From 8500517e348345b1eed17de2d463ec9cc8b1b17f Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 22 Jan 2016 12:41:43 -0500 Subject: [PATCH] add function for disabling mouse/key/wheel/signal bindings currently there are a lot of workarounds for inhibiting these bindings, but it's getting harder to keep track of all the conditions and cases where bindings need to be worked around this should greatly simplify the process of toggling binding activation in cases where such behavior is undesirable acpi bindings are always allowed since they are unlikely to interfere with operations where direct-input bindings would be harmful --- src/bin/e_bindings.c | 46 ++++++++++++++++++++++++++++++++++++++++++++ src/bin/e_bindings.h | 2 ++ 2 files changed, 48 insertions(+) diff --git a/src/bin/e_bindings.c b/src/bin/e_bindings.c index fffb68a8c..13605295c 100644 --- a/src/bin/e_bindings.c +++ b/src/bin/e_bindings.c @@ -20,6 +20,8 @@ static Eina_List *signal_bindings = NULL; static Eina_List *wheel_bindings = NULL; static Eina_List *acpi_bindings = NULL; +static unsigned int bindings_disabled = 0; + typedef struct _E_Binding_Edge_Data E_Binding_Edge_Data; struct _E_Binding_Edge_Data @@ -447,6 +449,7 @@ e_bindings_mouse_down_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Bind E_Action *act; E_Binding_Mouse *binding; + if (bindings_disabled) return NULL; act = e_bindings_mouse_button_find(ctxt, ev, &binding); if (act) { @@ -485,6 +488,7 @@ e_bindings_mouse_up_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Bindin E_Action *act; E_Binding_Mouse *binding; + if (bindings_disabled) return NULL; act = e_bindings_mouse_button_find(ctxt, ev, &binding); if (act) { @@ -643,6 +647,7 @@ e_bindings_key_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_Ev E_Binding_Key *binding; Eina_List *l; + if (bindings_disabled) return NULL; mod = _e_bindings_modifiers(ev->modifiers); EINA_LIST_FOREACH(key_bindings, l, binding) { @@ -676,6 +681,7 @@ e_bindings_key_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_Even E_Binding_Key *binding; Eina_List *l; + if (bindings_disabled) return NULL; mod = _e_bindings_modifiers(ev->modifiers); EINA_LIST_FOREACH(key_bindings, l, binding) { @@ -894,6 +900,7 @@ e_bindings_edge_in_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Z E_Action *act = NULL; Eina_List *l; + if (bindings_disabled) return NULL; current = e_desk_at_xy_get(ev->zone, ev->zone->desk_x_current, ev->zone->desk_y_current); if (current->fullscreen_clients && (!e_config->fullscreen_flip)) return NULL; @@ -943,6 +950,7 @@ e_bindings_edge_out_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_ E_Action *act = NULL; Eina_List *l; + if (bindings_disabled) return NULL; if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT; if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL; if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT; @@ -986,6 +994,7 @@ e_bindings_edge_down_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event E_Action *act = NULL; Eina_List *l; + if (bindings_disabled) return NULL; current = e_desk_at_xy_get(ev->zone, ev->zone->desk_x_current, ev->zone->desk_y_current); if (current->fullscreen_clients && (!e_config->fullscreen_flip)) return NULL; @@ -1022,6 +1031,7 @@ e_bindings_edge_up_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Z E_Action *act = NULL; Eina_List *l; + if (bindings_disabled) return NULL; if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT; if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL; if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT; @@ -1121,6 +1131,7 @@ e_bindings_signal_handle(E_Binding_Context ctxt, E_Object *obj, const char *sig, E_Action *act; E_Binding_Signal *binding; + if (bindings_disabled) return NULL; if ((!sig) || (sig && (sig[0] == 0))) return NULL; if (src && (src[0] == 0)) src = NULL; @@ -1285,6 +1296,7 @@ e_bindings_wheel_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Binding_E E_Action *act; E_Binding_Wheel *binding; + if (bindings_disabled) return NULL; act = e_bindings_wheel_find(ctxt, ev, &binding); if (act) { @@ -1400,6 +1412,40 @@ e_bindings_acpi_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Acpi return act; } +E_API void +e_bindings_disabled_set(Eina_Bool disabled) +{ + E_Client *ec; + Ecore_Window win; + + if (disabled) + { + if ((!bindings_disabled) && (e_comp->comp_type == E_PIXMAP_TYPE_X)) + { + e_bindings_key_ungrab(E_BINDING_CONTEXT_ANY, e_comp->root); + E_CLIENT_FOREACH(ec) + { + if (e_client_util_ignored_get(ec)) continue; + win = e_client_util_win_get(ec); + e_bindings_mouse_ungrab(E_BINDING_CONTEXT_WINDOW, win); + e_bindings_wheel_ungrab(E_BINDING_CONTEXT_WINDOW, win); + } + } + bindings_disabled++; + } + else if (bindings_disabled) + bindings_disabled--; + if (bindings_disabled || (e_comp->comp_type != E_PIXMAP_TYPE_X)) return; + e_bindings_key_grab(E_BINDING_CONTEXT_ANY, e_comp->root); + E_CLIENT_FOREACH(ec) + { + if (e_client_util_ignored_get(ec)) continue; + win = e_client_util_win_get(ec); + e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, win); + e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, win); + } +} + static void _e_bindings_mouse_free(E_Binding_Mouse *binding) { diff --git a/src/bin/e_bindings.h b/src/bin/e_bindings.h index 1c7c0bdb4..a06f3ef8c 100644 --- a/src/bin/e_bindings.h +++ b/src/bin/e_bindings.h @@ -202,5 +202,7 @@ E_API void e_bindings_evas_event_mouse_wheel_convert(const Evas_Event_Mouse_Whee E_API void e_bindings_ecore_event_mouse_button_convert(const Ecore_Event_Mouse_Button *ev, E_Binding_Event_Mouse_Button *event); E_API void e_bindings_ecore_event_mouse_wheel_convert(const Ecore_Event_Mouse_Wheel *ev, E_Binding_Event_Wheel *event); + +E_API void e_bindings_disabled_set(Eina_Bool disabled); #endif #endif