diff options
author | Owen W. Taylor <otaylor@fishsoup.net> | 2010-05-02 11:35:33 -0400 |
---|---|---|
committer | Owen W. Taylor <otaylor@fishsoup.net> | 2010-11-22 15:54:29 -0500 |
commit | ba2e5f7f541446931299814bafa642d09047f386 (patch) | |
tree | b30b92348fa9b86515a1cb46106a7ff0cd91eac7 | |
parent | c262e3d65a37abedc507705cddfec72c901c321f (diff) | |
download | metacity-ba2e5f7f541446931299814bafa642d09047f386.tar.gz |
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 <tthurman@gnome.org>
https://bugzilla.gnome.org/show_bug.cgi?id=565540
-rw-r--r-- | src/core/keybindings.c | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/src/core/keybindings.c b/src/core/keybindings.c index f6c276ab..1659c027 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,32 @@ 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); } |