tizen 2.4 release
[framework/uifw/e17-mod-tizen-comp.git] / src / effect / effect_image_launch.c
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"
6
7 #include "effect.h"
8 #include "effect_image_launch.h"
9 #include "effect_win_rotation.h"
10
11 #define FAKE_TABLE_PATH "/usr/share/themes/LaunchColorTable.xml"
12 #define APP_DEFINE_GROUP_NAME "effect"
13
14 /* local subsystem functions */
15 static void      _show_done(void *data, Evas_Object *obj, const char *emission, const char *source);
16 static void      _hide_done(void *data, Evas_Object *obj, const char *emission, const char *source);
17 static Eina_Bool _launch_timeout(void *data);
18 /* local subsystem globals */
19
20 /* externally accessible functions */
21 E_Comp_Effect_Image_Launch *
22 _effect_mod_image_launch_new(Evas *e,
23                                    int w, int h)
24 {
25    E_Comp_Effect_Image_Launch *eff;
26    int ok = 0;
27
28    E_Container *con;
29    E_Comp_Win *layers_cw = NULL;
30    Eina_List *ll;
31    E_Comp_Object *co;
32    int layer;
33
34    E_CHECK_RETURN(e, NULL);
35
36    eff = E_NEW(E_Comp_Effect_Image_Launch, 1);
37    E_CHECK_RETURN(eff, NULL);
38
39    eff->shobj = edje_object_add(e);
40    E_CHECK_GOTO(eff->shobj, error);
41
42    //get ecore_evas and save
43    Ecore_Evas *ee;
44    ee = ecore_evas_ecore_evas_get(e);
45    E_CHECK_GOTO(ee, error);
46    eff->ecore_evas = ee;
47    eff->evas = e;
48
49    ok = edje_object_file_set
50           (eff->shobj,
51           _comp_mod->conf->shadow_file,
52           "fake_effect_fade");
53    E_CHECK_GOTO(ok, error);
54
55    eff->w = w;
56    eff->h = h;
57
58    evas_object_move(eff->shobj, 0, 0);
59    evas_object_resize(eff->shobj, w, h);
60
61    edje_object_signal_callback_add
62      (eff->shobj, "fake,action,hide,done", "fake",
63      _hide_done, eff);
64
65    edje_object_signal_callback_add
66      (eff->shobj, "fake,action,show,done", "fake",
67      _show_done, eff);
68
69    return eff;
70
71 error:
72    _effect_mod_image_launch_free(eff);
73    return NULL;
74 }
75
76 void
77 _effect_mod_image_launch_free(E_Comp_Effect_Image_Launch *eff)
78 {
79    E_CHECK(eff);
80    if (eff->shobj) evas_object_del(eff->shobj);
81    if (eff->obj) evas_object_del(eff->obj);
82    E_FREE(eff);
83 }
84
85 Eina_Bool
86 _effect_mod_image_launch_handler_message(Ecore_X_Event_Client_Message *ev)
87 {
88    E_Comp_Effect_Image_Launch *eff;
89    E_Comp *c = NULL;
90    char *file = NULL;
91
92    E_CHECK_RETURN(ev, 0);
93
94    c = e_mod_comp_find(ev->win);
95    E_CHECK_RETURN(c, 0);
96    E_CHECK_RETURN(c->fake_image_launch, 0);
97
98    eff = c->eff_img;
99    E_CHECK_RETURN(eff, 0);
100
101    eff->file_type = ev->data.l[0]; //fake effect file type
102    eff->rot = ev->data.l[1]; //rotation value
103    eff->indicator_show = ev->data.l[2]; //indicator flag value
104    eff->theme_type = ev->data.l[3]; //fake effect theme type
105
106    file = ecore_x_window_prop_string_get
107         (ev->win, ATOM_IMAGE_LAUNCH_FILE);
108    E_CHECK_RETURN(file, 0);
109
110    ELBF(ELBT_COMP, 0, 0,
111         "%15.15s| type:%d, ROT:%d, Indi:%d, theme:%d", "FAKE SHOW",
112         eff->file_type, eff->rot, eff->indicator_show, eff->theme_type);
113
114    ELBF(ELBT_COMP, 0, 0,
115         "%15.15s| File:%s", "FAKE SHOW", file);
116
117
118    _effect_mod_image_launch_show(eff, file);
119    E_FREE(file);
120
121    return EINA_TRUE;
122 }
123
124 Eina_Bool
125 _effect_mod_image_launch_show(E_Comp_Effect_Image_Launch *eff,
126                                     const char *file)
127 {
128    E_Comp *c = e_mod_comp_util_get();
129    E_Comp_Win *bg_cw = NULL;
130    Eina_Bool grabbed;
131    Evas_Load_Error err;
132    Eina_Bool res;
133    int img_w, img_h;
134    E_Comp_Canvas *canvas;
135    E_Comp_Layer *ly;
136
137    E_CHECK_RETURN(eff, 0);
138    E_CHECK_RETURN(eff->evas, 0);
139    E_CHECK_RETURN(eff->ecore_evas, 0);
140    E_CHECK_RETURN(file, 0);
141    E_CHECK_RETURN(c, 0);
142    E_CHECK_RETURN(!(eff->running), 0);
143
144    grabbed = e_mod_comp_util_grab_home_key_set(EINA_TRUE);
145    E_CHECK_RETURN(grabbed, 0);
146
147    eff->running = EINA_TRUE;
148
149    bg_cw = e_mod_comp_util_win_normal_get(NULL, EINA_TRUE);
150    if (bg_cw)
151      {
152         E_CHECK_GOTO(!TYPE_LOCKSCREEN_CHECK(bg_cw), error);
153         _effect_mod_object_win_set(bg_cw, "e,state,visible,on,noeffect");
154      }
155
156    if (eff->file_type == E_FAKE_EFFECT_FILE_TYPE_IMAGE)
157      {
158         eff->obj = evas_object_image_add(eff->evas);
159         E_CHECK_GOTO(eff->obj, error);
160         evas_object_image_file_set(eff->obj, file, NULL);
161         err = evas_object_image_load_error_get(eff->obj);
162         E_CHECK_GOTO(err == EVAS_LOAD_ERROR_NONE, error);
163
164         evas_object_image_size_get(eff->obj, &(img_w), &(img_h));
165         evas_object_image_fill_set(eff->obj, 0, 0, img_w, img_h);
166         evas_object_image_filled_set(eff->obj, EINA_TRUE);
167         evas_object_show(eff->obj);
168      }
169    else
170      {
171         char *path = NULL;
172
173         if (file)
174           path = strtok(file, ":");
175         E_CHECK_GOTO(path, error);
176
177         eff->obj = edje_object_add(eff->evas);
178         E_CHECK_GOTO(eff->obj, error);
179         edje_object_file_set (eff->obj, path, APP_DEFINE_GROUP_NAME);
180
181         evas_object_move(eff->obj, 0, 0);
182         evas_object_resize(eff->obj, eff->w, eff->h);
183         evas_object_show(eff->obj);
184         evas_object_lower(eff->obj);
185      }
186
187    res = edje_object_part_swallow
188            (eff->shobj, "fake.swallow.content", eff->obj);
189    E_CHECK_GOTO(res, error);
190
191    evas_object_show(eff->shobj);
192
193    canvas = eina_list_nth(c->canvases, 0);
194    ly = e_mod_comp_canvas_layer_get(canvas, "effect");
195    if (ly)
196      {
197         evas_object_data_set(eff->shobj, "comp.effect_obj.ly", ly);
198         e_mod_comp_layer_populate(ly, eff->shobj);
199      }
200
201    if (bg_cw)
202      _effect_mod_above_wins_set(bg_cw, EINA_TRUE);
203
204    eff->indicator_obj = ecore_evas_extn_plug_new(eff->ecore_evas);
205    E_CHECK_GOTO(eff->indicator_obj, error);
206
207    if ((eff->rot == 0) || (eff->rot == 180))//portrait mode
208      {
209         e_layout_child_move(eff->shobj, 0, 0);
210         e_layout_child_resize(eff->shobj, eff->w, eff->h);
211         //get indicator object
212         if (eff->indicator_show)
213           {
214              if (!ecore_evas_extn_plug_connect(eff->indicator_obj, "elm_indicator_portrait", 0, EINA_FALSE))
215                eff->indicator_show = 0;
216           }
217      }
218    else //landscape mode
219      {
220         e_layout_child_move(eff->shobj, (eff->w - eff->h)/2, (eff->h - eff->w)/2);
221         e_layout_child_resize(eff->shobj, eff->h, eff->w);
222         //get indicator object
223         if (eff->indicator_show)
224           {
225              if (!ecore_evas_extn_plug_connect(eff->indicator_obj, "elm_indicator_landscape", 0, EINA_FALSE))
226                eff->indicator_show = 0;
227           }
228      }
229
230    if (eff->indicator_show)
231      {
232         evas_object_show(eff->indicator_obj);
233         res = edje_object_part_swallow
234               (eff->shobj, "fake.swallow.indicator", eff->indicator_obj);
235         E_CHECK_GOTO(res, error);
236      }
237
238    if (c->animatable)
239      {
240         switch (eff->rot)
241           {
242            case 90:
243               _effect_mod_signal_add
244                 (NULL, eff->shobj,
245                 "fake,state,visible,90,on", "fake");
246               break;
247            case 180:
248               _effect_mod_signal_add
249                 (NULL, eff->shobj,
250                 "fake,state,visible,180,on", "fake");
251               break;
252            case 270:
253               _effect_mod_signal_add
254                 (NULL, eff->shobj,
255                 "fake,state,visible,270,on", "fake");
256               break;
257            default:
258         _effect_mod_signal_add
259           (NULL, eff->shobj,
260           "fake,state,visible,on", "fake");
261               break;
262           }
263      }
264    else
265      {
266         switch (eff->rot)
267           {
268            case 90:
269               _effect_mod_signal_add
270                 (NULL, eff->shobj,
271                 "fake,state,visible,90,on,noeffect", "fake");
272               break;
273            case 180:
274               _effect_mod_signal_add
275                 (NULL, eff->shobj,
276                 "fake,state,visible,180,on,noeffect", "fake");
277               break;
278            case 270:
279               _effect_mod_signal_add
280                 (NULL, eff->shobj,
281                 "fake,state,visible,270,on,noeffect", "fake");
282               break;
283            default:
284         _effect_mod_signal_add
285           (NULL, eff->shobj,
286           "fake,state,visible,on,noeffect", "fake");
287               break;
288           }
289      }
290    eff->timeout = ecore_timer_add(20.0f, _launch_timeout, eff);
291    e_mod_comp_util_screen_input_region_set(EINA_TRUE);
292
293    e_mod_comp_render_queue(c);
294    return EINA_TRUE;
295
296 error:
297    eff->running = EINA_FALSE;
298    if (grabbed)
299      e_mod_comp_util_grab_home_key_set(EINA_FALSE);
300    return EINA_FALSE;
301 }
302
303 Eina_Bool
304 _effect_mod_image_launch_hide(E_Comp_Effect_Image_Launch *eff)
305 {
306    E_Comp *c = e_mod_comp_util_get();
307    E_CHECK_RETURN(c, 0);
308    E_CHECK_RETURN(eff, 0);
309
310    if (eff->timeout)
311      ecore_timer_del(eff->timeout);
312    eff->timeout = NULL;
313
314    if (c->animatable)
315      {
316         switch (eff->rot)
317           {
318            case 90:
319               _effect_mod_signal_add
320                 (NULL, eff->shobj,
321                 "fake,state,visible,90,off", "fake");
322               break;
323            case 180:
324               _effect_mod_signal_add
325                 (NULL, eff->shobj,
326                 "fake,state,visible,180,off", "fake");
327               break;
328            case 270:
329               _effect_mod_signal_add
330                 (NULL, eff->shobj,
331                 "fake,state,visible,270,off", "fake");
332               break;
333            default:
334      _effect_mod_signal_add
335        (NULL, eff->shobj,
336        "fake,state,visible,off", "fake");
337               break;
338           }
339      }
340    else
341      _effect_mod_signal_add
342        (NULL, eff->shobj,
343        "fake,state,visible,off,noeffect", "fake");
344
345    e_mod_comp_render_queue(c);
346    return EINA_TRUE;
347 }
348
349 Eina_Bool
350 _effect_mod_image_launch_window_check(E_Comp_Effect_Image_Launch *eff, E_Comp_Win *cw)
351 {
352    E_CHECK_RETURN(eff, 0);
353    E_CHECK_RETURN(eff->running, 0);
354    E_CHECK_RETURN(cw, 0);
355    E_CHECK_RETURN(cw->bd, 0);
356
357    if ( REGION_EQUAL_TO_ROOT(cw) && TYPE_NORMAL_CHECK(cw))
358      {
359         return EINA_TRUE;
360      }
361    else if ((e_config->use_tiled_desk_layout) &&
362              (cw->bd->client.e.state.ly.support) &&
363              TYPE_NORMAL_CHECK(cw))
364      {
365         return EINA_TRUE;
366      }
367    return EINA_FALSE;
368 }
369
370 Eina_Bool
371 _effect_mod_image_launch_running_check(E_Comp_Effect_Image_Launch *eff)
372 {
373    E_CHECK_RETURN(eff, 0);
374    return eff->running;
375 }
376
377 Eina_Bool
378 _effect_mod_image_launch_fake_show_done_check(E_Comp_Effect_Image_Launch *eff)
379 {
380    E_CHECK_RETURN(eff, 0);
381    return eff->fake_image_show_done;
382 }
383
384 Eina_Bool
385 _effect_mod_image_launch_window_set(E_Comp_Effect_Image_Launch *eff,
386                                           Ecore_X_Window w)
387 {
388    E_CHECK_RETURN(eff, 0);
389    E_CHECK_RETURN(w, 0);
390    eff->win = w;
391    return EINA_TRUE;
392 }
393
394 void
395 _effect_mod_image_launch_disable(E_Comp_Effect_Image_Launch *eff)
396 {
397    E_CHECK(eff);
398    E_CHECK(eff->running);
399
400    ELBF(ELBT_COMP, 0, 0,
401         "%15.15s|", "FAKE DISABLE");
402
403 #if SEND_LAUNCHING_DONE
404    if (eff->win)
405      {
406         E_Comp_Win *cw = NULL;
407         cw = e_mod_comp_win_find(eff->win);
408         if ((cw) && (cw->bd))
409           {
410              ecore_x_client_message32_send (cw->bd->client.win, ATOM_WINDOW_LAUNCHING_EFFECT_DONE,
411                                             ECORE_X_EVENT_MASK_WINDOW_CONFIGURE, 0, 0, 0, 0, 0);
412              e_msg_send("comp.message", "launching.done", cw->bd->client.win, NULL, NULL, NULL, NULL);
413           }
414      }
415 #endif
416
417    eff->running = EINA_FALSE;
418    eff->fake_image_show_done= EINA_FALSE;
419    eff->win = 0;
420
421    e_mod_comp_util_screen_input_region_set(EINA_FALSE);
422    e_mod_comp_util_grab_home_key_set(EINA_FALSE);
423
424    E_Comp_Canvas *canvas = NULL;
425    E_Comp_Layer *ly = NULL;
426
427    E_Comp *c = e_mod_comp_util_get();
428    if (c)
429      {
430         e_mod_comp_win_shape_input_update(c);
431         canvas = eina_list_nth(c->canvases, 0);
432      }
433
434    if (eff->timeout)
435      ecore_timer_del(eff->timeout);
436    eff->timeout = NULL;
437
438    if (eff->indicator_show)
439      {
440         edje_object_part_unswallow(eff->shobj, eff->indicator_obj);
441         evas_object_hide(eff->indicator_obj);
442         evas_object_del(eff->indicator_obj);
443         eff->indicator_obj = NULL;
444      }
445    edje_object_part_unswallow(eff->shobj, eff->obj);
446
447    evas_object_hide(eff->shobj);
448    evas_object_hide(eff->obj);
449    evas_object_del(eff->obj);
450    eff->obj = NULL;
451
452    e_layout_unpack(eff->shobj);
453
454    if (canvas)
455      ly = e_mod_comp_canvas_layer_get(canvas, "effect");
456
457    if (ly)
458      {
459         e_mod_comp_layer_effect_set(ly, EINA_FALSE);
460         evas_object_hide(ly->layout);
461      }
462    evas_object_data_del(eff->shobj, "comp.effect_obj.ly");
463 }
464
465 static void
466 _show_done(void *data,
467            Evas_Object *obj __UNUSED__,
468            const char *emission __UNUSED__,
469            const char *source __UNUSED__)
470 {
471    E_Comp_Win *cw;
472    E_Comp_Effect_Image_Launch *eff;
473    eff = (E_Comp_Effect_Image_Launch *)data;
474    E_CHECK(eff);
475
476    eff->fake_image_show_done = EINA_TRUE;
477
478    E_CHECK(eff->win);
479
480    cw = e_mod_comp_win_find(eff->win);
481    E_CHECK(cw);
482
483    _effect_mod_signal_add
484      (cw, NULL, "e,state,visible,on,noeffect", "e");
485    e_mod_comp_comp_event_src_visibility_send(cw);
486    _effect_mod_image_launch_disable(eff);
487
488    e_mod_comp_win_render_queue(cw);
489 }
490
491 static void
492 _hide_done(void *data,
493            Evas_Object *obj __UNUSED__,
494            const char *emission __UNUSED__,
495            const char *source __UNUSED__)
496 {
497    E_Comp_Effect_Image_Launch *eff;
498    E_Comp_Canvas *canvas = NULL;
499    E_Comp_Layer *ly = NULL;
500
501    E_Comp *c = e_mod_comp_util_get();
502
503    eff = (E_Comp_Effect_Image_Launch *)data;
504    E_CHECK(eff);
505
506    e_mod_comp_util_screen_input_region_set(EINA_FALSE);
507    e_mod_comp_util_grab_home_key_set(EINA_FALSE);
508
509    if (eff->indicator_show)
510      {
511         edje_object_part_unswallow(eff->shobj, eff->indicator_obj);
512         evas_object_hide(eff->indicator_obj);
513         eff->indicator_obj = NULL;
514      }
515    edje_object_part_unswallow(eff->shobj, eff->obj);
516    evas_object_hide(eff->shobj);
517    evas_object_hide(eff->obj);
518    eff->obj = NULL;
519
520    e_layout_unpack(eff->shobj);
521    if (c)
522      {
523         e_mod_comp_win_shape_input_update(c);
524         canvas = eina_list_nth(c->canvases, 0);
525      }
526
527    if (canvas)
528      ly = e_mod_comp_canvas_layer_get(canvas, "effect");
529
530    if (ly)
531      e_mod_comp_layer_effect_set(ly, EINA_FALSE);
532
533    evas_object_data_del(eff->shobj, "comp.effect_obj.ly");
534 }
535
536 static Eina_Bool
537 _launch_timeout(void *data)
538 {
539    E_Comp_Effect_Image_Launch *eff;
540    E_Comp *c = e_mod_comp_util_get();
541    eff = (E_Comp_Effect_Image_Launch *)data;
542
543    E_CHECK_RETURN(c, 0);
544    E_CHECK_RETURN(eff, 0);
545
546    _effect_mod_image_launch_disable(eff);
547    e_mod_comp_render_queue(c);
548
549    return EINA_FALSE;
550 }