[metacity] Unify keymap-reloading code branches



commit ba2e5f7f541446931299814bafa642d09047f386
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Sun May 2 11:35:33 2010 -0400

    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

 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 f6c276a..1659c02 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);
     }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]