xserver: Branch 'xorg-server-1.2-apple' - 4 commits
Ben Byer
bbyer at kemper.freedesktop.org
Wed Nov 7 02:59:06 PST 2007
configure.ac | 2
hw/darwin/Makefile.am | 3
hw/darwin/apple/X11Application.m | 539 ++++++++++++++++++---------------------
hw/darwin/quartz/quartz.c | 16 -
hw/darwin/quartz/xpr/xpr.h | 3
hw/darwin/quartz/xpr/xprFrame.c | 31 ++
6 files changed, 297 insertions(+), 297 deletions(-)
New commits:
commit 1ff9cccd7beba7520aa65a4813fc4cc29a44f78d
Author: Ben Byer <bbyer at bbyer.local>
Date: Wed Nov 7 02:58:56 2007 -0800
bump to version 1.2a7
diff --git a/configure.ac b/configure.ac
index 815bd8b..22252fb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -28,7 +28,7 @@ dnl Process this file with autoconf to create configure.
AC_PREREQ(2.57)
dnl This is the not the Xorg version number, it's the server version number.
dnl Yes, that's weird.
-AC_INIT([xorg-server], 1.2a6, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
+AC_INIT([xorg-server], 1.2a7, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
AC_CONFIG_SRCDIR([Makefile.am])
AM_INIT_AUTOMAKE([dist-bzip2 foreign])
AM_MAINTAINER_MODE
diff --git a/hw/darwin/Makefile.am b/hw/darwin/Makefile.am
index bfde6f6..45eb08b 100644
--- a/hw/darwin/Makefile.am
+++ b/hw/darwin/Makefile.am
@@ -1,11 +1,10 @@
noinst_LIBRARIES = libdarwinShared.a
libdarwin_XINPUT_SRCS = darwinXinput.c
-# -O2 inexplicably causes quartzKeyboard.o to break?!
AM_CFLAGS = @XORG_CFLAGS@
INCLUDES = @XORG_INCS@ -I../../miext/rootless
-DEFS = @DEFS@ -DUSE_NEW_CLUT
+DEFS = @DEFS@ -DUSE_NEW_CLUT -DBUILD_DATE=\"$(BUILD_DATE)\"
if XQUARTZ
XQUARTZ_SUBDIRS = bundle quartz
diff --git a/hw/darwin/apple/X11Application.m b/hw/darwin/apple/X11Application.m
index c52dfd0..d0c4936 100644
--- a/hw/darwin/apple/X11Application.m
+++ b/hw/darwin/apple/X11Application.m
@@ -156,7 +156,7 @@ message_kit_thread (SEL selector, NSObject *arg)
tem = [infoDict objectForKey:@"CFBundleShortVersionString"];
- [dict setObject:[NSString stringWithFormat:@"X11.app %@ - X.org X11R7.2 (xorg-server-1.2a6)",
+ [dict setObject:[NSString stringWithFormat:@"X11.app %@ - X.org X11R7.2 (xorg-server-1.2a7)",
tem] forKey:@"ApplicationVersion"];
[self orderFrontStandardAboutPanelWithOptions: dict];
commit a0abe7982d94a629e95d23161e78dafc30dbe731
Author: Ben Byer <bbyer at bbyer.local>
Date: Wed Nov 7 02:28:49 2007 -0800
removed debugging output
diff --git a/hw/darwin/quartz/quartz.c b/hw/darwin/quartz/quartz.c
index 113a7d2..eccb4ef 100644
--- a/hw/darwin/quartz/quartz.c
+++ b/hw/darwin/quartz/quartz.c
@@ -357,7 +357,7 @@ void DarwinModeProcessEvent(
break;
case kXDarwinActivate:
- ErrorF("kXDarwinActivate\n");
+ // ErrorF("kXDarwinActivate\n");
QuartzShow(xe->u.keyButtonPointer.rootX,
xe->u.keyButtonPointer.rootY);
AppleWMSendEvent(AppleWMActivationNotify,
@@ -366,7 +366,7 @@ void DarwinModeProcessEvent(
break;
case kXDarwinDeactivate:
- ErrorF("kXDarwinDeactivate\n");
+ // ErrorF("kXDarwinDeactivate\n");
AppleWMSendEvent(AppleWMActivationNotify,
AppleWMActivationNotifyMask,
AppleWMIsInactive, 0);
@@ -374,18 +374,18 @@ void DarwinModeProcessEvent(
break;
case kXDarwinDisplayChanged:
- ErrorF("kXDarwinDisplayChanged\n");
+ // ErrorF("kXDarwinDisplayChanged\n");
QuartzUpdateScreens();
break;
case kXDarwinWindowState:
- ErrorF("kXDarwinWindowState\n");
+ // ErrorF("kXDarwinWindowState\n");
RootlessNativeWindowStateChanged(xe->u.clientMessage.u.l.longs0,
xe->u.clientMessage.u.l.longs1);
break;
case kXDarwinWindowMoved:
- ErrorF("kXDarwinWindowMoved\n");
+ // ErrorF("kXDarwinWindowMoved\n");
RootlessNativeWindowMoved (xe->u.clientMessage.u.l.longs0);
break;
@@ -395,7 +395,7 @@ void DarwinModeProcessEvent(
else if (quartzHasRoot) QuartzHide();
else QuartzShow();
#else
- ErrorF("kXDarwinToggleFullscreen not implemented\n");
+ // ErrorF("kXDarwinToggleFullscreen not implemented\n");
#endif
break;
@@ -404,7 +404,7 @@ void DarwinModeProcessEvent(
QuartzSetRootless(xe->u.clientMessage.u.l.longs0);
if (!quartzEnableRootless && !quartzHasRoot) QuartzHide();
#else
- ErrorF("kXDarwinSetRootless not implemented\n");
+ // ErrorF("kXDarwinSetRootless not implemented\n");
#endif
break;
@@ -425,7 +425,7 @@ void DarwinModeProcessEvent(
break;
case kXDarwinBringAllToFront:
- ErrorF("kXDarwinBringAllToFront\n");
+ // ErrorF("kXDarwinBringAllToFront\n");
RootlessOrderAllWindows();
break;
commit 63af22ae3a2ac3de60cee00686cad528dfe399f0
Author: Ben Byer <bbyer at bbyer.local>
Date: Wed Nov 7 02:22:39 2007 -0800
Fixed focus problem (clicking on an X11 window that sits behind
an Aqua window would not always bring it to the top of the stack.
diff --git a/hw/darwin/apple/X11Application.m b/hw/darwin/apple/X11Application.m
index 62bf1f9..c52dfd0 100644
--- a/hw/darwin/apple/X11Application.m
+++ b/hw/darwin/apple/X11Application.m
@@ -225,6 +225,8 @@ message_kit_thread (SEL selector, NSObject *arg)
if (_x_active) [self activateX:NO];
} else if ([self modalWindow] == nil) {
/* Must be an X window. Tell appkit it doesn't have focus. */
+ WindowPtr pWin = xprGetXWindowFromAppKit([e windowNumber]);
+ if (pWin) RootlessReorderWindow(pWin);
for_appkit = NO;
if ([self isActive]) {
diff --git a/hw/darwin/quartz/xpr/xpr.h b/hw/darwin/quartz/xpr/xpr.h
index 81bb912..09e85f5 100644
--- a/hw/darwin/quartz/xpr/xpr.h
+++ b/hw/darwin/quartz/xpr/xpr.h
@@ -37,6 +37,9 @@ void AppleDRIExtensionInit(void);
void xprAppleWMInit(void);
Bool xprInit(ScreenPtr pScreen);
Bool xprIsX11Window(void *nsWindow, int windowNumber);
+WindowPtr xprGetX11Window(xp_window_id wid);
+WindowPtr xprGetXWindowFromAppKit(int windowNumber);
+
void xprHideWindows(Bool hide);
Bool QuartzInitCursor(ScreenPtr pScreen);
diff --git a/hw/darwin/quartz/xpr/xprFrame.c b/hw/darwin/quartz/xpr/xprFrame.c
index 53fbb31..54b2035 100644
--- a/hw/darwin/quartz/xpr/xprFrame.c
+++ b/hw/darwin/quartz/xpr/xprFrame.c
@@ -425,6 +425,37 @@ xprGetXWindow(xp_window_id wid)
return winRec != NULL ? winRec->win : NULL;
}
+/*
+ * Given the id of a physical window, try to find the top-level (or root)
+ * X window that it represents.
+ */
+WindowPtr
+xprGetXWindowFromAppKit(int windowNumber)
+{
+ RootlessWindowRec *winRec;
+ Bool ret;
+ xp_window_id wid;
+
+ if (window_hash == NULL)
+ return FALSE;
+
+ /* need to lock, since this function can be called by any thread */
+
+ pthread_mutex_lock(&window_hash_mutex);
+
+ if (xp_lookup_native_window(windowNumber, &wid))
+ ret = xprGetXWindow(wid) != NULL;
+ else
+ ret = FALSE;
+
+ pthread_mutex_unlock(&window_hash_mutex);
+
+ if (!ret) return NULL;
+ winRec = x_hash_table_lookup(window_hash, (void *) wid, NULL);
+
+ return winRec != NULL ? winRec->win : NULL;
+}
+
/*
* The windowNumber is an AppKit window number. Returns TRUE if xpr is
commit cb29f62b66821481c4d30afe630614d13dd3a2f0
Author: Ben Byer <bbyer at bbyer.local>
Date: Wed Nov 7 01:56:37 2007 -0800
formatting changes.
diff --git a/hw/darwin/apple/X11Application.m b/hw/darwin/apple/X11Application.m
index bd6b062..62bf1f9 100644
--- a/hw/darwin/apple/X11Application.m
+++ b/hw/darwin/apple/X11Application.m
@@ -207,140 +207,111 @@ message_kit_thread (SEL selector, NSObject *arg)
- (void) sendEvent:(NSEvent *)e
{
- NSEventType type;
- BOOL for_appkit, for_x;
-
- type = [e type];
-
- /* By default pass down the responder chain and to X. */
- for_appkit = YES;
- for_x = YES;
-
- switch (type)
- {
- case NSLeftMouseDown: case NSRightMouseDown: case NSOtherMouseDown:
- case NSLeftMouseUp: case NSRightMouseUp: case NSOtherMouseUp:
- if ([e window] != nil)
- {
- /* Pointer event has a window. Probably something for the kit. */
-
- for_x = NO;
-
- if (_x_active)
- [self activateX:NO];
- }
- else if ([self modalWindow] == nil)
- {
- /* Must be an X window. Tell appkit it doesn't have focus. */
-
- for_appkit = NO;
-
- if ([self isActive])
- {
- [self deactivate];
-
- if (!_x_active && quartzProcs->IsX11Window([e window],
- [e windowNumber]))
- [self activateX:YES];
- }
- }
- break;
+ NSEventType type;
+ BOOL for_appkit, for_x;
+
+ type = [e type];
+
+ /* By default pass down the responder chain and to X. */
+ for_appkit = YES;
+ for_x = YES;
+
+ switch (type) {
+ case NSLeftMouseDown: case NSRightMouseDown: case NSOtherMouseDown:
+ case NSLeftMouseUp: case NSRightMouseUp: case NSOtherMouseUp:
+ if ([e window] != nil) {
+ /* Pointer event has an (AppKit) window. Probably something for the kit. */
+ for_x = NO;
+ if (_x_active) [self activateX:NO];
+ } else if ([self modalWindow] == nil) {
+ /* Must be an X window. Tell appkit it doesn't have focus. */
+ for_appkit = NO;
+
+ if ([self isActive]) {
+ [self deactivate];
+
+ if (!_x_active && quartzProcs->IsX11Window([e window],
+ [e windowNumber]))
+ [self activateX:YES];
+ }
+ }
+ break;
case NSKeyDown: case NSKeyUp:
- if (_x_active)
- {
- static int swallow_up;
-
- /* No kit window is focused, so send it to X. */
-
- for_appkit = NO;
-
- if (type == NSKeyDown)
- {
- /* Before that though, see if there are any global
- shortcuts bound to it. */
-
- if (X11EnableKeyEquivalents
- && [[self mainMenu] performKeyEquivalent:e])
- {
- swallow_up = [e keyCode];
- for_x = NO;
- }
- else if (!quartzEnableRootless
- && ([e modifierFlags] & ALL_KEY_MASKS)
- == (NSCommandKeyMask | NSAlternateKeyMask)
- && ([e keyCode] == 0 /*a*/
- || [e keyCode] == 53 /*Esc*/))
- {
- swallow_up = 0;
- for_x = NO;
+ if (_x_active) {
+ static int swallow_up;
+
+ /* No kit window is focused, so send it to X. */
+ for_appkit = NO;
+ if (type == NSKeyDown) {
+ /* Before that though, see if there are any global
+ shortcuts bound to it. */
+
+ if (X11EnableKeyEquivalents
+ && [[self mainMenu] performKeyEquivalent:e]) {
+ swallow_up = [e keyCode];
+ for_x = NO;
+ } else if (!quartzEnableRootless
+ && ([e modifierFlags] & ALL_KEY_MASKS)
+ == (NSCommandKeyMask | NSAlternateKeyMask)
+ && ([e keyCode] == 0 /*a*/
+ || [e keyCode] == 53 /*Esc*/)) {
+ swallow_up = 0;
+ for_x = NO;
#ifdef DARWIN_DDX_MISSING
- QuartzMessageServerThread (kXDarwinToggleFullscreen, 0);
+ QuartzMessageServerThread (kXDarwinToggleFullscreen, 0);
#endif
- }
- }
- else
- {
- /* If we saw a key equivalent on the down, don't pass
- the up through to X. */
-
- if (swallow_up != 0 && [e keyCode] == swallow_up)
- {
- swallow_up = 0;
- for_x = NO;
- }
- }
- }
- else
- {
- for_x = NO;
- }
- break;
-
- case NSFlagsChanged:
- /* For the l33t X users who remap modifier keys to normal keysyms. */
- if (!_x_active)
- for_x = NO;
- break;
-
- case NSAppKitDefined:
- switch ([e subtype])
- {
- case NSApplicationActivatedEventType:
- for_x = NO;
- if ([self modalWindow] == nil)
- {
- for_appkit = NO;
-
- /* FIXME: hack to avoid having to pass the event to appkit,
- which would cause it to raise one of its windows. */
- _appFlags._active = YES;
-
- [self activateX:YES];
- if ([e data2] & 0x10) X11ApplicationSetFrontProcess();
- }
- break;
-
- case 18: /* ApplicationDidReactivate */
- if (quartzHasRoot)
- for_appkit = NO;
- break;
-
- case NSApplicationDeactivatedEventType:
- for_x = NO;
- [self activateX:NO];
- break;
- }
- break;
-
- default: break; /* for gcc */
+ }
+ } else {
+ /* If we saw a key equivalent on the down, don't pass
+ the up through to X. */
+
+ if (swallow_up != 0 && [e keyCode] == swallow_up) {
+ swallow_up = 0;
+ for_x = NO;
+ }
+ }
+ } else for_x = NO;
+ break;
+
+ case NSFlagsChanged:
+ /* For the l33t X users who remap modifier keys to normal keysyms. */
+ if (!_x_active) for_x = NO;
+ break;
+
+ case NSAppKitDefined:
+ switch ([e subtype]) {
+ case NSApplicationActivatedEventType:
+ for_x = NO;
+ if ([self modalWindow] == nil) {
+ for_appkit = NO;
+
+ /* FIXME: hack to avoid having to pass the event to appkit,
+ which would cause it to raise one of its windows. */
+ _appFlags._active = YES;
+
+ [self activateX:YES];
+ if ([e data2] & 0x10) X11ApplicationSetFrontProcess();
+ }
+ break;
+
+ case 18: /* ApplicationDidReactivate */
+ if (quartzHasRoot) for_appkit = NO;
+ break;
+
+ case NSApplicationDeactivatedEventType:
+ for_x = NO;
+ [self activateX:NO];
+ break;
}
-
- if (for_appkit)
- [super sendEvent:e];
-
- if (for_x)
- send_nsevent (type, e);
+ break;
+
+ default: break; /* for gcc */
+ }
+
+ if (for_appkit) [super sendEvent:e];
+
+ if (for_x) send_nsevent (type, e);
}
- (void) set_window_menu:(NSArray *)list
@@ -697,57 +668,53 @@ cfarray_to_nsarray (CFArrayRef in)
const char *tem;
quartzUseSysBeep = [self prefs_get_boolean:@PREFS_SYSBEEP
- default:quartzUseSysBeep];
+ default:quartzUseSysBeep];
quartzEnableRootless = [self prefs_get_boolean:@PREFS_ROOTLESS
- default:quartzEnableRootless];
+ default:quartzEnableRootless];
#ifdef DARWIN_DDX_MISSING
quartzFullscreenDisableHotkeys = ![self prefs_get_boolean:
- @PREFS_FULLSCREEN_HOTKEYS default:
- !quartzFullscreenDisableHotkeys];
+ @PREFS_FULLSCREEN_HOTKEYS default:
+ !quartzFullscreenDisableHotkeys];
quartzXpluginOptions = [self prefs_get_integer:@PREFS_XP_OPTIONS
- default:quartzXpluginOptions];
+ default:quartzXpluginOptions];
#endif
darwinSwapAltMeta = [self prefs_get_boolean:@PREFS_SWAP_ALT_META
- default:darwinSwapAltMeta];
+ default:darwinSwapAltMeta];
darwinFakeButtons = [self prefs_get_boolean:@PREFS_FAKEBUTTONS
- default:darwinFakeButtons];
- if (darwinFakeButtons)
- {
- const char *fake2, *fake3;
-
- fake2 = [self prefs_get_string:@PREFS_FAKE_BUTTON2 default:NULL];
- fake3 = [self prefs_get_string:@PREFS_FAKE_BUTTON3 default:NULL];
-
- if (fake2 != NULL) darwinFakeMouse2Mask = DarwinParseModifierList(fake2);
- if (fake3 != NULL) darwinFakeMouse3Mask = DarwinParseModifierList(fake3);
-
+ default:darwinFakeButtons];
+ if (darwinFakeButtons) {
+ const char *fake2, *fake3;
+
+ fake2 = [self prefs_get_string:@PREFS_FAKE_BUTTON2 default:NULL];
+ fake3 = [self prefs_get_string:@PREFS_FAKE_BUTTON3 default:NULL];
+
+ if (fake2 != NULL) darwinFakeMouse2Mask = DarwinParseModifierList(fake2);
+ if (fake3 != NULL) darwinFakeMouse3Mask = DarwinParseModifierList(fake3);
}
X11EnableKeyEquivalents = [self prefs_get_boolean:@PREFS_KEYEQUIVS
- default:X11EnableKeyEquivalents];
+ default:X11EnableKeyEquivalents];
darwinSyncKeymap = [self prefs_get_boolean:@PREFS_SYNC_KEYMAP
- default:darwinSyncKeymap];
+ default:darwinSyncKeymap];
tem = [self prefs_get_string:@PREFS_KEYMAP_FILE default:NULL];
- if (tem != NULL)
- darwinKeymapFile = strdup (tem);
- else
- darwinKeymapFile = NULL;
+ if (tem != NULL) darwinKeymapFile = strdup (tem);
+ else darwinKeymapFile = NULL;
darwinDesiredDepth = [self prefs_get_integer:@PREFS_DEPTH
- default:darwinDesiredDepth];
+ default:darwinDesiredDepth];
enable_stereo = [self prefs_get_boolean:@PREFS_ENABLE_STEREO
- default:false];
+ default:false];
}
/* This will end up at the end of the responder chain. */
- (void) copy:sender
{
QuartzMessageServerThread (kXDarwinPasteboardNotify, 1,
- AppleWMCopyToPasteboard);
+ AppleWMCopyToPasteboard);
}
- (BOOL) x_active
@@ -991,135 +958,133 @@ convert_flags (unsigned int nsflags)
static void
send_nsevent (NSEventType type, NSEvent *e)
{
- static unsigned int button_state = 0;
- NSRect screen;
- NSPoint location;
- NSWindow *window;
- int pointer_x, pointer_y;
- xEvent xe;
-
- memset (&xe, 0, sizeof (xe));
-
- /* This field should be filled in for every event */
- xe.u.keyButtonPointer.time = GetTimeInMillis();
-
- /* convert location to global top-left coordinates */
- location = [e locationInWindow];
- window = [e window];
- screen = [[[NSScreen screens] objectAtIndex:0] frame];
-
- if (window != nil) {
- NSRect frame = [window frame];
- pointer_x = location.x + frame.origin.x;
- pointer_y = (((screen.origin.y + screen.size.height)
- - location.y) - frame.origin.y);
- } else {
- pointer_x = location.x;
- pointer_y = (screen.origin.y + screen.size.height) - location.y;
- }
-
- xe.u.keyButtonPointer.rootX = pointer_x;
- xe.u.keyButtonPointer.rootY = pointer_y;
-
- switch (type) {
- float count;
-
- case NSLeftMouseDown:
- xe.u.u.type = ButtonPress;
- xe.u.u.detail = 1;
- goto do_press_event;
-
- case NSRightMouseDown:
- xe.u.u.type = ButtonPress;
- xe.u.u.detail = 3;
- goto do_press_event;
-
- case NSOtherMouseDown:
- xe.u.u.type = ButtonPress;
- xe.u.u.detail = 2; /* FIXME? */
- goto do_press_event;
-
-do_press_event:
- if (!quartzProcs->IsX11Window([e window], [e windowNumber])) {
- /* X server doesn't grok this window, drop the event.
-
- Note: theoretically this isn't necessary, but if I click
- on the menubar, we get sent a LeftMouseDown when the
- release happens, but no LeftMouseUp is ever seen! */
-
- break;
- }
- goto do_event;
-
- case NSLeftMouseUp:
- xe.u.u.type = ButtonRelease;
- xe.u.u.detail = 1;
- goto do_release_event;
-
- case NSRightMouseUp:
- xe.u.u.type = ButtonRelease;
- xe.u.u.detail = 3;
- goto do_release_event;
-
- case NSOtherMouseUp:
- xe.u.u.type = ButtonRelease;
- xe.u.u.detail = 2; /* FIXME? */
- goto do_release_event;
-
-do_release_event:
- if ((button_state & (1 << xe.u.u.detail)) == 0)
- {
- /* X didn't see the button press for this release, so skip it */
- break;
- }
- goto do_event;
-
- case NSMouseMoved:
- case NSLeftMouseDragged:
- case NSRightMouseDragged:
- case NSOtherMouseDragged:
- xe.u.u.type = MotionNotify;
- goto do_event;
-
- case NSKeyDown:
- xe.u.u.type = KeyPress;
- xe.u.u.detail = [e keyCode];
- goto do_event;
-
- case NSKeyUp:
- xe.u.u.type = KeyRelease;
- xe.u.u.detail = [e keyCode];
- goto do_event;
-
- case NSScrollWheel:
- xe.u.keyButtonPointer.state = convert_flags ([e modifierFlags]);
- count = [e deltaY];
- xe.u.u.detail = count > 0.0f ? 4 : 5;
- for (count = fabs(count); count > 0.0; count = count - 1.0f) {
- xe.u.u.type = ButtonPress;
- DarwinEQEnqueue(&xe);
- xe.u.u.type = ButtonRelease;
- DarwinEQEnqueue(&xe);
- }
- xe.u.u.type = 0;
- break;
-
- case NSFlagsChanged:
- xe.u.u.type = kXDarwinUpdateModifiers;
- xe.u.clientMessage.u.l.longs0 = [e modifierFlags];
- DarwinEQEnqueue (&xe);
- break;
-
-do_event:
- // xe.u.keyButtonPointer.state = convert_flags ([e modifierFlags]);
- DarwinEQEnqueue (&xe);
- break;
-
- default: break; /* for gcc */
+ static unsigned int button_state = 0;
+ NSRect screen;
+ NSPoint location;
+ NSWindow *window;
+ int pointer_x, pointer_y;
+ xEvent xe;
+
+ memset (&xe, 0, sizeof (xe));
+
+ /* This field should be filled in for every event */
+ xe.u.keyButtonPointer.time = GetTimeInMillis();
+
+ /* convert location to global top-left coordinates */
+ location = [e locationInWindow];
+ window = [e window];
+ screen = [[[NSScreen screens] objectAtIndex:0] frame];
+
+ if (window != nil) {
+ NSRect frame = [window frame];
+ pointer_x = location.x + frame.origin.x;
+ pointer_y = (((screen.origin.y + screen.size.height)
+ - location.y) - frame.origin.y);
+ } else {
+ pointer_x = location.x;
+ pointer_y = (screen.origin.y + screen.size.height) - location.y;
+ }
+
+ xe.u.keyButtonPointer.rootX = pointer_x;
+ xe.u.keyButtonPointer.rootY = pointer_y;
+
+ switch (type) {
+ float count;
+
+ case NSLeftMouseDown:
+ xe.u.u.type = ButtonPress;
+ xe.u.u.detail = 1;
+ goto do_press_event;
+
+ case NSRightMouseDown:
+ xe.u.u.type = ButtonPress;
+ xe.u.u.detail = 3;
+ goto do_press_event;
+
+ case NSOtherMouseDown:
+ xe.u.u.type = ButtonPress;
+ xe.u.u.detail = 2; /* FIXME? */
+ goto do_press_event;
+
+ do_press_event:
+ if (!quartzProcs->IsX11Window([e window], [e windowNumber])) {
+ /* X server doesn't grok this window, drop the event.
+
+ Note: theoretically this isn't necessary, but if I click
+ on the menubar, we get sent a LeftMouseDown when the
+ release happens, but no LeftMouseUp is ever seen! */
+
+ break;
}
-
- if (xe.u.u.type == ButtonPress)
- button_state |= (1 << xe.u.u.detail);
- else if (xe.u.u.type == ButtonRelease)
- button_state &= ~(1 << xe.u.u.detail);
+ goto do_event;
+
+ case NSLeftMouseUp:
+ xe.u.u.type = ButtonRelease;
+ xe.u.u.detail = 1;
+ goto do_release_event;
+
+ case NSRightMouseUp:
+ xe.u.u.type = ButtonRelease;
+ xe.u.u.detail = 3;
+ goto do_release_event;
+
+ case NSOtherMouseUp:
+ xe.u.u.type = ButtonRelease;
+ xe.u.u.detail = 2; /* FIXME? */
+ goto do_release_event;
+
+ do_release_event:
+ if ((button_state & (1 << xe.u.u.detail)) == 0)
+ {
+ /* X didn't see the button press for this release, so skip it */
+ break;
+ }
+ goto do_event;
+
+ case NSMouseMoved:
+ case NSLeftMouseDragged:
+ case NSRightMouseDragged:
+ case NSOtherMouseDragged:
+ xe.u.u.type = MotionNotify;
+ goto do_event;
+
+ case NSKeyDown:
+ xe.u.u.type = KeyPress;
+ xe.u.u.detail = [e keyCode];
+ goto do_event;
+
+ case NSKeyUp:
+ xe.u.u.type = KeyRelease;
+ xe.u.u.detail = [e keyCode];
+ goto do_event;
+
+ case NSScrollWheel:
+ xe.u.keyButtonPointer.state = convert_flags ([e modifierFlags]);
+ count = [e deltaY];
+ xe.u.u.detail = count > 0.0f ? 4 : 5;
+ for (count = fabs(count); count > 0.0; count = count - 1.0f) {
+ xe.u.u.type = ButtonPress;
+ DarwinEQEnqueue(&xe);
+ xe.u.u.type = ButtonRelease;
+ DarwinEQEnqueue(&xe);
+ }
+ xe.u.u.type = 0;
+ break;
+
+ case NSFlagsChanged:
+ xe.u.u.type = kXDarwinUpdateModifiers;
+ xe.u.clientMessage.u.l.longs0 = [e modifierFlags];
+ DarwinEQEnqueue (&xe);
+ break;
+
+ do_event:
+ // xe.u.keyButtonPointer.state = convert_flags ([e modifierFlags]);
+ DarwinEQEnqueue (&xe);
+ break;
+
+ default: break; /* for gcc */
+ }
+
+ if (xe.u.u.type == ButtonPress) button_state |= (1 << xe.u.u.detail);
+ else if (xe.u.u.type == ButtonRelease) button_state &= ~(1 << xe.u.u.detail);
}
More information about the xorg-commit
mailing list