diff --git a/hw/darwin/apple/X11Application.m b/hw/darwin/apple/X11Application.m index 5da057469..3982d97b3 100644 --- a/hw/darwin/apple/X11Application.m +++ b/hw/darwin/apple/X11Application.m @@ -1,7 +1,6 @@ /* X11Application.m -- subclass of NSApplication to multiplex events - $Id: X11Application.m,v 1.59 2006/09/06 21:19:32 jharper Exp $ - Copyright (c) 2002-2007 Apple Inc. All rights reserved. + Copyright (c) 2002-2007 Apple Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files @@ -35,12 +34,10 @@ /* ouch! */ #define BOOL X_BOOL -//# include "Xproto.h" # include "darwin.h" # include "../quartz/quartz.h" # define _APPLEWM_SERVER_ # include "X11/extensions/applewm.h" -//# include "X.h" # include "micmap.h" #undef BOOL @@ -55,15 +52,15 @@ int X11EnableKeyEquivalents = TRUE; int quartzHasRoot = FALSE, quartzEnableRootless = TRUE; -extern int darwinFakeButtons; +extern int darwinFakeButtons, input_check_flag; // extern Bool enable_stereo; Bool enable_stereo; //<-- this needs to go back to being an extern once glxCGL is fixed +static xEvent *quartzEvents; X11Application *X11App; -#define ALL_KEY_MASKS (NSShiftKeyMask | NSControlKeyMask \ -| NSAlternateKeyMask | NSCommandKeyMask) +#define ALL_KEY_MASKS (NSShiftKeyMask | NSControlKeyMask | NSAlternateKeyMask | NSCommandKeyMask) @implementation X11Application @@ -82,27 +79,21 @@ static void send_nsevent (NSEventType type, NSEvent *e); but is statically linked into this X server. */ extern Bool QuartzModeBundleInit(void); -static void -init_ports (void) -{ +static void init_ports (void) { kern_return_t r; NSPort *p; - if (_port != MACH_PORT_NULL) - return; + if (_port != MACH_PORT_NULL) return; r = mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_RECEIVE, &_port); - if (r != KERN_SUCCESS) - return; + if (r != KERN_SUCCESS) return; p = [NSMachPort portWithMachPort:_port]; [p setDelegate:NSApp]; [p scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; } -static void -message_kit_thread (SEL selector, NSObject *arg) -{ +static void message_kit_thread (SEL selector, NSObject *arg) { message msg; kern_return_t r; @@ -117,29 +108,24 @@ message_kit_thread (SEL selector, NSObject *arg) msg.arg = [arg retain]; r = mach_msg (&msg.hdr, MACH_SEND_MSG, msg.hdr.msgh_size, - 0, MACH_PORT_NULL, 0, MACH_PORT_NULL); + 0, MACH_PORT_NULL, 0, MACH_PORT_NULL); if (r != KERN_SUCCESS) - fprintf (stderr, "%s: mach_msg failed: %x\n", __FUNCTION__, r); + ErrorF("%s: mach_msg failed: %x\n", __FUNCTION__, r); } -- (void) handleMachMessage:(void *)_msg -{ +- (void) handleMachMessage:(void *)_msg { message *msg = _msg; [self performSelector:msg->selector withObject:msg->arg]; [msg->arg release]; } -- (void) set_controller:obj -{ - if (_controller == nil) - _controller = [obj retain]; +- (void) set_controller:obj { + if (_controller == nil) _controller = [obj retain]; } -- (void) dealloc -{ - if (_controller != nil) - [_controller release]; +- (void) dealloc { + if (_controller != nil) [_controller release]; if (_port != MACH_PORT_NULL) mach_port_deallocate (mach_task_self (), _port); @@ -147,8 +133,7 @@ message_kit_thread (SEL selector, NSObject *arg) [super dealloc]; } -- (void) orderFrontStandardAboutPanel: (id) sender -{ +- (void) orderFrontStandardAboutPanel: (id) sender { NSMutableDictionary *dict; NSDictionary *infoDict; NSString *tem; @@ -161,57 +146,45 @@ message_kit_thread (SEL selector, NSObject *arg) tem = [infoDict objectForKey:@"CFBundleShortVersionString"]; - [dict setObject:[NSString stringWithFormat:@"X11.app %@ - X.org X11R7.1", - tem] forKey:@"ApplicationVersion"]; + [dict setObject:[NSString stringWithFormat:@"X11.app %@ - X.org X11R7.3", tem] + forKey:@"ApplicationVersion"]; [self orderFrontStandardAboutPanelWithOptions: dict]; } -- (void) activateX:(BOOL)state -{ +- (void) activateX:(BOOL)state { /* Create a TSM document that supports full Unicode input, and have it activated while X is active (unless using the old keymapping files) */ static TSMDocumentID x11_document; - if (state) - { - QuartzMessageServerThread (kXDarwinActivate, 0); - - if (!_x_active) - { - if (x11_document == 0 && darwinKeymapFile == NULL) - { - OSType types[1]; - types[0] = kUnicodeDocument; - NewTSMDocument (1, types, &x11_document, 0); - } - - if (x11_document != 0) - ActivateTSMDocument (x11_document); - } - } - else - { - QuartzMessageServerThread (kXDarwinDeactivate, 0); - - if (_x_active) - { - if (x11_document != 0) - DeactivateTSMDocument (x11_document); - } - } + if (state) { + QuartzMessageServerThread (kXDarwinActivate, 0); + + if (!_x_active) { + if (x11_document == 0 && darwinKeymapFile == NULL) { + OSType types[1]; + types[0] = kUnicodeDocument; + NewTSMDocument (1, types, &x11_document, 0); + } + if (x11_document != 0) ActivateTSMDocument (x11_document); + } + } else { + QuartzMessageServerThread (kXDarwinDeactivate, 0); + + if (_x_active && x11_document != 0) + DeactivateTSMDocument (x11_document); + } + _x_active = state; } -- (void) became_key:(NSWindow *)win -{ +- (void) became_key:(NSWindow *)win { [self activateX:NO]; } -- (void) sendEvent:(NSEvent *)e -{ +- (void) sendEvent:(NSEvent *)e { NSEventType type; BOOL for_appkit, for_x; @@ -221,178 +194,140 @@ message_kit_thread (SEL selector, NSObject *arg) for_appkit = YES; for_x = YES; - switch (type) - { + 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. */ + 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_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; - + 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; + } + } 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; + /* 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]; + 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]; #ifdef DARWIN_DDX_MISSING - if ([e data2] & 0x10) QuartzMessageServerThread (kXDarwinBringAllToFront, 0); + if ([e data2] & 0x10) QuartzMessageServerThread (kXDarwinBringAllToFront, 0); #endif - } - break; + } + break; - case 18: /* ApplicationDidReactivate */ - if (quartzHasRoot) - for_appkit = NO; - break; + case 18: /* ApplicationDidReactivate */ + if (quartzHasRoot) for_appkit = NO; + break; - case NSApplicationDeactivatedEventType: - for_x = NO; - [self activateX:NO]; - break; - } - break; - + case NSApplicationDeactivatedEventType: + for_x = NO; + [self activateX:NO]; + break; + } + break; + default: break; /* for gcc */ } - if (for_appkit) - { - [super sendEvent:e]; - } - - if (for_x) - { - send_nsevent (type, e); - } + if (for_appkit) [super sendEvent:e]; + if (for_x) send_nsevent (type, e); } -- (void) set_window_menu:(NSArray *)list -{ +- (void) set_window_menu:(NSArray *)list { [_controller set_window_menu:list]; } -- (void) set_window_menu_check:(NSNumber *)n -{ +- (void) set_window_menu_check:(NSNumber *)n { [_controller set_window_menu_check:n]; } -- (void) set_apps_menu:(NSArray *)list -{ +- (void) set_apps_menu:(NSArray *)list { [_controller set_apps_menu:list]; } -- (void) set_front_process:unused -{ +- (void) set_front_process:unused { [NSApp activateIgnoringOtherApps:YES]; - if ([self modalWindow] == nil) - [self activateX:YES]; + if ([self modalWindow] == nil) [self activateX:YES]; } -- (void) set_can_quit:(NSNumber *)state -{ +- (void) set_can_quit:(NSNumber *)state { [_controller set_can_quit:[state boolValue]]; } -- (void) server_ready:unused -{ +- (void) server_ready:unused { [_controller server_ready]; } -- (void) show_hide_menubar:(NSNumber *)state -{ - if ([state boolValue]) - ShowMenuBar (); - else - HideMenuBar (); +- (void) show_hide_menubar:(NSNumber *)state { + if ([state boolValue]) ShowMenuBar (); + else HideMenuBar (); } @@ -404,12 +339,12 @@ message_kit_thread (SEL selector, NSObject *arg) static const void *cfretain (CFAllocatorRef a, const void *b) { return CFRetain (b); } + static void cfrelease (CFAllocatorRef a, const void *b) { CFRelease (b); } -static CFMutableArrayRef -nsarray_to_cfarray (NSArray *in) -{ + +static CFMutableArrayRef nsarray_to_cfarray (NSArray *in) { CFMutableArrayRef out; CFArrayCallBacks cb; NSObject *ns; @@ -424,24 +359,22 @@ nsarray_to_cfarray (NSArray *in) count = [in count]; out = CFArrayCreateMutable (NULL, count, &cb); - for (i = 0; i < count; i++) - { - ns = [in objectAtIndex:i]; - - if ([ns isKindOfClass:[NSArray class]]) - cf = (CFTypeRef) nsarray_to_cfarray ((NSArray *) ns); - else - cf = CFRetain ((CFTypeRef) ns); - - CFArrayAppendValue (out, cf); - CFRelease (cf); + for (i = 0; i < count; i++) { + ns = [in objectAtIndex:i]; + + if ([ns isKindOfClass:[NSArray class]]) + cf = (CFTypeRef) nsarray_to_cfarray ((NSArray *) ns); + else + cf = CFRetain ((CFTypeRef) ns); + + CFArrayAppendValue (out, cf); + CFRelease (cf); } - + return out; } -static NSMutableArray * -cfarray_to_nsarray (CFArrayRef in) -{ + +static NSMutableArray * cfarray_to_nsarray (CFArrayRef in) { NSMutableArray *out; const CFTypeRef *cf; NSObject *ns; @@ -450,320 +383,277 @@ cfarray_to_nsarray (CFArrayRef in) count = CFArrayGetCount (in); out = [[NSMutableArray alloc] initWithCapacity:count]; - for (i = 0; i < count; i++) - { - cf = CFArrayGetValueAtIndex (in, i); + for (i = 0; i < count; i++) { + cf = CFArrayGetValueAtIndex (in, i); - if (CFGetTypeID (cf) == CFArrayGetTypeID ()) - ns = cfarray_to_nsarray ((CFArrayRef) cf); - else - ns = [(id)cf retain]; - - [out addObject:ns]; - [ns release]; + if (CFGetTypeID (cf) == CFArrayGetTypeID ()) + ns = cfarray_to_nsarray ((CFArrayRef) cf); + else + ns = [(id)cf retain]; + + [out addObject:ns]; + [ns release]; } - + return out; } -- (CFPropertyListRef) prefs_get:(NSString *)key -{ +- (CFPropertyListRef) prefs_get:(NSString *)key { CFPropertyListRef value; value = CFPreferencesCopyAppValue ((CFStringRef) key, CFSTR (APP_PREFS)); - if (value == NULL) - { - static CFDictionaryRef defaults; - - if (defaults == NULL) - { - CFStringRef error = NULL; - CFDataRef data; - CFURLRef url; - SInt32 error_code; + if (value == NULL) { + static CFDictionaryRef defaults; + + if (defaults == NULL) { + CFStringRef error = NULL; + CFDataRef data; + CFURLRef url; + SInt32 error_code; + + url = (CFURLCreateFromFileSystemRepresentation + (NULL, (unsigned char *)DEFAULTS_FILE, strlen (DEFAULTS_FILE), false)); + if (CFURLCreateDataAndPropertiesFromResource (NULL, url, &data, + NULL, NULL, &error_code)) { + defaults = (CFPropertyListCreateFromXMLData + (NULL, data, kCFPropertyListMutableContainersAndLeaves, &error)); + if (error != NULL) CFRelease (error); + CFRelease (data); + } + CFRelease (url); - url = (CFURLCreateFromFileSystemRepresentation - (NULL, (unsigned char *)DEFAULTS_FILE, strlen (DEFAULTS_FILE), false)); - if (CFURLCreateDataAndPropertiesFromResource (NULL, url, &data, - NULL, NULL, - &error_code)) - { - defaults = (CFPropertyListCreateFromXMLData - (NULL, data, kCFPropertyListMutableContainersAndLeaves, &error)); - if (error != NULL) - CFRelease (error); - CFRelease (data); - } - CFRelease (url); - - if (defaults != NULL) - { - NSMutableArray *apps, *elt; - int count, i; - NSString *name, *nname; - - /* Localize the names in the default apps menu. */ - - apps = [(NSDictionary *)defaults objectForKey:@PREFS_APPSMENU]; - if (apps != nil) - { - count = [apps count]; - for (i = 0; i < count; i++) - { - elt = [apps objectAtIndex:i]; - if (elt != nil && [elt isKindOfClass:[NSArray class]]) - { - name = [elt objectAtIndex:0]; - if (name != nil) - { - nname = NSLocalizedString (name, nil); - if (nname != nil && nname != name) - [elt replaceObjectAtIndex:0 withObject:nname]; - } - } - } - } - } + if (defaults != NULL) { + NSMutableArray *apps, *elt; + int count, i; + NSString *name, *nname; + + /* Localize the names in the default apps menu. */ + + apps = [(NSDictionary *)defaults objectForKey:@PREFS_APPSMENU]; + if (apps != nil) { + count = [apps count]; + for (i = 0; i < count; i++) { + elt = [apps objectAtIndex:i]; + if (elt != nil && [elt isKindOfClass:[NSArray class]]) { + name = [elt objectAtIndex:0]; + if (name != nil) { + nname = NSLocalizedString (name, nil); + if (nname != nil && nname != name) + [elt replaceObjectAtIndex:0 withObject:nname]; } + } + } + } + } + } - if (defaults != NULL) - value = CFDictionaryGetValue (defaults, key); - - if (value != NULL) - CFRetain (value); + if (defaults != NULL) value = CFDictionaryGetValue (defaults, key); + if (value != NULL) CFRetain (value); } return value; } -- (int) prefs_get_integer:(NSString *)key default:(int)def -{ - CFPropertyListRef value; - int ret; - - value = [self prefs_get:key]; - - if (value != NULL && CFGetTypeID (value) == CFNumberGetTypeID ()) - CFNumberGetValue (value, kCFNumberIntType, &ret); - else if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ()) - ret = CFStringGetIntValue (value); - else - ret = def; - - if (value != NULL) - CFRelease (value); - - return ret; +- (int) prefs_get_integer:(NSString *)key default:(int)def { + CFPropertyListRef value; + int ret; + + value = [self prefs_get:key]; + + if (value != NULL && CFGetTypeID (value) == CFNumberGetTypeID ()) + CFNumberGetValue (value, kCFNumberIntType, &ret); + else if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ()) + ret = CFStringGetIntValue (value); + else + ret = def; + + if (value != NULL) CFRelease (value); + + return ret; } -- (const char *) prefs_get_string:(NSString *)key default:(const char *)def -{ - CFPropertyListRef value; - const char *ret = NULL; - - value = [self prefs_get:key]; - - if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ()) - { - NSString *s = (NSString *) value; - - ret = [s UTF8String]; - } - - if (value != NULL) - CFRelease (value); - - return ret != NULL ? ret : def; +- (const char *) prefs_get_string:(NSString *)key default:(const char *)def { + CFPropertyListRef value; + const char *ret = NULL; + + value = [self prefs_get:key]; + + if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ()) { + NSString *s = (NSString *) value; + + ret = [s UTF8String]; + } + + if (value != NULL) CFRelease (value); + + return ret != NULL ? ret : def; } -- (float) prefs_get_float:(NSString *)key default:(float)def -{ - CFPropertyListRef value; - float ret = def; +- (float) prefs_get_float:(NSString *)key default:(float)def { + CFPropertyListRef value; + float ret = def; + + value = [self prefs_get:key]; + + if (value != NULL + && CFGetTypeID (value) == CFNumberGetTypeID () + && CFNumberIsFloatType (value)) + CFNumberGetValue (value, kCFNumberFloatType, &ret); + else if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ()) + ret = CFStringGetDoubleValue (value); - value = [self prefs_get:key]; - - if (value != NULL - && CFGetTypeID (value) == CFNumberGetTypeID () - && CFNumberIsFloatType (value)) - { - CFNumberGetValue (value, kCFNumberFloatType, &ret); - } - else if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ()) - { - ret = CFStringGetDoubleValue (value); - } - - if (value != NULL) - CFRelease (value); - - return ret; + if (value != NULL) CFRelease (value); + + return ret; } -- (int) prefs_get_boolean:(NSString *)key default:(int)def -{ - CFPropertyListRef value; - int ret = def; - - value = [self prefs_get:key]; - - if (value != NULL) - { - if (CFGetTypeID (value) == CFNumberGetTypeID ()) - CFNumberGetValue (value, kCFNumberIntType, &ret); - else if (CFGetTypeID (value) == CFBooleanGetTypeID ()) - ret = CFBooleanGetValue (value); - else if (CFGetTypeID (value) == CFStringGetTypeID ()) - { - const char *tem = [(NSString *) value lossyCString]; - if (strcasecmp (tem, "true") == 0 || strcasecmp (tem, "yes") == 0) - ret = YES; - else - ret = NO; - } - - CFRelease (value); +- (int) prefs_get_boolean:(NSString *)key default:(int)def { + CFPropertyListRef value; + int ret = def; + + value = [self prefs_get:key]; + + if (value != NULL) { + if (CFGetTypeID (value) == CFNumberGetTypeID ()) + CFNumberGetValue (value, kCFNumberIntType, &ret); + else if (CFGetTypeID (value) == CFBooleanGetTypeID ()) + ret = CFBooleanGetValue (value); + else if (CFGetTypeID (value) == CFStringGetTypeID ()) { + const char *tem = [(NSString *) value lossyCString]; + if (strcasecmp (tem, "true") == 0 || strcasecmp (tem, "yes") == 0) + ret = YES; + else + ret = NO; } - - return ret; + + CFRelease (value); + } + return ret; } -- (NSArray *) prefs_get_array:(NSString *)key -{ - NSArray *ret = nil; - CFPropertyListRef value; - - value = [self prefs_get:key]; - - if (value != NULL) - { - if (CFGetTypeID (value) == CFArrayGetTypeID ()) - ret = [cfarray_to_nsarray (value) autorelease]; - - CFRelease (value); - } - - return ret; +- (NSArray *) prefs_get_array:(NSString *)key { + NSArray *ret = nil; + CFPropertyListRef value; + + value = [self prefs_get:key]; + + if (value != NULL) { + if (CFGetTypeID (value) == CFArrayGetTypeID ()) + ret = [cfarray_to_nsarray (value) autorelease]; + + CFRelease (value); + } + + return ret; } -- (void) prefs_set_integer:(NSString *)key value:(int)value -{ +- (void) prefs_set_integer:(NSString *)key value:(int)value { CFNumberRef x; x = CFNumberCreate (NULL, kCFNumberIntType, &value); CFPreferencesSetValue ((CFStringRef) key, (CFTypeRef) x, CFSTR (APP_PREFS), - kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + kCFPreferencesCurrentUser, kCFPreferencesAnyHost); CFRelease (x); } -- (void) prefs_set_float:(NSString *)key value:(float)value -{ +- (void) prefs_set_float:(NSString *)key value:(float)value { CFNumberRef x; x = CFNumberCreate (NULL, kCFNumberFloatType, &value); CFPreferencesSetValue ((CFStringRef) key, (CFTypeRef) x, CFSTR (APP_PREFS), - kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + kCFPreferencesCurrentUser, kCFPreferencesAnyHost); CFRelease (x); } -- (void) prefs_set_boolean:(NSString *)key value:(int)value -{ - CFPreferencesSetValue ((CFStringRef) key, - (CFTypeRef) value ? kCFBooleanTrue - : kCFBooleanFalse, CFSTR (APP_PREFS), - kCFPreferencesCurrentUser, kCFPreferencesAnyHost); - +- (void) prefs_set_boolean:(NSString *)key value:(int)value { + CFPreferencesSetValue ((CFStringRef) key, + (CFTypeRef) value ? kCFBooleanTrue + : kCFBooleanFalse, CFSTR (APP_PREFS), + kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + } -- (void) prefs_set_array:(NSString *)key value:(NSArray *)value -{ - CFArrayRef cfarray; - - cfarray = nsarray_to_cfarray (value); - CFPreferencesSetValue ((CFStringRef) key, - (CFTypeRef) cfarray, - CFSTR (APP_PREFS), - kCFPreferencesCurrentUser, kCFPreferencesAnyHost); - CFRelease (cfarray); +- (void) prefs_set_array:(NSString *)key value:(NSArray *)value { + CFArrayRef cfarray; + + cfarray = nsarray_to_cfarray (value); + CFPreferencesSetValue ((CFStringRef) key, + (CFTypeRef) cfarray, + CFSTR (APP_PREFS), + kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + CFRelease (cfarray); } -- (void) prefs_set_string:(NSString *)key value:(NSString *)value -{ - CFPreferencesSetValue ((CFStringRef) key, (CFTypeRef) value, - CFSTR (APP_PREFS), kCFPreferencesCurrentUser, - kCFPreferencesAnyHost); +- (void) prefs_set_string:(NSString *)key value:(NSString *)value { + CFPreferencesSetValue ((CFStringRef) key, (CFTypeRef) value, + CFSTR (APP_PREFS), kCFPreferencesCurrentUser, + kCFPreferencesAnyHost); } -- (void) prefs_synchronize -{ +- (void) prefs_synchronize { CFPreferencesAppSynchronize (kCFPreferencesCurrentApplication); } -- (void) read_defaults -{ - const char *tem; - - quartzUseSysBeep = [self prefs_get_boolean:@PREFS_SYSBEEP - default:quartzUseSysBeep]; - quartzEnableRootless = [self prefs_get_boolean:@PREFS_ROOTLESS - default:quartzEnableRootless]; +- (void) read_defaults { + const char *tem; + + quartzUseSysBeep = [self prefs_get_boolean:@PREFS_SYSBEEP + default:quartzUseSysBeep]; + quartzEnableRootless = [self prefs_get_boolean:@PREFS_ROOTLESS + default:quartzEnableRootless]; #ifdef DARWIN_DDX_MISSING - quartzFullscreenDisableHotkeys = ![self prefs_get_boolean: - @PREFS_FULLSCREEN_HOTKEYS default: - !quartzFullscreenDisableHotkeys]; - quartzXpluginOptions = [self prefs_get_integer:@PREFS_XP_OPTIONS - default:quartzXpluginOptions]; + quartzFullscreenDisableHotkeys = ![self prefs_get_boolean: + @PREFS_FULLSCREEN_HOTKEYS default: + !quartzFullscreenDisableHotkeys]; + quartzXpluginOptions = [self prefs_get_integer:@PREFS_XP_OPTIONS + default:quartzXpluginOptions]; #endif - - darwinSwapAltMeta = [self prefs_get_boolean:@PREFS_SWAP_ALT_META - default:darwinSwapAltMeta]; - darwinFakeButtons = [self prefs_get_boolean:@PREFS_FAKEBUTTONS - default:darwinFakeButtons]; - if (darwinFakeButtons) - { - const char *fake2, *fake3; + + darwinSwapAltMeta = [self prefs_get_boolean:@PREFS_SWAP_ALT_META + 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); - 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]; + X11EnableKeyEquivalents = [self prefs_get_boolean:@PREFS_KEYEQUIVS + default:X11EnableKeyEquivalents]; - darwinSyncKeymap = [self prefs_get_boolean:@PREFS_SYNC_KEYMAP - default:darwinSyncKeymap]; + darwinSyncKeymap = [self prefs_get_boolean:@PREFS_SYNC_KEYMAP + default:darwinSyncKeymap]; - tem = [self prefs_get_string:@PREFS_KEYMAP_FILE default:NULL]; - if (tem != NULL) - darwinKeymapFile = strdup (tem); - else - darwinKeymapFile = NULL; + tem = [self prefs_get_string:@PREFS_KEYMAP_FILE default:NULL]; + + if (tem != NULL) darwinKeymapFile = strdup (tem); + else darwinKeymapFile = NULL; - darwinDesiredDepth = [self prefs_get_integer:@PREFS_DEPTH - default:darwinDesiredDepth]; + darwinDesiredDepth = [self prefs_get_integer:@PREFS_DEPTH + default:darwinDesiredDepth]; - enable_stereo = [self prefs_get_boolean:@PREFS_ENABLE_STEREO - default:false]; + enable_stereo = [self prefs_get_boolean:@PREFS_ENABLE_STEREO + default:false]; } /* This will end up at the end of the responder chain. */ -- (void) copy:sender -{ - QuartzMessageServerThread (kXDarwinPasteboardNotify, 1, - AppleWMCopyToPasteboard); +- (void) copy:sender { + QuartzMessageServerThread (kXDarwinPasteboardNotify, 1, + AppleWMCopyToPasteboard); } -- (BOOL) x_active -{ +- (BOOL) x_active { return _x_active; } @@ -771,75 +661,62 @@ cfarray_to_nsarray (CFArrayRef in) static NSArray * array_with_strings_and_numbers (int nitems, const char **items, - const char *numbers) -{ - NSMutableArray *array, *subarray; - NSString *string; - NSString *number; - int i; + const char *numbers) { + NSMutableArray *array, *subarray; + NSString *string, *number; + int i; - /* (Can't autorelease on the X server thread) */ - - array = [[NSMutableArray alloc] initWithCapacity:nitems]; - - for (i = 0; i < nitems; i++) - { - subarray = [[NSMutableArray alloc] initWithCapacity:2]; - - string = [[NSString alloc] initWithUTF8String:items[i]]; - [subarray addObject:string]; - [string release]; - - if (numbers[i] != 0) - { - number = [[NSString alloc] initWithFormat:@"%d", numbers[i]]; - [subarray addObject:number]; - [number release]; - } - else - [subarray addObject:@""]; - - [array addObject:subarray]; - [subarray release]; - } - - return array; + /* (Can't autorelease on the X server thread) */ + + array = [[NSMutableArray alloc] initWithCapacity:nitems]; + + for (i = 0; i < nitems; i++) { + subarray = [[NSMutableArray alloc] initWithCapacity:2]; + + string = [[NSString alloc] initWithUTF8String:items[i]]; + [subarray addObject:string]; + [string release]; + + if (numbers[i] != 0) { + number = [[NSString alloc] initWithFormat:@"%d", numbers[i]]; + [subarray addObject:number]; + [number release]; + } else + [subarray addObject:@""]; + + [array addObject:subarray]; + [subarray release]; + } + + return array; } -void -X11ApplicationSetWindowMenu (int nitems, const char **items, - const char *shortcuts) -{ - NSArray *array; - array = array_with_strings_and_numbers (nitems, items, shortcuts); - - /* Send the array of strings over to the appkit thread */ - - message_kit_thread (@selector (set_window_menu:), array); - [array release]; +void X11ApplicationSetWindowMenu (int nitems, const char **items, + const char *shortcuts) { + NSArray *array; + array = array_with_strings_and_numbers (nitems, items, shortcuts); + + /* Send the array of strings over to the appkit thread */ + + message_kit_thread (@selector (set_window_menu:), array); + [array release]; } -void -X11ApplicationSetWindowMenuCheck (int idx) -{ - NSNumber *n; - - n = [[NSNumber alloc] initWithInt:idx]; - - message_kit_thread (@selector (set_window_menu_check:), n); - - [n release]; +void X11ApplicationSetWindowMenuCheck (int idx) { + NSNumber *n; + + n = [[NSNumber alloc] initWithInt:idx]; + + message_kit_thread (@selector (set_window_menu_check:), n); + + [n release]; } -void -X11ApplicationSetFrontProcess (void) -{ +void X11ApplicationSetFrontProcess (void) { message_kit_thread (@selector (set_front_process:), nil); } -void -X11ApplicationSetCanQuit (int state) -{ +void X11ApplicationSetCanQuit (int state) { NSNumber *n; n = [[NSNumber alloc] initWithBool:state]; @@ -849,15 +726,11 @@ X11ApplicationSetCanQuit (int state) [n release]; } -void -X11ApplicationServerReady (void) -{ +void X11ApplicationServerReady (void) { message_kit_thread (@selector (server_ready:), nil); } -void -X11ApplicationShowHideMenubar (int state) -{ +void X11ApplicationShowHideMenubar (int state) { NSNumber *n; n = [[NSNumber alloc] initWithBool:state]; @@ -867,27 +740,20 @@ X11ApplicationShowHideMenubar (int state) [n release]; } -static void * -create_thread (void *func, void *arg) -{ +static void * create_thread (void *func, void *arg) { pthread_attr_t attr; pthread_t tid; pthread_attr_init (&attr); - pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM); pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); - pthread_create (&tid, &attr, func, arg); - pthread_attr_destroy (&attr); return (void *) tid; } -static void -check_xinitrc (void) -{ +static void check_xinitrc (void) { char *tem, buf[1024]; NSString *msg; @@ -895,8 +761,7 @@ check_xinitrc (void) return; tem = getenv ("HOME"); - if (tem == NULL) - goto done; + if (tem == NULL) goto done; snprintf (buf, sizeof (buf), "%s/.xinitrc", tem); if (access (buf, F_OK) != 0) @@ -904,48 +769,44 @@ check_xinitrc (void) /* FIXME: put localized strings into Resources/English.lproj */ - msg = NSLocalizedString ( - @"You have an existing ~/.xinitrc file.\n\n\ - Windows displayed by X11 applications may not have titlebars, or may look \ - different to windows displayed by native applications.\n\n\ - Would you like to move aside the existing file and use the standard X11 \ - environment?", @"Startup xinitrc dialog"); + msg = NSLocalizedString (@"You have an existing ~/.xinitrc file.\n\n\ +Windows displayed by X11 applications may not have titlebars, or may look \ +different to windows displayed by native applications.\n\n\ +Would you like to move aside the existing file and use the standard X11 \ +environment?", @"Startup xinitrc dialog"); if (NSRunAlertPanel (nil, msg, NSLocalizedString (@"Yes", @""), - NSLocalizedString (@"No", @""), nil) - == NSAlertDefaultReturn) - { - char buf2[1024]; - int i = -1; - - snprintf (buf2, sizeof (buf2), "%s.old", buf); - - for (i = 1; access (buf2, F_OK) == 0; i++) - snprintf (buf2, sizeof (buf2), "%s.old.%d", buf, i); - - rename (buf, buf2); + NSLocalizedString (@"No", @""), nil) + == NSAlertDefaultReturn) { + char buf2[1024]; + int i = -1; + + snprintf (buf2, sizeof (buf2), "%s.old", buf); + + for (i = 1; access (buf2, F_OK) == 0; i++) + snprintf (buf2, sizeof (buf2), "%s.old.%d", buf, i); + + rename (buf, buf2); } - done: + done: [X11App prefs_set_boolean:@PREFS_DONE_XINIT_CHECK value:YES]; [X11App prefs_synchronize]; } -void -X11ApplicationMain (int argc, const char *argv[], - void (*server_thread) (void *), void *server_arg) -{ +void X11ApplicationMain (int argc, const char *argv[], + void (*server_thread) (void *), void *server_arg) { NSAutoreleasePool *pool; #ifdef DEBUG - while (access ("/tmp/x11-block", F_OK) == 0) - sleep (1); + while (access ("/tmp/x11-block", F_OK) == 0) sleep (1); #endif pool = [[NSAutoreleasePool alloc] init]; X11App = (X11Application *) [X11Application sharedApplication]; - + quartzEvents = (xEvent *)malloc(sizeof(xEvent) * GetMaximumEventsNum()); + init_ports (); [NSApp read_defaults]; @@ -953,8 +814,8 @@ X11ApplicationMain (int argc, const char *argv[], [NSBundle loadNibNamed:@"main" owner:NSApp]; [[NSNotificationCenter defaultCenter] addObserver:NSApp - selector:@selector (became_key:) - name:NSWindowDidBecomeKeyNotification object:nil]; + selector:@selector (became_key:) + name:NSWindowDidBecomeKeyNotification object:nil]; check_xinitrc (); @@ -966,173 +827,136 @@ X11ApplicationMain (int argc, const char *argv[], /* Calculate the height of the menubar so we can avoid it. */ aquaMenuBarHeight = NSHeight([[NSScreen mainScreen] frame]) - - NSMaxY([[NSScreen mainScreen] visibleFrame]) - 1; + NSMaxY([[NSScreen mainScreen] visibleFrame]) - 1; - if (!create_thread (server_thread, server_arg)) - { - fprintf (stderr, "can't create secondary thread\n"); - exit (1); + if (!create_thread (server_thread, server_arg)) { + ErrorF("can't create secondary thread\n"); + exit(1); } [NSApp run]; - - /* not reached */ } /* event conversion */ static inline unsigned short -convert_flags (unsigned int nsflags) -{ - unsigned int xflags; +convert_flags (unsigned int nsflags) { + unsigned int xflags = 0; if (nsflags == ~0) return 0xffff; - xflags = 0; - if (nsflags & NSAlphaShiftKeyMask) xflags |= LockMask; - if (nsflags & NSShiftKeyMask) xflags |= ShiftMask; - if (nsflags & NSControlKeyMask) xflags |= ControlMask; + if (nsflags & NSShiftKeyMask) xflags |= ShiftMask; + if (nsflags & NSControlKeyMask) xflags |= ControlMask; if (nsflags & NSAlternateKeyMask) xflags |= Mod1Mask; - if (nsflags & NSCommandKeyMask) xflags |= Mod2Mask; + if (nsflags & NSCommandKeyMask) xflags |= Mod2Mask; /* FIXME: secondaryfn? */ return xflags; } -static void -send_nsevent (NSEventType type, NSEvent *e) -{ +// This code should probably be merged with that in XDarwin's XServer.m - BB +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; + int pointer_x, pointer_y, ev_button, ev_type; + int num_events=0, i=0, state; + int valuators[2]; + float count; xEvent xe; + + bzero(&xe, sizeof(xe)); + input_check_flag++; - 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]; + /* 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 */ + 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; } - - 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); + + ErrorF("send_nsevent: type=%d pointer=(%d,%d)\n", type, pointer_x, pointer_y); + + valuators[0] = pointer_x; + valuators[1] = pointer_y; + state = convert_flags ([e modifierFlags]); + + switch (type) { + case NSLeftMouseDown: ev_button=1; ev_type=ButtonPress; goto handle_mouse; + case NSOtherMouseDown: ev_button=2; ev_type=ButtonPress; goto handle_mouse; + case NSRightMouseDown: ev_button=3; ev_type=ButtonPress; goto handle_mouse; + case NSLeftMouseUp: ev_button=1; ev_type=ButtonRelease; goto handle_mouse; + case NSOtherMouseUp: ev_button=2; ev_type=ButtonRelease; goto handle_mouse; + case NSRightMouseUp: ev_button=3; ev_type=ButtonRelease; goto handle_mouse; + case NSLeftMouseDragged: ev_button=1; ev_type=MotionNotify; goto handle_mouse; + case NSOtherMouseDragged: ev_button=2; ev_type=MotionNotify; goto handle_mouse; + case NSRightMouseDragged: ev_button=3; ev_type=MotionNotify; goto handle_mouse; + case NSMouseMoved: ev_button=0; ev_type=MotionNotify; goto handle_mouse; + handle_mouse: + + if(ev_type==ButtonPress) { + if (!quartzProcs->IsX11Window([e window], [e windowNumber])) { + fprintf(stderr, "Dropping event because it's not a window\n"); + break; + } + button_state |= (1 << ev_button); + } else if (ev_type==ButtonRelease && (button_state & (1 << ev_button)) == 0) break; + + num_events = GetPointerEvents(quartzEvents, darwinPointer, ev_type, ev_button, + POINTER_ABSOLUTE, 0, 2, valuators); + + ErrorF("GetPointerEvents returned %d events\n", num_events); + for(i=0; i 0.0f ? 4 : 5; + for (count = fabs(count); count > 0.0; count = count - 1.0f) { + num_events = GetPointerEvents(quartzEvents, darwinPointer, ButtonPress, ev_button, + POINTER_ABSOLUTE, 0, 2, valuators); + for(i=0; iprocessInputProc) (e, (DeviceIntPtr)darwinEventQueue.pPtr, 1); } -void -DarwinEQSwitchScreen( - ScreenPtr pScreen, - Bool fromDIX) -{ +void DarwinEQSwitchScreen(ScreenPtr pScreen, Bool fromDIX) { darwinEventQueue.pEnqueueScreen = pScreen; if (fromDIX) darwinEventQueue.pDequeueScreen = pScreen; @@ -268,8 +257,7 @@ DarwinEQSwitchScreen( * ProcessInputEvents * Read and process events from the event queue until it is empty. */ -void ProcessInputEvents(void) -{ +void ProcessInputEvents(void) { EventRec *e; int x, y; xEvent xe; @@ -277,12 +265,15 @@ void ProcessInputEvents(void) // button number and modifier mask of currently pressed fake button static int darwinFakeMouseButtonDown = 0; static int darwinFakeMouseButtonMask = 0; + input_check_flag=0; + + ErrorF("calling mieqProcessInputEvents\n"); + mieqProcessInputEvents(); // Empty the signaling pipe x = sizeof(xe); - while (x == sizeof(xe)) { + while (x == sizeof(xe)) x = read(darwinEventReadFD, &xe, sizeof(xe)); - } while (darwinEventQueue.head != darwinEventQueue.tail) { @@ -298,10 +289,16 @@ void ProcessInputEvents(void) dixScreenOrigins[miPointerCurrentScreen()->myNum].x; xe.u.keyButtonPointer.rootY -= darwinMainScreenY + dixScreenOrigins[miPointerCurrentScreen()->myNum].y; + + ErrorF("old rootX = (%d,%d) darwinMainScreen = (%d,%d) dixScreenOrigins[%d]=(%d,%d)\n", + xe.u.keyButtonPointer.rootX, xe.u.keyButtonPointer.rootY, + darwinMainScreenX, darwinMainScreenY, + miPointerCurrentScreen()->myNum, + dixScreenOrigins[miPointerCurrentScreen()->myNum].x, + dixScreenOrigins[miPointerCurrentScreen()->myNum].y); + + //Assumption - screen switching can only occur on motion events - /* - * Assumption - screen switching can only occur on motion events - */ if (e->pScreen != darwinEventQueue.pDequeueScreen) { darwinEventQueue.pDequeueScreen = e->pScreen;