[gnome-settings-daemon] keyboard: Clean up Num-Lock setup and XKB checking



commit 61a0c22fa2e5bbf7ea37d3b3e130fba329939566
Author: Bastien Nocera <hadess hadess net>
Date:   Thu Apr 26 17:41:21 2012 +0100

    keyboard: Clean up Num-Lock setup and XKB checking

 plugins/keyboard/gsd-keyboard-manager.c |   61 ++++++++++++++++++-------------
 1 files changed, 36 insertions(+), 25 deletions(-)
---
diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c
index 84c6e00..845e71d 100644
--- a/plugins/keyboard/gsd-keyboard-manager.c
+++ b/plugins/keyboard/gsd-keyboard-manager.c
@@ -92,14 +92,13 @@ xkb_set_keyboard_autorepeat_rate (guint delay, guint interval)
                                      interval);
 }
 
-static void
-numlock_xkb_init (GsdKeyboardManager *manager)
+static gboolean
+check_xkb_extension (GsdKeyboardManager *manager)
 {
         Display *dpy = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
-        gboolean have_xkb;
         int opcode, error_base, major, minor;
 
-        have_xkb = XkbQueryExtension (dpy,
+        manager->priv->have_xkb = XkbQueryExtension (dpy,
                                       &opcode,
                                       &manager->priv->xkb_event_base,
                                       &error_base,
@@ -107,17 +106,23 @@ numlock_xkb_init (GsdKeyboardManager *manager)
                                       &minor)
                 && XkbUseExtension (dpy, &major, &minor);
 
-        if (have_xkb) {
-                XkbSelectEventDetails (dpy,
-                                       XkbUseCoreKbd,
-                                       XkbStateNotifyMask,
-                                       XkbModifierLockMask,
-                                       XkbModifierLockMask);
-        } else {
-                g_warning ("XKB extension not available");
-        }
+        return manager->priv->have_xkb;
+}
+
+static void
+numlock_xkb_init (GsdKeyboardManager *manager)
+{
+        Display *dpy;
+
+	if (manager->priv->have_xkb == FALSE)
+		return;
 
-        manager->priv->have_xkb = have_xkb;
+        dpy = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
+        XkbSelectEventDetails (dpy,
+                               XkbUseCoreKbd,
+                               XkbStateNotifyMask,
+                               XkbModifierLockMask,
+                               XkbModifierLockMask);
 }
 
 static unsigned
@@ -183,6 +188,17 @@ numlock_install_xkb_callback (GsdKeyboardManager *manager)
 }
 
 static void
+numlock_remove_xkb_callback (GsdKeyboardManager *manager)
+{
+        if (!manager->priv->have_xkb)
+                return;
+
+        gdk_window_remove_filter (NULL,
+                                  numlock_xkb_callback,
+                                  manager);
+}
+
+static void
 apply_settings (GSettings          *settings,
                 const char         *key,
                 GsdKeyboardManager *manager)
@@ -263,13 +279,13 @@ start_keyboard_idle_cb (GsdKeyboardManager *manager)
 
         g_debug ("Starting keyboard manager");
 
-        manager->priv->have_xkb = 0;
+	check_xkb_extension (manager);
         manager->priv->settings = g_settings_new (GSD_KEYBOARD_DIR);
 
-        /* Essential - xkb initialization should happen before */
-        gsd_keyboard_xkb_init (manager);
-
-        numlock_xkb_init (manager);
+	if (manager->priv->have_xkb) {
+		gsd_keyboard_xkb_init (manager);
+		numlock_xkb_init (manager);
+	}
 
         /* apply current settings before we install the callback */
         gsd_keyboard_manager_apply_settings (manager);
@@ -311,12 +327,7 @@ gsd_keyboard_manager_stop (GsdKeyboardManager *manager)
                 p->settings = NULL;
         }
 
-        if (p->have_xkb) {
-                gdk_window_remove_filter (NULL,
-                                          numlock_xkb_callback,
-                                          manager);
-        }
-
+        numlock_remove_xkb_callback (manager);
         gsd_keyboard_xkb_shutdown ();
 }
 



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