4 // This class keeps track of the user preferences.
7 * Copyright (c) 2002-2004 Torrey T. Lyons. All Rights Reserved.
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:
17 * The above copyright notice and this permission notice shall be included
18 * in all copies or substantial portions of the Software.
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.
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
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>
37 #import "quartzCommon.h"
43 #import "Preferences.h"
45 #include <IOKit/hidsystem/IOLLEvent.h> // for modifier masks
47 // Macros to build the path name
49 #define XBINDIR /usr/X11/bin
52 #define XSTRPATH(s) STR(s)
54 // Keys for user defaults dictionary
55 static NSString *X11EnableKeyEquivalentsKey = @"EnableKeyEquivalents";
58 @implementation Preferences
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",
84 [NSString stringWithCString:XSTRPATH(XBINDIR)], @"AddToPathString",
85 @"YES", @"UseDefaultShell",
86 @"/bin/tcsh", @"Shell",
87 [NSNumber numberWithInt:depth_Current], @"Depth",
89 [NSArray arrayWithObjects:@"xpr.bundle", @"cr.bundle", nil],
91 [NSArray arrayWithObjects:@"cr.bundle", nil],
93 @"DisplayModeBundles", nil];
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]];
112 switchString=[[NSMutableString alloc] init];
113 [self initSwitchKey];
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
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;
147 // Set the window controls to the state in user defaults
150 if ([Preferences keymapFile] == nil)
151 [keymapFileField setStringValue:@" "];
153 [keymapFileField setStringValue:[Preferences keymapFile]];
155 if ([Preferences switchString] == nil)
156 [switchKeyButton setTitle:@"--"];
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]
177 [useOtherShellField setStringValue:[Preferences shellString]];
178 [depthButton selectItemAtIndex:[Preferences depth]];
186 // Preference window delegate
187 - (void)windowWillClose:(NSNotification *)aNotification
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
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]];
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
260 if([anEvent type]!=NSKeyUp)
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-"];
276 [switchString appendString:[anEvent charactersIgnoringModifiers]];
277 [switchKeyButton setTitle:switchString];
279 keyCode = [anEvent keyCode];
280 modifiers = [anEvent modifierFlags];
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
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
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
438 + (void)setDepth:(int)newDepth
440 [[NSUserDefaults standardUserDefaults] setInteger:newDepth
444 + (void)setDisplayModeBundles:(NSArray *)newBundles
446 [[NSUserDefaults standardUserDefaults] setObject:newBundles
447 forKey:@"DisplayModeBundles"];
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"];
487 return [[NSUserDefaults standardUserDefaults]
488 integerForKey:@"Display"];
493 return [[NSUserDefaults standardUserDefaults] boolForKey:@"DockSwitch"];
498 return [[NSUserDefaults standardUserDefaults] boolForKey:@"FakeButtons"];
503 return [[NSUserDefaults standardUserDefaults]
504 integerForKey:@"Button2Mask"];
509 return [[NSUserDefaults standardUserDefaults]
510 integerForKey:@"Button3Mask"];
513 + (BOOL)mouseAccelChange
515 return [[NSUserDefaults standardUserDefaults]
516 boolForKey:@"AllowMouseAccelChange"];
521 return [[NSUserDefaults standardUserDefaults]
522 integerForKey:@"UseQDCursor"];
527 return [[NSUserDefaults standardUserDefaults]
528 boolForKey:@"UseRootlessMode"];
533 return [[NSUserDefaults standardUserDefaults]
534 boolForKey:@"UseAGLforGLX"];
539 return [[NSUserDefaults standardUserDefaults]
540 boolForKey:@"ShowModePickWindow"];
545 return [[NSUserDefaults standardUserDefaults]
546 boolForKey:@"ShowStartupHelp"];
551 return [[NSUserDefaults standardUserDefaults] boolForKey:@"UseSystemBeep"];
554 + (BOOL)enableKeyEquivalents
556 return [[NSUserDefaults standardUserDefaults] boolForKey:X11EnableKeyEquivalentsKey];
561 return [[NSUserDefaults standardUserDefaults] boolForKey:@"Xinerama"];
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"];
589 return [[NSUserDefaults standardUserDefaults]
590 integerForKey:@"Depth"];
593 + (NSArray *)displayModeBundles
595 return [[NSUserDefaults standardUserDefaults]
596 objectForKey:@"DisplayModeBundles"];