diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib/elementary/efl_ui_win.c | 61 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_win.eo | 2 |
2 files changed, 59 insertions, 4 deletions
diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index 3d6abd8483..ae7354a026 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c | |||
@@ -37,6 +37,8 @@ | |||
37 | 37 | ||
38 | static const Elm_Win_Trap *trap = NULL; | 38 | static const Elm_Win_Trap *trap = NULL; |
39 | 39 | ||
40 | static int _paused_windows = 0; | ||
41 | |||
40 | #define TRAP(sd, name, ...) \ | 42 | #define TRAP(sd, name, ...) \ |
41 | do \ | 43 | do \ |
42 | { \ | 44 | { \ |
@@ -274,6 +276,7 @@ struct _Efl_Ui_Win_Data | |||
274 | Eina_Bool single_edje_content: 1; /* hack for E */ | 276 | Eina_Bool single_edje_content: 1; /* hack for E */ |
275 | Eina_Bool shown : 1; | 277 | Eina_Bool shown : 1; |
276 | Eina_Bool stack_base : 1; | 278 | Eina_Bool stack_base : 1; |
279 | Eina_Bool paused : 1; | ||
277 | }; | 280 | }; |
278 | 281 | ||
279 | struct _Input_Pointer_Iterator | 282 | struct _Input_Pointer_Iterator |
@@ -505,6 +508,8 @@ _elm_win_state_eval(void *data EINA_UNUSED) | |||
505 | evas_render_dump(evas); | 508 | evas_render_dump(evas); |
506 | } | 509 | } |
507 | } | 510 | } |
511 | |||
512 | efl_event_callback_call(obj, EFL_UI_WIN_EVENT_PAUSE, NULL); | ||
508 | continue; | 513 | continue; |
509 | } | 514 | } |
510 | } | 515 | } |
@@ -2180,6 +2185,28 @@ _win_event_del_cb(void *data, const Efl_Event *ev) | |||
2180 | } | 2185 | } |
2181 | 2186 | ||
2182 | static void | 2187 | static void |
2188 | _win_paused(void *data, const Efl_Event *ev) | ||
2189 | { | ||
2190 | Efl_Ui_Win_Data *sd = data; | ||
2191 | |||
2192 | if (sd->paused) | ||
2193 | { | ||
2194 | ERR("A window did receive a pause event while still paused. Dismissing."); | ||
2195 | return ; | ||
2196 | } | ||
2197 | sd->paused = EINA_TRUE; | ||
2198 | _paused_windows++; | ||
2199 | |||
2200 | if (_elm_win_count == _paused_windows) | ||
2201 | efl_event_callback_call(efl_loop_get(ev->object), EFL_LOOP_EVENT_PAUSE, NULL); | ||
2202 | } | ||
2203 | |||
2204 | EFL_CALLBACKS_ARRAY_DEFINE(_elm_win_tracking, | ||
2205 | { EFL_EVENT_CALLBACK_ADD, _win_event_add_cb }, | ||
2206 | { EFL_EVENT_CALLBACK_DEL, _win_event_del_cb }, | ||
2207 | { EFL_UI_WIN_EVENT_PAUSE, _win_paused }) | ||
2208 | |||
2209 | static void | ||
2183 | _elm_win_cb_mouse_up(void *data, const Efl_Event *ev EINA_UNUSED) | 2210 | _elm_win_cb_mouse_up(void *data, const Efl_Event *ev EINA_UNUSED) |
2184 | { | 2211 | { |
2185 | DBG("Evas mouse up event"); | 2212 | DBG("Evas mouse up event"); |
@@ -2189,6 +2216,26 @@ _elm_win_cb_mouse_up(void *data, const Efl_Event *ev EINA_UNUSED) | |||
2189 | } | 2216 | } |
2190 | 2217 | ||
2191 | static void | 2218 | static void |
2219 | _elm_win_resume(void *data, const Efl_Event *ev) | ||
2220 | { | ||
2221 | Efl_Ui_Win_Data *sd = data; | ||
2222 | |||
2223 | if (!sd->paused) return ; | ||
2224 | |||
2225 | efl_event_callback_call(sd->obj, EFL_UI_WIN_EVENT_RESUME, NULL); | ||
2226 | sd->paused = EINA_FALSE; | ||
2227 | |||
2228 | if (_elm_win_count == _paused_windows) | ||
2229 | efl_event_callback_call(efl_loop_get(ev->object), EFL_LOOP_EVENT_RESUME, NULL); | ||
2230 | |||
2231 | _paused_windows--; | ||
2232 | } | ||
2233 | |||
2234 | EFL_CALLBACKS_ARRAY_DEFINE(_elm_evas_tracking, | ||
2235 | { EFL_EVENT_POINTER_UP, _elm_win_cb_mouse_up }, | ||
2236 | { EFL_CANVAS_EVENT_RENDER_PRE, _elm_win_resume }) | ||
2237 | |||
2238 | static void | ||
2192 | _deferred_ecore_evas_free(void *data) | 2239 | _deferred_ecore_evas_free(void *data) |
2193 | { | 2240 | { |
2194 | ecore_evas_free(data); | 2241 | ecore_evas_free(data); |
@@ -2810,6 +2857,9 @@ _efl_ui_win_efl_canvas_group_group_del(Eo *obj, Efl_Ui_Win_Data *sd) | |||
2810 | _elm_win_count--; | 2857 | _elm_win_count--; |
2811 | _elm_win_state_eval_queue(); | 2858 | _elm_win_state_eval_queue(); |
2812 | 2859 | ||
2860 | if (_elm_win_count == _paused_windows) | ||
2861 | efl_event_callback_call(efl_loop_get(obj), EFL_LOOP_EVENT_PAUSE, NULL); | ||
2862 | |||
2813 | if (sd->ee) | 2863 | if (sd->ee) |
2814 | { | 2864 | { |
2815 | ecore_evas_callback_delete_request_set(sd->ee, NULL); | 2865 | ecore_evas_callback_delete_request_set(sd->ee, NULL); |
@@ -5298,10 +5348,9 @@ _elm_win_finalize_internal(Eo *obj, Efl_Ui_Win_Data *sd, const char *name, Elm_W | |||
5298 | efl_composite_attach(obj, efl_provider_find(ecore_main_loop_get(), EFL_CONFIG_GLOBAL_CLASS)); | 5348 | efl_composite_attach(obj, efl_provider_find(ecore_main_loop_get(), EFL_CONFIG_GLOBAL_CLASS)); |
5299 | 5349 | ||
5300 | efl_event_callback_array_add(obj, _elm_win_evas_feed_fake_callbacks(), sd->evas); | 5350 | efl_event_callback_array_add(obj, _elm_win_evas_feed_fake_callbacks(), sd->evas); |
5301 | efl_event_callback_add(obj, EFL_EVENT_CALLBACK_ADD, _win_event_add_cb, sd); | 5351 | efl_event_callback_array_add(obj, _elm_evas_tracking(), sd); |
5302 | efl_event_callback_add(obj, EFL_EVENT_CALLBACK_DEL, _win_event_del_cb, sd); | ||
5303 | 5352 | ||
5304 | efl_event_callback_add(sd->evas, EFL_EVENT_POINTER_UP, _elm_win_cb_mouse_up, sd); | 5353 | efl_event_callback_array_add(sd->evas, _elm_win_tracking(), sd); |
5305 | evas_object_show(sd->legacy.edje); | 5354 | evas_object_show(sd->legacy.edje); |
5306 | 5355 | ||
5307 | if (type == ELM_WIN_FAKE) | 5356 | if (type == ELM_WIN_FAKE) |
@@ -5330,9 +5379,13 @@ _elm_win_finalize_internal(Eo *obj, Efl_Ui_Win_Data *sd, const char *name, Elm_W | |||
5330 | EOLIAN static Eo * | 5379 | EOLIAN static Eo * |
5331 | _efl_ui_win_efl_object_finalize(Eo *obj, Efl_Ui_Win_Data *sd) | 5380 | _efl_ui_win_efl_object_finalize(Eo *obj, Efl_Ui_Win_Data *sd) |
5332 | { | 5381 | { |
5382 | Eina_Bool resume = !_elm_win_count; | ||
5383 | |||
5333 | obj = _elm_win_finalize_internal(obj, sd, sd->name, sd->type); | 5384 | obj = _elm_win_finalize_internal(obj, sd, sd->name, sd->type); |
5334 | if (!obj) return NULL; | 5385 | if (!obj) return NULL; |
5335 | return efl_finalize(efl_super(obj, MY_CLASS)); | 5386 | obj = efl_finalize(efl_super(obj, MY_CLASS)); |
5387 | if (obj && resume) efl_event_callback_call(efl_loop_get(obj), EFL_LOOP_EVENT_RESUME, NULL); | ||
5388 | return obj; | ||
5336 | } | 5389 | } |
5337 | 5390 | ||
5338 | EOLIAN static void | 5391 | EOLIAN static void |
diff --git a/src/lib/elementary/efl_ui_win.eo b/src/lib/elementary/efl_ui_win.eo index 2cae3d776e..9a640f088e 100644 --- a/src/lib/elementary/efl_ui_win.eo +++ b/src/lib/elementary/efl_ui_win.eo | |||
@@ -889,5 +889,7 @@ class Efl.Ui.Win (Elm.Widget, Efl.Canvas, Efl.Access.Window, | |||
889 | wm,rotation,changed; [[Called when window manager rotation changed]] | 889 | wm,rotation,changed; [[Called when window manager rotation changed]] |
890 | theme,changed; [[Called when theme changed]] | 890 | theme,changed; [[Called when theme changed]] |
891 | elm,action,block_menu; [[Called when elementary block menu action happened]] | 891 | elm,action,block_menu; [[Called when elementary block menu action happened]] |
892 | pause; [[Called when the window is going not be displayed for some time]] | ||
893 | resume; [[Called before a window get rendered after a pause event]] | ||
892 | } | 894 | } |
893 | } | 895 | } |