xserver: Branch 'server-1.7-nominations' - 2 commits

Jeremy Huddleston jeremyhu at kemper.freedesktop.org
Thu Oct 1 23:35:55 PDT 2009


 hw/xquartz/mach-startup/bundle-main.c |   77 ++++++++++-------
 hw/xquartz/quartzKeyboard.c           |  147 +++++++++++++++++++---------------
 2 files changed, 131 insertions(+), 93 deletions(-)

New commits:
commit b6016134b53587b8f942243d95729bb902c58db4
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Mon Sep 28 17:05:29 2009 -0700

    XQuartz: Set the proper bitmap for key repeats...
    
    XkbSetRepeatKeys lies and doesn't do what it says it will...
    
    (cherry picked from commits b9dfed9e88389cbd29406a20d38ee4297638649b and
                                873467adad479be02cd9cc6b43685919f5612d91)

diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c
index d36d967..06b981e 100644
--- a/hw/xquartz/quartzKeyboard.c
+++ b/hw/xquartz/quartzKeyboard.c
@@ -280,98 +280,123 @@ static void DarwinBuildModifierMaps(darwinKeyboardInfo *info) {
 }
 
 /*
- * DarwinLoadKeyboardMapping
- *  Load the keyboard map from a file or system and convert
- *  it to an equivalent X keyboard map and modifier map.
- */
-static void DarwinLoadKeyboardMapping(KeySymsRec *keySyms) {    
-    DarwinBuildModifierMaps(&keyInfo);
-
-    keySyms->map        = keyInfo.keyMap;
-    keySyms->mapWidth   = GLYPHS_PER_KEY;
-    keySyms->minKeyCode = MIN_KEYCODE;
-    keySyms->maxKeyCode = MAX_KEYCODE;
-}
-
-/*
- * DarwinKeyboardSetDeviceKeyMap
- * Load a keymap into the keyboard device
- */
-static void DarwinKeyboardSetDeviceKeyMap(KeySymsRec *keySyms, CARD8 *modmap) {
-    DeviceIntPtr pDev;
-
-    for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
-        if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key)
-            XkbApplyMappingChange(pDev, keySyms, keySyms->minKeyCode,
-                                  keySyms->maxKeyCode - keySyms->minKeyCode + 1,
-                                  modmap, serverClient);
-}
-
-/*
  * DarwinKeyboardInit
  *      Get the Darwin keyboard map and compute an equivalent
  *      X keyboard map and modifier map. Set the new keyboard
  *      device structure.
  */
 void DarwinKeyboardInit(DeviceIntPtr pDev) {
-    KeySymsRec keySyms;
-    XkbComponentNamesRec names;
-    CFIndex value;
-    BOOL ok;
-
     // Open a shared connection to the HID System.
     // Note that the Event Status Driver is really just a wrapper
     // for a kIOHIDParamConnectType connection.
     assert(darwinParamConnect = NXOpenEventStatus());
 
-    bzero(&names, sizeof(names));
-
     /* We need to really have rules... or something... */
     //XkbSetRulesDflts("base", "pc105", "us", NULL, NULL);
 
     InitKeyboardDeviceStruct(pDev, NULL, NULL, DarwinChangeKeyboardControl);
 
-    pthread_mutex_lock(&keyInfo_mutex);   
-    DarwinLoadKeyboardMapping(&keySyms);    
-    DarwinKeyboardSetDeviceKeyMap(&keySyms, keyInfo.modMap);
-    pthread_mutex_unlock(&keyInfo_mutex);
+    DarwinKeyboardReloadHandler();
 
-    /* Get our key repeat settings from GlobalPreferences */
-    (void)CFPreferencesAppSynchronize(CFSTR(".GlobalPreferences"));
-    value = CFPreferencesGetAppIntegerValue(CFSTR("InitialKeyRepeat"), CFSTR(".GlobalPreferences"), &ok);
-    if(!ok)
-        value = 35;
+    CopyKeyClass(pDev, inputInfo.keyboard);
+}
 
-    if(value == 300000) { // off
+/* Set the repeat rates based on global preferences and keycodes for modifiers.
+ * Precondition: Has the keyInfo_mutex lock.
+ */
+static void DarwinKeyboardSetRepeat(DeviceIntPtr pDev, int initialKeyRepeatValue, int keyRepeatValue) {
+    if(initialKeyRepeatValue == 300000) { // off
+        /* Turn off repeats globally */
         XkbSetRepeatKeys(pDev, -1, AutoRepeatModeOff);
     } else {
-        pDev->key->xkbInfo->desc->ctrls->repeat_delay = value * 15;
-
-        value = CFPreferencesGetAppIntegerValue(CFSTR("KeyRepeat"), CFSTR(".GlobalPreferences"), &ok);
-        if(!ok)
-            value = 6;
-        pDev->key->xkbInfo->desc->ctrls->repeat_interval = value * 15;
+        int i;
+        XkbControlsPtr      ctrl;
+        XkbControlsRec      old;
 
+        /* Turn on repeats globally */
         XkbSetRepeatKeys(pDev, -1, AutoRepeatModeOn);
-    }
+        
+        /* Setup the bit mask for individual key repeats */
+        ctrl = pDev->key->xkbInfo->desc->ctrls;
+        old= *ctrl;
+        
+        ctrl->repeat_delay = initialKeyRepeatValue * 15;
+        ctrl->repeat_interval = keyRepeatValue * 15;
+
+        /* Turn off key-repeat for modifier keys, on for others */
+        /* First set them all on */
+        for(i=0; i < XkbPerKeyBitArraySize; i++)
+            ctrl->per_key_repeat[i] = -1;
+
+        /* Now turn off the modifiers */
+        for(i=0; i < 32; i++) {
+            unsigned char keycode;
+            
+            keycode = keyInfo.modifierKeycodes[i][0];
+            if(keycode)
+                ClearBit(ctrl->per_key_repeat, keycode + MIN_KEYCODE);
+
+            keycode = keyInfo.modifierKeycodes[i][1];
+            if(keycode)
+                ClearBit(ctrl->per_key_repeat, keycode + MIN_KEYCODE);
+        }
 
-    CopyKeyClass(pDev, inputInfo.keyboard);
+        /* Hurray for data duplication */
+        if (pDev->kbdfeed)
+            memcpy(pDev->kbdfeed->ctrl.autoRepeats, ctrl->per_key_repeat, XkbPerKeyBitArraySize);
+
+        //fprintf(stderr, "per_key_repeat =\n");
+        //for(i=0; i < XkbPerKeyBitArraySize; i++)
+        //    fprintf(stderr, "%02x%s", ctrl->per_key_repeat[i], (i + 1) & 7 ? "" : "\n");
+
+        /* And now we notify the puppies about the changes */
+        XkbDDXChangeControls(pDev, &old, ctrl);
+    }
 }
 
 void DarwinKeyboardReloadHandler(void) {
     KeySymsRec keySyms;
+    CFIndex initialKeyRepeatValue, keyRepeatValue;
+    BOOL ok;
+    DeviceIntPtr pDev = darwinKeyboard;
 
     DEBUG_LOG("DarwinKeyboardReloadHandler\n");
-//    if (pDev->key) {
-//        if (pDev->key->curKeySyms.map) xfree(pDev->key->curKeySyms.map);
-//        xfree(pDev->key);
-//    }
 
+    /* Get our key repeat settings from GlobalPreferences */
+    (void)CFPreferencesAppSynchronize(CFSTR(".GlobalPreferences"));
     
-    pthread_mutex_lock(&keyInfo_mutex);
-    DarwinLoadKeyboardMapping(&keySyms);
-    DarwinKeyboardSetDeviceKeyMap(&keySyms, keyInfo.modMap);
-    pthread_mutex_unlock(&keyInfo_mutex);
+    initialKeyRepeatValue = CFPreferencesGetAppIntegerValue(CFSTR("InitialKeyRepeat"), CFSTR(".GlobalPreferences"), &ok);
+    if(!ok)
+        initialKeyRepeatValue = 35;
+    
+    keyRepeatValue = CFPreferencesGetAppIntegerValue(CFSTR("KeyRepeat"), CFSTR(".GlobalPreferences"), &ok);
+    if(!ok)
+        keyRepeatValue = 6;
+    
+    pthread_mutex_lock(&keyInfo_mutex); {
+        /* Initialize our keySyms */
+        DarwinBuildModifierMaps(&keyInfo);
+        keySyms.map = keyInfo.keyMap;
+        keySyms.mapWidth   = GLYPHS_PER_KEY;
+        keySyms.minKeyCode = MIN_KEYCODE;
+        keySyms.maxKeyCode = MAX_KEYCODE;
+
+        /* Apply the mappings to darwinKeyboard */
+        XkbApplyMappingChange(darwinKeyboard, &keySyms, keySyms.minKeyCode,
+                              keySyms.maxKeyCode - keySyms.minKeyCode + 1,
+                              keyInfo.modMap, serverClient);
+        DarwinKeyboardSetRepeat(darwinKeyboard, initialKeyRepeatValue, keyRepeatValue);
+
+        /* Apply the mappings to the core keyboard */
+        for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
+            if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key) {
+                XkbApplyMappingChange(pDev, &keySyms, keySyms.minKeyCode,
+                                      keySyms.maxKeyCode - keySyms.minKeyCode + 1,
+                                      keyInfo.modMap, serverClient);
+                DarwinKeyboardSetRepeat(pDev, initialKeyRepeatValue, keyRepeatValue);    
+            }
+        }
+    } pthread_mutex_unlock(&keyInfo_mutex);
 }
 
 //-----------------------------------------------------------------------------
commit 3808ecc99a8d64cdbe3fb4a3b57c59e7545e362c
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date:   Mon Sep 28 17:47:31 2009 -0700

    XQuartz: Query the BundleIdentifier from the bundle in X11.bin rather than using the configure option.
    
    This lets X11.bin drop into any .app ... the Info.plist and Xquartz binary need to have it hardcoded still.
    (cherry picked from commit 9ad16b8e50b13eb6d0cd20386d07aa8d7320f671)

diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index 917bbaf..146ea11 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -80,7 +80,8 @@ const char *__crashreporter_info__base = "X.Org X Server " XSERVER_VERSION " Bui
 char __crashreporter_info__buf[4096];
 char *__crashreporter_info__ = __crashreporter_info__buf;
 
-static char *server_bootstrap_name = LAUNCHD_ID_PREFIX".X11";
+static char *launchd_id_prefix = NULL;
+static char *server_bootstrap_name = NULL;
 
 #define DEBUG 1
 
@@ -456,6 +457,7 @@ static void setup_env(void) {
     char *temp;
     const char *pds = NULL;
     const char *disp = getenv("DISPLAY");
+    size_t len;
 
     /* Pass on our prefs domain to startx and its inheritors (mainly for
      * quartz-wm and the Xquartz stub's MachIPC)
@@ -465,45 +467,56 @@ static void setup_env(void) {
         CFStringRef pd = CFBundleGetIdentifier(bundle);
         if(pd) {
             pds = CFStringGetCStringPtr(pd, 0);
-            if(pds) {
-                server_bootstrap_name = malloc(sizeof(char) * (strlen(pds) + 1));
-                strcpy(server_bootstrap_name, pds);
-                setenv("X11_PREFS_DOMAIN", pds, 1);
-            }
         }
     }
+
+    /* fallback to hardcoded value if we can't discover it */
+    if(!pds) {
+        pds = LAUNCHD_ID_PREFIX".X11";
+    }
+
+    server_bootstrap_name = malloc(sizeof(char) * (strlen(pds) + 1));
+    if(!server_bootstrap_name) {
+        fprintf(stderr, "Memory allocation error.\n");
+        exit(1);
+    }
+    strcpy(server_bootstrap_name, pds);
+    setenv("X11_PREFS_DOMAIN", server_bootstrap_name, 1);
+    
+    len = strlen(server_bootstrap_name);
+    launchd_id_prefix = malloc(sizeof(char) * (len - 3));
+    if(!launchd_id_prefix) {
+        fprintf(stderr, "Memory allocation error.\n");
+        exit(1);
+    }
+    strlcpy(launchd_id_prefix, server_bootstrap_name, len - 3);
+    
     /* We need to unset DISPLAY if it is not our socket */
     if(disp) {
-        if(!pds) {
-            /* If we can't detet our id, we are beyond hope and need to just
-             * revert to the non-launchd startup */
-            unsetenv("DISPLAY");
-        } else {
-            /* s = basename(disp) */
-            const char *d, *s;
+        /* s = basename(disp) */
+        const char *d, *s;
 	    for(s = NULL, d = disp; *d; d++) {
-                if(*d == '/')
-                     s = d + 1;
-            }
-
-            if(s && *s) {
-                size_t pds_len = strlen(pds);
-                temp = (char *)malloc(sizeof(char) * pds_len);
-                if(!temp) {
-                    fprintf(stderr, "Memory allocation error creating space for socket name test.\n");
-                }
-                strlcpy(temp, pds, pds_len - 3);
-                strlcat(temp, ":0", pds_len);
+            if(*d == '/')
+                s = d + 1;
+        }
 
-                if(strcmp(temp, s) != 0) {
-                    /* If we don't have a match, unset it. */
-                    unsetenv("DISPLAY");
-                }
-                free(temp);
-            } else {
-                /* The DISPLAY environment variable is not formatted like a launchd socket, so reset. */
+        if(s && *s) {
+            temp = (char *)malloc(sizeof(char) * len);
+            if(!temp) {
+                fprintf(stderr, "Memory allocation error creating space for socket name test.\n");
+                exit(1);
+            }
+            strlcpy(temp, launchd_id_prefix, len);
+            strlcat(temp, ":0", len);
+            
+            if(strcmp(temp, s) != 0) {
+                /* If we don't have a match, unset it. */
                 unsetenv("DISPLAY");
             }
+            free(temp);
+        } else {
+            /* The DISPLAY environment variable is not formatted like a launchd socket, so reset. */
+            unsetenv("DISPLAY");
         }
     }
 


More information about the xorg-commit mailing list