From e90f63b25b2af9bec1634405287fc7d40c44b09c Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Tue, 11 Jul 2017 09:00:05 +0900 Subject: [PATCH] Revert "move x11 suspend window grabbing to comp_x, ungrab on resume" This reverts commit 7bc179da5acc31d7271349771c027ec374704eb3. this now totally broke the glitch fix and it now animates in reverse on suspend and does nothng on resume... testing might be a good idea beforehand... --- src/bin/e_comp.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++ src/bin/e_comp.h | 4 ++ src/bin/e_comp_x.c | 90 ----------------------------------------- src/bin/e_comp_x.h | 3 -- src/bin/e_sys.c | 10 +---- 5 files changed, 105 insertions(+), 101 deletions(-) diff --git a/src/bin/e_comp.c b/src/bin/e_comp.c index 0e1e56c1b..01e8d4d51 100644 --- a/src/bin/e_comp.c +++ b/src/bin/e_comp.c @@ -893,6 +893,7 @@ _e_comp_screensaver_on(void *data EINA_UNUSED, int type EINA_UNUSED, void *event edje_object_signal_emit(zone->base, "e,state,screensaver,on", "e"); edje_object_signal_emit(zone->over, "e,state,screensaver,on", "e"); } + e_comp_screen_suspend(); return ECORE_CALLBACK_PASS_ON; } @@ -906,6 +907,7 @@ _e_comp_screensaver_off(void *data EINA_UNUSED, int type EINA_UNUSED, void *even ecore_animator_frametime_set(ecore_frametime); if (!e_comp->saver) return ECORE_CALLBACK_RENEW; + e_comp_screen_resume(); e_comp_override_del(); e_comp->saver = EINA_FALSE; if (!e_comp->nocomp) @@ -1800,3 +1802,100 @@ e_comp_util_object_is_above_nocomp(Evas_Object *obj) return EINA_TRUE; return EINA_FALSE; } + +#ifndef HAVE_WAYLAND_ONLY +static void +_e_comp_pointer_grab(void) +{ + if (e_comp->suspend_grabbed) ecore_x_window_free(e_comp->suspend_grabbed); + e_comp->suspend_grabbed = ecore_x_window_input_new(e_comp->root, 0, 0, 1, 1); + ecore_x_window_show(e_comp->suspend_grabbed); + if (!e_grabinput_get(e_comp->suspend_grabbed, 0, e_comp->suspend_grabbed)) + { + ecore_x_window_free(e_comp->suspend_grabbed); + e_comp->suspend_grabbed = 0; + } +} + +static void +_e_comp_pointer_ungrab(void) +{ + if (e_comp->comp_type == E_PIXMAP_TYPE_X) + { + e_grabinput_release(e_comp->suspend_grabbed, e_comp->suspend_grabbed); + ecore_x_window_free(e_comp->suspend_grabbed); + } +} + +static void +_e_comp_cb_pointer_suspend_resume_done(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + edje_object_signal_callback_del(obj, emission, source, + _e_comp_cb_pointer_suspend_resume_done); + if (!data) _e_comp_pointer_ungrab(); +} +#endif + +E_API void +e_comp_screen_suspend(void) +{ +#ifndef HAVE_WAYLAND_ONLY + if (e_comp->comp_type != E_PIXMAP_TYPE_X) return; + _e_comp_pointer_ungrab(); + _e_comp_pointer_grab(); + if (!e_comp->suspend_grabbed) return; + if ((e_comp->pointer) && (e_comp->pointer->o_ptr)) + { + const char *s = edje_object_data_get(e_comp->pointer->o_ptr, + "can_suspend"); + if ((s) && (atoi(s) == 1)) + { + edje_object_signal_callback_del(e_comp->pointer->o_ptr, + "e,state,mouse,suspend,done", "e", + _e_comp_cb_pointer_suspend_resume_done); + edje_object_signal_callback_del(e_comp->pointer->o_ptr, + "e,state,mouse,resume,done", "e", + _e_comp_cb_pointer_suspend_resume_done); + edje_object_signal_callback_add(e_comp->pointer->o_ptr, + "e,state,mouse,suspend,done", + "e", + _e_comp_cb_pointer_suspend_resume_done, + e_comp); + edje_object_signal_emit(e_comp->pointer->o_ptr, + "e,state,mouse,suspend", "e"); + } + } +#endif +} + +E_API void +e_comp_screen_resume(void) +{ +#ifndef HAVE_WAYLAND_ONLY + if (e_comp->comp_type != E_PIXMAP_TYPE_X) return; + _e_comp_pointer_ungrab(); + _e_comp_pointer_grab(); + if (!e_comp->suspend_grabbed) return; + if ((e_comp->pointer) && (e_comp->pointer->o_ptr)) + { + const char *s = edje_object_data_get(e_comp->pointer->o_ptr, + "can_suspend"); + if ((s) && (atoi(s) == 1)) + { + edje_object_signal_callback_del(e_comp->pointer->o_ptr, + "e,state,mouse,suspend,done", "e", + _e_comp_cb_pointer_suspend_resume_done); + edje_object_signal_callback_del(e_comp->pointer->o_ptr, + "e,state,mouse,resume,done", "e", + _e_comp_cb_pointer_suspend_resume_done); + edje_object_signal_callback_add(e_comp->pointer->o_ptr, + "e,state,mouse,resume,done", + "e", + _e_comp_cb_pointer_suspend_resume_done, + NULL); + edje_object_signal_emit(e_comp->pointer->o_ptr, + "e,state,mouse,resume", "e"); + } + } +#endif +} diff --git a/src/bin/e_comp.h b/src/bin/e_comp.h index c3acb4bec..c991088ea 100644 --- a/src/bin/e_comp.h +++ b/src/bin/e_comp.h @@ -97,6 +97,7 @@ struct _E_Comp Ecore_Window win; // input overlay Ecore_Window root; //x11 root window + Ecore_Window suspend_grabbed; // window grabber for suspending pointer Ecore_Evas *ee; //canvas Ecore_Window ee_win; //canvas window E_Comp_Canvas *canvas; @@ -232,6 +233,9 @@ EINTERN Evas_Object *e_comp_style_selector_create(Evas *evas, const char **sourc E_API E_Config_Dialog *e_int_config_comp(Evas_Object *parent, const char *params); E_API E_Config_Dialog *e_int_config_comp_match(Evas_Object *parent, const char *params); +E_API void e_comp_screen_suspend(void); +E_API void e_comp_screen_resume(void); + E_API Eina_Bool e_comp_util_kbd_grabbed(void); E_API Eina_Bool e_comp_util_mouse_grabbed(void); diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c index 67253748d..a039862d1 100644 --- a/src/bin/e_comp_x.c +++ b/src/bin/e_comp_x.c @@ -70,8 +70,6 @@ extern double e_bl_val; static Eina_Hash *dead_wins; -static Ecore_Window _e_comp_x_suspend_grabbed; // window grabber for suspending pointer - static void _e_comp_x_hook_client_pre_frame_assign(void *d EINA_UNUSED, E_Client *ec); static inline E_Comp_X_Client_Data * @@ -4927,92 +4925,6 @@ _e_comp_x_cb_ping(void *data EINA_UNUSED, int ev_type EINA_UNUSED, Ecore_X_Event return ECORE_CALLBACK_PASS_ON; } -static void -_e_comp_pointer_grab(void) -{ - if (_e_comp_x_suspend_grabbed) ecore_x_window_free(_e_comp_x_suspend_grabbed); - _e_comp_x_suspend_grabbed = ecore_x_window_input_new(e_comp->root, 0, 0, 1, 1); - ecore_x_window_show(_e_comp_x_suspend_grabbed); - if (!e_grabinput_get(_e_comp_x_suspend_grabbed, 0, _e_comp_x_suspend_grabbed)) - { - ecore_x_window_free(_e_comp_x_suspend_grabbed); - _e_comp_x_suspend_grabbed = 0; - } -} - -static void -_e_comp_pointer_ungrab(void) -{ - e_grabinput_release(_e_comp_x_suspend_grabbed, _e_comp_x_suspend_grabbed); - ecore_x_window_free(_e_comp_x_suspend_grabbed); -} - -static void -_e_comp_cb_pointer_suspend_resume_done(void *data, Evas_Object *obj, const char *emission, const char *source) -{ - edje_object_signal_callback_del(obj, emission, source, - _e_comp_cb_pointer_suspend_resume_done); - if (!data) _e_comp_pointer_ungrab(); -} - -EINTERN Eina_Bool -_e_comp_x_screensaver_on() -{ - _e_comp_pointer_ungrab(); - _e_comp_pointer_grab(); - if (!_e_comp_x_suspend_grabbed) return ECORE_CALLBACK_RENEW; - if ((e_comp->pointer) && (e_comp->pointer->o_ptr)) - { - const char *s = edje_object_data_get(e_comp->pointer->o_ptr, - "can_suspend"); - if ((s) && (atoi(s) == 1)) - { - edje_object_signal_callback_del(e_comp->pointer->o_ptr, - "e,state,mouse,suspend,done", "e", - _e_comp_cb_pointer_suspend_resume_done); - edje_object_signal_callback_del(e_comp->pointer->o_ptr, - "e,state,mouse,resume,done", "e", - _e_comp_cb_pointer_suspend_resume_done); - edje_object_signal_callback_add(e_comp->pointer->o_ptr, - "e,state,mouse,suspend,done", - "e", - _e_comp_cb_pointer_suspend_resume_done, - e_comp); - edje_object_signal_emit(e_comp->pointer->o_ptr, - "e,state,mouse,suspend", "e"); - } - } - return ECORE_CALLBACK_RENEW; -} - -EINTERN Eina_Bool -_e_comp_x_screensaver_off() -{ - _e_comp_pointer_ungrab(); - if ((e_comp->pointer) && (e_comp->pointer->o_ptr)) - { - const char *s = edje_object_data_get(e_comp->pointer->o_ptr, - "can_suspend"); - if ((s) && (atoi(s) == 1)) - { - edje_object_signal_callback_del(e_comp->pointer->o_ptr, - "e,state,mouse,suspend,done", "e", - _e_comp_cb_pointer_suspend_resume_done); - edje_object_signal_callback_del(e_comp->pointer->o_ptr, - "e,state,mouse,resume,done", "e", - _e_comp_cb_pointer_suspend_resume_done); - edje_object_signal_callback_add(e_comp->pointer->o_ptr, - "e,state,mouse,resume,done", - "e", - _e_comp_cb_pointer_suspend_resume_done, - NULL); - edje_object_signal_emit(e_comp->pointer->o_ptr, - "e,state,mouse,resume", "e"); - } - } - return ECORE_CALLBACK_RENEW; -} - static Ecore_Timer *screensaver_eval_timer = NULL; static Eina_Bool saver_on = EINA_FALSE; @@ -5759,8 +5671,6 @@ e_comp_x_init(void) if (e_comp->comp_type != E_PIXMAP_TYPE_WL) { ecore_x_screensaver_event_listen_set(1); - E_LIST_HANDLER_APPEND(handlers, E_EVENT_SCREENSAVER_ON, _e_comp_x_screensaver_on, NULL); - E_LIST_HANDLER_APPEND(handlers, E_EVENT_SCREENSAVER_ON, _e_comp_x_screensaver_off, NULL); E_LIST_HANDLER_APPEND(handlers, ECORE_X_EVENT_SCREENSAVER_NOTIFY, _e_comp_x_screensaver_notify_cb, NULL); ecore_x_screensaver_custom_blanking_enable(); diff --git a/src/bin/e_comp_x.h b/src/bin/e_comp_x.h index 2ff0858f0..30f8981f3 100644 --- a/src/bin/e_comp_x.h +++ b/src/bin/e_comp_x.h @@ -118,8 +118,5 @@ EINTERN void e_comp_x_xwayland_client_setup(E_Client *ec, E_Client *wc); E_API E_Pixmap *e_comp_x_client_pixmap_get(const E_Client *ec); -EINTERN Eina_Bool _e_comp_x_screensaver_on(); -EINTERN Eina_Bool _e_comp_x_screensaver_off(); - # endif #endif diff --git a/src/bin/e_sys.c b/src/bin/e_sys.c index a67af2ea4..d323ea60b 100644 --- a/src/bin/e_sys.c +++ b/src/bin/e_sys.c @@ -162,10 +162,7 @@ _e_sys_comp_emit_cb_wait(E_Sys_Action a, const char *sig, const char *rep, Eina_ else e_comp_override_timed_pop(); _e_sys_comp_zones_fade(sig, nocomp_push); -#ifndef HAVE_WAYLAND_ONLY - if (e_comp->comp_type == E_PIXMAP_TYPE_X) - _e_comp_x_screensaver_on(); -#endif + e_comp_screen_suspend(); if (rep) { @@ -220,10 +217,7 @@ _e_sys_comp_resume2(void *data EINA_UNUSED) Eina_List *l; E_Zone *zone; -#ifndef HAVE_WAYLAND_ONLY - if (e_comp->comp_type == E_PIXMAP_TYPE_X) - _e_comp_x_screensaver_off(); -#endif + e_comp_screen_resume(); EINA_LIST_FOREACH(e_comp->zones, l, zone) e_backlight_level_set(zone, e_config->backlight.normal, -1.0); _e_sys_comp_zones_fade("e,state,sys,resume", EINA_FALSE);