move x11 suspend window grabbing to comp_x, ungrab on resume

ref d0c5fb465b
This commit is contained in:
Mike Blumenkrantz 2017-07-10 09:48:51 -04:00
parent ac92ff5256
commit 7bc179da5a
5 changed files with 101 additions and 105 deletions

View File

@ -893,7 +893,6 @@ _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->base, "e,state,screensaver,on", "e");
edje_object_signal_emit(zone->over, "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; return ECORE_CALLBACK_PASS_ON;
} }
@ -907,7 +906,6 @@ _e_comp_screensaver_off(void *data EINA_UNUSED, int type EINA_UNUSED, void *even
ecore_animator_frametime_set(ecore_frametime); ecore_animator_frametime_set(ecore_frametime);
if (!e_comp->saver) return ECORE_CALLBACK_RENEW; if (!e_comp->saver) return ECORE_CALLBACK_RENEW;
e_comp_screen_resume();
e_comp_override_del(); e_comp_override_del();
e_comp->saver = EINA_FALSE; e_comp->saver = EINA_FALSE;
if (!e_comp->nocomp) if (!e_comp->nocomp)
@ -1802,100 +1800,3 @@ e_comp_util_object_is_above_nocomp(Evas_Object *obj)
return EINA_TRUE; return EINA_TRUE;
return EINA_FALSE; 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
}

View File

@ -97,7 +97,6 @@ struct _E_Comp
Ecore_Window win; // input overlay Ecore_Window win; // input overlay
Ecore_Window root; //x11 root window Ecore_Window root; //x11 root window
Ecore_Window suspend_grabbed; // window grabber for suspending pointer
Ecore_Evas *ee; //canvas Ecore_Evas *ee; //canvas
Ecore_Window ee_win; //canvas window Ecore_Window ee_win; //canvas window
E_Comp_Canvas *canvas; E_Comp_Canvas *canvas;
@ -233,9 +232,6 @@ 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(Evas_Object *parent, const char *params);
E_API E_Config_Dialog *e_int_config_comp_match(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_kbd_grabbed(void);
E_API Eina_Bool e_comp_util_mouse_grabbed(void); E_API Eina_Bool e_comp_util_mouse_grabbed(void);

View File

@ -70,6 +70,8 @@ extern double e_bl_val;
static Eina_Hash *dead_wins; 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 void _e_comp_x_hook_client_pre_frame_assign(void *d EINA_UNUSED, E_Client *ec);
static inline E_Comp_X_Client_Data * static inline E_Comp_X_Client_Data *
@ -4925,6 +4927,92 @@ _e_comp_x_cb_ping(void *data EINA_UNUSED, int ev_type EINA_UNUSED, Ecore_X_Event
return ECORE_CALLBACK_PASS_ON; 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 Ecore_Timer *screensaver_eval_timer = NULL;
static Eina_Bool saver_on = EINA_FALSE; static Eina_Bool saver_on = EINA_FALSE;
@ -5671,6 +5759,8 @@ e_comp_x_init(void)
if (e_comp->comp_type != E_PIXMAP_TYPE_WL) if (e_comp->comp_type != E_PIXMAP_TYPE_WL)
{ {
ecore_x_screensaver_event_listen_set(1); 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); E_LIST_HANDLER_APPEND(handlers, ECORE_X_EVENT_SCREENSAVER_NOTIFY, _e_comp_x_screensaver_notify_cb, NULL);
ecore_x_screensaver_custom_blanking_enable(); ecore_x_screensaver_custom_blanking_enable();

View File

@ -118,5 +118,8 @@ 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); 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
#endif #endif

View File

@ -162,7 +162,10 @@ _e_sys_comp_emit_cb_wait(E_Sys_Action a, const char *sig, const char *rep, Eina_
else e_comp_override_timed_pop(); else e_comp_override_timed_pop();
_e_sys_comp_zones_fade(sig, nocomp_push); _e_sys_comp_zones_fade(sig, nocomp_push);
e_comp_screen_suspend(); #ifndef HAVE_WAYLAND_ONLY
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
_e_comp_x_screensaver_on();
#endif
if (rep) if (rep)
{ {
@ -217,7 +220,10 @@ _e_sys_comp_resume2(void *data EINA_UNUSED)
Eina_List *l; Eina_List *l;
E_Zone *zone; E_Zone *zone;
e_comp_screen_resume(); #ifndef HAVE_WAYLAND_ONLY
if (e_comp->comp_type == E_PIXMAP_TYPE_X)
_e_comp_x_screensaver_off();
#endif
EINA_LIST_FOREACH(e_comp->zones, l, zone) EINA_LIST_FOREACH(e_comp->zones, l, zone)
e_backlight_level_set(zone, e_config->backlight.normal, -1.0); e_backlight_level_set(zone, e_config->backlight.normal, -1.0);
_e_sys_comp_zones_fade("e,state,sys,resume", EINA_FALSE); _e_sys_comp_zones_fade("e,state,sys,resume", EINA_FALSE);