diff options
| author | infirit <[email protected]> | 2014-11-12 18:42:00 +0100 | 
|---|---|---|
| committer | infirit <[email protected]> | 2014-11-12 20:36:49 +0100 | 
| commit | d817c619c77795b9fd438ff5b3931df6b2d38184 (patch) | |
| tree | d35193552bb62c51f7c0ca48c0853c5b631fd710 /src/core/keybindings.c | |
| parent | 1de3cf470353049ee9974bd6d9a437f556931bea (diff) | |
| download | marco-d817c619c77795b9fd438ff5b3931df6b2d38184.tar.bz2 marco-d817c619c77795b9fd438ff5b3931df6b2d38184.tar.xz  | |
Unify keymap-reloading code branches
Simplify the keymap loading logic by unifying the different
branches; in the reorganization this patch fixes a bug where when
we got a MappingKeyboard event we wouldn't update virtual modifiers
correctly.
Based on a patch by Thomas Thurman <[email protected]>
Based on metacity commit: ba2e5f7f541446931299814bafa642d09047f386
From: "Owen W. Taylor" <[email protected]>
Gnome bug: https://bugzilla.gnome.org/show_bug.cgi?id=565540
Diffstat (limited to 'src/core/keybindings.c')
| -rw-r--r-- | src/core/keybindings.c | 38 | 
1 files changed, 24 insertions, 14 deletions
diff --git a/src/core/keybindings.c b/src/core/keybindings.c index 9bdea53e..81b1c47f 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -506,19 +506,17 @@ void  meta_display_process_mapping_event (MetaDisplay *display,                                      XEvent      *event)  { +  gboolean keymap_changed = FALSE; +  gboolean modmap_changed = FALSE; +  #ifdef HAVE_XKB    if (event->type == display->xkb_base_event_type)      {        meta_topic (META_DEBUG_KEYBINDINGS,                    "XKB mapping changed, will redo keybindings\n"); -      reload_keymap (display); -      reload_modmap (display); - -      reload_keycodes (display); -      reload_modifiers (display); - -      regrab_key_bindings (display); +      keymap_changed = TRUE; +      modmap_changed = TRUE;      }    else  #endif @@ -527,21 +525,33 @@ meta_display_process_mapping_event (MetaDisplay *display,        meta_topic (META_DEBUG_KEYBINDINGS,                    "Received MappingModifier event, will reload modmap and redo keybindings\n"); -      reload_modmap (display); - -      reload_modifiers (display); - -      regrab_key_bindings (display); +      modmap_changed = TRUE;      }    else if (event->xmapping.request == MappingKeyboard)      {        meta_topic (META_DEBUG_KEYBINDINGS,                    "Received MappingKeyboard event, will reload keycodes and redo keybindings\n"); -      reload_keymap (display); +      keymap_changed = TRUE; +    } + +  /* Now to do the work itself */ + +  if (keymap_changed || modmap_changed) +    { +      if (keymap_changed) +        reload_keymap (display); + +      /* Deciphering the modmap depends on the loaded keysyms to find out +       * what modifiers is Super and so forth, so we need to reload it +       * even when only the keymap changes */        reload_modmap (display); -      reload_keycodes (display); + +      if (keymap_changed) +        reload_keycodes (display); + +      reload_modifiers (display);        regrab_key_bindings (display);      }  | 
