1 #include "services/e_service_launcher_intern.h"
2 #include "e_comp_wl_rsm_intern.h"
3 #include "e_comp_wl_tbm_intern.h"
4 #include "e_devicemgr_intern.h"
5 #include "e_policy_intern.h"
6 #include "e_policy_wl_intern.h"
7 #include "e_policy_private_data.h"
8 #include "e_policy_visibility_intern.h"
9 #include "e_client_intern.h"
10 #include "e_comp_object_intern.h"
11 #include "e_utils_intern.h"
12 #include "e_appinfo_intern.h"
14 #include <tzsh_server.h>
15 #include <wayland-tbm-server.h>
17 typedef struct _E_Service_Launcher E_Service_Launcher;
18 typedef struct _E_Service_Launcher_Handler E_Service_Launcher_Handler;
19 typedef struct _E_Service_Launcher_Consumer E_Service_Launcher_Consumer;
24 LAUNCHER_STATE_MONITORING,
25 LAUNCHER_STATE_PREPARING,
26 LAUNCHER_STATE_LAUNCHING,
27 LAUNCHER_STATE_LAUNCHING_WAIT_BUFFER,
29 LAUNCHER_STATE_CANCELED,
30 LAUNCHER_STATE_WAIT_RESPONSE_FROM_CALLEE,
33 struct _E_Service_Launcher_Consumer
35 E_Service_Launcher *lc;
36 E_Vis_Grab *vis_grab; //grab of client's visibility
39 E_Object_Delfn *delfn; //del callback of E_Client
41 Ecore_Event_Handler *buff_attach; //event handler for BUFFER_CHANGE
42 int buff_attach_count;
45 struct _E_Service_Launcher
47 Launcher_State state; //current state of launcher
49 struct wl_resource *res; //tizen_window_transition_launcher resource
50 E_Client *ec; //launcher E_Client
52 E_Vis_Grab *vis_grab; //grab of launcher visibility
53 uint32_t serial; //identifier
54 enum tws_service_launcher_direction direction; //direction of transition
58 E_Client *ec; //target E_Client
60 const char *appid; //appid
61 E_Vis_Grab *vis_grab; //grab of target client's visibility
63 Eina_Bool delay_del; //refered delay_del
64 E_Object_Delfn *delfn; //del callback of target E_Client
66 const char *splash_path; //path of file for splash
67 const char *splash_group; //group name for splash
68 } target; //target window information for transition
70 E_Client *launched_ec; //E_Client was launched by launcher
71 E_Object_Delfn *launched_delfn; //del callback of launched_ec
73 Ecore_Event_Handler *buff_attach; //event handler for BUFFER_CHANGE
75 Eina_Bool with_swl; //it's for shared widget launch
76 Eina_Bool swl_done; //flag indicating done of callee
78 Eina_Bool block_input; //input is blocked(1) or not(0) while running client side animation
80 Eina_List *consumers; //list launcher consumer of launcher ec
83 struct _E_Service_Launcher_Handler
85 Eina_Hash *launcher_hash; //hash key:launcher_ec, data:E_Service_Launcher
86 unsigned int launcher_count; //count of launcher object
88 Eina_List *hooks_ec; //hook list for E_CLIENT_HOOK_*
89 Eina_List *hooks_vis; //hook list for E_POL_VIS_HOOK_TYPE_*
90 Eina_List *hooks_co; //hook list for E_COMP_OBJECT_INTERCEPT_HOOK_*
91 Eina_List *hooks_appinfo; //hook list for E_APPINFO_HOOK_*
92 Eina_List *hdlrs_ev; //handler list for ecore event
94 E_Service_Launcher *runner; //current runner(running launcher)
95 E_Service_Launcher *pre_runner; //previous runner
98 ////////////////////////////////////////////////////////////////////
99 static E_Service_Launcher_Handler *_laundler = NULL;
101 static void _launcher_launched_ec_set(E_Service_Launcher *lc, E_Client *launched_ec);
102 static void _launcher_target_ec_set(E_Service_Launcher *lc, E_Client *target_ec);
104 static E_Service_Launcher *_launcher_handler_launcher_find(E_Client *ec);
105 static Eina_Bool _launcher_handler_launcher_add(E_Service_Launcher *lc);
106 static Eina_Bool _launcher_handler_launcher_del(E_Service_Launcher *lc);
108 static E_Service_Launcher *_launcher_handler_launcher_runner_get(void);
109 static void _launcher_handler_launcher_runner_set(E_Service_Launcher *lc);
110 static void _launcher_handler_launcher_runner_unset(E_Service_Launcher *lc);
111 static E_Service_Launcher *_launcher_handler_launcher_pre_runner_get(void);
112 static void _launcher_handler_launcher_pre_runner_set(E_Service_Launcher *lc);
113 static void _launcher_handler_launcher_pre_runner_unset(E_Service_Launcher *lc);
115 ////////////////////////////////////////////////////////////////////
117 _launcher_clients_find_by_pid(pid_t pid)
120 Eina_List *clients = NULL, *l;
122 EINA_LIST_FOREACH(e_comp->clients, l, ec)
124 if (e_object_is_del(E_OBJECT(ec))) continue;
125 if (ec->netwm.pid != pid) continue;
126 clients = eina_list_append(clients, ec);
134 _launcher_cb_input_block_expired(void *data)
136 E_Service_Launcher *lc = (E_Service_Launcher*)data;
137 EINA_SAFETY_ON_NULL_RETURN(lc);
139 lc->block_input = EINA_FALSE;
141 ELOGF("LAUNCHER_SRV", "Input block EXPIRED", lc->ec);
145 _launcher_input_block_set(E_Service_Launcher *lc, Eina_Bool set)
147 EINA_SAFETY_ON_NULL_RETURN_VAL(lc, EINA_FALSE);
151 //request for block all input
152 lc->block_input = e_devicemgr_block_internal_add(ECORE_DEVICE_CLASS_NONE,
154 (uint32_t)(e_policy_visibility_timeout_get() * 1000),
155 _launcher_cb_input_block_expired, lc);
156 return lc->block_input;
160 return e_devicemgr_block_internal_remove(_launcher_cb_input_block_expired, lc);
165 _launcher_state_to_str(Launcher_State state)
169 case LAUNCHER_STATE_IDLE:
171 case LAUNCHER_STATE_MONITORING:
172 return "PID_MONITORING";
173 case LAUNCHER_STATE_PREPARING:
175 case LAUNCHER_STATE_LAUNCHING:
177 case LAUNCHER_STATE_LAUNCHING_WAIT_BUFFER:
178 return "LAUNCHING_BUT_WAITING_BUFFER";
179 case LAUNCHER_STATE_DONE:
180 return "LAUNCH_DONE";
181 case LAUNCHER_STATE_CANCELED:
182 return "LAUNCH_CANCELED";
183 case LAUNCHER_STATE_WAIT_RESPONSE_FROM_CALLEE:
184 return "WAIT_FOR_RESPONSE_FROM_CALLEE";
190 _launcher_state_set(E_Service_Launcher *lc,
191 Launcher_State state)
193 EINA_SAFETY_ON_NULL_RETURN(lc);
195 if (state == lc->state) return;
197 ELOGF("LAUNCHER_SRV", "Set state %s --> %s",
199 _launcher_state_to_str(lc->state),
200 _launcher_state_to_str(state));
206 _launcher_consumer_del(E_Service_Launcher_Consumer *consumer)
208 E_Service_Launcher *lc;
210 EINA_SAFETY_ON_NULL_RETURN(consumer);
214 ELOGF("LAUNCHER_SRV", "Del launcher_consumer ec:%p", lc ? lc->ec : NULL, consumer->ec);
218 e_object_delfn_del(E_OBJECT(consumer->ec), consumer->delfn);
220 consumer->delfn = NULL;
223 if (consumer->vis_grab)
225 e_policy_visibility_client_grab_release(consumer->vis_grab);
226 consumer->vis_grab = NULL;
229 if (consumer->buff_attach)
230 E_FREE_FUNC(consumer->buff_attach, ecore_event_handler_del);
233 lc->consumers = eina_list_remove(lc->consumers, consumer);
239 _launcher_cb_consumer_ec_del(void *data, void *obj)
241 E_Service_Launcher_Consumer *consumer;
244 ec = (E_Client *)obj;
245 EINA_SAFETY_ON_NULL_RETURN(ec);
247 consumer= (E_Service_Launcher_Consumer *)data;
248 EINA_SAFETY_ON_NULL_RETURN(consumer);
249 EINA_SAFETY_ON_TRUE_RETURN(consumer->ec != ec);
252 consumer->delfn = NULL;
254 _launcher_consumer_del(consumer);
257 static E_Service_Launcher_Consumer *
258 _launcher_consumer_create(E_Service_Launcher *lc, E_Client *ec)
260 E_Service_Launcher_Consumer *consumer;
262 EINA_SAFETY_ON_NULL_RETURN_VAL(lc, NULL);
263 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
265 consumer = E_NEW(E_Service_Launcher_Consumer, 1);
266 EINA_SAFETY_ON_NULL_RETURN_VAL(consumer, NULL);
269 consumer->delfn = e_object_delfn_add(E_OBJECT(ec),
270 _launcher_cb_consumer_ec_del, consumer);
273 lc->consumers = eina_list_append(lc->consumers, consumer);
275 ELOGF("LAUNCHER_SRV", "Create launcher_consumer ec:%p", lc->ec, ec);
281 _launcher_consumers_reset(E_Service_Launcher *lc)
283 E_Service_Launcher_Consumer *consumer;
286 EINA_SAFETY_ON_NULL_RETURN(lc);
288 EINA_LIST_FOREACH_SAFE(lc->consumers, l, ll, consumer)
289 _launcher_consumer_del(consumer);
293 _launcher_post_forward(E_Service_Launcher *lc, Eina_Bool success)
295 E_Client *target_ec = NULL;
297 if ((lc->target.ec) && (!e_object_is_del(E_OBJECT(lc->target.ec))))
298 target_ec = lc->target.ec;
300 _launcher_target_ec_set(lc, NULL);
305 E_FREE_FUNC(lc->target.appid, eina_stringshare_del);
306 E_FREE_FUNC(lc->target.splash_path, eina_stringshare_del);
307 E_FREE_FUNC(lc->target.splash_group, eina_stringshare_del);
308 E_FREE_FUNC(lc->buff_attach, ecore_event_handler_del);
310 //if forward animation is failed, enlightenment can run animation instead.
311 if ((!success) && (target_ec))
312 e_policy_animatable_lock(target_ec, E_POLICY_ANIMATABLE_CUSTOMIZED, 0);
314 if (!_launcher_input_block_set(lc, EINA_FALSE))
315 ELOGF("LAUNCHER_SRV", "Input block remove FAIL...", lc->ec);
318 e_policy_visibility_client_grab_release(lc->vis_grab);
319 if (lc->target.vis_grab)
320 e_policy_visibility_client_grab_release(lc->target.vis_grab);
323 lc->target.vis_grab = NULL;
325 if (!target_ec) return;
328 _launcher_launched_ec_set(lc, target_ec);
331 e_comp_object_damage(target_ec->frame, 0, 0, target_ec->w, target_ec->h);
332 e_comp_object_dirty(target_ec->frame);
333 e_comp_object_render(target_ec->frame);
334 evas_object_show(target_ec->frame);
336 e_comp_client_override_del(target_ec);
340 _launcher_post_backward(E_Service_Launcher *lc, Eina_Bool success)
342 E_Client *target_ec = NULL;
344 target_ec = lc->target.ec;
345 _launcher_target_ec_set(lc, NULL);
351 E_FREE_FUNC(lc->target.appid, eina_stringshare_del);
352 E_FREE_FUNC(lc->target.splash_path, eina_stringshare_del);
353 E_FREE_FUNC(lc->target.splash_group, eina_stringshare_del);
354 E_FREE_FUNC(lc->buff_attach, ecore_event_handler_del);
359 is_del = e_object_is_del(E_OBJECT(target_ec));
360 if (lc->target.delay_del)
361 e_object_delay_del_unref(E_OBJECT(target_ec));
366 lc->target.delay_del = EINA_FALSE;
368 //if forward animation is failed, enlightenment can run animation instead.
369 if ((!success) && (target_ec))
370 e_policy_animatable_lock(target_ec, E_POLICY_ANIMATABLE_CUSTOMIZED, 0);
372 if (!_launcher_input_block_set(lc, EINA_FALSE))
373 ELOGF("LAUNCHER_SRV", "Input block remove FAIL...", lc->ec);
376 e_policy_visibility_client_grab_release(lc->vis_grab);
377 if (lc->target.vis_grab)
378 e_policy_visibility_client_grab_release(lc->target.vis_grab);
381 lc->target.vis_grab = NULL;
383 _launcher_consumers_reset(lc);
385 if (!target_ec) return;
388 e_policy_animatable_lock(target_ec, E_POLICY_ANIMATABLE_CUSTOMIZED, 0);
390 e_comp_client_override_del(target_ec);
394 _launcher_stop_send(E_Service_Launcher *lc)
396 EINA_SAFETY_ON_NULL_RETURN(lc);
398 ELOGF("LAUNCHER_SRV", "Send STOP event(%d) target(ec:%p)",
399 lc->ec, lc->serial, lc->target.ec);
401 tws_service_launcher_send_stop(lc->res, lc->serial);
405 _launcher_prepare_send(E_Service_Launcher *lc,
408 const char *shared_widget_info)
412 E_Comp_Object_Content_Type content_type = 0;
413 enum tws_service_launcher_target_type target_type = 0;
414 const char *target_path = NULL, *target_group = NULL;
415 Evas_Object *content = NULL;
416 struct wl_array info_array;
422 EINA_SAFETY_ON_NULL_RETURN_VAL(lc, EINA_FALSE);
423 EINA_SAFETY_ON_NULL_RETURN_VAL(target_ec, EINA_FALSE);
425 wl_array_init(&info_array);
426 if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD)
428 content_type = e_comp_object_content_type_get(target_ec->frame);
429 switch (content_type)
431 case E_COMP_OBJECT_CONTENT_TYPE_EXT_IMAGE:
432 content = e_comp_object_content_get(target_ec->frame);
433 EINA_SAFETY_ON_NULL_GOTO(content, fail);
435 target_type = TWS_SERVICE_LAUNCHER_TARGET_TYPE_IMAGE;
436 evas_object_image_file_get(content, &target_path, NULL);
437 EINA_SAFETY_ON_NULL_GOTO(target_path, fail);
439 len = strlen(target_path) + 1;
440 p_char = wl_array_add(&info_array, len);
441 EINA_SAFETY_ON_NULL_GOTO(p_char, fail);
443 strncpy(p_char, target_path, len);
445 case E_COMP_OBJECT_CONTENT_TYPE_EXT_EDJE:
446 content = e_comp_object_content_get(target_ec->frame);
447 EINA_SAFETY_ON_NULL_GOTO(content, fail);
449 target_type = TWS_SERVICE_LAUNCHER_TARGET_TYPE_EDJE;
450 target_path = lc->target.splash_path;
451 target_group = lc->target.splash_group;
452 if ((!target_path) || (!target_group))
453 edje_object_file_get(content, &target_path, &target_group);
454 EINA_SAFETY_ON_NULL_GOTO(target_path, fail);
455 EINA_SAFETY_ON_NULL_GOTO(target_group, fail);
457 len = strlen(target_path) + 1;
458 p_char = wl_array_add(&info_array, len);
459 EINA_SAFETY_ON_NULL_GOTO(p_char, fail);
461 strncpy(p_char, target_path, len);
463 len = strlen(target_group) + 1;
464 p_char = wl_array_add(&info_array, len);
465 EINA_SAFETY_ON_NULL_GOTO(p_char, fail);
467 strncpy(p_char, target_group, len);
471 target_type = TWS_SERVICE_LAUNCHER_TARGET_TYPE_REMOTE_SURFACE;
472 res_id = e_pixmap_res_id_get(target_ec->pixmap);
474 p_u32 = wl_array_add(&info_array, sizeof(uint32_t));
475 EINA_SAFETY_ON_NULL_GOTO(p_u32, fail);
482 target_type = TWS_SERVICE_LAUNCHER_TARGET_TYPE_REMOTE_SURFACE;
483 res_id = e_pixmap_res_id_get(target_ec->pixmap);
485 p_u32 = wl_array_add(&info_array, sizeof(uint32_t));
486 EINA_SAFETY_ON_NULL_GOTO(p_u32, fail);
492 ELOGF("LAUNCHER_SRV", "Send PREPARE event(%d) direction:%s target(ec:%p type:%d res:%d path:%s pos(%d,%d) widget:%s)",
493 lc->ec, lc->serial, lc->direction?"BACKWARD":"FORWARD", target_ec, target_type, res_id, target_path?:"N/A", x, y, shared_widget_info);
495 tws_service_launcher_send_prepare(lc->res,
500 shared_widget_info ? shared_widget_info : "None",
503 wl_array_release(&info_array);
506 wl_array_release(&info_array);
511 _launcher_prepare_shared_widget_forward_send(E_Service_Launcher *lc,
514 Eina_Bool sent = EINA_FALSE;
516 EINA_SAFETY_ON_NULL_RETURN_VAL(lc, EINA_FALSE);
517 EINA_SAFETY_ON_NULL_RETURN_VAL(target_ec, EINA_FALSE);
518 if(e_object_is_del(E_OBJECT(target_ec))) return EINA_FALSE;
520 e_policy_animatable_lock(target_ec, E_POLICY_ANIMATABLE_CUSTOMIZED, 1);
521 e_comp_client_override_add(target_ec);
523 // grab uniconify job of target_ec
524 if (target_ec->iconic)
526 lc->target.vis_grab =
527 e_policy_visibility_client_filtered_grab_get
529 (E_VIS_JOB_TYPE_UNICONIFY | E_VIS_JOB_TYPE_UNICONIFY_BY_VISIBILITY),
533 if (!_launcher_input_block_set(lc, EINA_TRUE))
534 ELOGF("LAUNCHER_SRV", "Input block add FAIL...", lc->ec);
536 _launcher_launched_ec_set(lc, NULL);
537 _launcher_target_ec_set(lc, target_ec);
539 lc->direction = TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD;
541 sent = e_tzsh_shared_widget_launch_prepare_send(target_ec,
542 TWS_SHARED_WIDGET_LAUNCH_PREPARE_STATE_WIDGET_HIDE,
546 ELOGF("LAUNCHER_SRV", "Failed to send event(PREPARE:FORWARD)", lc->ec);
547 _launcher_post_forward(lc, EINA_FALSE);
554 _launcher_prepare_shared_widget_backward_send(E_Service_Launcher *lc,
557 E_Vis_Job_Type job_type)
559 Eina_Bool sent = EINA_FALSE;
561 EINA_SAFETY_ON_NULL_RETURN_VAL(lc, EINA_FALSE);
562 EINA_SAFETY_ON_NULL_RETURN_VAL(activity, EINA_FALSE);
563 EINA_SAFETY_ON_NULL_RETURN_VAL(target_ec, EINA_FALSE);
565 if (e_object_is_del(E_OBJECT(target_ec)))
567 if (lc->with_swl) return EINA_FALSE;
568 // do nothing if ec is deleted and there's no delay_del_ref as well.
569 if (!e_object_delay_del_ref_get(E_OBJECT(target_ec)))
573 e_object_delay_del_ref(E_OBJECT(target_ec));
574 lc->target.delay_del = EINA_TRUE;
576 e_policy_animatable_lock(target_ec, E_POLICY_ANIMATABLE_CUSTOMIZED, 1);
577 e_comp_client_override_add(target_ec);
579 if (activity == target_ec)
581 lc->vis_grab = e_policy_visibility_client_filtered_grab_get(lc->ec, job_type, __func__);
582 lc->target.vis_grab = e_policy_visibility_client_filtered_grab_get(target_ec, E_VIS_JOB_TYPE_ALL, __func__);
586 lc->target.vis_grab = e_policy_visibility_client_filtered_grab_get(target_ec, job_type, __func__);
589 if (!_launcher_input_block_set(lc, EINA_TRUE))
590 ELOGF("LAUNCHER_SRV", "Input block add FAIL...", lc->ec);
592 _launcher_launched_ec_set(lc, NULL);
593 _launcher_target_ec_set(lc, target_ec);
595 lc->direction = TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD;
596 lc->serial = wl_display_next_serial(e_comp_wl->wl.disp);
598 sent = e_tzsh_shared_widget_launch_prepare_send(target_ec,
599 TWS_SHARED_WIDGET_LAUNCH_PREPARE_STATE_WIDGET_HIDE,
602 // fail to send protocol event
605 ELOGF("LAUNCHER_SRV", "Failed to send event(PREPARE:BACKWARD)", lc->ec);
606 _launcher_post_backward(lc, EINA_FALSE);
613 _launcher_prepare_forward_send(E_Service_Launcher *lc,
616 Eina_Bool sent = EINA_FALSE;
619 EINA_SAFETY_ON_NULL_RETURN_VAL(lc, EINA_FALSE);
620 EINA_SAFETY_ON_NULL_RETURN_VAL(target_ec, EINA_FALSE);
622 if(e_object_is_del(E_OBJECT(target_ec))) return EINA_FALSE;
624 e_policy_animatable_lock(target_ec, E_POLICY_ANIMATABLE_CUSTOMIZED, 1);
625 e_comp_client_override_add(target_ec);
627 //grab uniconify job of target_ec
628 if (target_ec->iconic)
629 lc->target.vis_grab = e_policy_visibility_client_filtered_grab_get(target_ec,
630 (E_VIS_JOB_TYPE_UNICONIFY |
631 E_VIS_JOB_TYPE_UNICONIFY_BY_VISIBILITY),
634 if (!_launcher_input_block_set(lc, EINA_TRUE))
635 ELOGF("LAUNCHER_SRV", "Input block add FAIL...", lc->ec);
637 _launcher_launched_ec_set(lc, NULL);
638 _launcher_target_ec_set(lc, target_ec);
640 lc->direction = TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD;
641 e_client_pos_get(target_ec, &x, &y);
643 sent = _launcher_prepare_send(lc, target_ec, x, y, NULL);
645 //fail to send protocol event
648 ELOGF("LAUNCHER_SRV", "Failed to send event(PREPARE:FORWARD)", lc->ec);
649 _launcher_post_forward(lc, EINA_FALSE);
656 _launcher_prepare_backward_send(E_Service_Launcher *lc,
659 E_Vis_Job_Type job_type)
662 Eina_Bool sent = EINA_FALSE;
663 Eina_List *consumers;
666 E_Service_Launcher_Consumer *consumer;
668 EINA_SAFETY_ON_NULL_RETURN_VAL(lc, EINA_FALSE);
669 EINA_SAFETY_ON_NULL_RETURN_VAL(activity, EINA_FALSE);
670 EINA_SAFETY_ON_NULL_RETURN_VAL(target_ec, EINA_FALSE);
672 if (e_object_is_del(E_OBJECT(target_ec)))
674 //can't do nothing if ec is deleted and there's no delay_del_ref as well.
675 if (!e_object_delay_del_ref_get(E_OBJECT(target_ec)))
679 e_object_delay_del_ref(E_OBJECT(target_ec));
680 lc->target.delay_del = EINA_TRUE;
682 e_policy_animatable_lock(target_ec, E_POLICY_ANIMATABLE_CUSTOMIZED, 1);
683 e_comp_client_override_add(target_ec);
685 if ((lc->ec) && (lc->ec->remote_surface.provider))
687 consumers = e_comp_wl_remote_surface_consumers_get(lc->ec);
688 EINA_LIST_FOREACH(consumers, l, ec)
690 if (e_object_is_del(E_OBJECT(ec))) continue;
691 if (!e_policy_visibility_client_is_uniconify_render_running(ec)) continue;
693 consumer = _launcher_consumer_create(lc, ec);
694 consumer->vis_grab = e_policy_visibility_client_filtered_grab_get(ec,
695 (E_VIS_JOB_TYPE_UNICONIFY |
696 E_VIS_JOB_TYPE_UNICONIFY_BY_VISIBILITY),
699 eina_list_free(consumers);
702 if (activity == target_ec)
704 lc->vis_grab = e_policy_visibility_client_filtered_grab_get(lc->ec, job_type, __func__);
705 lc->target.vis_grab = e_policy_visibility_client_filtered_grab_get(target_ec, E_VIS_JOB_TYPE_ALL, __func__);
709 lc->target.vis_grab = e_policy_visibility_client_filtered_grab_get(target_ec, job_type, __func__);
712 if (!_launcher_input_block_set(lc, EINA_TRUE))
713 ELOGF("LAUNCHER_SRV", "Input block add FAIL...", lc->ec);
715 _launcher_launched_ec_set(lc, NULL);
716 _launcher_target_ec_set(lc, target_ec);
718 lc->serial = wl_display_next_serial(e_comp_wl->wl.disp);
719 lc->direction = TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD;
720 e_client_pos_get(target_ec, &x, &y);
722 sent = _launcher_prepare_send(lc, target_ec, x, y, NULL);
724 //fail to send protocol event
727 ELOGF("LAUNCHER_SRV", "Failed to send event(PREPARE:BACKWARD)", lc->ec);
728 _launcher_post_backward(lc, EINA_FALSE);
736 _launcher_data_reset(E_Service_Launcher *lc)
738 EINA_SAFETY_ON_NULL_RETURN(lc);
740 ELOGF("LAUNCHER_SRV", "Reset Launcher Data", lc->ec);
742 //clear resource and send 'DISQUALIFIED' msg
745 tws_service_launcher_send_error(lc->res, TWS_SERVICE_LAUNCHER_ERROR_DISQUALIFIED, lc->serial);
746 wl_resource_set_user_data(lc->res, NULL);
750 if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD)
751 _launcher_post_forward(lc, EINA_FALSE);
752 else if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD)
753 _launcher_post_backward(lc, EINA_FALSE);
755 _launcher_state_set(lc, LAUNCHER_STATE_IDLE);
756 _launcher_launched_ec_set(lc, NULL);
757 _launcher_consumers_reset(lc);
759 _launcher_handler_launcher_runner_unset(lc);
760 _launcher_handler_launcher_pre_runner_unset(lc);
767 _launcher_cb_done_buff_attach(void *data, int type EINA_UNUSED, void *event)
769 E_Service_Launcher *lc;
773 lc = (E_Service_Launcher*)data;
774 EINA_SAFETY_ON_NULL_RETURN_VAL(lc, ECORE_CALLBACK_PASS_ON);
775 if (!lc->with_swl) goto clean;
776 if (lc->direction != TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD) goto clean;
778 ev = (E_Event_Client *)event;
779 EINA_SAFETY_ON_NULL_RETURN_VAL(ev, ECORE_CALLBACK_PASS_ON);
780 EINA_SAFETY_ON_NULL_RETURN_VAL(ev->ec, ECORE_CALLBACK_PASS_ON);
783 if (ec != lc->target.ec) return ECORE_CALLBACK_PASS_ON;
784 if (!lc->swl_done) goto clean;
786 ELOGF("LAUNCHER_SRV", "Event cb(BUFFER_CHANGE) for LAUNCH_DONE", ec);
788 lc->swl_done = EINA_FALSE;
790 _launcher_post_forward(lc, EINA_TRUE);
792 _launcher_handler_launcher_runner_unset(lc);
793 _launcher_handler_launcher_pre_runner_set(lc);
794 _launcher_state_set(lc, LAUNCHER_STATE_DONE);
797 E_FREE_FUNC(lc->buff_attach, ecore_event_handler_del);
799 return ECORE_CALLBACK_DONE;
803 _launcher_cb_launching_consumer_buff_attach(void *data, int type EINA_UNUSED, void *event)
805 E_Service_Launcher *lc;
806 E_Service_Launcher_Consumer *consumer;
810 consumer = (E_Service_Launcher_Consumer*)data;
811 EINA_SAFETY_ON_NULL_RETURN_VAL(consumer, ECORE_CALLBACK_PASS_ON);
813 EINA_SAFETY_ON_NULL_GOTO(lc, clean);
814 EINA_SAFETY_ON_FALSE_GOTO(lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD, clean);
816 ev = (E_Event_Client *)event;
817 EINA_SAFETY_ON_NULL_RETURN_VAL(ev, ECORE_CALLBACK_PASS_ON);
818 EINA_SAFETY_ON_NULL_RETURN_VAL(ev->ec, ECORE_CALLBACK_PASS_ON);
821 if (ec != consumer->ec) return ECORE_CALLBACK_PASS_ON;
823 ELOGF("LAUNCHER_SRV", "Event cb(BUFFER_CHANGE) for WAIT_CONSUMER_LAUNCHING count:%d",
824 ec, consumer->buff_attach_count);
826 consumer->buff_attach_count++;
827 if (consumer->buff_attach_count < 2) return ECORE_CALLBACK_PASS_ON;
829 if (consumer->vis_grab)
831 e_policy_visibility_client_grab_release(consumer->vis_grab);
832 consumer->vis_grab = NULL;
836 _launcher_consumer_del(consumer);
838 return ECORE_CALLBACK_PASS_ON;
842 _launcher_consumers_buffer_change_wait(E_Service_Launcher *lc)
844 E_Service_Launcher_Consumer *consumer;
847 EINA_LIST_FOREACH(lc->consumers, l, consumer)
848 consumer->buff_attach = ecore_event_handler_add(E_EVENT_CLIENT_BUFFER_CHANGE,
849 _launcher_cb_launching_consumer_buff_attach,
854 _launcher_cb_launching_buff_attach(void *data, int type EINA_UNUSED, void *event)
856 E_Service_Launcher *lc;
860 lc = (E_Service_Launcher*)data;
861 EINA_SAFETY_ON_NULL_RETURN_VAL(lc, ECORE_CALLBACK_PASS_ON);
862 if (lc->direction != TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD) goto clean;
864 ev = (E_Event_Client *)event;
865 EINA_SAFETY_ON_NULL_RETURN_VAL(ev, ECORE_CALLBACK_PASS_ON);
866 EINA_SAFETY_ON_NULL_RETURN_VAL(ev->ec, ECORE_CALLBACK_PASS_ON);
869 if (ec != lc->ec) return ECORE_CALLBACK_PASS_ON;
871 ELOGF("LAUNCHER_SRV", "Event cb(BUFFER_CHANGE) for LAUNCHING", ec);
873 if (lc->state == LAUNCHER_STATE_LAUNCHING_WAIT_BUFFER)
875 _launcher_consumers_buffer_change_wait(lc);
876 _launcher_state_set(lc, LAUNCHER_STATE_LAUNCHING);
881 e_policy_visibility_client_grab_release(lc->vis_grab);
885 if (lc->target.vis_grab)
887 e_policy_visibility_client_grab_release(lc->target.vis_grab);
888 lc->target.vis_grab = NULL;
892 E_FREE_FUNC(lc->buff_attach, ecore_event_handler_del);
894 return ECORE_CALLBACK_PASS_ON;
898 _launcher_buffer_change_wait(E_Service_Launcher *lc)
901 if (lc->buff_attach) return;
903 if (lc->state == LAUNCHER_STATE_LAUNCHING_WAIT_BUFFER)
904 lc->buff_attach = ecore_event_handler_add(E_EVENT_CLIENT_BUFFER_CHANGE,
905 _launcher_cb_launching_buff_attach,
907 else if ((lc->with_swl) && (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD))
908 lc->buff_attach = ecore_event_handler_add(E_EVENT_CLIENT_BUFFER_CHANGE,
909 _launcher_cb_done_buff_attach,
915 _launcher_cb_launched_ec_del(void *data, void *obj)
917 E_Service_Launcher *lc = (E_Service_Launcher *)data;
918 E_Client *launched_ec = (E_Client *)obj;
920 EINA_SAFETY_ON_NULL_RETURN(launched_ec);
921 EINA_SAFETY_ON_NULL_RETURN(lc);
922 EINA_SAFETY_ON_TRUE_RETURN(lc->launched_ec != launched_ec);
924 lc->launched_ec = NULL;
925 lc->launched_delfn = NULL;
929 _launcher_cb_target_ec_del(void *data, void *obj)
931 E_Service_Launcher *lc = (E_Service_Launcher *)data;
932 E_Client *target_ec = (E_Client *)obj;
934 EINA_SAFETY_ON_NULL_RETURN(target_ec);
935 EINA_SAFETY_ON_NULL_RETURN(lc);
936 EINA_SAFETY_ON_TRUE_RETURN(lc->target.ec != target_ec);
938 lc->target.ec = NULL;
939 lc->target.delfn = NULL;
943 case LAUNCHER_STATE_PREPARING:
944 case LAUNCHER_STATE_LAUNCHING:
945 case LAUNCHER_STATE_LAUNCHING_WAIT_BUFFER:
946 _launcher_stop_send(lc);
947 if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD)
948 _launcher_post_forward(lc, EINA_FALSE);
949 else if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD)
950 _launcher_post_backward(lc, EINA_FALSE);
952 _launcher_handler_launcher_runner_unset(lc);
953 _launcher_handler_launcher_pre_runner_unset(lc);
955 _launcher_state_set(lc, LAUNCHER_STATE_IDLE);
963 _launcher_launched_ec_set(E_Service_Launcher *lc, E_Client *launched_ec)
965 EINA_SAFETY_ON_NULL_RETURN(lc);
966 if (lc->launched_ec == launched_ec) return;
970 e_object_delfn_del(E_OBJECT(lc->launched_ec), lc->launched_delfn);
971 lc->launched_ec = NULL;
972 lc->launched_delfn = NULL;
977 lc->launched_ec = launched_ec;
978 lc->launched_delfn = e_object_delfn_add(E_OBJECT(launched_ec),
979 _launcher_cb_launched_ec_del, lc);
984 _launcher_target_ec_set(E_Service_Launcher *lc, E_Client *target_ec)
986 EINA_SAFETY_ON_NULL_RETURN(lc);
987 if (lc->target.ec == target_ec) return;
991 e_object_delfn_del(E_OBJECT(lc->target.ec), lc->target.delfn);
992 lc->target.ec = NULL;
993 lc->target.delfn = NULL;
998 lc->target.ec = target_ec;
999 lc->target.delfn = e_object_delfn_add(E_OBJECT(target_ec),
1000 _launcher_cb_target_ec_del, lc);
1005 _launcher_cb_resource_destroy(struct wl_resource *res_tws_lc)
1007 E_Service_Launcher *lc;
1009 lc = wl_resource_get_user_data(res_tws_lc);
1012 ELOGF("LAUNCHER_SRV", "Start Resource Destroy tws_service_launcher", lc->ec);
1014 _launcher_handler_launcher_del(lc);
1017 _launcher_data_reset(lc);
1021 ELOGF("LAUNCHER_SRV", "End Resource Destroy tws_service_launcher", NULL);
1025 _launcher_cb_destroy(struct wl_client *client EINA_UNUSED,
1026 struct wl_resource *res_tws_lc)
1028 ELOGF("LAUNCHER_SRV", "Received request(launcher_destroy)", NULL);
1029 wl_resource_destroy(res_tws_lc);
1033 _launcher_cb_launch(struct wl_client *client EINA_UNUSED,
1034 struct wl_resource *res_tws_lc,
1036 const char *instance_id,
1040 E_Service_Launcher *lc;
1041 E_Service_Launcher *runner, *pre_runner;
1042 E_Client *target_ec;
1044 Eina_Bool sent = EINA_FALSE;
1046 lc = wl_resource_get_user_data(res_tws_lc);
1047 EINA_SAFETY_ON_NULL_RETURN(lc);
1048 EINA_SAFETY_ON_NULL_RETURN(lc->ec);
1050 ELOGF("LAUNCHER_SRV",
1051 "Recieved request(launcher_launch) appid:%s instance id:%s pid:%d",
1052 lc->ec, app_id?:"NONE", instance_id?:"NONE", pid);
1054 EINA_SAFETY_ON_TRUE_GOTO(lc->ec->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED, send_stop);
1055 EINA_SAFETY_ON_TRUE_GOTO((pid < 0) && !(app_id) , send_stop);
1057 //check current state of lc
1058 runner = _launcher_handler_launcher_runner_get();
1061 ELOGF("LAUNCHER_SRV",
1062 "Launcher(%s) requests LAUNCH again without cancel, ignore this.",
1063 lc->ec, _launcher_state_to_str(lc->state));
1065 tws_service_launcher_send_error(lc->res, TWS_SERVICE_LAUNCHER_ERROR_WRONG_REQUEST, lc->serial);
1069 pre_runner = _launcher_handler_launcher_pre_runner_get();
1070 if (pre_runner == lc)
1072 _launcher_handler_launcher_pre_runner_set(NULL);
1073 _launcher_launched_ec_set(lc, NULL);
1076 lc->serial = serial;
1077 lc->target.pid = pid;
1081 ecs = _launcher_clients_find_by_pid(pid);
1082 EINA_LIST_FOREACH(ecs, l, target_ec)
1084 if (e_object_is_del(E_OBJECT(target_ec))) continue;
1085 if (e_client_util_ignored_get(target_ec)) continue;
1087 ELOGF("LAUNCHER_SRV", "Found target_ec:%p", lc->ec, target_ec);
1089 sent = _launcher_prepare_forward_send(lc, target_ec);
1090 EINA_SAFETY_ON_FALSE_GOTO(sent, send_stop);
1092 _launcher_state_set(lc, LAUNCHER_STATE_PREPARING);
1095 eina_list_free(ecs);
1100 lc->target.appid = eina_stringshare_add(app_id);
1105 ELOGF("LAUNCHER_SRV", "Can't find target_ec, Start Monitoring", lc->ec);
1106 _launcher_state_set(lc, LAUNCHER_STATE_MONITORING);
1109 _launcher_handler_launcher_runner_set(lc);
1114 ELOGF("LAUNCHER_SRV", "can't process request(launcher_launch)", lc->ec);
1115 _launcher_stop_send(lc);
1119 _launcher_cb_launch_with_shared_widget(struct wl_client *client EINA_UNUSED,
1120 struct wl_resource *res_tws_lc,
1122 const char *instance_id,
1126 E_Service_Launcher *lc;
1127 E_Service_Launcher *runner, *pre_runner;
1128 E_Client *target_ec;
1130 Eina_Bool sent = EINA_FALSE;
1132 lc = wl_resource_get_user_data(res_tws_lc);
1133 EINA_SAFETY_ON_NULL_RETURN(lc);
1134 EINA_SAFETY_ON_NULL_RETURN(lc->ec);
1136 ELOGF("LAUNCHER_SRV",
1137 "Recieved request(launcher_launch_with_shared_widget) appid:%s instance id:%s pid:%d",
1138 lc->ec, app_id?:"NONE", instance_id?:"NONE", pid);
1140 EINA_SAFETY_ON_TRUE_GOTO(lc->ec->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED, send_stop);
1141 EINA_SAFETY_ON_TRUE_GOTO((pid < 0) && !(app_id), send_stop);
1143 // check current state of lc
1144 runner = _launcher_handler_launcher_runner_get();
1147 ELOGF("LAUNCHER_SRV",
1148 "Launcher(%s) requests LAUNCH again without cancel, ignore this.",
1149 lc->ec, _launcher_state_to_str(lc->state));
1151 tws_service_launcher_send_error(lc->res,
1152 TWS_SERVICE_LAUNCHER_ERROR_WRONG_REQUEST,
1157 pre_runner = _launcher_handler_launcher_pre_runner_get();
1158 if (pre_runner == lc)
1160 _launcher_handler_launcher_pre_runner_set(NULL);
1161 _launcher_launched_ec_set(lc, NULL);
1164 lc->with_swl = EINA_TRUE; /* set swl flag */
1165 lc->serial = serial;
1166 lc->target.pid = pid;
1170 ecs = _launcher_clients_find_by_pid(pid);
1171 EINA_LIST_FOREACH(ecs, l, target_ec)
1173 if (e_object_is_del(E_OBJECT(target_ec))) continue;
1174 if (e_client_util_ignored_get(target_ec)) continue;
1176 ELOGF("LAUNCHER_SRV", "Found target_ec:%p", lc->ec, target_ec);
1178 // send prepare_shared_widget event to callee
1179 sent = _launcher_prepare_shared_widget_forward_send(lc, target_ec);
1180 EINA_SAFETY_ON_FALSE_GOTO(sent, send_stop);
1182 _launcher_state_set(lc, LAUNCHER_STATE_WAIT_RESPONSE_FROM_CALLEE);
1185 eina_list_free(ecs);
1190 lc->target.appid = eina_stringshare_add(app_id);
1195 ELOGF("LAUNCHER_SRV", "Can't find target_ec, Start Monitoring", lc->ec);
1196 _launcher_state_set(lc, LAUNCHER_STATE_MONITORING);
1199 _launcher_handler_launcher_runner_set(lc);
1204 ELOGF("LAUNCHER_SRV", "can't process request(launcher_launch)", lc->ec);
1205 _launcher_stop_send(lc);
1209 _launcher_cb_launching(struct wl_client *client EINA_UNUSED,
1210 struct wl_resource *res_tws_lc,
1213 E_Service_Launcher *lc;
1214 E_Service_Launcher *runner;
1216 lc = wl_resource_get_user_data(res_tws_lc);
1217 EINA_SAFETY_ON_NULL_RETURN(lc);
1219 ELOGF("LAUNCHER_SRV", "LAUNCHING(%d) %s",
1220 lc->ec, serial, lc->direction?"backward":"forward");
1222 //check current state of lc
1223 runner = _launcher_handler_launcher_runner_get();
1226 ELOGF("LAUNCHER_SRV", "lc(%p) runner(%p), lc is not runner, ignore LAUNCHING",
1227 lc->ec, lc, runner);
1228 tws_service_launcher_send_error(lc->res, TWS_SERVICE_LAUNCHER_ERROR_WRONG_REQUEST, lc->serial);
1232 _launcher_state_set(lc, LAUNCHER_STATE_LAUNCHING);
1234 if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD)
1236 _launcher_state_set(lc, LAUNCHER_STATE_LAUNCHING_WAIT_BUFFER);
1237 _launcher_buffer_change_wait(lc);
1242 _launcher_target_ec_queue_flush(E_Service_Launcher *lc)
1244 struct wayland_tbm_client_queue *cqueue;
1246 if (!e_comp_wl) return;
1248 if (!lc->target.ec) return;
1249 if (e_object_is_del(E_OBJECT(lc->target.ec))) return;
1251 cqueue = e_comp_wl_tbm_client_queue_get(lc->target.ec);
1253 wayland_tbm_server_client_queue_flush(cqueue);
1257 _launcher_cb_launch_done(struct wl_client *client EINA_UNUSED,
1258 struct wl_resource *res_tws_lc,
1261 E_Service_Launcher *lc;
1262 E_Service_Launcher *runner;
1263 E_Client *target_ec = NULL;
1264 enum tws_service_launcher_direction launch_direction = 0;
1266 lc = wl_resource_get_user_data(res_tws_lc);
1267 EINA_SAFETY_ON_NULL_RETURN(lc);
1269 ELOGF("LAUNCHER_SRV", "LAUNCH_DONE(%d) target:%p", lc->ec, serial, lc->target.ec);
1271 target_ec = lc->target.ec;
1272 launch_direction = lc->direction;
1274 //check current state of lc
1275 runner = _launcher_handler_launcher_runner_get();
1278 ELOGF("LAUNCHER_SRV", "lc(%p) runner(%p), lc is not runner, ignore LAUNCH_DONE",
1279 lc->ec, lc, runner);
1280 tws_service_launcher_send_error(lc->res, TWS_SERVICE_LAUNCHER_ERROR_WRONG_REQUEST, lc->serial);
1284 //shared widget launch case
1287 if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD)
1291 sent = e_tzsh_shared_widget_launch_prepare_send(lc->target.ec,
1292 TWS_SHARED_WIDGET_LAUNCH_PREPARE_STATE_WIDGET_SHOW,
1295 //TODO : handle failure case
1298 _launcher_buffer_change_wait(lc);
1304 else if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD)
1306 e_tzsh_shared_widget_launch_prepare_send(lc->target.ec,
1307 TWS_SHARED_WIDGET_LAUNCH_PREPARE_STATE_WIDGET_SHOW,
1309 _launcher_post_backward(lc, EINA_TRUE);
1312 else //normal launcher
1314 _launcher_target_ec_queue_flush(lc);
1315 if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD)
1316 _launcher_post_forward(lc, EINA_TRUE);
1317 else if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD)
1318 _launcher_post_backward(lc, EINA_TRUE);
1321 _launcher_handler_launcher_runner_unset(lc);
1322 _launcher_handler_launcher_pre_runner_set(lc);
1323 _launcher_state_set(lc, LAUNCHER_STATE_DONE);
1325 if (launch_direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD)
1327 if (target_ec && !e_object_is_del(E_OBJECT(target_ec)))
1329 if (target_ec->launching == EINA_TRUE)
1331 ELOGF("COMP", "Un-Set launching flag..", target_ec);
1332 target_ec->launching = EINA_FALSE;
1334 if (target_ec->first_mapped)
1336 E_Comp_Wl_Client_Data *target_cdata = e_client_cdata_get(target_ec);
1337 ELOGF("LAUNCH", "SHOW real win (target->frame:%p, map:%d) by launcher service (win:0x%08zx, ec:%p).", target_ec, target_ec->frame, target_cdata->mapped, e_client_util_win_get(lc->ec), lc->ec);
1338 e_comp_object_signal_emit(target_ec->frame, "e,action,launch_real,done", "e");
1340 e_comp_object_signal_emit(target_ec->frame, "e,action,launch,done", "e");
1347 _launcher_cb_launch_cancel(struct wl_client *client EINA_UNUSED,
1348 struct wl_resource *res_tws_lc,
1351 E_Service_Launcher *lc;
1352 E_Service_Launcher *runner;
1354 lc = wl_resource_get_user_data(res_tws_lc);
1355 EINA_SAFETY_ON_NULL_RETURN(lc);
1357 ELOGF("LAUNCHER_SRV", "LAUNCH_CANCEL(%d) target_ec:%p",
1358 lc->ec, serial, lc->target.ec);
1361 runner = _launcher_handler_launcher_runner_get();
1364 ELOGF("LAUNCHER_SRV", "lc(%p) runner(%p), lc is not runner, ignore LAUNCH_CANCEL",
1365 lc->ec, lc, runner);
1366 tws_service_launcher_send_error(lc->res, TWS_SERVICE_LAUNCHER_ERROR_WRONG_REQUEST, lc->serial);
1370 if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD)
1371 _launcher_post_forward(lc, EINA_FALSE);
1372 else if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD)
1373 _launcher_post_backward(lc, EINA_FALSE);
1375 _launcher_handler_launcher_runner_unset(lc);
1376 _launcher_handler_launcher_pre_runner_set(lc);
1377 _launcher_state_set(lc, LAUNCHER_STATE_CANCELED);
1380 static const struct tws_service_launcher_interface _launcher_iface =
1382 _launcher_cb_destroy,
1383 _launcher_cb_launch,
1384 _launcher_cb_launch_with_shared_widget,
1385 _launcher_cb_launching,
1386 _launcher_cb_launch_done,
1387 _launcher_cb_launch_cancel,
1391 _launcher_handler_rsm_provider_client_find(E_Client *rsm_consumer_ec)
1393 E_Client *prov_ec = NULL;
1394 E_Comp_Wl_Client_Data *prov_cdata = NULL;
1395 Eina_List *tzrs_provs, *l;
1396 E_Service_Launcher *lc;
1398 if (!rsm_consumer_ec->remote_surface.consumer) return NULL;
1400 tzrs_provs = e_comp_wl_remote_surface_providers_get(rsm_consumer_ec);
1401 if (!tzrs_provs) return NULL;
1403 EINA_LIST_FOREACH(tzrs_provs, l, prov_ec)
1405 /* check remote surface provider */
1406 if (!prov_ec->remote_surface.provider) continue;
1407 if (prov_ec->visible) continue;
1408 if (evas_object_visible_get(prov_ec->frame)) continue;
1409 prov_cdata = e_client_cdata_get(prov_ec);
1410 if (prov_cdata->mapped) continue;
1411 if (!(lc = _launcher_handler_launcher_find(prov_ec))) continue;
1412 if (!lc->launched_ec) continue;
1414 ELOGF("LAUNCHER_SRV", "Found prov_ec:%p", rsm_consumer_ec, prov_ec);
1417 eina_list_free(tzrs_provs);
1422 static E_Service_Launcher *
1423 _launcher_handler_launcher_find(E_Client *ec)
1425 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
1426 EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler, NULL);
1427 EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler->launcher_hash, NULL);
1429 return eina_hash_find(_laundler->launcher_hash, &ec);
1433 _launcher_handler_launcher_add(E_Service_Launcher *lc)
1437 EINA_SAFETY_ON_NULL_RETURN_VAL(lc, EINA_FALSE);
1438 EINA_SAFETY_ON_NULL_RETURN_VAL(lc->ec, EINA_FALSE);
1439 EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler, EINA_FALSE);
1440 EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler->launcher_hash, EINA_FALSE);
1442 ret = eina_hash_add(_laundler->launcher_hash, &lc->ec, lc);
1444 _laundler->launcher_count++;
1450 _launcher_handler_launcher_del(E_Service_Launcher *lc)
1454 EINA_SAFETY_ON_NULL_RETURN_VAL(lc, EINA_FALSE);
1455 EINA_SAFETY_ON_NULL_RETURN_VAL(lc->ec, EINA_FALSE);
1456 EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler, EINA_FALSE);
1457 EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler->launcher_hash, EINA_FALSE);
1459 ret = eina_hash_del(_laundler->launcher_hash, &lc->ec, lc);
1460 if (ret) _laundler->launcher_count--;
1466 _launcher_handler_launcher_runner_set(E_Service_Launcher *lc)
1468 E_Service_Launcher *runner = NULL;
1470 EINA_SAFETY_ON_NULL_RETURN(_laundler);
1471 if (_laundler->runner == lc) return;
1473 //reset previous runner
1474 runner = _laundler->runner;
1477 switch (runner->state)
1479 case LAUNCHER_STATE_PREPARING:
1480 case LAUNCHER_STATE_LAUNCHING:
1481 case LAUNCHER_STATE_LAUNCHING_WAIT_BUFFER:
1482 _launcher_state_set(runner, LAUNCHER_STATE_CANCELED);
1483 _launcher_stop_send(runner);
1484 if (runner->direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD)
1485 _launcher_post_forward(runner, EINA_FALSE);
1486 else if (runner->direction == TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD)
1487 _launcher_post_backward(runner, EINA_FALSE);
1489 case LAUNCHER_STATE_MONITORING:
1490 _launcher_state_set(runner, LAUNCHER_STATE_CANCELED);
1491 _launcher_stop_send(runner);
1492 runner->target.pid = -1;
1493 runner->target.ec = NULL;
1494 E_FREE_FUNC(runner->target.appid, eina_stringshare_del);
1495 E_FREE_FUNC(runner->target.splash_path, eina_stringshare_del);
1496 E_FREE_FUNC(runner->target.splash_group, eina_stringshare_del);
1501 _launcher_handler_launcher_pre_runner_set(runner);
1504 ELOGF("LAUNCHER_SRV", "runner change %p(ec:%p) to %p(ec:%p)",
1505 NULL, runner, runner?runner->ec:NULL, lc, lc?lc->ec:NULL);
1507 _laundler->runner = lc;
1511 _launcher_handler_launcher_runner_unset(E_Service_Launcher *lc)
1513 EINA_SAFETY_ON_NULL_RETURN(_laundler);
1514 if (_laundler->runner != lc) return;
1516 _laundler->runner = NULL;
1518 ELOGF("LAUNCHER_SRV", "runner unset %p(ec:%p)",
1519 NULL, lc, lc?lc->ec:NULL);
1522 static E_Service_Launcher *
1523 _launcher_handler_launcher_runner_get(void)
1525 EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler, NULL);
1526 return _laundler->runner;
1530 _launcher_handler_launcher_pre_runner_set(E_Service_Launcher *lc)
1532 E_Service_Launcher *pre_runner = NULL;
1534 EINA_SAFETY_ON_NULL_RETURN(_laundler);
1536 pre_runner = _laundler->pre_runner;
1537 if (pre_runner == lc) return;
1540 if (pre_runner->launched_ec)
1541 e_policy_animatable_lock(pre_runner->launched_ec, E_POLICY_ANIMATABLE_CUSTOMIZED, 0);
1542 _launcher_state_set(pre_runner, LAUNCHER_STATE_IDLE);
1545 _laundler->pre_runner = lc;
1547 ELOGF("LAUNCHER_SRV", "pre_runner change %p(ec:%p) to %p(ec:%p)",
1548 NULL, pre_runner, pre_runner?pre_runner->ec:NULL, lc, lc?lc->ec:NULL);
1552 _launcher_handler_launcher_pre_runner_unset(E_Service_Launcher *lc)
1554 EINA_SAFETY_ON_NULL_RETURN(_laundler);
1555 if (_laundler->pre_runner != lc) return;
1557 _laundler->pre_runner = NULL;
1559 ELOGF("LAUNCHER_SRV", "pre_runner unset %p(ec:%p)",
1560 NULL, lc, lc?lc->ec:NULL);
1563 static E_Service_Launcher *
1564 _launcher_handler_launcher_pre_runner_get(void)
1566 EINA_SAFETY_ON_NULL_RETURN_VAL(_laundler, NULL);
1567 return _laundler->pre_runner;
1571 _launcher_handler_cb_hook_vis_uniconify_render_running(void *data EINA_UNUSED, E_Client *ec)
1573 E_Service_Launcher *lc = NULL;
1574 E_Service_Launcher *runner, *pre_runner = NULL;
1575 E_Client *activity = NULL, *prov_ec = NULL;
1576 Launcher_State new_state;
1578 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
1580 lc = _launcher_handler_launcher_find(ec);
1583 prov_ec = _launcher_handler_rsm_provider_client_find(ec);
1586 /* find launcher handler again with provider ec */
1587 lc = _launcher_handler_launcher_find(prov_ec);
1588 /* set rsm provider ec pointer value to given ec (rsm consumer) */
1592 if (!lc) return EINA_TRUE;
1594 activity = e_policy_visibility_main_activity_get();
1595 EINA_SAFETY_ON_NULL_RETURN_VAL(activity, EINA_TRUE);
1599 ELOGF("LAUNCHER_SRV", "Hook uniconify render begin target.ec:%p activity:%p launched_ec:%p",
1600 ec, lc->target.ec, activity, lc->launched_ec);
1602 if (activity == lc->launched_ec)
1604 int sent = EINA_FALSE;
1606 ELOGF("LAUNCHER_SRV", "Current activity(%p, is_del:%d) was launched by launcher.",
1607 ec, activity, e_object_is_del(E_OBJECT(activity)));
1610 runner = _launcher_handler_launcher_runner_get();
1613 ELOGF("LAUNCHER_SRV",
1614 "Launcher(%s) is already runner, do nothing",
1615 lc->ec, _launcher_state_to_str(lc->state));
1619 pre_runner = _launcher_handler_launcher_pre_runner_get();
1620 if (pre_runner == lc)
1622 _launcher_handler_launcher_pre_runner_set(NULL);
1627 sent = _launcher_prepare_shared_widget_backward_send
1628 (lc, activity, activity,
1629 (E_VIS_JOB_TYPE_UNICONIFY |
1630 E_VIS_JOB_TYPE_UNICONIFY_BY_VISIBILITY));
1632 new_state = LAUNCHER_STATE_WAIT_RESPONSE_FROM_CALLEE;
1636 sent = _launcher_prepare_backward_send
1637 (lc, activity, activity,
1638 (E_VIS_JOB_TYPE_UNICONIFY |
1639 E_VIS_JOB_TYPE_UNICONIFY_BY_VISIBILITY));
1641 new_state = LAUNCHER_STATE_PREPARING;
1645 if (!sent) return EINA_FALSE;
1647 _launcher_state_set(lc, new_state);
1648 _launcher_handler_launcher_runner_set(lc);
1656 _launcher_handler_cb_hook_vis_lower(void *data EINA_UNUSED, E_Client *ec)
1658 E_Service_Launcher *lc = NULL;
1659 E_Service_Launcher *runner, *pre_runner;
1660 E_Client *activity = NULL, *prov_ec = NULL;
1661 Launcher_State new_state;
1663 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
1665 activity = e_policy_visibility_main_activity_get();
1666 EINA_SAFETY_ON_NULL_RETURN_VAL(activity, EINA_FALSE);
1668 lc = _launcher_handler_launcher_find(activity);
1671 prov_ec = _launcher_handler_rsm_provider_client_find(activity);
1674 /* find launcher handler again with provider activity */
1675 lc = _launcher_handler_launcher_find(prov_ec);
1678 if (!lc) return EINA_FALSE;
1680 if (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED) return EINA_FALSE;
1682 if (ec == lc->launched_ec)
1684 Eina_Bool sent = EINA_FALSE;
1685 ELOGF("LAUNCHER_SRV", "Lower hook of launched_ec(%p)", lc->ec, ec);
1688 runner = _launcher_handler_launcher_runner_get();
1691 ELOGF("LAUNCHER_SRV",
1692 "Launcher(%s) is already runner, do nothing",
1693 lc->ec, _launcher_state_to_str(lc->state));
1697 pre_runner = _launcher_handler_launcher_pre_runner_get();
1698 if (pre_runner == lc)
1700 _launcher_handler_launcher_pre_runner_set(NULL);
1705 sent = _launcher_prepare_shared_widget_backward_send(lc, activity, ec, E_VIS_JOB_TYPE_LOWER);
1706 new_state = LAUNCHER_STATE_WAIT_RESPONSE_FROM_CALLEE;
1710 sent = _launcher_prepare_backward_send(lc, activity, ec, E_VIS_JOB_TYPE_LOWER);
1711 new_state = LAUNCHER_STATE_PREPARING;
1714 if (!sent) return EINA_FALSE;
1716 _launcher_state_set(lc, new_state);
1717 _launcher_handler_launcher_runner_set(lc);
1724 _launcher_handler_cb_hook_vis_hide(void *data EINA_UNUSED, E_Client *ec)
1726 E_Service_Launcher *lc = NULL;
1727 E_Service_Launcher *runner, *pre_runner;
1728 E_Client *activity = NULL, *prov_ec = NULL;
1729 Launcher_State new_state;
1731 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
1733 activity = e_policy_visibility_main_activity_get();
1734 EINA_SAFETY_ON_NULL_RETURN_VAL(activity, EINA_FALSE);
1736 lc = _launcher_handler_launcher_find(activity);
1739 prov_ec = _launcher_handler_rsm_provider_client_find(activity);
1742 /* find launcher handler again with provider ec */
1743 lc = _launcher_handler_launcher_find(prov_ec);
1749 * activity: callee ec
1750 * given ec: callee ec (transient_for child) <-- destroying by back key
1751 * caller ec (transient_for parent) <-- will be shown
1753 * In this case, the given ec is a callee ec and is transient_for with caller ec (lc) by
1754 * group launching. Also, because of transient_for, caller ec is not iconified.
1755 * Since the given ec is destroyed by the back key, we can't find out caller ec(lc) with activity and given ec.
1756 * We have to use transient_for to find caller ec(lc).
1760 ELOGF("LAUNCHER_SRV", "Hide hook of ec->parent(%p)", ec, ec->parent);
1761 lc = _launcher_handler_launcher_find(ec->parent);
1762 if ((lc) && (lc->launched_ec != ec)) lc = NULL;
1766 ELOGF("LAUNCHER_SRV", "Hide hook of ec->parent(NULL)", ec);
1770 if (!lc) return EINA_FALSE;
1772 if (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED) return EINA_FALSE;
1774 if (ec == lc->launched_ec)
1776 Eina_Bool sent = EINA_FALSE;
1777 ELOGF("LAUNCHER_SRV", "Hide hook of launched_ec(%p)", lc->ec, ec);
1780 runner = _launcher_handler_launcher_runner_get();
1783 ELOGF("LAUNCHER_SRV",
1784 "Launcher(%s) is already runner, do nothing",
1785 lc->ec, _launcher_state_to_str(lc->state));
1789 pre_runner = _launcher_handler_launcher_pre_runner_get();
1790 if (pre_runner == lc)
1792 _launcher_handler_launcher_pre_runner_set(NULL);
1797 sent = _launcher_prepare_shared_widget_backward_send(lc, activity, ec, E_VIS_JOB_TYPE_HIDE);
1798 new_state = LAUNCHER_STATE_WAIT_RESPONSE_FROM_CALLEE;
1802 sent = _launcher_prepare_backward_send(lc, activity, ec, E_VIS_JOB_TYPE_HIDE);
1803 new_state = LAUNCHER_STATE_PREPARING;
1805 if (!sent) return EINA_FALSE;
1807 _launcher_state_set(lc, new_state);
1808 _launcher_handler_launcher_runner_set(lc);
1815 _launcher_handler_cb_hook_client_del(void *data EINA_UNUSED, E_Client *ec)
1817 E_Service_Launcher *lc;
1819 EINA_SAFETY_ON_NULL_RETURN(ec);
1821 lc = _launcher_handler_launcher_find(ec);
1824 if (lc->ec == ec) //launcher surface is gone.
1826 _launcher_handler_launcher_del(lc);
1827 _launcher_data_reset(lc);
1833 _launcher_handler_cb_hook_intercept_show_helper(void *data, E_Client *ec)
1835 E_Service_Launcher *runner;
1836 Eina_Bool sent = EINA_FALSE;
1838 runner = _launcher_handler_launcher_runner_get();
1840 if (!runner) goto show_allow;
1841 EINA_SAFETY_ON_NULL_GOTO(ec, show_allow);
1843 if (ec->new_client) goto show_allow;
1845 switch (runner->state)
1847 case LAUNCHER_STATE_LAUNCHING_WAIT_BUFFER: //waiting buffer change
1848 if (ec == runner->ec)
1851 case LAUNCHER_STATE_PREPARING: //waiting launcher client's preparation
1852 case LAUNCHER_STATE_WAIT_RESPONSE_FROM_CALLEE:
1853 if (ec == runner->target.ec) goto show_deny;
1855 case LAUNCHER_STATE_LAUNCHING: //doing animation
1856 if (ec == runner->target.ec) goto show_deny; //don't show launched app window
1857 else if (ec == runner->ec) goto show_allow; //show launcher
1859 case LAUNCHER_STATE_MONITORING: //waiting creation of target window
1860 if ((runner->target.pid >= 0) && (ec->netwm.pid != runner->target.pid)) goto show_allow; //detect by pid
1861 if ((runner->target.appid) && (runner->target.ec) && (runner->target.ec != ec)) goto show_allow; //detect by appid
1862 if ((runner->target.appid) && (runner->target.pid < 0) && (!runner->target.ec)) goto show_allow; //not enough info
1863 if (e_object_is_del(E_OBJECT(ec))) goto show_allow;
1865 if (runner->with_swl)
1867 sent = _launcher_prepare_shared_widget_forward_send(runner, ec);
1868 EINA_SAFETY_ON_FALSE_GOTO(sent, send_stop);
1870 _launcher_state_set(runner, LAUNCHER_STATE_WAIT_RESPONSE_FROM_CALLEE);
1874 sent = _launcher_prepare_forward_send(runner, ec);
1875 EINA_SAFETY_ON_FALSE_GOTO(sent, send_stop);
1877 _launcher_state_set(runner, LAUNCHER_STATE_PREPARING);
1889 runner->target.pid = -1;
1891 runner->target.ec = NULL;
1892 E_FREE_FUNC(runner->target.appid, eina_stringshare_del);
1893 E_FREE_FUNC(runner->target.splash_path, eina_stringshare_del);
1894 E_FREE_FUNC(runner->target.splash_group, eina_stringshare_del);
1896 _launcher_stop_send(runner);
1897 _launcher_state_set(runner, LAUNCHER_STATE_IDLE);
1898 _launcher_handler_launcher_runner_unset(runner);
1902 static void _launcher_handler_cb_hook_appinfo_pid_set(const char *appid, pid_t pid, void *data)
1904 E_Service_Launcher *runner;
1906 EINA_SAFETY_ON_NULL_RETURN(appid);
1907 EINA_SAFETY_ON_TRUE_RETURN(pid < 0);
1909 runner = _launcher_handler_launcher_runner_get();
1910 if (!runner) return;
1911 if (runner->state != LAUNCHER_STATE_MONITORING) return;
1913 if (runner->target.appid)
1915 if (!e_util_strcmp(appid, runner->target.appid))
1917 runner->target.pid = pid;
1919 ELOGF("LAUNCHER_SRV", "Register callee pid:%d by appid(%s)",
1920 runner->ec, pid, runner->target.appid);
1926 _launcher_handler_cb_event_client_show(void *data, int type EINA_UNUSED, void *event)
1928 E_Service_Launcher *runner, *pre_runner;
1932 runner = _launcher_handler_launcher_runner_get();
1933 if (!runner) return ECORE_CALLBACK_PASS_ON;
1935 ev = (E_Event_Client *)event;
1936 EINA_SAFETY_ON_NULL_RETURN_VAL(ev, ECORE_CALLBACK_PASS_ON);
1937 EINA_SAFETY_ON_NULL_RETURN_VAL(ev->ec, ECORE_CALLBACK_PASS_ON);
1941 switch (runner->state)
1943 case LAUNCHER_STATE_MONITORING:
1944 if (ec->netwm.pid == runner->target.pid)
1947 case LAUNCHER_STATE_PREPARING:
1948 if (runner->direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD)
1950 if (ec == runner->target.ec) goto send_stop;
1952 else if (runner->direction == TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD)
1954 if (ec == runner->ec) goto send_stop;
1957 case LAUNCHER_STATE_LAUNCHING:
1958 if (runner->direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD)
1960 if (ec == runner->target.ec) goto send_stop;
1967 pre_runner = _launcher_handler_launcher_pre_runner_get();
1970 switch (pre_runner->state)
1972 case LAUNCHER_STATE_DONE:
1973 if (ec == pre_runner->launched_ec)
1974 _launcher_handler_launcher_pre_runner_set(NULL);
1976 case LAUNCHER_STATE_CANCELED:
1977 _launcher_handler_launcher_pre_runner_set(NULL);
1984 return ECORE_CALLBACK_PASS_ON;
1987 ELOGF("LAUNCHER_SRV", "CLIENT SHOW: Failure Case runner:%p", ec, runner);
1989 _launcher_stop_send(runner);
1991 if (runner->state == LAUNCHER_STATE_MONITORING)
1993 runner->target.pid = -1;
1996 else if (runner->direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD)
1997 _launcher_post_forward(runner, EINA_FALSE);
1998 else if (runner->direction == TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD)
1999 _launcher_post_backward(runner, EINA_FALSE);
2001 _launcher_state_set(runner, LAUNCHER_STATE_IDLE);
2002 _launcher_handler_launcher_runner_unset(runner);
2004 return ECORE_CALLBACK_PASS_ON;
2008 _launcher_handler_cb_event_client_visibility_change(void *data, int type EINA_UNUSED, void *event)
2010 E_Service_Launcher *pre_runner;
2014 ev = (E_Event_Client *)event;
2015 EINA_SAFETY_ON_NULL_RETURN_VAL(ev, ECORE_CALLBACK_PASS_ON);
2016 EINA_SAFETY_ON_NULL_RETURN_VAL(ev->ec, ECORE_CALLBACK_PASS_ON);
2019 if (ec->visibility.obscured != E_VISIBILITY_UNOBSCURED)
2020 return ECORE_CALLBACK_PASS_ON;
2022 pre_runner = _launcher_handler_launcher_pre_runner_get();
2025 switch (pre_runner->state)
2027 case LAUNCHER_STATE_DONE:
2028 case LAUNCHER_STATE_CANCELED:
2029 if (pre_runner->launched_ec)
2031 if (pre_runner->launched_ec == ec)
2033 e_policy_animatable_lock(pre_runner->launched_ec, E_POLICY_ANIMATABLE_CUSTOMIZED, 0);
2042 return ECORE_CALLBACK_PASS_ON;
2045 #undef LAUNCHER_HANDLER_CB_ADD
2046 #define LAUNCHER_HANDLER_CB_ADD(l, appender, event_type, cb, data) \
2050 _h = appender(event_type, cb, data); \
2052 l = eina_list_append(l, _h); \
2057 static E_Service_Launcher_Handler *
2058 _launcher_handler_create(void)
2060 E_Service_Launcher_Handler *laundler = NULL;
2062 laundler = E_NEW(E_Service_Launcher_Handler, 1);
2063 EINA_SAFETY_ON_NULL_RETURN_VAL(laundler, NULL);
2065 laundler->launcher_count = 0;
2066 laundler->launcher_hash = eina_hash_pointer_new(NULL);
2068 LAUNCHER_HANDLER_CB_ADD(laundler->hooks_vis,
2069 e_policy_visibility_hook_add,
2070 E_POL_VIS_HOOK_TYPE_UNICONIFY_RENDER_RUNNING,
2071 _launcher_handler_cb_hook_vis_uniconify_render_running, NULL);
2073 LAUNCHER_HANDLER_CB_ADD(laundler->hooks_vis,
2074 e_policy_visibility_hook_add,
2075 E_POL_VIS_HOOK_TYPE_LOWER,
2076 _launcher_handler_cb_hook_vis_lower, NULL);
2078 LAUNCHER_HANDLER_CB_ADD(laundler->hooks_vis,
2079 e_policy_visibility_hook_add,
2080 E_POL_VIS_HOOK_TYPE_HIDE,
2081 _launcher_handler_cb_hook_vis_hide, NULL);
2083 LAUNCHER_HANDLER_CB_ADD(laundler->hooks_ec,
2086 _launcher_handler_cb_hook_client_del, NULL);
2088 LAUNCHER_HANDLER_CB_ADD(laundler->hooks_co,
2089 e_comp_object_intercept_hook_add,
2090 E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER,
2091 _launcher_handler_cb_hook_intercept_show_helper, NULL);
2093 LAUNCHER_HANDLER_CB_ADD(laundler->hooks_appinfo,
2095 E_APPINFO_HOOK_PID_SET,
2096 _launcher_handler_cb_hook_appinfo_pid_set, NULL);
2098 LAUNCHER_HANDLER_CB_ADD(laundler->hdlrs_ev,
2099 ecore_event_handler_add,
2100 E_EVENT_CLIENT_SHOW,
2101 _launcher_handler_cb_event_client_show, NULL);
2103 LAUNCHER_HANDLER_CB_ADD(laundler->hdlrs_ev,
2104 ecore_event_handler_add,
2105 E_EVENT_CLIENT_VISIBILITY_CHANGE,
2106 _launcher_handler_cb_event_client_visibility_change, NULL);
2108 ELOGF("LAUNCHER_SRV", "new launcher handler(%p) created", NULL, laundler);
2114 _launcher_handler_destroy(E_Service_Launcher_Handler *laundler)
2116 EINA_SAFETY_ON_NULL_RETURN(laundler);
2118 E_FREE_LIST(laundler->hdlrs_ev, ecore_event_handler_del);
2119 E_FREE_LIST(laundler->hooks_appinfo, e_appinfo_hook_del);
2120 E_FREE_LIST(laundler->hooks_co, e_comp_object_intercept_hook_del);
2121 E_FREE_LIST(laundler->hooks_ec, e_client_hook_del);
2122 E_FREE_LIST(laundler->hooks_vis, e_policy_visibility_hook_del);
2124 E_FREE_FUNC(laundler->launcher_hash, eina_hash_free);
2129 e_service_launcher_resource_set(E_Client *ec, struct wl_resource *res_tws_lc)
2131 E_Service_Launcher *lc;
2133 EINA_SAFETY_ON_NULL_RETURN(ec);
2134 EINA_SAFETY_ON_NULL_RETURN(res_tws_lc);
2136 lc = _launcher_handler_launcher_find(ec);
2137 EINA_SAFETY_ON_NULL_RETURN(lc);
2138 EINA_SAFETY_ON_TRUE_RETURN(lc->ec != ec);
2141 _launcher_data_reset(lc);
2143 lc->res = res_tws_lc;
2144 wl_resource_set_implementation(res_tws_lc,
2145 &_launcher_iface, lc,
2146 _launcher_cb_resource_destroy);
2150 e_service_launcher_client_set(E_Client *ec)
2152 E_Service_Launcher *lc = NULL;
2154 EINA_SAFETY_ON_NULL_RETURN(ec);
2155 EINA_SAFETY_ON_TRUE_RETURN(e_object_is_del(E_OBJECT(ec)));
2157 if ((lc = _launcher_handler_launcher_find(ec)))
2159 ELOGF("LAUNCHER_SRV", "ec(%p) is already set as launcher(%p)",
2166 _laundler = _launcher_handler_create();
2167 EINA_SAFETY_ON_NULL_RETURN(_laundler);
2170 lc = E_NEW(E_Service_Launcher, 1);
2171 EINA_SAFETY_ON_NULL_RETURN(lc);
2174 if (!_launcher_handler_launcher_add(lc))
2177 ELOGF("LAUNCHER_SRV", "Fail to add launcher", ec);
2181 ELOGF("LAUNCHER_SRV", "client set|Created New Launcher(%p)", ec, lc);
2182 _launcher_state_set(lc, LAUNCHER_STATE_IDLE);
2188 e_service_launcher_client_unset(E_Client *ec)
2190 E_Service_Launcher *lc;
2192 EINA_SAFETY_ON_NULL_RETURN(ec);
2194 lc = _launcher_handler_launcher_find(ec);
2195 EINA_SAFETY_ON_NULL_RETURN(lc);
2197 _launcher_handler_launcher_del(lc);
2198 _launcher_data_reset(lc);
2201 ELOGF("LAUNCHER_SRV", "client unset", ec);
2203 if ((_laundler) && (_laundler->launcher_count == 0))
2205 ELOGF("LAUNCHER_SRV", "No launcher available, Destroy Launcher Handler(%p)",
2208 _launcher_handler_destroy(_laundler);
2214 e_service_launcher_prepare_send_with_shared_widget_info(E_Client *target_ec,
2215 const char *shared_widget_info,
2219 E_Service_Launcher *lc = NULL;
2222 Eina_Iterator *hash_iter;
2223 Eina_Bool found = EINA_FALSE;
2225 EINA_SAFETY_ON_NULL_RETURN(_laundler);
2227 /* look for launcher service object which has given target_ec */
2228 hash_iter = eina_hash_iterator_data_new(_laundler->launcher_hash);
2229 EINA_ITERATOR_FOREACH(hash_iter, lc)
2231 if (lc->target.ec != target_ec) continue;
2232 if (lc->serial != serial) continue;
2236 eina_iterator_free(hash_iter);
2238 EINA_SAFETY_ON_FALSE_RETURN(found);
2239 EINA_SAFETY_ON_NULL_RETURN(lc);
2241 ELOGF("LAUNCHER_SRV", "SWL | callee(%p) cb(PREPARE_DONE(%d))",
2242 lc->ec, target_ec, state);
2244 if (state == TWS_SHARED_WIDGET_LAUNCH_PREPARE_STATE_WIDGET_HIDE)
2246 e_client_pos_get(target_ec, &x, &y);
2248 sent = _launcher_prepare_send(lc, target_ec, x, y, shared_widget_info);
2249 EINA_SAFETY_ON_FALSE_GOTO(sent, error);
2251 _launcher_state_set(lc, LAUNCHER_STATE_PREPARING);
2253 else if (state == TWS_SHARED_WIDGET_LAUNCH_PREPARE_STATE_WIDGET_SHOW)
2255 if (!lc->buff_attach)
2257 if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD)
2258 _launcher_post_forward(lc, EINA_TRUE);
2259 else if (lc->direction == TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD)
2260 _launcher_post_backward(lc, EINA_TRUE);
2262 _launcher_handler_launcher_runner_unset(lc);
2263 _launcher_handler_launcher_pre_runner_set(lc);
2264 _launcher_state_set(lc, LAUNCHER_STATE_DONE);
2267 lc->swl_done = EINA_TRUE;
2269 ELOGF("LAUNCHER_SRV", "SWL | send CLEANUP", lc->ec);
2270 tws_service_launcher_send_cleanup(lc->res,
2277 ELOGF("LAUNCHER_SRV", "Failed to send event(PREPARE:FORWARD)", lc->ec);
2278 _launcher_post_forward(lc, EINA_FALSE);
2282 e_service_launcher_release_shared_widget_launch(E_Client *ec)
2284 E_Service_Launcher *runner;
2286 EINA_SAFETY_ON_NULL_RETURN(ec);
2288 runner = _launcher_handler_launcher_runner_get();
2289 EINA_SAFETY_ON_NULL_RETURN(runner);
2291 ELOGF("LAUNCHER_SRV", "Released tzsh_swl", ec);
2293 if ((runner) && (runner->target.ec == ec))
2295 if (runner->with_swl)
2297 //callee is gone before replying prepare_done
2298 if (runner->state == LAUNCHER_STATE_WAIT_RESPONSE_FROM_CALLEE)
2300 if (runner->direction == TWS_SERVICE_LAUNCHER_DIRECTION_FORWARD)
2301 _launcher_post_forward(runner, EINA_FALSE);
2302 else if (runner->direction == TWS_SERVICE_LAUNCHER_DIRECTION_BACKWARD)
2303 _launcher_post_backward(runner, EINA_FALSE);
2305 _launcher_state_set(runner, LAUNCHER_STATE_IDLE);
2306 _launcher_launched_ec_set(runner, NULL);
2308 _launcher_handler_launcher_runner_unset(runner);
2309 _launcher_handler_launcher_pre_runner_unset(runner);
2311 runner->direction = 0;
2312 runner->with_swl = 0;
2319 e_service_launcher_callee_register(E_Client *callee, const char *appid, const char *splash_path, const char *splash_group)
2321 E_Service_Launcher *runner;
2323 EINA_SAFETY_ON_NULL_RETURN(callee);
2325 runner = _launcher_handler_launcher_runner_get();
2326 EINA_SAFETY_ON_NULL_RETURN(runner);
2327 EINA_SAFETY_ON_TRUE_RETURN(runner->state != LAUNCHER_STATE_MONITORING);
2329 if (runner->target.appid)
2331 if (!e_util_strcmp(appid, runner->target.appid))
2333 runner->target.ec = callee;
2334 runner->target.splash_path = eina_stringshare_add(splash_path);
2335 runner->target.splash_group = eina_stringshare_add(splash_group);
2337 ELOGF("LAUNCHER_SRV", "Register callee(%p) by appid(%s)",
2338 runner->ec, runner->target.ec, runner->target.appid);