[Xfce4-commits] r25670 - in xfce-mcs-plugins/branches/xfce_4_4: . plugins/keyboard_plugin

Olivier Fourdan olivier at xfce.org
Wed May 2 22:59:53 CEST 2007


Author: olivier
Date: 2007-05-02 20:59:53 +0000 (Wed, 02 May 2007)
New Revision: 25670

Modified:
   xfce-mcs-plugins/branches/xfce_4_4/NEWS
   xfce-mcs-plugins/branches/xfce_4_4/plugins/keyboard_plugin/keys_management.c
Log:
Fix modifier mask not working with all keymaps (Bug #3194)

Modified: xfce-mcs-plugins/branches/xfce_4_4/NEWS
===================================================================
--- xfce-mcs-plugins/branches/xfce_4_4/NEWS	2007-05-02 20:57:46 UTC (rev 25669)
+++ xfce-mcs-plugins/branches/xfce_4_4/NEWS	2007-05-02 20:59:53 UTC (rev 25670)
@@ -1,5 +1,6 @@
 4.4.2
 =====
+- Fix modifier mask not working with all keymaps (Bug #3194)
 - Add support for xinput devices when setting left/right handed mouse.
 
 4.4.1

Modified: xfce-mcs-plugins/branches/xfce_4_4/plugins/keyboard_plugin/keys_management.c
===================================================================
--- xfce-mcs-plugins/branches/xfce_4_4/plugins/keyboard_plugin/keys_management.c	2007-05-02 20:57:46 UTC (rev 25669)
+++ xfce-mcs-plugins/branches/xfce_4_4/plugins/keyboard_plugin/keys_management.c	2007-05-02 20:59:53 UTC (rev 25670)
@@ -224,7 +224,7 @@
 }
 
 void
-init_modifiers (void)
+initModifiers (void)
 {
     GdkDisplay *gdisplay;
     GdkScreen *gscr;
@@ -232,10 +232,11 @@
 
     XModifierKeymap *modmap;
     KeySym *keymap;
-    int i;
-    int keysyms_per_keycode;
+    unsigned int keycode;
     int min_keycode;
     int max_keycode;
+    int keysyms_per_keycode;
+    int i;
 
     gdisplay = gdk_display_get_default ();
     gscr = gdk_display_get_default_screen (gdisplay);
@@ -255,47 +256,61 @@
     modmap = XGetModifierMapping (GDK_DISPLAY_XDISPLAY (gdisplay));
     keymap = XGetKeyboardMapping (GDK_DISPLAY_XDISPLAY (gdisplay), min_keycode, max_keycode - min_keycode + 1, &keysyms_per_keycode);
 
-    for (i = 3 * modmap->max_keypermod; i < 8 * modmap->max_keypermod; i++)
-    {
-        unsigned int keycode = modmap->modifiermap[i];
-
-        if ((keycode >= min_keycode) && (keycode <= max_keycode))
+    if (modmap && keymap)
+    {    
+        for (i = 3 * modmap->max_keypermod; i < 8 * modmap->max_keypermod; i++)
         {
-            int j;
-            KeySym *syms = keymap + (keycode - min_keycode) * keysyms_per_keycode;
+            keycode = modmap->modifiermap[i];
+            if ((keycode >= min_keycode) && (keycode <= max_keycode))
+            {
+                int j;
+                KeySym *syms = keymap + (keycode - min_keycode) * keysyms_per_keycode;
 
-            for (j = 0; j < keysyms_per_keycode; j++)
-            {
-                if (syms[j] == XK_Num_Lock)
+                for (j = 0; j < keysyms_per_keycode; j++)
                 {
-                    NumLockMask |= (1 << (i / modmap->max_keypermod));
+                    if (!NumLockMask && (syms[j] == XK_Num_Lock))
+                    {
+                        NumLockMask = (1 << (i / modmap->max_keypermod));
+                    }
+                    else if (!ScrollLockMask && (syms[j] == XK_Scroll_Lock))
+                    {
+                        ScrollLockMask = (1 << (i / modmap->max_keypermod));
+                    }
+                    else if (!AltMask && ((syms[j] == XK_Alt_L) || (syms[j] == XK_Alt_R)))
+                    {
+                        AltMask = (1 << (i / modmap->max_keypermod));
+                    }
+                    else if (!SuperMask && ((syms[j] == XK_Super_L) || (syms[j] == XK_Super_R)))
+                    {
+                        SuperMask = (1 << (i / modmap->max_keypermod));
+                    }
+                    else if (!HyperMask && ((syms[j] == XK_Hyper_L) || (syms[j] == XK_Hyper_R)))
+                    {
+                        HyperMask = (1 << (i / modmap->max_keypermod));
+                    }       
+                    else if (!MetaMask && ((syms[j] == XK_Meta_L) || (syms[j] == XK_Meta_R)))
+                    {
+                        MetaMask = (1 << (i / modmap->max_keypermod));
+                    }
                 }
-                else if (syms[j] == XK_Scroll_Lock)
-                {
-                    ScrollLockMask |= (1 << (i / modmap->max_keypermod));
-                }
-                else if ((syms[j] == XK_Super_L) || (syms[j] == XK_Super_R))
-                {
-                    SuperMask |= (1 << (i / modmap->max_keypermod));
-                }
-                else if ((syms[j] == XK_Hyper_L) || (syms[j] == XK_Hyper_R))
-                {
-                    HyperMask |= (1 << (i / modmap->max_keypermod));
-                }
-                else if ((syms[j] == XK_Meta_L) || (syms[j] == XK_Meta_R))
-                {
-                    MetaMask |= (1 << (i / modmap->max_keypermod));
-                }
-                else if ((syms[j] == XK_Alt_L) || (syms[j] == XK_Alt_R))
-                {
-                    AltMask |= (1 << (i / modmap->max_keypermod));
-                }
             }
         }
     }
-    KeyMask = ControlMask | ShiftMask | AltMask | MetaMask | SuperMask | HyperMask;
 
-    ButtonMask = Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask;
+    /* Cleanup memory */
+    if (modmap)
+    {
+        XFreeModifiermap (modmap);
+    }
 
-    ButtonKeyMask = KeyMask | ButtonMask;
+    if (keymap)
+    {
+        XFree (keymap);
+    }
+
+    /* In case we didn't find AltMask, use Mod1Mask */
+    if (AltMask == 0)
+    {
+        AltMask = Mod1Mask;
+    }
 }



More information about the Xfce4-commits mailing list