xserver: Branch 'xorg-server-1.4-apple'
Jeremy Huddleston
jeremyhu at kemper.freedesktop.org
Sun Dec 28 23:17:50 PST 2008
hw/xquartz/X11Application.m | 89 +++++++++++++++++++++++++++++++-------------
1 file changed, 64 insertions(+), 25 deletions(-)
New commits:
commit cbb0a8a3fb3ac1131be7e6219bb912602bc9afc0
Author: Jeremy Huddleston <jeremyhu at freedesktop.org>
Date: Sun Dec 28 23:17:10 2008 -0800
XQuartz: Workaround OSX VNC server bug for modifier key state
diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m
index 2387d0d..ed41b3c 100644
--- a/hw/xquartz/X11Application.m
+++ b/hw/xquartz/X11Application.m
@@ -63,6 +63,13 @@ extern BOOL xpbproxy_init (void);
#define ProximityIn 0
#define ProximityOut 1
+/* workaround a bug in vnc for those hit by a bug in Remote Desktop on OSX */
+#define VNCMODIFIERBUGWORKAROUND 1
+
+#ifdef VNCMODIFIERBUGWORKAROUND
+static NSEventType keyState[NUM_KEYCODES];
+#endif
+
int X11EnableKeyEquivalents = TRUE, quartzFullscreenMenu = FALSE;
int quartzHasRoot = FALSE, quartzEnableRootless = TRUE;
@@ -179,29 +186,40 @@ static void message_kit_thread (SEL selector, NSObject *arg) {
- (void) activateX:(OSX_BOOL)state {
/* Create a TSM document that supports full Unicode input, and
- have it activated while X is active */
+ * have it activated while X is active
+ */
static TSMDocumentID x11_document;
- DEBUG_LOG("state=%d, _x_active=%d, \n", state, _x_active)
+#ifdef VNCMODIFIERBUGWORKAROUND
+ size_t i;
+#endif
+ DEBUG_LOG("state=%d, _x_active=%d, \n", state, _x_active)
if (state) {
- DarwinSendDDXEvent(kXquartzActivate, 0);
-
- if (!_x_active) {
- if (x11_document == 0) {
- OSType types[1];
- types[0] = kUnicodeDocument;
- NewTSMDocument (1, types, &x11_document, 0);
- }
-
- if (x11_document != 0) ActivateTSMDocument (x11_document);
- }
+ DarwinSendDDXEvent(kXquartzActivate, 0);
+
+ if (!_x_active) {
+ if (x11_document == 0) {
+ OSType types[1];
+ types[0] = kUnicodeDocument;
+ NewTSMDocument (1, types, &x11_document, 0);
+ }
+
+ if (x11_document != 0) ActivateTSMDocument (x11_document);
+ }
} else {
- DarwinSendDDXEvent(kXquartzDeactivate, 0);
-
- if (_x_active && x11_document != 0)
- DeactivateTSMDocument (x11_document);
- }
-
- _x_active = state;
+#ifdef VNCMODIFIERBUGWORKAROUND
+ DarwinUpdateModKeys(0);
+ for(i=0; i < NUM_KEYCODES; i++) {
+ if(keyState[i] == NSKeyDown)
+ DarwinSendKeyboardEvents(KeyRelease, i);
+ }
+#endif
+ DarwinSendDDXEvent(kXquartzDeactivate, 0);
+
+ if (_x_active && x11_document != 0)
+ DeactivateTSMDocument (x11_document);
+ }
+
+ _x_active = state;
}
- (void) became_key:(NSWindow *)win {
@@ -859,7 +877,10 @@ environment the next time you start X11?", @"Startup xinitrc dialog");
void X11ApplicationMain (int argc, char **argv, char **envp) {
NSAutoreleasePool *pool;
-
+#ifdef VNCMODIFIERBUGWORKAROUND
+ size_t i;
+#endif
+
#ifdef DEBUG
while (access ("/tmp/x11-block", F_OK) == 0) sleep (1);
#endif
@@ -876,6 +897,12 @@ void X11ApplicationMain (int argc, char **argv, char **envp) {
selector:@selector (became_key:)
name:NSWindowDidBecomeKeyNotification object:nil];
+#ifdef VNCMODIFIERBUGWORKAROUND
+ for(i=0; i < NUM_KEYCODES; i++) {
+ keyState[i] = NSKeyUp;
+ }
+#endif
+
/*
* The xpr Quartz mode is statically linked into this server.
* Initialize all the Quartz functions.
@@ -948,14 +975,16 @@ extern int darwin_modifier_flags; // darwinEvents.c
pressure = 0;
tilt_x = 0;
tilt_y = 0;
-
+
+#ifndef VNCMODIFIERBUGWORKAROUND
/* We don't receive modifier key events while out of focus, and 3button
* emulation mucks this up, so we need to check our modifier flag state
* on every event... ugg
*/
if(darwin_modifier_flags != [e modifierFlags])
DarwinUpdateModKeys([e modifierFlags]);
-
+#endif
+
switch ([e type]) {
case NSLeftMouseDown: ev_button=1; ev_type=ButtonPress; goto handle_mouse;
case NSOtherMouseDown: ev_button=2; ev_type=ButtonPress; goto handle_mouse;
@@ -1093,10 +1122,20 @@ extern int darwin_modifier_flags; // darwinEvents.c
DarwinSendDDXEvent(kXquartzReloadKeymap, 0);
}
}
-
+
+#ifdef VNCMODIFIERBUGWORKAROUND
+ keyState[[e keyCode]] == [e type];
+#endif
+
DarwinSendKeyboardEvents(([e type] == NSKeyDown) ? KeyPress : KeyRelease, [e keyCode]);
break;
-
+
+#ifdef VNCMODIFIERBUGWORKAROUND
+ case NSFlagsChanged:
+ DarwinUpdateModKeys([e modifierFlags]);
+ break;
+#endif
+
default: break; /* for gcc */
}
}
More information about the xorg-commit
mailing list