1 #include "e_mod_comp_shared_types.h"
2 #include "e_mod_comp.h"
3 #include "e_mod_comp_atoms.h"
4 #include "e_mod_comp_debug.h"
5 #include "e_mod_comp_effect_image_launch.h"
7 struct _E_Comp_Effect_Image_Launch
10 Eina_Bool fake_image_show_done : 1; // image launch edje object got effect done or not.
11 Evas_Object *obj; // image object
12 Evas_Object *shobj; // image shadow object
13 Ecore_Timer *timeout; // max time between show, hide image launch
14 Ecore_X_Window win; // this represent image launch effect's real window id.
15 int w, h; // width and height of image object
16 int rot; // rotation angle
17 int indicator_show; // indicator enable / disable flag
18 Evas_Object* indicator_obj; // plugin indicator object
19 Evas_Object* layer_obj; // evas_object between normal layer with float layer
22 /* local subsystem functions */
23 static void _show_done(void *data, Evas_Object *obj, const char *emission, const char *source);
24 static void _hide_done(void *data, Evas_Object *obj, const char *emission, const char *source);
25 static Eina_Bool _launch_timeout(void *data);
26 static E_Comp_Win *_appinapp_bottom_win_get(E_Comp_Win *normal_top);
28 /* local subsystem globals */
30 /* externally accessible functions */
31 EINTERN E_Comp_Effect_Image_Launch *
32 e_mod_comp_effect_image_launch_new(Evas *e,
35 E_Comp_Effect_Image_Launch *eff;
39 E_Comp_Win *layers_cw = NULL;
44 E_CHECK_RETURN(e, NULL);
46 eff = E_NEW(E_Comp_Effect_Image_Launch, 1);
47 E_CHECK_RETURN(eff, NULL);
49 eff->shobj = edje_object_add(e);
50 E_CHECK_GOTO(eff->shobj, error);
54 ee = ecore_evas_ecore_evas_get(e);
55 E_CHECK_GOTO(ee, error);
56 eff->indicator_obj = ecore_evas_extn_plug_new(ee);
57 E_CHECK_GOTO(eff->indicator_obj, error);
59 ok = edje_object_file_set
61 _comp_mod->conf->shadow_file,
63 E_CHECK_GOTO(ok, error);
68 evas_object_move(eff->shobj, 0, 0);
69 evas_object_resize(eff->shobj, w, h);
71 eff->obj = evas_object_image_add(e);
72 E_CHECK_GOTO(eff->obj, error);
74 edje_object_signal_callback_add
75 (eff->shobj, "fake,action,hide,done", "fake",
78 edje_object_signal_callback_add
79 (eff->shobj, "fake,action,show,done", "fake",
82 // check fake image object stack (Choice proper layer)
83 eff->layer_obj = NULL;
84 layer = _comp_mod->conf->fake_launch_layer;
85 con = e_container_current_get(e_manager_current_get());
87 layers_cw = e_mod_comp_win_find(con->layers[layer].win);
91 EINA_LIST_FOREACH(layers_cw->objs, ll, co)
94 eff->layer_obj = co->shadow;
101 e_mod_comp_effect_image_launch_free(eff);
106 e_mod_comp_effect_image_launch_free(E_Comp_Effect_Image_Launch *eff)
109 if (eff->shobj) evas_object_del(eff->shobj);
110 if (eff->obj) evas_object_del(eff->obj);
115 e_mod_comp_effect_image_launch_handler_message(Ecore_X_Event_Client_Message *ev)
117 E_Comp_Effect_Image_Launch *eff;
121 E_CHECK_RETURN(ev, 0);
123 c = e_mod_comp_find(ev->win);
124 E_CHECK_RETURN(c, 0);
125 E_CHECK_RETURN(c->fake_image_launch, 0);
128 E_CHECK_RETURN(eff, 0);
130 eff->rot = ev->data.l[1]; //rotation value
131 eff->indicator_show = ev->data.l[2]; //indicator flag value
133 if (ev->data.l[0] == 0)
135 e_mod_comp_effect_image_launch_hide(eff);
137 else if (ev->data.l[0] == 1)
139 file = ecore_x_window_prop_string_get
140 (ev->win, ATOM_IMAGE_LAUNCH_FILE);
141 E_CHECK_RETURN(file, 0);
143 e_mod_comp_effect_image_launch_show(eff, file);
151 e_mod_comp_effect_image_launch_show(E_Comp_Effect_Image_Launch *eff,
154 E_Comp *c = e_mod_comp_util_get();
155 E_Comp_Win *bg_cw = NULL;
162 E_Comp_Win *bottom_appinapp_cw = NULL;
164 E_CHECK_RETURN(eff, 0);
165 E_CHECK_RETURN(file, 0);
166 E_CHECK_RETURN(c, 0);
168 grabbed = e_mod_comp_util_grab_key_set(EINA_TRUE);
169 E_CHECK_RETURN(grabbed, 0);
171 eff->running = EINA_TRUE;
174 evas_object_image_file_set(eff->obj, file, NULL);
175 err = evas_object_image_load_error_get(eff->obj);
176 E_CHECK_GOTO(err == EVAS_LOAD_ERROR_NONE, error);
178 evas_object_image_size_get(eff->obj, &(img_w), &(img_h));
179 evas_object_image_fill_set(eff->obj, 0, 0, img_w, img_h);
180 evas_object_image_filled_set(eff->obj, EINA_TRUE);
182 evas_object_show(eff->obj);
184 res = edje_object_part_swallow
185 (eff->shobj, "fake.swallow.content", eff->obj);
186 E_CHECK_GOTO(res, error);
188 if ((eff->rot == 0) || (eff->rot == 180))//portrait mode
190 evas_object_move(eff->shobj, 0, 0);
191 evas_object_resize(eff->shobj, eff->w, eff->h);
193 //get indicator object
194 if (eff->indicator_show)
196 if (!ecore_evas_extn_plug_connect(eff->indicator_obj, "elm_indicator_portrait", 0, EINA_FALSE))
197 eff->indicator_show = 0;
200 else //landscape mode
202 evas_object_move(eff->shobj, (eff->w - eff->h)/2, (eff->h - eff->w)/2);
203 evas_object_resize(eff->shobj, eff->h, eff->w);
205 //get indicator object
206 if (eff->indicator_show)
208 if (!ecore_evas_extn_plug_connect(eff->indicator_obj, "elm_indicator_landscape", 0, EINA_FALSE))
209 eff->indicator_show = 0;
213 if (eff->indicator_show)
215 evas_object_show(eff->indicator_obj);
216 res = edje_object_part_swallow
217 (eff->shobj, "fake.swallow.indicator", eff->indicator_obj);
218 E_CHECK_GOTO(res, error);
221 // set position of fake launch image
224 evas_object_stack_above(eff->shobj, eff->layer_obj);
228 bottom_appinapp_cw = _appinapp_bottom_win_get(bg_cw);
230 if (bottom_appinapp_cw)
232 EINA_LIST_FOREACH(bottom_appinapp_cw->objs, ll, co)
235 evas_object_stack_below(eff->shobj, co->shadow);
239 evas_object_raise(eff->shobj);
242 evas_object_show(eff->shobj);
249 e_mod_comp_effect_signal_add
251 "fake,state,visible,90,on", "fake");
254 e_mod_comp_effect_signal_add
256 "fake,state,visible,180,on", "fake");
259 e_mod_comp_effect_signal_add
261 "fake,state,visible,270,on", "fake");
264 e_mod_comp_effect_signal_add
266 "fake,state,visible,on", "fake");
275 e_mod_comp_effect_signal_add
277 "fake,state,visible,90,on,noeffect", "fake");
280 e_mod_comp_effect_signal_add
282 "fake,state,visible,180,on,noeffect", "fake");
285 e_mod_comp_effect_signal_add
287 "fake,state,visible,270,on,noeffect", "fake");
290 e_mod_comp_effect_signal_add
292 "fake,state,visible,on,noeffect", "fake");
296 eff->timeout = ecore_timer_add(10.0f, _launch_timeout, eff);
297 e_mod_comp_util_screen_input_region_set(EINA_TRUE);
299 e_mod_comp_render_queue(c);
303 eff->running = EINA_FALSE;
305 e_mod_comp_util_grab_key_set(EINA_FALSE);
310 e_mod_comp_effect_image_launch_hide(E_Comp_Effect_Image_Launch *eff)
312 E_Comp *c = e_mod_comp_util_get();
313 E_CHECK_RETURN(c, 0);
314 E_CHECK_RETURN(eff, 0);
317 ecore_timer_del(eff->timeout);
325 e_mod_comp_effect_signal_add
327 "fake,state,visible,90,off", "fake");
330 e_mod_comp_effect_signal_add
332 "fake,state,visible,180,off", "fake");
335 e_mod_comp_effect_signal_add
337 "fake,state,visible,270,off", "fake");
340 e_mod_comp_effect_signal_add
342 "fake,state,visible,off", "fake");
347 e_mod_comp_effect_signal_add
349 "fake,state,visible,off,noeffect", "fake");
351 e_mod_comp_render_queue(c);
356 e_mod_comp_effect_image_launch_window_check(E_Comp_Effect_Image_Launch *eff, E_Comp_Win *cw)
358 E_CHECK_RETURN(eff, 0);
359 E_CHECK_RETURN(eff->running, 0);
360 E_CHECK_RETURN(cw, 0);
361 E_CHECK_RETURN(cw->bd, 0);
363 if ( REGION_EQUAL_TO_ROOT(cw) && TYPE_NORMAL_CHECK(cw))
371 e_mod_comp_effect_image_launch_running_check(E_Comp_Effect_Image_Launch *eff)
373 E_CHECK_RETURN(eff, 0);
378 e_mod_comp_effect_image_launch_fake_show_done_check(E_Comp_Effect_Image_Launch *eff)
380 E_CHECK_RETURN(eff, 0);
381 return eff->fake_image_show_done;
385 e_mod_comp_effect_image_launch_window_set(E_Comp_Effect_Image_Launch *eff,
388 E_CHECK_RETURN(eff, 0);
389 E_CHECK_RETURN(w, 0);
395 e_mod_comp_effect_image_launch_disable(E_Comp_Effect_Image_Launch *eff)
398 E_CHECK(eff->running);
400 eff->running = EINA_FALSE;
401 eff->fake_image_show_done= EINA_FALSE;
404 e_mod_comp_util_screen_input_region_set(EINA_FALSE);
405 e_mod_comp_util_grab_key_set(EINA_FALSE);
407 E_Comp *c = e_mod_comp_util_get();
409 e_mod_comp_win_shape_input_update(c);
412 ecore_timer_del(eff->timeout);
415 if (eff->indicator_show)
417 edje_object_part_unswallow(eff->shobj, eff->indicator_obj);
418 evas_object_hide(eff->indicator_obj);
420 edje_object_part_unswallow(eff->shobj, eff->obj);
422 evas_object_hide(eff->shobj);
423 evas_object_hide(eff->obj);
427 _appinapp_bottom_win_get(E_Comp_Win *normal_top)
429 E_Comp *c = e_mod_comp_util_get();
430 E_Comp_Win *cw = NULL;
431 E_Comp_Win *_cw = NULL;
432 E_CHECK_RETURN(c, 0);
433 Ecore_X_Window win = 0;
436 win = normal_top->win;
438 EINA_INLIST_REVERSE_FOREACH(c->wins, cw)
440 if((cw->win) == (win)) break;
441 if (!(cw->bd)) continue;
443 if(cw->bd->client.illume.win_state.state == ECORE_X_ILLUME_WINDOW_STATE_FLOATING)
450 _show_done(void *data,
451 Evas_Object *obj __UNUSED__,
452 const char *emission __UNUSED__,
453 const char *source __UNUSED__)
456 E_Comp_Effect_Image_Launch *eff;
457 eff = (E_Comp_Effect_Image_Launch *)data;
460 eff->fake_image_show_done = EINA_TRUE;
464 cw = e_mod_comp_win_find(eff->win);
467 e_mod_comp_effect_signal_add
468 (cw, NULL, "e,state,visible,on,noeffect", "e");
469 e_mod_comp_comp_event_src_visibility_send(cw);
470 e_mod_comp_effect_image_launch_disable(eff);
472 e_mod_comp_win_render_queue(cw);
476 _hide_done(void *data,
477 Evas_Object *obj __UNUSED__,
478 const char *emission __UNUSED__,
479 const char *source __UNUSED__)
481 E_Comp_Effect_Image_Launch *eff;
482 eff = (E_Comp_Effect_Image_Launch *)data;
485 e_mod_comp_util_screen_input_region_set(EINA_FALSE);
486 e_mod_comp_util_grab_key_set(EINA_FALSE);
488 if (eff->indicator_show)
490 edje_object_part_unswallow(eff->shobj, eff->indicator_obj);
491 evas_object_hide(eff->indicator_obj);
493 edje_object_part_unswallow(eff->shobj, eff->obj);
494 evas_object_hide(eff->shobj);
495 evas_object_hide(eff->obj);
499 _launch_timeout(void *data)
501 E_Comp_Effect_Image_Launch *eff;
502 E_Comp *c = e_mod_comp_util_get();
503 eff = (E_Comp_Effect_Image_Launch *)data;
505 E_CHECK_RETURN(c, 0);
506 E_CHECK_RETURN(eff, 0);
509 ecore_timer_del(eff->timeout);
512 eff->running = EINA_FALSE;
514 eff->fake_image_show_done = EINA_FALSE;
521 e_mod_comp_effect_signal_add
523 "fake,state,visible,90,off", "fake");
526 e_mod_comp_effect_signal_add
528 "fake,state,visible,180,off", "fake");
531 e_mod_comp_effect_signal_add
533 "fake,state,visible,270,off", "fake");
536 e_mod_comp_effect_signal_add
538 "fake,state,visible,off", "fake");
543 e_mod_comp_effect_signal_add
545 "fake,state,visible,off,noeffect", "fake");
547 e_mod_comp_render_queue(c);