First import
[xorg_rtime.git] / xorg-server-1.4 / hw / darwin / quartz / Preferences.m
blobeb78fd32a1ae078c8420d195062e405faecaec01
1 //
2 //  Preferences.m
3 //
4 //  This class keeps track of the user preferences.
5 //
6 /*
7  * Copyright (c) 2002-2004 Torrey T. Lyons. All Rights Reserved.
8  *
9  * Permission is hereby granted, free of charge, to any person obtaining a
10  * copy of this software and associated documentation files (the
11  * "Software"), to deal in the Software without restriction, including
12  * without limitation the rights to use, copy, modify, merge, publish,
13  * distribute, sublicense, and/or sell copies of the Software, and to
14  * permit persons to whom the Software is furnished to do so, subject to
15  * the following conditions:
16  *
17  * The above copyright notice and this permission notice shall be included
18  * in all copies or substantial portions of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23  * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
24  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27  *
28  * Except as contained in this notice, the name(s) of the above copyright
29  * holders shall not be used in advertising or otherwise to promote the
30  * sale, use or other dealings in this Software without prior written
31  * authorization.
32  */
33 /* $XFree86: xc/programs/Xserver/hw/darwin/quartz/Preferences.m,v 1.5 2004/06/08 22:58:10 torrey Exp $ */
34 #ifdef HAVE_XORG_CONFIG_H
35 #include <xorg-config.h>
36 #endif
37 #import "quartzCommon.h"
39 #define BOOL xBOOL
40 #include "darwin.h"
41 #undef BOOL
43 #import "Preferences.h"
45 #include <IOKit/hidsystem/IOLLEvent.h>  // for modifier masks
47 // Macros to build the path name
48 #ifndef XBINDIR
49 #define XBINDIR /usr/X11/bin
50 #endif
51 #define STR(s) #s
52 #define XSTRPATH(s) STR(s)
54 // Keys for user defaults dictionary
55 static NSString *X11EnableKeyEquivalentsKey = @"EnableKeyEquivalents";
58 @implementation Preferences
60 + (void)initialize
62     // Provide user defaults if needed
63     NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
64         [NSNumber numberWithInt:0], @"Display",
65         @"YES", @"FakeButtons",
66         [NSNumber numberWithInt:NX_COMMANDMASK], @"Button2Mask",
67         [NSNumber numberWithInt:NX_ALTERNATEMASK], @"Button3Mask",
68         NSLocalizedString(@"USA.keymapping",@""), @"KeymappingFile",
69         @"YES", @"UseKeymappingFile",
70         NSLocalizedString(@"Cmd-Opt-a",@""), @"SwitchString",
71         @"YES", @"UseRootlessMode",
72         @"YES", @"UseAGLforGLX",
73         @"YES", @"ShowModePickWindow",
74         @"YES", @"ShowStartupHelp",
75         [NSNumber numberWithInt:0], @"SwitchKeyCode",
76         [NSNumber numberWithInt:(NSCommandKeyMask | NSAlternateKeyMask)],
77         @"SwitchModifiers", @"NO", @"UseSystemBeep",
78         @"YES", X11EnableKeyEquivalentsKey,
79         @"YES", @"DockSwitch",
80         @"NO", @"AllowMouseAccelChange",
81         [NSNumber numberWithInt:qdCursor_Not8Bit], @"UseQDCursor",
82         @"YES", @"Xinerama",
83         @"YES", @"AddToPath",
84         [NSString stringWithCString:XSTRPATH(XBINDIR)], @"AddToPathString",
85         @"YES", @"UseDefaultShell",
86         @"/bin/tcsh", @"Shell",
87         [NSNumber numberWithInt:depth_Current], @"Depth",
88 #ifdef BUILD_XPR
89         [NSArray arrayWithObjects:@"xpr.bundle", @"cr.bundle", nil],
90 #else
91         [NSArray arrayWithObjects:@"cr.bundle", nil],
92 #endif
93         @"DisplayModeBundles", nil];
95     [super initialize];
96     [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
99 // Initialize internal state info of switch key button
100 - (void)initSwitchKey
102     keyCode = [Preferences keyCode];
103     modifiers = [Preferences modifiers];
104     [switchString setString:[Preferences switchString]];
107 - (id)init
109     self = [super init];
111     isGettingKeyCode=NO;
112     switchString=[[NSMutableString alloc] init];
113     [self initSwitchKey];
115     return self;
118 // Set a modifiers checkbox matrix to match a modifier mask
119 - (void)resetMatrix:(NSMatrix *)aMatrix withMask:(int)aMask
121     [aMatrix setState:(aMask & NX_SHIFTMASK)       atRow:0 column:0];
122     [aMatrix setState:(aMask & NX_CONTROLMASK)     atRow:1 column:0];
123     [aMatrix setState:(aMask & NX_COMMANDMASK)     atRow:2 column:0];
124     [aMatrix setState:(aMask & NX_ALTERNATEMASK)   atRow:3 column:0];
125     [aMatrix setState:(aMask & NX_SECONDARYFNMASK) atRow:4 column:0];
128 // Generate a modifiers mask from a modifiers checkbox matrix
129 - (int)getMaskFromMatrix:(NSMatrix *)aMatrix
131     int theMask = 0;
133     if ([[aMatrix cellAtRow:0 column:0] state])
134         theMask |= NX_SHIFTMASK;
135     if ([[aMatrix cellAtRow:1 column:0] state])
136         theMask |= NX_CONTROLMASK;
137     if ([[aMatrix cellAtRow:2 column:0] state])
138         theMask |= NX_COMMANDMASK;
139     if ([[aMatrix cellAtRow:3 column:0] state])
140         theMask |= NX_ALTERNATEMASK;
141     if ([[aMatrix cellAtRow:4 column:0] state])
142         theMask |= NX_SECONDARYFNMASK;
144     return theMask;
147 // Set the window controls to the state in user defaults
148 - (void)resetWindow
150     if ([Preferences keymapFile] == nil)
151         [keymapFileField setStringValue:@" "];
152     else
153         [keymapFileField setStringValue:[Preferences keymapFile]];
155     if ([Preferences switchString] == nil)
156         [switchKeyButton setTitle:@"--"];
157     else
158         [switchKeyButton setTitle:[Preferences switchString]];
160     [displayField setIntValue:[Preferences display]];
161     [dockSwitchButton setIntValue:[Preferences dockSwitch]];
162     [fakeButton setIntValue:[Preferences fakeButtons]];
163     [self resetMatrix:button2ModifiersMatrix
164           withMask:[Preferences button2Mask]];
165     [self resetMatrix:button3ModifiersMatrix
166           withMask:[Preferences button3Mask]];
167     [modeMatrix setState:[Preferences rootless] atRow:0 column:1];
168     [startupHelpButton setIntValue:[Preferences startupHelp]];
169     [modeWindowButton setIntValue:[Preferences modeWindow]];
170     [systemBeepButton setIntValue:[Preferences systemBeep]];
171     [mouseAccelChangeButton setIntValue:[Preferences mouseAccelChange]];
172     [useXineramaButton setIntValue:[Preferences xinerama]];
173     [addToPathButton setIntValue:[Preferences addToPath]];
174     [addToPathField setStringValue:[Preferences addToPathString]];
175     [useDefaultShellMatrix setState:![Preferences useDefaultShell]
176                            atRow:1 column:0];
177     [useOtherShellField setStringValue:[Preferences shellString]];
178     [depthButton selectItemAtIndex:[Preferences depth]];
181 - (void)awakeFromNib
183     [self resetWindow];
186 // Preference window delegate
187 - (void)windowWillClose:(NSNotification *)aNotification
189     [self resetWindow];
190     [self initSwitchKey];
193 // User cancelled the changes
194 - (IBAction)close:(id)sender
196     [window orderOut:nil];
197     [self resetWindow];         // reset window controls
198     [self initSwitchKey];       // reset switch key state
201 // Pick keymapping file
202 - (IBAction)pickFile:(id)sender
204     int result;
205     NSArray *fileTypes = [NSArray arrayWithObject:@"keymapping"];
206     NSOpenPanel *oPanel = [NSOpenPanel openPanel];
208     [oPanel setAllowsMultipleSelection:NO];
209     result = [oPanel runModalForDirectory:@"/System/Library/Keyboards"
210                      file:nil types:fileTypes];
211     if (result == NSOKButton) {
212         [keymapFileField setStringValue:[oPanel filename]];
213     }
216 // User saved changes
217 - (IBAction)saveChanges:(id)sender
219     [Preferences setKeyCode:keyCode];
220     [Preferences setModifiers:modifiers];
221     [Preferences setSwitchString:switchString];
222     [Preferences setKeymapFile:[keymapFileField stringValue]];
223     [Preferences setUseKeymapFile:YES];
224     [Preferences setDisplay:[displayField intValue]];
225     [Preferences setDockSwitch:[dockSwitchButton intValue]];
226     [Preferences setFakeButtons:[fakeButton intValue]];
227     [Preferences setButton2Mask:
228                     [self getMaskFromMatrix:button2ModifiersMatrix]];
229     [Preferences setButton3Mask:
230                     [self getMaskFromMatrix:button3ModifiersMatrix]];
231     [Preferences setRootless:[[modeMatrix cellAtRow:0 column:1] state]];
232     [Preferences setModeWindow:[modeWindowButton intValue]];
233     [Preferences setStartupHelp:[startupHelpButton intValue]];
234     [Preferences setSystemBeep:[systemBeepButton intValue]];
235     [Preferences setMouseAccelChange:[mouseAccelChangeButton intValue]];
236     [Preferences setXinerama:[useXineramaButton intValue]];
237     [Preferences setAddToPath:[addToPathButton intValue]];
238     [Preferences setAddToPathString:[addToPathField stringValue]];
239     [Preferences setUseDefaultShell:
240                     [[useDefaultShellMatrix cellAtRow:0 column:0] state]];
241     [Preferences setShellString:[useOtherShellField stringValue]];
242     [Preferences setDepth:[depthButton indexOfSelectedItem]];
243     [Preferences saveToDisk];
245     [window orderOut:nil];
248 - (IBAction)setKey:(id)sender
250     [switchKeyButton setTitle:NSLocalizedString(@"Press key",@"")];
251     isGettingKeyCode=YES;
252     [switchString setString:@""];
255 - (BOOL)sendEvent:(NSEvent *)anEvent
257     if(isGettingKeyCode) {
258         if([anEvent type]==NSKeyDown) // wait for keyup
259             return YES;
260         if([anEvent type]!=NSKeyUp)
261             return NO;
263         if([anEvent modifierFlags] & NSCommandKeyMask)
264             [switchString appendString:@"Cmd-"];
265         if([anEvent modifierFlags] & NSControlKeyMask)
266             [switchString appendString:@"Ctrl-"];
267         if([anEvent modifierFlags] & NSAlternateKeyMask)
268             [switchString appendString:@"Opt-"];
269         if([anEvent modifierFlags] & NSNumericPadKeyMask) // doesn't work
270             [switchString appendString:@"Num-"];
271         if([anEvent modifierFlags] & NSHelpKeyMask)
272             [switchString appendString:@"Help-"];
273         if([anEvent modifierFlags] & NSFunctionKeyMask) // powerbooks only
274             [switchString appendString:@"Fn-"];
275         
276         [switchString appendString:[anEvent charactersIgnoringModifiers]];
277         [switchKeyButton setTitle:switchString];
278         
279         keyCode = [anEvent keyCode];
280         modifiers = [anEvent modifierFlags];
281         isGettingKeyCode=NO;
282         
283         return YES;
284     }
285     return NO;
288 + (void)setKeymapFile:(NSString *)newFile
290     [[NSUserDefaults standardUserDefaults] setObject:newFile
291             forKey:@"KeymappingFile"];
294 + (void)setUseKeymapFile:(BOOL)newUseKeymapFile
296     [[NSUserDefaults standardUserDefaults] setBool:newUseKeymapFile
297             forKey:@"UseKeymappingFile"];
300 + (void)setSwitchString:(NSString *)newString
302     [[NSUserDefaults standardUserDefaults] setObject:newString
303             forKey:@"SwitchString"];
306 + (void)setKeyCode:(int)newKeyCode
308     [[NSUserDefaults standardUserDefaults] setInteger:newKeyCode
309             forKey:@"SwitchKeyCode"];
312 + (void)setModifiers:(int)newModifiers
314     [[NSUserDefaults standardUserDefaults] setInteger:newModifiers
315             forKey:@"SwitchModifiers"];
318 + (void)setDisplay:(int)newDisplay
320     [[NSUserDefaults standardUserDefaults] setInteger:newDisplay
321             forKey:@"Display"];
324 + (void)setDockSwitch:(BOOL)newDockSwitch
326     [[NSUserDefaults standardUserDefaults] setBool:newDockSwitch
327             forKey:@"DockSwitch"];
330 + (void)setFakeButtons:(BOOL)newFakeButtons
332     [[NSUserDefaults standardUserDefaults] setBool:newFakeButtons
333             forKey:@"FakeButtons"];
334     // Update the setting used by the X server thread
335     darwinFakeButtons = newFakeButtons;
338 + (void)setButton2Mask:(int)newFakeMask
340     [[NSUserDefaults standardUserDefaults] setInteger:newFakeMask
341             forKey:@"Button2Mask"];
342     // Update the setting used by the X server thread
343     darwinFakeMouse2Mask = newFakeMask;
346 + (void)setButton3Mask:(int)newFakeMask
348     [[NSUserDefaults standardUserDefaults] setInteger:newFakeMask
349             forKey:@"Button3Mask"];
350     // Update the setting used by the X server thread
351     darwinFakeMouse3Mask = newFakeMask;
354 + (void)setMouseAccelChange:(BOOL)newMouseAccelChange
356     [[NSUserDefaults standardUserDefaults] setBool:newMouseAccelChange
357             forKey:@"AllowMouseAccelChange"];
358     // Update the setting used by the X server thread
359     darwinMouseAccelChange = newMouseAccelChange;
362 + (void)setUseQDCursor:(int)newUseQDCursor
364     [[NSUserDefaults standardUserDefaults] setInteger:newUseQDCursor
365             forKey:@"UseQDCursor"];
368 + (void)setModeWindow:(BOOL)newModeWindow
370     [[NSUserDefaults standardUserDefaults] setBool:newModeWindow
371             forKey:@"ShowModePickWindow"];
374 + (void)setRootless:(BOOL)newRootless
376     [[NSUserDefaults standardUserDefaults] setBool:newRootless
377             forKey:@"UseRootlessMode"];
380 + (void)setUseAGL:(BOOL)newUseAGL
382     [[NSUserDefaults standardUserDefaults] setBool:newUseAGL
383             forKey:@"UseAGLforGLX"];
386 + (void)setStartupHelp:(BOOL)newStartupHelp
388     [[NSUserDefaults standardUserDefaults] setBool:newStartupHelp
389             forKey:@"ShowStartupHelp"];
392 + (void)setSystemBeep:(BOOL)newSystemBeep
394     [[NSUserDefaults standardUserDefaults] setBool:newSystemBeep
395             forKey:@"UseSystemBeep"];
396     // Update the setting used by the X server thread
397     quartzUseSysBeep = newSystemBeep;
400 + (void)setEnableKeyEquivalents:(BOOL)newKeyEquivs
402     [[NSUserDefaults standardUserDefaults] setBool:newKeyEquivs
403             forKey:X11EnableKeyEquivalentsKey];
404     // Update the setting used by the X server thread
405     quartzEnableKeyEquivalents = newKeyEquivs;
408 + (void)setXinerama:(BOOL)newXinerama
410     [[NSUserDefaults standardUserDefaults] setBool:newXinerama
411             forKey:@"Xinerama"];
414 + (void)setAddToPath:(BOOL)newAddToPath
416     [[NSUserDefaults standardUserDefaults] setBool:newAddToPath
417             forKey:@"AddToPath"];
420 + (void)setAddToPathString:(NSString *)newAddToPathString
422     [[NSUserDefaults standardUserDefaults] setObject:newAddToPathString
423             forKey:@"AddToPathString"];
426 + (void)setUseDefaultShell:(BOOL)newUseDefaultShell
428     [[NSUserDefaults standardUserDefaults] setBool:newUseDefaultShell
429             forKey:@"UseDefaultShell"];
432 + (void)setShellString:(NSString *)newShellString
434     [[NSUserDefaults standardUserDefaults] setObject:newShellString
435             forKey:@"Shell"];
438 + (void)setDepth:(int)newDepth
440     [[NSUserDefaults standardUserDefaults] setInteger:newDepth
441             forKey:@"Depth"];
444 + (void)setDisplayModeBundles:(NSArray *)newBundles
446     [[NSUserDefaults standardUserDefaults] setObject:newBundles
447             forKey:@"DisplayModeBundles"];
450 + (void)saveToDisk
452     [[NSUserDefaults standardUserDefaults] synchronize];
455 + (BOOL)useKeymapFile
457     return [[NSUserDefaults standardUserDefaults]
458                 boolForKey:@"UseKeymappingFile"];
461 + (NSString *)keymapFile
463     return [[NSUserDefaults standardUserDefaults]
464                 stringForKey:@"KeymappingFile"];
467 + (NSString *)switchString
469     return [[NSUserDefaults standardUserDefaults]
470                 stringForKey:@"SwitchString"];
473 + (unsigned int)keyCode
475     return [[NSUserDefaults standardUserDefaults]
476                 integerForKey:@"SwitchKeyCode"];
479 + (unsigned int)modifiers
481     return [[NSUserDefaults standardUserDefaults]
482                 integerForKey:@"SwitchModifiers"];
485 + (int)display
487     return [[NSUserDefaults standardUserDefaults]
488                 integerForKey:@"Display"];
491 + (BOOL)dockSwitch
493     return [[NSUserDefaults standardUserDefaults] boolForKey:@"DockSwitch"];
496 + (BOOL)fakeButtons
498     return [[NSUserDefaults standardUserDefaults] boolForKey:@"FakeButtons"];
501 + (int)button2Mask
503     return [[NSUserDefaults standardUserDefaults]
504                 integerForKey:@"Button2Mask"];
507 + (int)button3Mask
509     return [[NSUserDefaults standardUserDefaults]
510                 integerForKey:@"Button3Mask"];
513 + (BOOL)mouseAccelChange
515     return [[NSUserDefaults standardUserDefaults]
516                 boolForKey:@"AllowMouseAccelChange"];
519 + (int)useQDCursor
521     return [[NSUserDefaults standardUserDefaults]
522                 integerForKey:@"UseQDCursor"];
525 + (BOOL)rootless
527     return [[NSUserDefaults standardUserDefaults]
528                 boolForKey:@"UseRootlessMode"];
531 + (BOOL)useAGL
533     return [[NSUserDefaults standardUserDefaults]
534                 boolForKey:@"UseAGLforGLX"];
537 + (BOOL)modeWindow
539     return [[NSUserDefaults standardUserDefaults]
540                 boolForKey:@"ShowModePickWindow"];
543 + (BOOL)startupHelp
545     return [[NSUserDefaults standardUserDefaults]
546                 boolForKey:@"ShowStartupHelp"];
549 + (BOOL)systemBeep
551     return [[NSUserDefaults standardUserDefaults] boolForKey:@"UseSystemBeep"];
554 + (BOOL)enableKeyEquivalents
556     return [[NSUserDefaults standardUserDefaults] boolForKey:X11EnableKeyEquivalentsKey];
559 + (BOOL)xinerama
561     return [[NSUserDefaults standardUserDefaults] boolForKey:@"Xinerama"];
564 + (BOOL)addToPath
566     return [[NSUserDefaults standardUserDefaults] boolForKey:@"AddToPath"];
569 + (NSString *)addToPathString
571     return [[NSUserDefaults standardUserDefaults]
572                 stringForKey:@"AddToPathString"];
575 + (BOOL)useDefaultShell
577     return [[NSUserDefaults standardUserDefaults]
578                 boolForKey:@"UseDefaultShell"];
581 + (NSString *)shellString
583     return [[NSUserDefaults standardUserDefaults]
584                 stringForKey:@"Shell"];
587 + (int)depth
589     return [[NSUserDefaults standardUserDefaults]
590                 integerForKey:@"Depth"];
593 + (NSArray *)displayModeBundles
595     return [[NSUserDefaults standardUserDefaults]
596                 objectForKey:@"DisplayModeBundles"];
599 @end