diff options
Diffstat (limited to 'xc/programs/Xserver/hw/darwin/bundle')
21 files changed, 601 insertions, 203 deletions
diff --git a/xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/classes.nib b/xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/classes.nib index 3c4afe987..b5583719f 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/classes.nib +++ b/xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/classes.nib @@ -7,13 +7,16 @@ SUPERCLASS = NSObject; }, { - ACTIONS = {close = id; saveChanges = id; setKey = id; }; + ACTIONS = {close = id; pickFile = id; saveChanges = id; setKey = id; }; CLASS = Preferences; LANGUAGE = ObjC; OUTLETS = { displayNumber = id; fakeButton = id; keyField = id; + keymapFileField = id; + loadKeymapFileButton = id; + pickKeymapFileButton = id; splashStartupHelpButton = id; startupHelpButton = id; systemBeepButton = id; diff --git a/xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/info.nib b/xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/info.nib index 7c8a23fe9..21d75f060 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/info.nib +++ b/xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/info.nib @@ -3,7 +3,7 @@ <plist version="0.9"> <dict> <key>IBDocumentLocation</key> - <string>11 9 367 304 0 4 800 574 </string> + <string>20 4 367 304 0 4 800 574 </string> <key>IBMainMenuLocation</key> <string>19 268 220 44 0 4 800 574 </string> <key>IBUserGuides</key> diff --git a/xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/objects.nib b/xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/objects.nib Binary files differindex 5a21abc46..39fec4b7a 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/objects.nib +++ b/xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/objects.nib diff --git a/xc/programs/Xserver/hw/darwin/bundle/Imakefile b/xc/programs/Xserver/hw/darwin/bundle/Imakefile index a8c0416ce..aaeed48a7 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/Imakefile +++ b/xc/programs/Xserver/hw/darwin/bundle/Imakefile @@ -1,4 +1,4 @@ -XCOMM $XFree86: xc/programs/Xserver/hw/darwin/bundle/Imakefile,v 1.7 2001/04/02 05:18:50 torrey Exp $ +XCOMM $XFree86: xc/programs/Xserver/hw/darwin/bundle/Imakefile,v 1.9 2001/04/18 20:28:52 torrey Exp $ #include <Server.tmpl> @@ -28,8 +28,12 @@ CUSTOMVERSION = XFree86CustomVersion CUSTOMVERDEF = -DXF86_CUSTOM_VERSION='$(CUSTOMVERSION)' #endif -DEFINES = $(CUSTOMVERDEF) -DXBINDIR=$(DESTDIR)$(BINDIR) -XDARWINBINDIR = $(DESTDIR)$(BINDIR)/XDarwin.app/Contents/MacOS +DEFINES = $(CUSTOMVERDEF) -DXBINDIR=$(DESTDIR)$(BINDIR) -DXINITDIR=$(XINITDIR) +#if NothingOutsideProjectRoot +XDARWINROOT = $(DESTDIR)$(BINDIR) +#else +XDARWINROOT = /Applications +#endif NormalLibraryObjectRule() NormalLibraryTarget(XQuartz,$(OBJS)) @@ -43,8 +47,12 @@ InstallProgram(XDarwinStartup,$(DESTDIR)$(BINDIR)) install:: -(cd $(DESTDIR)$(BINDIR); $(RM) X; $(LN) XDarwinStartup X) +AllTarget(XDarwin) +XDarwin: + pbxbuild -target XDarwin + install:: - pbxbuild install -target XDarwin DSTROOT=$(DESTDIR)$(BINDIR) + pbxbuild install -target XDarwin DSTROOT=$(XDARWINROOT) clean:: pbxbuild "clean" -target XDarwin diff --git a/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/classes.nib b/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/classes.nib index 3c4afe987..b5583719f 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/classes.nib +++ b/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/classes.nib @@ -7,13 +7,16 @@ SUPERCLASS = NSObject; }, { - ACTIONS = {close = id; saveChanges = id; setKey = id; }; + ACTIONS = {close = id; pickFile = id; saveChanges = id; setKey = id; }; CLASS = Preferences; LANGUAGE = ObjC; OUTLETS = { displayNumber = id; fakeButton = id; keyField = id; + keymapFileField = id; + loadKeymapFileButton = id; + pickKeymapFileButton = id; splashStartupHelpButton = id; startupHelpButton = id; systemBeepButton = id; diff --git a/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/info.nib b/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/info.nib index e2f8cf545..babc232fe 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/info.nib +++ b/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/info.nib @@ -3,9 +3,9 @@ <plist version="0.9"> <dict> <key>IBDocumentLocation</key> - <string>14 4 367 304 0 4 800 574 </string> + <string>451 75 367 304 0 67 1024 679 </string> <key>IBMainMenuLocation</key> - <string>18 269 262 44 0 4 800 574 </string> + <string>78 473 262 44 0 4 800 574 </string> <key>IBUserGuides</key> <dict> <key>HelpPanel</key> diff --git a/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/objects.nib b/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/objects.nib Binary files differindex 1d79a36c7..0c990727b 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/objects.nib +++ b/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/objects.nib diff --git a/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/XDarwinHelp.html b/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/XDarwinHelp.html index b4b1a4741..ff20e7208 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/XDarwinHelp.html +++ b/xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/XDarwinHelp.html @@ -1,4 +1,3 @@ -<!-- $XFree86: xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/XDarwinHelp.html,v 1.2 2001/04/05 06:08:47 torrey Exp $ --> <html> <head> <META http-equiv="Content-Type" content="text/html; charset=EUC-JP"> @@ -7,7 +6,7 @@ XFree86 for Mac OS X</title></head> <body> <center> <h1> -Darwin ¤È Mac OS X ¾å¤Î XFree86 +XFree86 on Darwin and Mac OS X </h1> </center> <h2> @@ -34,16 +33,16 @@ Darwin ¤È Mac OS X ¾å¤Î XFree86 </center> <blockquote> ¤³¤ì¤Ï¡¤XFree86 ¤Î¥×¥ì¥ê¥ê¡¼¥¹¥Ð¡¼¥¸¥ç¥ó¤Ç¤¢¤ê¡¤¤¤¤«¤Ê¤ë¾ì¹ç¤Ë¤ª¤¤¤Æ¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó¡£ -ËÜ¥½¥Õ¥È¥¦¥§¥¢¤Ï¡¤<A HREF="#license">MIT X11/X Consortium License</A> ¤Î¾ò·ï¤Ë´ð¤Å¤¡¤ÊݾÚ̵¤·¤Ç¡¤¡Ö¤½¤Î¤Þ¤Þ¡×¤Î·Á¤Ç¶¡µë¤µ¤ì¤Þ¤¹¡£ -¤´»ÈÍѤˤʤëÁ°¤Ë¡¤<A HREF="#license">¥é¥¤¥»¥ó¥¹</A>¤òÆÉ¤ó¤Ç²¼¤µ¤¤¡£ +ËÜ¥½¥Õ¥È¥¦¥§¥¢¤Ï¡¤<A HREF="#license">MIT X11/X Consortium License</A> ¤Î¾ò·ï¤Ë´ð¤Å¤¡¤ÌµÊݾڤǡ¤¡Ö¤½¤Î¤Þ¤Þ¡×¤Î·Á¤Ç¶¡µë¤µ¤ì¤Þ¤¹¡£ +¤´»ÈÍѤˤʤëÁ°¤Ë¡¤<A HREF="#license">¥é¥¤¥»¥ó¥¹¾ò·ï</A>¤ò¤ªÆÉ¤ß²¼¤µ¤¤¡£ ¥Ð¥°¤ÎÊó¹ð¤ä¥Ñ¥Ã¥Á¤¬ SourceForge ¤Î <A HREF="http://sourceforge.net/projects/xonx/">XonX ¥×¥í¥¸¥§¥¯¥È¥Ú¡¼¥¸</A>¤ËÄó½Ð¤µ¤ì¤Æ¤¤¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£ -¥×¥ì¥ê¥ê¡¼¥¹¥Ð¡¼¥¸¥ç¥ó¤Î¥Ð¥°¤òÊó¹ð¤¹¤ëÁ°¤Ë¡¤<A HREF="http://sourceforge.net/projects/xonx/">XonX</A> ¥×¥í¥¸¥§¥¯¥È¥Ú¡¼¥¸¤Þ¤¿¤Ï <A HREF="http://www.XFree86.Org/cvs">XFree86 CVS ÁÒ¸Ë</A>¤ÇºÇ¿·ÈǤΥÁ¥§¥Ã¥¯¤ò¤·¤Æ²¼¤µ¤¤¡£ +¥×¥ì¥ê¥ê¡¼¥¹¥Ð¡¼¥¸¥ç¥ó¤Î¥Ð¥°¤òÊó¹ð¤¹¤ëÁ°¤Ë¡¤<A HREF="http://sourceforge.net/projects/xonx/">XonX</A> ¥×¥í¥¸¥§¥¯¥È¥Ú¡¼¥¸¤Þ¤¿¤Ï <A HREF="http://www.XFree86.Org/cvs">XFree86 CVS ¥ê¥Ý¥¸¥È¥ê</A>¤ÇºÇ¿·ÈǤΥÁ¥§¥Ã¥¯¤ò¤·¤Æ²¼¤µ¤¤¡£ </blockquote> <h2> <a NAME="usage">»ÈÍÑË¡</a> </h2> <p> -Mac OS X ¾å¤Ç¡¤XFree86¤Ï¥Õ¥ë¥¹¥¯¥ê¡¼¥ó¥â¡¼¥É¤Çưºî¤·¤Þ¤¹¡£ +Mac OS X ¾å¤Ç¡¤XFree86 ¤Ï¥Õ¥ë¥¹¥¯¥ê¡¼¥ó¥â¡¼¥É¤Çưºî¤·¤Þ¤¹¡£ X Window ¥Ç¥¹¥¯¥È¥Ã¥×¤¬¥¢¥¯¥Æ¥£¥Ö¤Ê»þ¡¤¤½¤ì¤ÏÁ´²èÌ̤òÀêͤ·¤Þ¤¹¡£ ¤¢¤Ê¤¿¤Ï¡¤Command-Option-A ¥¡¼¤ò²¡¤¹¤³¤È¤Ë¤è¤Ã¤Æ Mac OS X ¥Ç¥¹¥¯¥È¥Ã¥×¤ØÀÚ¤êÂØ¤¨¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£ ¡Ê¤³¤Î¥¡¼¤ÎÁȤ߹ç¤ï¤»¤Ï¡¤´Ä¶ÀßÄê¤ÇÊѹ¹²Äǽ¤Ç¤¹¡Ë @@ -94,7 +93,7 @@ X11 ¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤Ï /usr/X11R6/man ¤ËÃÖ¤«¤ì¤Þ¤¹¡£¤½¤·¤Æ MANPATH ´Ä¶ÊÑ¿ô¤Ï¸ <h2> <a NAME="license">¥é¥¤¥»¥ó¥¹</a> </h2> -XFree86 Project ¤Ï¡¤¼«Í³¤ËºÆÇÛÉÛ²Äǽ¤Ê¥Ð¥¤¥Ê¥ê¤È¥½¡¼¥¹¥³¡¼¥É¤òÄ󶡤¹¤ë¤³¤È¤òÌ󫤷¤Þ¤¹¡£ +XFree86 Project ¤Ï¡¤¼«Í³¤ËºÆÇÛÉÛ²Äǽ¤Ê¥Ð¥¤¥Ê¥ê¤È¥½¡¼¥¹¥³¡¼¥É¤òÄ󶡤¹¤ë¤³¤È¤Ë¥³¥ß¥Ã¥È¤·¤Æ¤¤¤Þ¤¹¡£ »ä¤¿¤Á¤¬»ÈÍѤ¹¤ë¼ç¤Ê¥é¥¤¥»¥ó¥¹¤Ï¡¤ÅÁÅýŪ¤Ê MIT X11/X Consortium License ¤Ë´ð¤Å¤¯¤â¤Î¤Ç¤¹¡£ ¤½¤·¤Æ¡¤¤½¤ì¤Ï½¤Àµ¤Þ¤¿¤ÏºÆÇÛÉÛ¤µ¤ì¤ë¥½¡¼¥¹¥³¡¼¥É¤Þ¤¿¤Ï¥Ð¥¤¥Ê¥ê¤Ë¡¤¤½¤Î Copyright/¥é¥¤¥»¥ó¥¹¹ð¼¨¤¬¤½¤Î¤Þ¤Þ»Ä¤µ¤ì¤ë¤³¤È¤òÍ׵᤹¤ë°Ê³°¤Î¾ò·ï¤ò¶¯À©¤·¤Þ¤»¤ó¡£ ¤è¤ê¿¤¯¤Î¾ðÊó¤È¡¤¥³¡¼¥É¤Î°ìÉô¤ò¥«¥Ð¡¼¤¹¤ëÄɲäΠCopyright/¥é¥¤¥»¥ó¥¹¹ð¼¨¤Î¤¿¤á¤Ë¡¤<A HREF="http://www.xfree86.org/legal/licence.html">XFree86 ¤Î License ¥Ú¡¼¥¸</A>¤ò»²¾È¤·¤Æ²¼¤µ¤¤¡£ diff --git a/xc/programs/Xserver/hw/darwin/bundle/Preferences.h b/xc/programs/Xserver/hw/darwin/bundle/Preferences.h index f2a6ba724..dd89f82aa 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/Preferences.h +++ b/xc/programs/Xserver/hw/darwin/bundle/Preferences.h @@ -1,16 +1,19 @@ -/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/Preferences.h,v 1.2 2001/04/05 06:08:46 torrey Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/Preferences.h,v 1.4 2001/04/25 02:23:47 torrey Exp $ */ #import <Cocoa/Cocoa.h> @interface Preferences : NSObject { IBOutlet NSPanel *window; - IBOutlet id keyField; - IBOutlet id fakeButton; IBOutlet id displayNumber; + IBOutlet id fakeButton; + IBOutlet id keyField; + IBOutlet id keymapFileField; + IBOutlet id loadKeymapFileButton; + IBOutlet id pickKeymapFileButton; + IBOutlet id splashStartupHelpButton; IBOutlet id startupHelpButton; IBOutlet id systemBeepButton; - IBOutlet id splashStartupHelpButton; BOOL isGettingKeyCode; int keyCode; @@ -18,6 +21,7 @@ NSMutableString *switchString; } - (IBAction)close:(id)sender; +- (IBAction)pickFile:(id)sender; - (IBAction)saveChanges:(id)sender; - (IBAction)setKey:(id)sender; @@ -25,6 +29,8 @@ - (void)awakeFromNib; ++ (void)setUseKeymapFile:(BOOL)newUseKeymapFile; ++ (void)setKeymapFile:(NSString*)newFile; + (void)setSwitchString:(NSString*)newString; + (void)setKeyCode:(int)newKeyCode; + (void)setModifiers:(int)newModifiers; @@ -32,7 +38,10 @@ + (void)setFakeButtons:(BOOL)newFakeButtons; + (void)setStartupHelp:(BOOL)newStartupHelp; + (void)setSystemBeep:(BOOL)newSystemBeep; ++ (void)saveToDisk; ++ (BOOL)useKeymapFile; ++ (NSString*)keymapFile; + (NSString*)switchString; + (unsigned int)keyCode; + (unsigned int)modifiers; diff --git a/xc/programs/Xserver/hw/darwin/bundle/Preferences.m b/xc/programs/Xserver/hw/darwin/bundle/Preferences.m index 968f9aff7..f923b2224 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/Preferences.m +++ b/xc/programs/Xserver/hw/darwin/bundle/Preferences.m @@ -3,7 +3,7 @@ // // This class keeps track of the user preferences. // -/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/Preferences.m,v 1.2 2001/04/05 06:08:46 torrey Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/Preferences.m,v 1.4 2001/04/25 02:23:47 torrey Exp $ */ #import "Preferences.h" #import "quartzShared.h" @@ -24,7 +24,7 @@ switchString=[[NSMutableString alloc] init]; // Provide user defaults if needed - if([[NSUserDefaults standardUserDefaults] stringForKey:@"SwitchKeyCode"]==nil) { + if ([[NSUserDefaults standardUserDefaults] stringForKey:@"SwitchKeyCode"] == nil) { [Preferences setKeyCode:0]; [Preferences setModifiers:(NSCommandKeyMask | NSAlternateKeyMask)]; [Preferences setSwitchString:@"Cmd-Opt-a"]; @@ -33,6 +33,10 @@ [Preferences setStartupHelp:YES]; [Preferences setSystemBeep:NO]; } + if ([[NSUserDefaults standardUserDefaults] stringForKey:@"UseKeymappingFile"] == nil) { + [Preferences setUseKeymapFile:NO]; + [Preferences setKeymapFile:@"/System/Library/Keyboards/USA.keymapping"]; + } [self initSwitchKey]; @@ -41,7 +45,18 @@ // Set the window controls to the state in user defaults - (void)resetWindow { - [keyField setTitle:[Preferences switchString]]; + [loadKeymapFileButton setIntValue:[Preferences useKeymapFile]]; + + if ([Preferences keymapFile] == nil) + [keymapFileField setStringValue:@" "]; + else + [keymapFileField setStringValue:[Preferences keymapFile]]; + + if ([Preferences switchString] == nil) + [keyField setTitle:@"--"]; + else + [keyField setTitle:[Preferences switchString]]; + [displayNumber setIntValue:[Preferences display]]; [fakeButton setIntValue:[Preferences fakeButtons]]; [startupHelpButton setIntValue:[Preferences startupHelp]]; @@ -61,20 +76,33 @@ [self initSwitchKey]; // reset switch key state } +// Pick keymapping file +- (IBAction)pickFile:(id)sender +{ + int result; + NSArray *fileTypes = [NSArray arrayWithObject:@"keymapping"]; + NSOpenPanel *oPanel = [NSOpenPanel openPanel]; + + [oPanel setAllowsMultipleSelection:NO]; + result = [oPanel runModalForDirectory:@"/System/Library/Keyboards" file:nil types:fileTypes]; + if (result == NSOKButton) { + [keymapFileField setStringValue:[oPanel filename]]; + } +} + // User saved changes - (IBAction)saveChanges:(id)sender { [Preferences setKeyCode:keyCode]; [Preferences setModifiers:modifiers]; [Preferences setSwitchString:switchString]; + [Preferences setKeymapFile:[keymapFileField stringValue]]; + [Preferences setUseKeymapFile:[loadKeymapFileButton intValue]]; [Preferences setDisplay:[displayNumber intValue]]; [Preferences setFakeButtons:[fakeButton intValue]]; [Preferences setStartupHelp:[startupHelpButton intValue]]; [Preferences setSystemBeep:[systemBeepButton intValue]]; - - // Update the settings used by the X server thread - quartzUseSysBeep = [Preferences systemBeep]; - darwinFakeButtons = [Preferences fakeButton]; + [Preferences saveToDisk]; [window orderOut:nil]; } @@ -118,6 +146,14 @@ return NO; } ++ (void)setKeymapFile:(NSString*)newFile { + [[NSUserDefaults standardUserDefaults] setObject:newFile forKey:@"KeymappingFile"]; +} + ++ (void)setUseKeymapFile:(BOOL)newUseKeymapFile { + [[NSUserDefaults standardUserDefaults] setBool:newUseKeymapFile forKey:@"UseKeymappingFile"]; +} + + (void)setSwitchString:(NSString*)newString { [[NSUserDefaults standardUserDefaults] setObject:newString forKey:@"SwitchString"]; } @@ -136,6 +172,8 @@ + (void)setFakeButtons:(BOOL)newFakeButtons { [[NSUserDefaults standardUserDefaults] setBool:newFakeButtons forKey:@"FakeButtons"]; + // Update the setting used by the X server thread + darwinFakeButtons = newFakeButtons; } + (void)setStartupHelp:(BOOL)newStartupHelp { @@ -144,6 +182,20 @@ + (void)setSystemBeep:(BOOL)newSystemBeep { [[NSUserDefaults standardUserDefaults] setBool:newSystemBeep forKey:@"UseSystemBeep"]; + // Update the setting used by the X server thread + quartzUseSysBeep = newSystemBeep; +} + ++ (void)saveToDisk { + [[NSUserDefaults standardUserDefaults] synchronize]; +} + ++ (BOOL)useKeymapFile { + return [[NSUserDefaults standardUserDefaults] boolForKey:@"UseKeymappingFile"]; +} + ++ (NSString*)keymapFile { + return [[NSUserDefaults standardUserDefaults] stringForKey:@"KeymappingFile"]; } + (NSString*)switchString { diff --git a/xc/programs/Xserver/hw/darwin/bundle/XDarwin.pbproj/project.pbxproj b/xc/programs/Xserver/hw/darwin/bundle/XDarwin.pbproj/project.pbxproj index 877e20104..4848d9c01 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/XDarwin.pbproj/project.pbxproj +++ b/xc/programs/Xserver/hw/darwin/bundle/XDarwin.pbproj/project.pbxproj @@ -177,6 +177,7 @@ children = ( 018F40F3003E1916CE6F79C2, 021D6BA9003E1BACCE6F79C2, + 3E74E03600863F047F000001, 018F40F6003E1974CE6F79C2, ); isa = PBXGroup; @@ -250,6 +251,11 @@ path = English.lproj/XDarwinHelp.html; refType = 4; }; + 0338412F0083BFE57F000001 = { + isa = PBXFileReference; + path = quartzCursor.h; + refType = 4; + }; 04329610000763920A000002 = { isa = PBXFileReference; path = Preferences.m; @@ -645,6 +651,11 @@ path = quartzCursor.c; refType = 4; }; + 3E74E03600863F047F000001 = { + isa = PBXFileReference; + path = darwinClut8.h; + refType = 4; + }; 43B962CE00617089416877C2 = { children = ( 018F40F8003E1979CE6F79C2, @@ -652,6 +663,7 @@ 237A34C10076E37E7F000001, 237A34C40076F4F07F000001, 3576829A0077B8F17F000001, + 0338412F0083BFE57F000001, 43B962D000617089416877C2, 43B962CF00617089416877C2, 43B962D100617089416877C2, diff --git a/xc/programs/Xserver/hw/darwin/bundle/XDarwinStartup.c b/xc/programs/Xserver/hw/darwin/bundle/XDarwinStartup.c index f321cb0be..435c3cc77 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/XDarwinStartup.c +++ b/xc/programs/Xserver/hw/darwin/bundle/XDarwinStartup.c @@ -4,18 +4,20 @@ * * This program selects the appropriate X server to launch: * XDarwin IOKit X server (default) - * XDarwin.app Quartz X server (-quartz option) + * XDarwinQuartz A soft link to the Quartz X server + * executable (-quartz option) * * If told to idle, the program will simply pause and not * launch any X server. This is to support startx being * run by XDarwin.app. * **************************************************************/ -/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/XDarwinStartup.c,v 1.1 2001/03/29 02:06:51 torrey Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/XDarwinStartup.c,v 1.3 2001/04/16 06:51:48 torrey Exp $ */ #include <unistd.h> #include <stdio.h> #include <stdlib.h> +#include <sys/syslimits.h> extern int errno; @@ -43,11 +45,23 @@ int main( return 0; } else if (!strcmp(argv[i], "-quartz")) { + char quartzPath[PATH_MAX+1]; + int pathLength; + + // Find the path to the Quartz executable + pathLength = readlink(XPATH(XDarwinQuartz), quartzPath, PATH_MAX); + if (!pathLength) { + fprintf(stderr, "The symbolic link " XPATH(XDarwinQuartz) + " is not valid.\n"); + return errno; + } + quartzPath[pathLength] = '\0'; + // Build the new argument list - newargv = (char **) malloc((argc+2) + sizeof(char *)); + newargv = (char **) malloc((argc+2) * sizeof(char *)); for (j = argc; j; j--) newargv[j] = argv[j]; - newargv[0] = XPATH(XDarwin.app/Contents/MacOS/XDarwin); + newargv[0] = quartzPath; newargv[argc] = "-nostartx"; newargv[argc+1] = NULL; @@ -58,7 +72,7 @@ int main( } // Build the new argument list - newargv = (char **) malloc((argc+1) + sizeof(char *)); + newargv = (char **) malloc((argc+1) * sizeof(char *)); for (j = argc; j; j--) newargv[j] = argv[j]; newargv[0] = XPATH(XDarwin); diff --git a/xc/programs/Xserver/hw/darwin/bundle/Xserver.h b/xc/programs/Xserver/hw/darwin/bundle/Xserver.h index 87d4ae09a..0e0ce6961 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/Xserver.h +++ b/xc/programs/Xserver/hw/darwin/bundle/Xserver.h @@ -3,22 +3,26 @@ // // Created by Andreas Monitzer on January 6, 2001. // -/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/Xserver.h,v 1.4 2001/04/02 08:50:56 torrey Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/Xserver.h,v 1.6 2001/04/25 02:23:47 torrey Exp $ */ #import <Cocoa/Cocoa.h> #include <drivers/event_status_driver.h> // for NXEvent #include <unistd.h> -#include <stdlib.h> +#include <stdio.h> +#include <sys/syslimits.h> @interface Xserver : NSObject { // server state NSLock *serverLock; + NSTask *clientTask; + NSPort *signalPort; + NSPortMessage *signalMessage; BOOL serverVisible; BOOL appQuitting; UInt32 mouseState; - // communication + // server event queue int eventWriteFD; // Aqua interface @@ -34,24 +38,27 @@ + (void)append:(NSString*)value toEnv:(NSString*)name; - (void)run; -- (void)startClients; - (void)toggle; - (void)show; - (void)hide; -- (void)kill; +- (void)killServer; - (void)readPasteboard; - (void)writePasteboard; +- (void)clientTaskDone:(NSNotification *)aNotification; - (void)sendNXEvent:(NXEvent*)ev; - (void)sendShowHide:(BOOL)show; - (IBAction)closeHelpAndShow:(id)sender; // NSApplication delegate -- (BOOL)applicationShouldTerminate:(NSApplication *)sender; +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; - (void)applicationDidFinishLaunching:(NSNotification *)aNotification; - (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag; - (void)applicationWillResignActive:(NSNotification *)aNotification; - (void)applicationWillBecomeActive:(NSNotification *)aNotification; +// NSPort delegate +- (void)handlePortMessage:(NSPortMessage *)portMessage; + @end diff --git a/xc/programs/Xserver/hw/darwin/bundle/Xserver.m b/xc/programs/Xserver/hw/darwin/bundle/Xserver.m index e0f86790f..d047b53dd 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/Xserver.m +++ b/xc/programs/Xserver/hw/darwin/bundle/Xserver.m @@ -6,7 +6,7 @@ // // Created by Andreas Monitzer on January 6, 2001. // -/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/Xserver.m,v 1.7 2001/04/05 06:08:46 torrey Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/Xserver.m,v 1.14 2001/04/25 02:23:47 torrey Exp $ */ #import "Xserver.h" #import "Preferences.h" @@ -23,6 +23,9 @@ extern int argcGlobal; extern char **argvGlobal; extern char **envpGlobal; +extern int main(int argc, char *argv[], char *envp[]); +extern void HideMenuBar(void); +extern void ShowMenuBar(void); @implementation Xserver @@ -30,39 +33,52 @@ extern char **envpGlobal; self=[super init]; serverLock = [[NSLock alloc] init]; + clientTask = nil; serverVisible = NO; appQuitting = NO; mouseState = 0; eventWriteFD = quartzEventWriteFD; + // set up a port to safely send messages to main thread from server thread + signalPort = [[NSPort port] retain]; + signalMessage = [[NSPortMessage alloc] initWithSendPort:signalPort receivePort:signalPort components:nil]; + + // set up receiving end + [signalPort setDelegate:self]; + [[NSRunLoop currentRunLoop] addPort:signalPort forMode:NSDefaultRunLoopMode]; + [[NSRunLoop currentRunLoop] addPort:signalPort forMode:NSModalPanelRunLoopMode]; + return self; } -- (BOOL)applicationShouldTerminate:(NSApplication *)sender { - int but; - +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { + // Quit if the X server is not running if ([serverLock tryLock]) - return YES; - if (serverVisible) - [self hide]; + return NSTerminateNow; - but = NSRunAlertPanel(NSLocalizedString(@"Quit X server?",@""), - NSLocalizedString(@"Quitting the X server will terminate any running X Window programs.",@""), - NSLocalizedString(@"Quit",@""), - NSLocalizedString(@"Cancel",@""), - nil); - - switch (but) { - case NSAlertDefaultReturn: // quit - appQuitting = YES; - [self kill]; - // Try to wait until the X server shuts down - [serverLock lockBeforeDate:[NSDate dateWithTimeIntervalSinceNow:10]]; - return YES; - case NSAlertAlternateReturn: // cancel - break; + if ([clientTask isRunning] || !quartzStartClients) { + int but; + + [self hide]; + but = NSRunAlertPanel(NSLocalizedString(@"Quit X server?",@""), + NSLocalizedString(@"Quitting the X server will terminate any running X Window programs.",@""), + NSLocalizedString(@"Quit",@""), + NSLocalizedString(@"Cancel",@""), + nil); + + switch (but) { + case NSAlertDefaultReturn: // quit + break; + case NSAlertAlternateReturn: // cancel + return NSTerminateCancel; + } } - return NO; + + appQuitting = YES; + [self killServer]; + + // Wait until the X server shuts down + return NSTerminateLater; } // returns YES when event was handled @@ -75,10 +91,10 @@ extern char **envpGlobal; [self toggle]; return YES; } - + if(!serverVisible) return NO; - + [self getNXMouse:&ev]; ev.type=[anEvent type]; ev.flags=[anEvent modifierFlags]; @@ -89,13 +105,14 @@ extern char **envpGlobal; break; case NSLeftMouseDragged: case NSRightMouseDragged: + case 27: // undocumented high button MouseDragged event ev.type=NSMouseMoved; break; case NSSystemDefined: if(([anEvent subtype]==7) && ([anEvent data1] & 1)) - return YES; // skip mouse button 1 events + return NO; // skip mouse button 1 events if(mouseState==[anEvent data2]) - return YES; // ignore double events + return NO; // ignore double events ev.data.compound.subType=[anEvent subtype]; ev.data.compound.misc.L[0]=[anEvent data1]; ev.data.compound.misc.L[1]=mouseState=[anEvent data2]; @@ -112,7 +129,7 @@ extern char **envpGlobal; ev.data.key.keyCode = [anEvent keyCode]; break; default: - return YES; + return NO; } [self sendNXEvent:&ev]; @@ -137,18 +154,64 @@ extern char **envpGlobal; // Start the X server thread [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; + // If we are going to display a splash screen, hide the X11 screen immediately + if ([Preferences startupHelp]) + [self sendShowHide:NO]; + // Start the X clients if started from GUI - if (quartzStartClients) - [NSThread detachNewThreadSelector:@selector(startClients) toTarget:self withObject:nil]; + if (quartzStartClients) { + char *home; + char xinitrcbuf[PATH_MAX]; + NSString *path = [NSString stringWithCString:XPATH(xinit)]; + NSString *server = [NSString stringWithCString:XPATH(XDarwinStartup)]; + NSString *client; + BOOL hasClient = YES; + NSArray *args; + + // Register to receive notification when the client task finishes + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(clientTaskDone:) + name:NSTaskDidTerminateNotification + object:nil]; + + // Change to user's home directory (so xterms etc. start there) + home = getenv("HOME"); + if (home) + chdir(home); + else + home = ""; + + // Add X binary directory to path + [Xserver append:@":" toEnv:@"PATH"]; + [Xserver append:@XSTRPATH(XBINDIR) toEnv:@"PATH"]; + + // Find the client init file to use + snprintf(xinitrcbuf, PATH_MAX, "%s/.xinitrc", home); + if (access(xinitrcbuf, F_OK)) { + snprintf(xinitrcbuf, PATH_MAX, XSTRPATH(XINITDIR) "/xinitrc"); + if (access(xinitrcbuf, F_OK)) { + hasClient = NO; + } + } + if (hasClient) { + client = [NSString stringWithCString:xinitrcbuf]; + args = [NSArray arrayWithObjects:client, @"--", server, @"-idle", nil]; + } else { + args = [NSArray arrayWithObjects:@"--", server, @"-idle", nil]; + } + + // Launch a new task to run start X clients + clientTask = [NSTask launchedTaskWithLaunchPath:path arguments:args]; + } // Make sure the menu bar gets drawn [NSApp setWindowsNeedUpdate:YES]; // Display the help splash screen or show the X server if ([Preferences startupHelp]) { - [self sendShowHide:NO]; [helpWindow makeKeyAndOrderFront:self]; } else { + ShowMenuBar(); [self closeHelpAndShow:self]; } } @@ -162,24 +225,7 @@ extern char **envpGlobal; serverVisible = NO; [serverLock unlock]; [pool release]; - if (!appQuitting) - [NSApp terminate:nil]; // quit if we aren't already -} - -// Start the X clients in a separate thread -- (void)startClients { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - char *home; - - // Change to user's home directory (so xterms etc. start there) - home = getenv("HOME"); - if (home) chdir(home); - - [Xserver append:@":" toEnv:@"PATH"]; - [Xserver append:@XSTRPATH(XBINDIR) toEnv:@"PATH"]; - system(XPATH(startx -- -idle &)); - // FIXME: quit when startx dies - [pool release]; + [signalMessage sendBeforeDate:[NSDate distantPast]]; } // Close the help splash screen and show the X server @@ -188,7 +234,10 @@ extern char **envpGlobal; helpVal = [startupHelpButton intValue]; [Preferences setStartupHelp:helpVal]; + [Preferences saveToDisk]; + [helpWindow close]; + serverVisible = YES; [self sendShowHide:YES]; [NSApp activateIgnoringOtherApps:YES]; @@ -216,8 +265,8 @@ extern char **envpGlobal; } } -// Kill the Xserver process -- (void)kill { +// Kill the Xserver thread +- (void)killServer { NXEvent ev; if (serverVisible) @@ -239,6 +288,7 @@ extern char **envpGlobal; if (show) { ev.data.compound.subType = kXDarwinShow; [self sendNXEvent:&ev]; + HideMenuBar(); // inform the X server of the current modifier state ev.flags = [[NSApp currentEvent] modifierFlags]; @@ -253,6 +303,7 @@ extern char **envpGlobal; ev.data.compound.subType = kXDarwinHide; [self sendNXEvent:&ev]; + ShowMenuBar(); } serverVisible = show; @@ -281,10 +332,38 @@ extern char **envpGlobal; - (void)sendNXEvent:(NXEvent*)ev { if (write(eventWriteFD, ev, sizeof(*ev)) == sizeof(*ev)) return; - ErrorF("Bad write to event pipe.\n"); + NSLog(@"Bad write to event pipe."); // FIXME: handle bad writes better? } +// Handle message that X server thread is finished +- (void)handlePortMessage:(NSPortMessage *)portMessage { + if (appQuitting) { + // If we quit before the clients start, they may sit and wait + // for the X server to start. Kill them instead. + if ([clientTask isRunning]) + [clientTask terminate]; + [NSApp replyToApplicationShouldTerminate:YES]; + } else { + [NSApp terminate:nil]; // quit if we aren't already + } +} + +// Quit the X server when the X client task finishes +- (void)clientTaskDone:(NSNotification *)aNotification { + // Make sure it was the client task that finished + if (![clientTask isRunning]) { + int status = [[aNotification object] terminationStatus]; + + if (status != 0) + NSLog(@"X client task terminated abnormally."); + + if (!appQuitting) + [NSApp terminate:nil]; // quit if we aren't already + } +} + +// Called when the user clicks the application icon, but not when Cmd-Tab is used - (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag { [self show]; return NO; diff --git a/xc/programs/Xserver/hw/darwin/bundle/quartz.c b/xc/programs/Xserver/hw/darwin/bundle/quartz.c index f3965d55e..080937288 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/quartz.c +++ b/xc/programs/Xserver/hw/darwin/bundle/quartz.c @@ -5,7 +5,7 @@ * By Gregory Robert Parker * **************************************************************/ -/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/quartz.c,v 1.4 2001/04/02 05:18:50 torrey Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/quartz.c,v 1.7 2001/04/16 06:51:48 torrey Exp $ */ // X headers #include "scrnintstr.h" @@ -25,6 +25,7 @@ #include "../darwin.h" #include "quartz.h" #include "quartzAudio.h" +#include "quartzCursor.h" #define kDarwinMaxScreens 100 static ScreenPtr darwinScreens[kDarwinMaxScreens]; @@ -112,31 +113,24 @@ Bool QuartzAddScreen(ScreenPtr pScreen) /* * QuartzCapture - * Capture the screen so we can draw and hide the Aqua cursor. + * Capture the screen so we can draw. */ static void QuartzCapture(void) { if (! CGDisplayIsCaptured(kCGDirectMainDisplay)) { CGDisplayCapture(kCGDirectMainDisplay); -// FIXME: Properly initialize X cursor -#if 0 - CGDisplayHideCursor(kCGDirectMainDisplay); -#endif - HideMenuBar(); } } /* * QuartzRelease - * Release the screen so others can draw and restore the Aqua cursor. + * Release the screen so others can draw. */ static void QuartzRelease(void) { if (CGDisplayIsCaptured(kCGDirectMainDisplay)) { - InitCursor(); CGDisplayRelease(kCGDirectMainDisplay); - ShowMenuBar(); } } @@ -174,10 +168,12 @@ static void QuartzDisplayInit(void) /* * QuartzOsVendorInit - * Quartz display initialization. + * Quartz display initialization. */ void QuartzOsVendorInit(void) { + ErrorF("Display mode: Quartz\n"); + QuartzAudioInit(); QuartzDisplayInit(); } @@ -185,27 +181,34 @@ void QuartzOsVendorInit(void) /* * QuartzShow - * Show the X server on screen. Does nothing if already shown. - * recapture the screen, restore the X clip regions. + * Show the X server on screen. Does nothing if already shown. + * Recapture the screen, restore the X clip regions, and restore + * the X server cursor state. */ -void QuartzShow(void) { +void QuartzShow( + int x, // cursor location + int y ) +{ int i; QuartzCapture(); if (xhidden) { for (i = 0; i < darwinNumScreens; i++) { - if (darwinScreens[i]) - xf86SetRootClip(darwinScreens[i], true); + if (darwinScreens[i]) { + xf86SetRootClip(darwinScreens[i], true); + QuartzResumeXCursor(darwinScreens[i], x, y); + } } } - xhidden = false; + xhidden = FALSE; } /* * QuartzHide * Remove the X server display from the screen. Does nothing if already hidden. - * Release the screen, set X clip regions to prevent drawing. + * Release the screen, set X clip regions to prevent drawing, and restore the + * Aqua cursor. */ void QuartzHide(void) { @@ -213,12 +216,14 @@ void QuartzHide(void) if (!xhidden) { for (i = 0; i < darwinNumScreens; i++) { - if (darwinScreens[i]) - xf86SetRootClip(darwinScreens[i], false); + if (darwinScreens[i]) { + QuartzSuspendXCursor(darwinScreens[i]); + xf86SetRootClip(darwinScreens[i], false); + } } } QuartzRelease(); - xhidden = true; + xhidden = TRUE; } diff --git a/xc/programs/Xserver/hw/darwin/bundle/quartz.h b/xc/programs/Xserver/hw/darwin/bundle/quartz.h index 01c52eaae..30839fcda 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/quartz.h +++ b/xc/programs/Xserver/hw/darwin/bundle/quartz.h @@ -3,7 +3,7 @@ Quartz-specific functions and definitions */ -/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/quartz.h,v 1.2 2001/04/02 05:18:50 torrey Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/quartz.h,v 1.3 2001/04/11 08:34:18 torrey Exp $ */ #ifndef _QUARTZ_H #define _QUARTZ_H @@ -15,9 +15,8 @@ void QuartzOsVendorInit(void); Bool QuartzAddScreen(ScreenPtr screen); -Bool QuartzInitCursor(ScreenPtr pScreen); void QuartzGiveUp(void); void QuartzHide(void); -void QuartzShow(void); +void QuartzShow(int x, int y); #endif diff --git a/xc/programs/Xserver/hw/darwin/bundle/quartzAudio.c b/xc/programs/Xserver/hw/darwin/bundle/quartzAudio.c index a794a2b35..d903b24df 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/quartzAudio.c +++ b/xc/programs/Xserver/hw/darwin/bundle/quartzAudio.c @@ -10,7 +10,7 @@ // Smoothing transitions between sounds // http://www.wam.umd.edu/~mphoenix/dss/dss.html // -/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/quartzAudio.c,v 1.2 2001/04/05 06:08:46 torrey Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/quartzAudio.c,v 1.3 2001/04/07 18:01:29 torrey Exp $ */ #include <CoreAudio/AudioHardware.h> #include <pthread.h> @@ -238,10 +238,9 @@ void QuartzBell( return; } - // FIXME: how is NSBeep volume set? if (quartzUseSysBeep) { - NSBeep(); - return; + if (volume) + NSBeep(); } else { QuartzCoreAudioBell(volume, pitch, duration); } diff --git a/xc/programs/Xserver/hw/darwin/bundle/quartzCocoa.m b/xc/programs/Xserver/hw/darwin/bundle/quartzCocoa.m index d9168df75..c7b108646 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/quartzCocoa.m +++ b/xc/programs/Xserver/hw/darwin/bundle/quartzCocoa.m @@ -7,26 +7,36 @@ * that use X include files to avoid symbol collisions. * **************************************************************/ -/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/quartzCocoa.m,v 1.2 2001/04/05 06:08:46 torrey Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/quartzCocoa.m,v 1.4 2001/04/25 02:23:47 torrey Exp $ */ #include <Cocoa/Cocoa.h> #import "Preferences.h" #include "quartzShared.h" -static NSArray *pasteboardTypes = nil; +extern void FatalError(const char *, ...); // Read the user preferences from the Cocoa front end void QuartzReadPreferences(void) { + char *fileString; + darwinFakeButtons = [Preferences fakeButtons]; quartzUseSysBeep = [Preferences systemBeep]; + if ([Preferences useKeymapFile]) { + fileString = [[Preferences keymapFile] lossyCString]; + darwinKeymapFile = (char *) malloc(strlen(fileString)+1); + if (! darwinKeymapFile) + FatalError("malloc failed in QuartzReadPreferences()!\n"); + strcpy(darwinKeymapFile, fileString); + } } // Write text to the Mac OS X pasteboard. void QuartzWriteCocoaPasteboard(char *text) { NSPasteboard *pasteboard; + NSArray *pasteboardTypes; NSString *string; if (! text) return; @@ -34,15 +44,11 @@ void QuartzWriteCocoaPasteboard(char *text) if (! pasteboard) return; string = [NSString stringWithCString:text]; if (! string) return; - if (! pasteboardTypes) { - pasteboardTypes = [NSArray arrayWithObject:NSStringPboardType]; - [pasteboardTypes retain]; - } + pasteboardTypes = [NSArray arrayWithObject:NSStringPboardType]; // nil owner because we don't provide type translations [pasteboard declareTypes:pasteboardTypes owner:nil]; [pasteboard setString:string forType:NSStringPboardType]; - [string release]; } // Read text from the Mac OS X pasteboard and return it as a heap string. @@ -50,14 +56,11 @@ void QuartzWriteCocoaPasteboard(char *text) char *QuartzReadCocoaPasteboard(void) { NSPasteboard *pasteboard; + NSArray *pasteboardTypes; NSString *existingType; char *text = NULL; - if (! pasteboardTypes) { - pasteboardTypes = [NSArray arrayWithObject:NSStringPboardType]; - [[pasteboardTypes retain] autorelease]; - } - + pasteboardTypes = [NSArray arrayWithObject:NSStringPboardType]; pasteboard = [NSPasteboard generalPasteboard]; if (! pasteboard) return NULL; @@ -68,10 +71,9 @@ char *QuartzReadCocoaPasteboard(void) if (! string) return NULL; buffer = [string lossyCString]; - text = (char *) malloc(strlen(buffer)); + text = (char *) malloc(strlen(buffer)+1); if (text) strcpy(text, buffer); - [string release]; } return text; diff --git a/xc/programs/Xserver/hw/darwin/bundle/quartzCursor.c b/xc/programs/Xserver/hw/darwin/bundle/quartzCursor.c index 9435d96e9..d53cea982 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/quartzCursor.c +++ b/xc/programs/Xserver/hw/darwin/bundle/quartzCursor.c @@ -3,13 +3,15 @@ * Support for using the Quartz Window Manager cursor * **************************************************************/ -/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/quartzCursor.c,v 1.1 2001/04/02 05:18:50 torrey Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/quartzCursor.c,v 1.3 2001/04/13 20:55:26 torrey Exp $ */ #include "mi.h" #include "scrnintstr.h" #include "cursorstr.h" #include "mipointrst.h" +#include "quartzCursor.h" + #undef AllocCursor #define Cursor QD_Cursor #define WindowPtr QD_WindowPtr @@ -20,13 +22,179 @@ #define CURSORHEIGHT 16 typedef struct { - int cursorMode; + int qdCursorMode; + int qdCursorVisible; + int serverVisible; + CursorPtr latentCursor; QueryBestSizeProcPtr QueryBestSize; miPointerSpriteFuncPtr spriteFuncs; } QuartzCursorScreenRec, *QuartzCursorScreenPtr; static int darwinCursorScreenIndex = -1; static unsigned long darwinCursorGeneration = 0; +static QD_Cursor gQDArrow; // QuickDraw arrow cursor + +#define CURSOR_PRIV(pScreen) \ + ((QuartzCursorScreenPtr)pScreen->devPrivates[darwinCursorScreenIndex].ptr) +#define HIDE_QD_CURSOR(display, visible) \ + if (visible) { CGDisplayHideCursor(display); visible = FALSE; } +#define SHOW_QD_CURSOR(display, visible) \ + if (! visible) { CGDisplayShowCursor(display); visible = TRUE; } + + +/* + * MakeQDCursor helpers: CTAB_ENTER, interleave + */ + +// Add a color entry to a ctab +#define CTAB_ENTER(ctab, index, r, g, b) \ + ctab->ctTable[index].rgb.red = r; \ + ctab->ctTable[index].rgb.green = g; \ + ctab->ctTable[index].rgb.blue = b + +// Make an unsigned short by interleaving the bits of bytes c1 and c2. +// High bit of c1 is first; low bit of c2 is last. +// Interleave is a built-in INTERCAL operator. +static unsigned short +interleave( + unsigned char c1, + unsigned char c2 ) +{ + return + ((c1 & 0x80) << 8) | ((c2 & 0x80) << 7) | + ((c1 & 0x40) << 7) | ((c2 & 0x40) << 6) | + ((c1 & 0x20) << 6) | ((c2 & 0x20) << 5) | + ((c1 & 0x10) << 5) | ((c2 & 0x10) << 4) | + ((c1 & 0x08) << 4) | ((c2 & 0x08) << 3) | + ((c1 & 0x04) << 3) | ((c2 & 0x04) << 2) | + ((c1 & 0x02) << 2) | ((c2 & 0x02) << 1) | + ((c1 & 0x01) << 1) | ((c2 & 0x01) << 0) ; +} + +/* + * MakeQDCursor + * Make a QuickDraw color cursor from the given X11 cursor. + * Warning: This code is nasty. Color cursors were meant to be read + * from resources; constructing the structures programmatically is messy. + */ +/* + QuickDraw cursor representation: + Our color cursor is a 2 bit per pixel pixmap. + Each pixel's bits are (source<<1 | mask) from the original X cursor pixel. + The cursor's color table maps the colors like this: + (2-bit value | X result | colortable | Mac result) + 00 | transparent | white | transparent (white outside mask) + 01 | back color | back color | back color + 10 | undefined | black | invert background (just for fun) + 11 | fore color | fore color | fore color +*/ +static CCrsrHandle +MakeQDCursor( + CursorPtr pCursor ) +{ + CCrsrHandle result; + CCrsrPtr curs; + int i, w, h; + unsigned short rowMask; + PixMap *pix; + ColorTable *ctab; + unsigned short *image; + + result = (CCrsrHandle) NewHandleClear(sizeof(CCrsr)); + if (!result) return NULL; + HLock((Handle)result); + curs = *result; + + // Initialize CCrsr + curs->crsrType = 0x8001; // 0x8000 = b&w, 0x8001 = color + curs->crsrMap = (PixMapHandle) NewHandleClear(sizeof(PixMap)); + if (!curs->crsrMap) goto pixAllocFailed; + HLock((Handle)curs->crsrMap); + pix = *curs->crsrMap; + curs->crsrData = NULL; // raw cursor image data (set below) + curs->crsrXData = NULL; // QD's processed data + curs->crsrXValid = 0; // zero means QD must re-process cursor data + curs->crsrXHandle = NULL; // reserved + memset(curs->crsr1Data, 0, CURSORWIDTH*CURSORHEIGHT/8); // b&w data + memset(curs->crsrMask, 0, CURSORWIDTH*CURSORHEIGHT/8); // b&w & color mask + curs->crsrHotSpot.h = min(CURSORWIDTH, pCursor->bits->xhot); // hot spot + curs->crsrHotSpot.v = min(CURSORHEIGHT, pCursor->bits->yhot); // hot spot + curs->crsrXTable = 0; // reserved + curs->crsrID = GetCTSeed(); // unique ID from Color Manager + + // Set the b&w data and mask + w = min(pCursor->bits->width, CURSORWIDTH); + h = min(pCursor->bits->height, CURSORHEIGHT); + rowMask = ~((1 << (CURSORWIDTH - w)) - 1); + for (i = 0; i < h; i++) { + curs->crsr1Data[i] = rowMask & + ((pCursor->bits->source[i*4]<<8) | pCursor->bits->source[i*4+1]); + curs->crsrMask[i] = rowMask & + ((pCursor->bits->mask[i*4]<<8) | pCursor->bits->mask[i*4+1]); + } + + // Set the color data and mask + // crsrMap: defines bit depth and size and colortable only + pix->rowBytes = (CURSORWIDTH * 2 / 8) | 0x8000; // last bit on means PixMap + SetRect(&pix->bounds, 0, 0, CURSORWIDTH, CURSORHEIGHT); // see TN 1020 + pix->pixelSize = 2; + pix->cmpCount = 1; + pix->cmpSize = 2; + // pix->pmTable set below + + // crsrData is the pixel data. crsrMap's baseAddr is not used. + curs->crsrData = NewHandleClear(CURSORWIDTH*CURSORHEIGHT * 2 / 8); + if (!curs->crsrData) goto imageAllocFailed; + HLock((Handle)curs->crsrData); + image = (unsigned short *) *curs->crsrData; + // Pixel data is just 1-bit data and mask interleaved (see above) + for (i = 0; i < h; i++) { + unsigned char s, m; + s = pCursor->bits->source[i*4] & (rowMask >> 8); + m = pCursor->bits->mask[i*4] & (rowMask >> 8); + image[2*i] = interleave(s, m); + s = pCursor->bits->source[i*4+1] & (rowMask & 0x00ff); + m = pCursor->bits->mask[i*4+1] & (rowMask & 0x00ff); + image[2*i+1] = interleave(s, m); + } + + // Build the color table (entries described above) + // NewPixMap allocates a color table handle. + pix->pmTable = (CTabHandle) NewHandleClear(sizeof(ColorTable) + 3 + * sizeof(ColorSpec)); + if (!pix->pmTable) goto ctabAllocFailed; + HLock((Handle)pix->pmTable); + ctab = *pix->pmTable; + ctab->ctSeed = GetCTSeed(); + ctab->ctFlags = 0; + ctab->ctSize = 3; // color count - 1 + CTAB_ENTER(ctab, 0, 0xffff, 0xffff, 0xffff); + CTAB_ENTER(ctab, 1, pCursor->backRed, pCursor->backGreen, + pCursor->backBlue); + CTAB_ENTER(ctab, 2, 0x0000, 0x0000, 0x0000); + CTAB_ENTER(ctab, 3, pCursor->foreRed, pCursor->foreGreen, + pCursor->foreBlue); + + HUnlock((Handle)pix->pmTable); // ctab + HUnlock((Handle)curs->crsrData); // image data + HUnlock((Handle)curs->crsrMap); // pix + HUnlock((Handle)result); // cursor + + return result; + + // "What we have here is a failure to allocate" +ctabAllocFailed: + HUnlock((Handle)curs->crsrData); + DisposeHandle((Handle)curs->crsrData); +imageAllocFailed: + HUnlock((Handle)curs->crsrMap); + DisposeHandle((Handle)curs->crsrMap); +pixAllocFailed: + HUnlock((Handle)result); + DisposeHandle((Handle)result); + return NULL; +} + /* =========================================================================== @@ -45,10 +213,8 @@ QuartzRealizeCursor( ScreenPtr pScreen, CursorPtr pCursor ) { - int i; - QD_Cursor *curs; - QuartzCursorScreenPtr ScreenPriv = (QuartzCursorScreenPtr) - pScreen->devPrivates[darwinCursorScreenIndex].ptr; + CCrsrHandle qdCursor; + QuartzCursorScreenPtr ScreenPriv = CURSOR_PRIV(pScreen); if(!pCursor || !pCursor->bits) return FALSE; @@ -58,29 +224,13 @@ QuartzRealizeCursor( (pCursor->bits->width > CURSORWIDTH)) return (*ScreenPriv->spriteFuncs->RealizeCursor)(pScreen, pCursor); - // allocate memory for new cursor image - curs = xalloc( sizeof(QD_Cursor) ); - if (!curs) - return FALSE; - - // X cursor max size is 32x32 (rowbytes 4). - // Copy top left 16x16 for now. - for (i = 0; i < 16; i++) - { - curs->data[i] = (pCursor->bits->source[i*4]<<8) | - pCursor->bits->source[i*4+1]; - curs->mask[i] = (pCursor->bits->mask[i*4]<<8) | - pCursor->bits->mask[i*4+1]; - } - curs->hotSpot.h = pCursor->bits->xhot; - if(curs->hotSpot.h >= 16) - curs->hotSpot.h = 15; - curs->hotSpot.v = pCursor->bits->yhot; - if(curs->hotSpot.v >= 16) - curs->hotSpot.v = 15; + // make new cursor image + qdCursor = MakeQDCursor(pCursor); + if (!qdCursor) return FALSE; // save the result - pCursor->devPriv[pScreen->myNum] = (pointer) curs; + pCursor->devPriv[pScreen->myNum] = (pointer) qdCursor; + return TRUE; } @@ -94,14 +244,13 @@ QuartzUnrealizeCursor( ScreenPtr pScreen, CursorPtr pCursor ) { - QuartzCursorScreenPtr ScreenPriv = (QuartzCursorScreenPtr) - pScreen->devPrivates[darwinCursorScreenIndex].ptr; + QuartzCursorScreenPtr ScreenPriv = CURSOR_PRIV(pScreen); if ((pCursor->bits->height > CURSORHEIGHT) || (pCursor->bits->width > CURSORWIDTH)) { return (*ScreenPriv->spriteFuncs->UnrealizeCursor)(pScreen, pCursor); } else { - xfree( pCursor->devPriv[pScreen->myNum] ); + DisposeCCursor((CCrsrHandle) pCursor->devPriv[pScreen->myNum]); return TRUE; } } @@ -119,40 +268,40 @@ QuartzSetCursor( int x, int y) { - QD_Cursor *curs; - QuartzCursorScreenPtr ScreenPriv = (QuartzCursorScreenPtr) - pScreen->devPrivates[darwinCursorScreenIndex].ptr; + QuartzCursorScreenPtr ScreenPriv = CURSOR_PRIV(pScreen); + + ScreenPriv->latentCursor = pCursor; + + // Don't touch Mac OS cursor if X is hidden! + if (! ScreenPriv->serverVisible) + return; - // are we supposed to remove the cursor? if (!pCursor) { - if (ScreenPriv->cursorMode == 0) + // Remove the cursor completely. + HIDE_QD_CURSOR(kCGDirectMainDisplay, ScreenPriv->qdCursorVisible); + if (! ScreenPriv->qdCursorMode) (*ScreenPriv->spriteFuncs->SetCursor)(pScreen, 0, x, y); - else - CGDisplayHideCursor(kCGDirectMainDisplay); - return; } + else if ((pCursor->bits->height <= CURSORHEIGHT) && + (pCursor->bits->width <= CURSORWIDTH)) + { + // Cursor is small enough to use QuickDraw directly. + CCrsrHandle curs; - // can we use QuickDraw cursor? - if ((pCursor->bits->height <= CURSORHEIGHT) && - (pCursor->bits->width <= CURSORWIDTH)) { - - if (ScreenPriv->cursorMode == 0) // remove the X cursor + if (! ScreenPriv->qdCursorMode) // remove the X cursor (*ScreenPriv->spriteFuncs->SetCursor)(pScreen, 0, x, y); + ScreenPriv->qdCursorMode = TRUE; - ScreenPriv->cursorMode = 1; - curs = (QD_Cursor *) pCursor->devPriv[pScreen->myNum]; - SetCursor(curs); - return; + curs = (CCrsrHandle) pCursor->devPriv[pScreen->myNum]; + SetCCursor(curs); + SHOW_QD_CURSOR(kCGDirectMainDisplay, ScreenPriv->qdCursorVisible); } - - // otherwise we use a software cursor - if (ScreenPriv->cursorMode) { - // remove the QuickDraw cursor - QuartzSetCursor(pScreen, 0, x, y); + else { + // Cursor is too big for QuickDraw. Use X software cursor. + HIDE_QD_CURSOR(kCGDirectMainDisplay, ScreenPriv->qdCursorVisible); + ScreenPriv->qdCursorMode = FALSE; + (*ScreenPriv->spriteFuncs->SetCursor)(pScreen, pCursor, x, y); } - - ScreenPriv->cursorMode = 0; - (*ScreenPriv->spriteFuncs->SetCursor)(pScreen, pCursor, x, y); } @@ -166,11 +315,10 @@ QuartzMoveCursor( int x, int y) { - QuartzCursorScreenPtr ScreenPriv = (QuartzCursorScreenPtr) - pScreen->devPrivates[darwinCursorScreenIndex].ptr; + QuartzCursorScreenPtr ScreenPriv = CURSOR_PRIV(pScreen); // only the X cursor needs to be explicitly moved - if (!ScreenPriv->cursorMode) + if (!ScreenPriv->qdCursorMode) (*ScreenPriv->spriteFuncs->MoveCursor)(pScreen, x, y); } @@ -220,12 +368,24 @@ QuartzWarpCursor( { CGDisplayErr cgErr; CGPoint cgPoint; + int neverMoved = TRUE; - cgPoint = CGPointMake(x, y); - cgErr = CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgPoint); - if (cgErr != CGDisplayNoErr) { - ErrorF("Could not set cursor position with error code 0x%x.\n", cgErr); + if (neverMoved) { + // Don't move the cursor the first time. This is the jump-to-center + // initialization, and it's annoying because we may still be in MacOS. + neverMoved = FALSE; + return; + } + + if (CURSOR_PRIV(pScreen)->serverVisible) { + cgPoint = CGPointMake(x, y); + cgErr = CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgPoint); + if (cgErr != CGDisplayNoErr) { + ErrorF("Could not set cursor position with error code 0x%x.\n", + cgErr); + } } + miPointerWarpCursor(pScreen, x, y); } @@ -255,14 +415,14 @@ QuartzCursorQueryBestSize( unsigned short *height, ScreenPtr pScreen) { - QuartzCursorScreenPtr ScreenPriv = (QuartzCursorScreenPtr) - pScreen->devPrivates[darwinCursorScreenIndex].ptr; + QuartzCursorScreenPtr ScreenPriv = CURSOR_PRIV(pScreen); if (class == CursorShape) { *width = CURSORWIDTH; *height = CURSORHEIGHT; - } else + } else { (*ScreenPriv->QueryBestSize)(class, width, height, pScreen); + } } @@ -272,10 +432,10 @@ QuartzCursorQueryBestSize( */ Bool QuartzInitCursor( - ScreenPtr pScreen ) + ScreenPtr pScreen ) { QuartzCursorScreenPtr ScreenPriv; - miPointerScreenPtr PointPriv; + miPointerScreenPtr PointPriv; // initialize software cursor handling (always needed as backup) if (!miDCInitialize(pScreen, &quartzScreenFuncsRec)) { @@ -286,25 +446,56 @@ QuartzInitCursor( if (darwinCursorGeneration != serverGeneration) { if ((darwinCursorScreenIndex = AllocateScreenPrivateIndex()) < 0) return FALSE; - darwinCursorGeneration = serverGeneration; + darwinCursorGeneration = serverGeneration; } ScreenPriv = xcalloc( 1, sizeof(QuartzCursorScreenRec) ); if (!ScreenPriv) return FALSE; - pScreen->devPrivates[darwinCursorScreenIndex].ptr = (pointer) ScreenPriv; + CURSOR_PRIV(pScreen) = ScreenPriv; // override some screen procedures ScreenPriv->QueryBestSize = pScreen->QueryBestSize; pScreen->QueryBestSize = QuartzCursorQueryBestSize; // initialize QuickDraw cursor handling + GetQDGlobalsArrow(&gQDArrow); PointPriv = (miPointerScreenPtr) pScreen->devPrivates[miPointerScreenIndex].ptr; ScreenPriv->spriteFuncs = PointPriv->spriteFuncs; PointPriv->spriteFuncs = &quartzSpriteFuncsRec; - ScreenPriv->cursorMode = 1; + ScreenPriv->qdCursorMode = TRUE; + ScreenPriv->qdCursorVisible = TRUE; + ScreenPriv->latentCursor = NULL; + ScreenPriv->serverVisible = FALSE; return TRUE; } + + +// X server is hiding. Restore the Aqua cursor. +void QuartzSuspendXCursor( + ScreenPtr pScreen ) +{ + QuartzCursorScreenPtr ScreenPriv = CURSOR_PRIV(pScreen); + + SetCursor(&gQDArrow); + SHOW_QD_CURSOR(kCGDirectMainDisplay, ScreenPriv->qdCursorVisible); + + ScreenPriv->serverVisible = FALSE; +} + + +// X server is showing. Restore the X cursor. +void QuartzResumeXCursor( + ScreenPtr pScreen, + int x, + int y ) +{ + QuartzCursorScreenPtr ScreenPriv = CURSOR_PRIV(pScreen); + + ScreenPriv->serverVisible = TRUE; + + QuartzSetCursor(pScreen, ScreenPriv->latentCursor, x, y); +} diff --git a/xc/programs/Xserver/hw/darwin/bundle/quartzCursor.h b/xc/programs/Xserver/hw/darwin/bundle/quartzCursor.h new file mode 100644 index 000000000..997e26176 --- /dev/null +++ b/xc/programs/Xserver/hw/darwin/bundle/quartzCursor.h @@ -0,0 +1,15 @@ +/* + * quartzCursor.h + * + * Quartz hardware cursor + */ +/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/quartzCursor.h,v 1.1 2001/04/11 08:34:18 torrey Exp $ */ + +#ifndef QUARTZCURSOR_H +#define QUARTZCURSOR_H + +Bool QuartzInitCursor(ScreenPtr pScreen); +void QuartzSuspendXCursor(ScreenPtr pScreen); +void QuartzResumeXCursor(ScreenPtr pScreen, int x, int y); + +#endif diff --git a/xc/programs/Xserver/hw/darwin/bundle/quartzShared.h b/xc/programs/Xserver/hw/darwin/bundle/quartzShared.h index 9a69295ce..3813f4f17 100644 --- a/xc/programs/Xserver/hw/darwin/bundle/quartzShared.h +++ b/xc/programs/Xserver/hw/darwin/bundle/quartzShared.h @@ -2,7 +2,7 @@ * Shared definitions between the Darwin X Server * and the Cocoa front end. */ -/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/quartzShared.h,v 1.3 2001/04/05 06:08:46 torrey Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/quartzShared.h,v 1.4 2001/04/25 02:23:47 torrey Exp $ */ #ifndef _QUARTZSHARED_H #define _QUARTZSHARED_H @@ -14,6 +14,7 @@ extern int quartzStartClients; // User preferences used by X server extern int quartzUseSysBeep; extern int darwinFakeButtons; +extern char *darwinKeymapFile; void QuartzReadPreferences(void); |