summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen W. Taylor <otaylor@fishsoup.net>2010-05-02 11:35:33 -0400
committerOwen W. Taylor <otaylor@fishsoup.net>2010-11-22 15:54:29 -0500
commitba2e5f7f541446931299814bafa642d09047f386 (patch)
treeb30b92348fa9b86515a1cb46106a7ff0cd91eac7
parentc262e3d65a37abedc507705cddfec72c901c321f (diff)
downloadmetacity-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.c39
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);
}