summaryrefslogtreecommitdiff
path: root/xc/programs/Xserver/hw/darwin/bundle
diff options
context:
space:
mode:
Diffstat (limited to 'xc/programs/Xserver/hw/darwin/bundle')
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/classes.nib5
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/info.nib2
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/English.lproj/MainMenu.nib/objects.nibbin6947 -> 7656 bytes
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/Imakefile16
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/classes.nib5
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/info.nib4
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/MainMenu.nib/objects.nibbin7489 -> 8235 bytes
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/Japanese.lproj/XDarwinHelp.html13
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/Preferences.h17
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/Preferences.m66
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/XDarwin.pbproj/project.pbxproj12
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/XDarwinStartup.c24
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/Xserver.h19
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/Xserver.m183
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/quartz.c47
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/quartz.h5
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/quartzAudio.c7
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/quartzCocoa.m30
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/quartzCursor.c331
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/quartzCursor.h15
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/quartzShared.h3
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
index 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
Binary files differ
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
index 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
Binary files differ
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);