From 5ba54b7aa8c7f54d835db63808fea33b577a4f64 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Fri, 9 Nov 2018 22:04:24 +0000 Subject: [PATCH] e winlist focus and input - fix to work with basic wheel/mouse ev this fixes T6415 @fix --- src/bin/e_grabinput.c | 20 ++++++++++++++++++++ src/bin/e_grabinput.h | 1 + src/modules/winlist/e_mod_main.c | 29 ++++++++++++++--------------- src/modules/winlist/e_winlist.c | 11 +++++++++-- 4 files changed, 44 insertions(+), 17 deletions(-) diff --git a/src/bin/e_grabinput.c b/src/bin/e_grabinput.c index c050a0825..55876e203 100644 --- a/src/bin/e_grabinput.c +++ b/src/bin/e_grabinput.c @@ -14,6 +14,9 @@ static double last_focus_time = 0.0; static Ecore_Window focus_fix_win = 0; static E_Focus_Method focus_fix_method = E_FOCUS_METHOD_NO_INPUT; +static void (*lost_cb) (void *data) = NULL; +static void *lost_data = NULL; + /* externally accessible functions */ EINTERN int e_grabinput_init(void) @@ -27,9 +30,18 @@ e_grabinput_shutdown(void) return 1; } +E_API void +e_grabinput_lost_cb_set(void (*cb) (void *data), void *data) +{ + lost_cb = cb; + lost_data = data; +} + E_API int e_grabinput_get(Ecore_Window mouse_win, int confine_mouse, Ecore_Window key_win) { + Eina_Bool ungrabbed = EINA_FALSE; + if (grab_mouse_win) { #ifndef HAVE_WAYLAND_ONLY @@ -37,6 +49,7 @@ e_grabinput_get(Ecore_Window mouse_win, int confine_mouse, Ecore_Window key_win) ecore_x_pointer_ungrab(); #endif grab_mouse_win = 0; + ungrabbed = EINA_TRUE; } if (grab_key_win) { @@ -47,6 +60,13 @@ e_grabinput_get(Ecore_Window mouse_win, int confine_mouse, Ecore_Window key_win) grab_key_win = 0; focus_win = 0; + ungrabbed = EINA_TRUE; + } + if (ungrabbed) + { + if (lost_cb) lost_cb(lost_data); + lost_cb = NULL; + lost_data = NULL; } if (mouse_win) { diff --git a/src/bin/e_grabinput.h b/src/bin/e_grabinput.h index 5dabb8118..fd6feff4d 100644 --- a/src/bin/e_grabinput.h +++ b/src/bin/e_grabinput.h @@ -14,6 +14,7 @@ typedef enum _E_Focus_Method EINTERN int e_grabinput_init(void); EINTERN int e_grabinput_shutdown(void); +E_API void e_grabinput_lost_cb_set(void (*cb) (void *data), void *data); E_API int e_grabinput_get(Ecore_Window mouse_win, int confine_mouse, Ecore_Window key_win); E_API void e_grabinput_release(Ecore_Window mouse_win, Ecore_Window key_win); E_API void e_grabinput_focus(Ecore_Window win, E_Focus_Method method); diff --git a/src/modules/winlist/e_mod_main.c b/src/modules/winlist/e_mod_main.c index bd2a3a364..d7b6049fd 100644 --- a/src/modules/winlist/e_mod_main.c +++ b/src/modules/winlist/e_mod_main.c @@ -4,6 +4,7 @@ /* actual module specifics */ static void _e_mod_action_winlist_cb(E_Object *obj, const char *params); static Eina_Bool _e_mod_action_winlist_mouse_cb(E_Object *obj, const char *params, E_Binding_Event_Mouse_Button *ev); +static Eina_Bool _e_mod_action_winlist_wheel_cb(E_Object *obj, const char *params, E_Binding_Event_Wheel *ev); static void _e_mod_action_winlist_key_cb(E_Object *obj, const char *params, Ecore_Event_Key *ev); static void _e_mod_action_winlist_edge_cb(E_Object *obj, const char *params, E_Event_Zone_Edge *ev); static void _e_mod_action_winlist_signal_cb(E_Object *obj, const char *params, const char *sig, const char *src); @@ -34,6 +35,7 @@ e_modapi_init(E_Module *m) { _act_winlist->func.go = _e_mod_action_winlist_cb; _act_winlist->func.go_mouse = _e_mod_action_winlist_mouse_cb; + _act_winlist->func.go_wheel = _e_mod_action_winlist_wheel_cb; _act_winlist->func.go_key = _e_mod_action_winlist_key_cb; _act_winlist->func.go_edge = _e_mod_action_winlist_edge_cb; _act_winlist->func.go_signal = _e_mod_action_winlist_signal_cb; @@ -113,7 +115,6 @@ _e_mod_action_winlist_cb_helper(E_Object *obj EINA_UNUSED, const char *params, i E_Winlist_Filter filter = E_WINLIST_FILTER_NONE; int direction = 0; // -1 for prev, 1 for next; int udlr = -1; // 0 for up, 1 for down, 2 for left, 3 for right - Eina_Bool ok = EINA_TRUE; zone = e_zone_current_get(); if (!zone) return EINA_FALSE; @@ -143,20 +144,11 @@ _e_mod_action_winlist_cb_helper(E_Object *obj EINA_UNUSED, const char *params, i } else direction = 1; - if (direction) - ok = !e_winlist_show(zone, filter); - if (!ok) - { - if (!type) return EINA_FALSE; - e_winlist_modifiers_set(modifiers, type); - return EINA_TRUE; - } - if (direction == 1) - e_winlist_next(); - else if (direction == -1) - e_winlist_prev(); - else - e_winlist_direction_select(zone, udlr); + e_winlist_modifiers_set(modifiers, type); + if (direction) e_winlist_show(zone, filter); + if (direction == 1) e_winlist_next(); + else if (direction == -1) e_winlist_prev(); + else e_winlist_direction_select(zone, udlr); return EINA_TRUE; } @@ -173,6 +165,13 @@ _e_mod_action_winlist_mouse_cb(E_Object *obj, const char *params, E_Binding_Even e_bindings_modifiers_to_ecore_convert(ev->modifiers), E_WINLIST_ACTIVATE_TYPE_MOUSE); } +static Eina_Bool +_e_mod_action_winlist_wheel_cb(E_Object *obj, const char *params, E_Binding_Event_Wheel *ev) +{ + return _e_mod_action_winlist_cb_helper(obj, params, + e_bindings_modifiers_to_ecore_convert(ev->modifiers), E_WINLIST_ACTIVATE_TYPE_MOUSE); +} + static void _e_mod_action_winlist_key_cb(E_Object *obj, const char *params, Ecore_Event_Key *ev) { diff --git a/src/modules/winlist/e_winlist.c b/src/modules/winlist/e_winlist.c index eadd9cbad..778250ac4 100644 --- a/src/modules/winlist/e_winlist.c +++ b/src/modules/winlist/e_winlist.c @@ -73,6 +73,12 @@ _wmclass_picked(const Eina_List *lst, const char *wmclass) return EINA_FALSE; } +static void +_cb_lost(void *data EINA_UNUSED) +{ + e_winlist_hide(); +} + /* externally accessible functions */ int e_winlist_init(void) @@ -101,7 +107,7 @@ e_winlist_show(E_Zone *zone, E_Winlist_Filter filter) E_OBJECT_CHECK_RETURN(zone, 0); E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, 0); - if (_winlist) return 0; + if (_winlist) return 1; #ifndef HAVE_WAYLAND_ONLY if (e_comp->comp_type == E_PIXMAP_TYPE_X) @@ -117,6 +123,7 @@ e_winlist_show(E_Zone *zone, E_Winlist_Filter filter) _input_window = 0; return 0; } + e_grabinput_lost_cb_set(_cb_lost, NULL); } #endif if (e_comp->comp_type != E_PIXMAP_TYPE_X) @@ -155,6 +162,7 @@ e_winlist_show(E_Zone *zone, E_Winlist_Filter filter) evas_event_freeze(e_comp->evas); o = edje_object_add(e_comp->evas); + evas_object_pass_events_set(o, EINA_TRUE); _winlist = e_comp_object_util_add(o, E_COMP_OBJECT_TYPE_POPUP); evas_object_layer_set(_winlist, E_LAYER_CLIENT_POPUP); evas_object_move(_winlist, x, y); @@ -561,7 +569,6 @@ e_winlist_direction_select(E_Zone *zone, int dir) void e_winlist_modifiers_set(int mod, E_Winlist_Activate_Type type) { - if (!_winlist) return; _hold_mod = mod; _hold_count = 0; _activate_type = type;