From 5e79976c13c5b94b12392b493846ca26be11750b Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Tue, 3 Nov 2009 16:35:27 -0800 Subject: [PATCH 1/2] XQuartz: Run xmodmap after programatically updating the keymap. Signed-off-by: Jeremy Huddleston Signed-off-by: Martin Otte --- hw/xquartz/X11Application.m | 6 ++++++ hw/xquartz/X11Controller.h | 1 + hw/xquartz/quartzKeyboard.c | 23 +++++++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m index f4fbb1abe..2c9548534 100644 --- a/hw/xquartz/X11Application.m +++ b/hw/xquartz/X11Application.m @@ -961,6 +961,12 @@ void X11ApplicationMain (int argc, char **argv, char **envp) { /* not reached */ } +void launch_client(const char *cmd) { + NSString *string = [[NSString alloc] initWithUTF8String:cmd]; + [[X11App controller] launch_client:string]; + [string release]; +} + @implementation X11Application (Private) #ifdef NX_DEVICELCMDKEYMASK diff --git a/hw/xquartz/X11Controller.h b/hw/xquartz/X11Controller.h index a86b20f17..3d8e007e7 100644 --- a/hw/xquartz/X11Controller.h +++ b/hw/xquartz/X11Controller.h @@ -144,5 +144,6 @@ typedef unsigned int NSUInteger; #endif /* __OBJC__ */ void X11ControllerMain(int argc, char **argv, char **envp); +void launch_client(const char *cmd); #endif /* X11CONTROLLER_H */ diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c index 06b981e02..5bbb9c9cf 100644 --- a/hw/xquartz/quartzKeyboard.c +++ b/hw/xquartz/quartzKeyboard.c @@ -52,6 +52,8 @@ #include "quartzKeyboard.h" #include "quartzAudio.h" +#include "X11Application.h" + #include "threadSafety.h" #ifdef NDEBUG @@ -359,6 +361,10 @@ void DarwinKeyboardReloadHandler(void) { CFIndex initialKeyRepeatValue, keyRepeatValue; BOOL ok; DeviceIntPtr pDev = darwinKeyboard; + const char *xmodmap = PROJECTROOT "/bin/xmodmap"; + const char *sysmodmap = PROJECTROOT "/lib/X11/xinit/.Xmodmap"; + const char *homedir = getenv("HOME"); + char usermodmap[PATH_MAX], cmd[PATH_MAX]; DEBUG_LOG("DarwinKeyboardReloadHandler\n"); @@ -397,6 +403,23 @@ void DarwinKeyboardReloadHandler(void) { } } } pthread_mutex_unlock(&keyInfo_mutex); + + /* Check for system .Xmodmap */ + if (access(xmodmap, F_OK) == 0) { + if (access(sysmodmap, F_OK) == 0) { + snprintf (cmd, sizeof(cmd), "%s %s", xmodmap, sysmodmap); + launch_client(cmd); + } + } + + /* Check for user's local .Xmodmap */ + if (homedir != NULL) { + snprintf (usermodmap, sizeof(usermodmap), "%s/.Xmodmap", homedir); + if (access(usermodmap, F_OK) == 0) { + snprintf (cmd, sizeof(cmd), "%s %s", xmodmap, usermodmap); + launch_client(cmd); + } + } } //----------------------------------------------------------------------------- From 7897b6c2d41bccb72c19418674c3526ecce29515 Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Tue, 27 Oct 2009 18:00:48 -0700 Subject: [PATCH 2/2] dix: Properly detect if the other device is frozen Signed-off-by: Jeremy Huddleston --- dix/events.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/dix/events.c b/dix/events.c index d070a4c6f..015c2b19f 100644 --- a/dix/events.c +++ b/dix/events.c @@ -1673,7 +1673,7 @@ AllowSome(ClientPtr client, thisGrabbed = grabinfo->grab && SameClient(grabinfo->grab, client); thisSynced = FALSE; otherGrabbed = FALSE; - othersFrozen = TRUE; + othersFrozen = FALSE; grabTime = grabinfo->grabTime; for (dev = inputInfo.devices; dev; dev = dev->next) { @@ -1689,11 +1689,9 @@ AllowSome(ClientPtr client, otherGrabbed = TRUE; if (grabinfo->sync.other == devgrabinfo->grab) thisSynced = TRUE; - if (devgrabinfo->sync.state < FROZEN) - othersFrozen = FALSE; + if (devgrabinfo->sync.state >= FROZEN) + othersFrozen = TRUE; } - else if (!devgrabinfo->sync.other || !SameClient(devgrabinfo->sync.other, client)) - othersFrozen = FALSE; } if (!((thisGrabbed && grabinfo->sync.state >= FROZEN) || thisSynced)) return;