From ed6821a819bd632a8dfe9ae30b1cac94341b71cd Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Wed, 26 Feb 2014 18:56:17 +0100 Subject: [PATCH] keybindings: fix per window keybindings We must spoof events to clutter even if they are associated with a MetaWindow, because keyboard events are always associated with one (the focus window), and we must process keybindings for window togheter with the global ones if they include Super, because we're not going to see them again. --- src/compositor/compositor.c | 57 ++++++++++--------------------------- src/core/keybindings.c | 16 +++++------ 2 files changed, 22 insertions(+), 51 deletions(-) diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index 0fd6d6789..8982bbd08 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -971,24 +971,22 @@ maybe_spoof_event_as_stage_event (MetaCompScreen *info, event->xcookie.extension == display->xinput_opcode) { XIEvent *input_event = (XIEvent *) event->xcookie.data; + XIDeviceEvent *device_event = ((XIDeviceEvent *) input_event); switch (input_event->evtype) { case XI_Motion: case XI_ButtonPress: case XI_ButtonRelease: - case XI_KeyPress: - case XI_KeyRelease: - { - XIDeviceEvent *device_event = ((XIDeviceEvent *) input_event); - /* If this is a GTK+ widget, like a window menu, let GTK+ handle * it as-is without mangling. */ if (meta_ui_window_is_widget (info->screen->ui, device_event->event)) break; + /* fall through */ + case XI_KeyPress: + case XI_KeyRelease: device_event->event = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage)); - } break; default: break; @@ -1008,6 +1006,12 @@ meta_compositor_process_event (MetaCompositor *compositor, XEvent *event, MetaWindow *window) { + MetaDisplay *display = compositor->display; + MetaScreen *screen = display->screens->data; + MetaCompScreen *info; + + info = meta_screen_get_compositor_data (screen); + if (compositor->modal_plugin && is_grabbed_event (compositor->display, event)) { _meta_plugin_xevent_filter (compositor->modal_plugin, event); @@ -1017,43 +1021,12 @@ meta_compositor_process_event (MetaCompositor *compositor, return TRUE; } - if (window) + maybe_spoof_event_as_stage_event (info, event); + + if (meta_plugin_manager_xevent_filter (info->plugin_mgr, event)) { - MetaCompScreen *info; - MetaScreen *screen; - - screen = meta_window_get_screen (window); - info = meta_screen_get_compositor_data (screen); - - if (meta_plugin_manager_xevent_filter (info->plugin_mgr, event)) - { - DEBUG_TRACE ("meta_compositor_process_event (filtered,window==NULL)\n"); - return TRUE; - } - } - else - { - GSList *l; - - l = meta_display_get_screens (compositor->display); - - while (l) - { - MetaScreen *screen = l->data; - MetaCompScreen *info; - - info = meta_screen_get_compositor_data (screen); - - maybe_spoof_event_as_stage_event (info, event); - - if (meta_plugin_manager_xevent_filter (info->plugin_mgr, event)) - { - DEBUG_TRACE ("meta_compositor_process_event (filtered,window==NULL)\n"); - return TRUE; - } - - l = l->next; - } + DEBUG_TRACE ("meta_compositor_process_event (filtered,window==NULL)\n"); + return TRUE; } if (!meta_is_wayland_compositor () && diff --git a/src/core/keybindings.c b/src/core/keybindings.c index db2db7687..bf33587df 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -1842,8 +1842,7 @@ process_event (MetaKeyBinding *bindings, MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - ClutterKeyEvent *event, - gboolean on_window) + ClutterKeyEvent *event) { int i; @@ -1859,7 +1858,7 @@ process_event (MetaKeyBinding *bindings, { MetaKeyHandler *handler = bindings[i].handler; - if ((!on_window && handler->flags & META_KEY_BINDING_PER_WINDOW) || + if ((!window && handler->flags & META_KEY_BINDING_PER_WINDOW) || (event->keyval != bindings[i].keysym) || (event->modifier_state != bindings[i].mask) || meta_compositor_filter_keybinding (display->compositor, screen, &bindings[i])) @@ -1891,7 +1890,8 @@ process_event (MetaKeyBinding *bindings, static gboolean process_overlay_key (MetaDisplay *display, MetaScreen *screen, - ClutterKeyEvent *event) + ClutterKeyEvent *event, + MetaWindow *window) { if (display->overlay_key_only_pressed) { @@ -1913,8 +1913,7 @@ process_overlay_key (MetaDisplay *display, */ if (process_event (display->key_bindings, display->n_key_bindings, - display, screen, NULL, event, - FALSE)) + display, screen, window, event)) { /* As normally, after we've handled a global key * binding, we unfreeze the keyboard but keep the grab @@ -2056,7 +2055,7 @@ meta_display_process_key_event (MetaDisplay *display, all_keys_grabbed = window ? window->all_keys_grabbed : screen->all_keys_grabbed; if (!all_keys_grabbed) { - handled = process_overlay_key (display, screen, event); + handled = process_overlay_key (display, screen, event, window); if (handled) return TRUE; @@ -2150,8 +2149,7 @@ meta_display_process_key_event (MetaDisplay *display, /* Do the normal keybindings */ return process_event (display->key_bindings, display->n_key_bindings, - display, screen, window, event, - !all_keys_grabbed && window); + display, screen, window, event); } static gboolean