4
// This class keeps track of the user preferences.
6
/* $XFree86: xc/programs/Xserver/hw/darwin/quartz/Preferences.m,v 1.2 2003/01/15 02:34:06 torrey Exp $ */
8
#import "Preferences.h"
9
#import "quartzCommon.h"
10
#include <IOKit/hidsystem/IOLLEvent.h> // for modifier masks
12
// Macros to build the path name
14
#define XBINDIR /usr/X11R6/bin
17
#define XSTRPATH(s) STR(s)
20
@implementation Preferences
24
// Provide user defaults if needed
25
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
26
[NSNumber numberWithInt:0], @"Display",
27
@"YES", @"FakeButtons",
28
[NSNumber numberWithInt:NX_COMMANDMASK], @"Button2Mask",
29
[NSNumber numberWithInt:NX_ALTERNATEMASK], @"Button3Mask",
30
NSLocalizedString(@"USA.keymapping",@""), @"KeymappingFile",
31
@"YES", @"UseKeymappingFile",
32
NSLocalizedString(@"Cmd-Opt-a",@""), @"SwitchString",
33
@"YES", @"UseRootlessMode",
34
@"YES", @"UseAGLforGLX",
35
@"YES", @"ShowModePickWindow",
36
@"YES", @"ShowStartupHelp",
37
[NSNumber numberWithInt:0], @"SwitchKeyCode",
38
[NSNumber numberWithInt:(NSCommandKeyMask | NSAlternateKeyMask)],
39
@"SwitchModifiers", @"NO", @"UseSystemBeep",
40
@"YES", @"DockSwitch",
41
@"NO", @"AllowMouseAccelChange",
42
[NSNumber numberWithInt:qdCursor_Not8Bit], @"UseQDCursor",
45
[NSString stringWithCString:XSTRPATH(XBINDIR)], @"AddToPathString",
46
@"YES", @"UseDefaultShell",
47
@"/bin/tcsh", @"Shell",
48
[NSNumber numberWithInt:depth_Current], @"Depth", nil];
51
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
54
// Initialize internal state info of switch key button
57
keyCode = [Preferences keyCode];
58
modifiers = [Preferences modifiers];
59
[switchString setString:[Preferences switchString]];
67
switchString=[[NSMutableString alloc] init];
73
// Set a modifiers checkbox matrix to match a modifier mask
74
- (void)resetMatrix:(NSMatrix *)aMatrix withMask:(int)aMask
76
[aMatrix setState:(aMask & NX_SHIFTMASK) atRow:0 column:0];
77
[aMatrix setState:(aMask & NX_CONTROLMASK) atRow:1 column:0];
78
[aMatrix setState:(aMask & NX_COMMANDMASK) atRow:2 column:0];
79
[aMatrix setState:(aMask & NX_ALTERNATEMASK) atRow:3 column:0];
80
[aMatrix setState:(aMask & NX_SECONDARYFNMASK) atRow:4 column:0];
83
// Generate a modifiers mask from a modifiers checkbox matrix
84
- (int)getMaskFromMatrix:(NSMatrix *)aMatrix
88
if ([[aMatrix cellAtRow:0 column:0] state])
89
theMask |= NX_SHIFTMASK;
90
if ([[aMatrix cellAtRow:1 column:0] state])
91
theMask |= NX_CONTROLMASK;
92
if ([[aMatrix cellAtRow:2 column:0] state])
93
theMask |= NX_COMMANDMASK;
94
if ([[aMatrix cellAtRow:3 column:0] state])
95
theMask |= NX_ALTERNATEMASK;
96
if ([[aMatrix cellAtRow:4 column:0] state])
97
theMask |= NX_SECONDARYFNMASK;
102
// Set the window controls to the state in user defaults
105
if ([Preferences keymapFile] == nil)
106
[keymapFileField setStringValue:@" "];
108
[keymapFileField setStringValue:[Preferences keymapFile]];
110
if ([Preferences switchString] == nil)
111
[switchKeyButton setTitle:@"--"];
113
[switchKeyButton setTitle:[Preferences switchString]];
115
[displayField setIntValue:[Preferences display]];
116
[dockSwitchButton setIntValue:[Preferences dockSwitch]];
117
[fakeButton setIntValue:[Preferences fakeButtons]];
118
[self resetMatrix:button2ModifiersMatrix
119
withMask:[Preferences button2Mask]];
120
[self resetMatrix:button3ModifiersMatrix
121
withMask:[Preferences button3Mask]];
122
[modeMatrix setState:[Preferences rootless] atRow:0 column:1];
123
[startupHelpButton setIntValue:[Preferences startupHelp]];
124
[modeWindowButton setIntValue:[Preferences modeWindow]];
125
[systemBeepButton setIntValue:[Preferences systemBeep]];
126
[mouseAccelChangeButton setIntValue:[Preferences mouseAccelChange]];
127
[useXineramaButton setIntValue:[Preferences xinerama]];
128
[addToPathButton setIntValue:[Preferences addToPath]];
129
[addToPathField setStringValue:[Preferences addToPathString]];
130
[useDefaultShellMatrix setState:![Preferences useDefaultShell]
132
[useOtherShellField setStringValue:[Preferences shellString]];
133
[depthButton selectItemAtIndex:[Preferences depth]];
141
// Preference window delegate
142
- (void)windowWillClose:(NSNotification *)aNotification
145
[self initSwitchKey];
148
// User cancelled the changes
149
- (IBAction)close:(id)sender
151
[window orderOut:nil];
152
[self resetWindow]; // reset window controls
153
[self initSwitchKey]; // reset switch key state
156
// Pick keymapping file
157
- (IBAction)pickFile:(id)sender
160
NSArray *fileTypes = [NSArray arrayWithObject:@"keymapping"];
161
NSOpenPanel *oPanel = [NSOpenPanel openPanel];
163
[oPanel setAllowsMultipleSelection:NO];
164
result = [oPanel runModalForDirectory:@"/System/Library/Keyboards"
165
file:nil types:fileTypes];
166
if (result == NSOKButton) {
167
[keymapFileField setStringValue:[oPanel filename]];
171
// User saved changes
172
- (IBAction)saveChanges:(id)sender
174
[Preferences setKeyCode:keyCode];
175
[Preferences setModifiers:modifiers];
176
[Preferences setSwitchString:switchString];
177
[Preferences setKeymapFile:[keymapFileField stringValue]];
178
[Preferences setUseKeymapFile:YES];
179
[Preferences setDisplay:[displayField intValue]];
180
[Preferences setDockSwitch:[dockSwitchButton intValue]];
181
[Preferences setFakeButtons:[fakeButton intValue]];
182
[Preferences setButton2Mask:
183
[self getMaskFromMatrix:button2ModifiersMatrix]];
184
[Preferences setButton3Mask:
185
[self getMaskFromMatrix:button3ModifiersMatrix]];
186
[Preferences setRootless:[[modeMatrix cellAtRow:0 column:1] state]];
187
[Preferences setModeWindow:[modeWindowButton intValue]];
188
[Preferences setStartupHelp:[startupHelpButton intValue]];
189
[Preferences setSystemBeep:[systemBeepButton intValue]];
190
[Preferences setMouseAccelChange:[mouseAccelChangeButton intValue]];
191
[Preferences setXinerama:[useXineramaButton intValue]];
192
[Preferences setAddToPath:[addToPathButton intValue]];
193
[Preferences setAddToPathString:[addToPathField stringValue]];
194
[Preferences setUseDefaultShell:
195
[[useDefaultShellMatrix cellAtRow:0 column:0] state]];
196
[Preferences setShellString:[useOtherShellField stringValue]];
197
[Preferences setDepth:[depthButton indexOfSelectedItem]];
198
[Preferences saveToDisk];
200
[window orderOut:nil];
203
- (IBAction)setKey:(id)sender
205
[switchKeyButton setTitle:NSLocalizedString(@"Press key",@"")];
206
isGettingKeyCode=YES;
207
[switchString setString:@""];
210
- (BOOL)sendEvent:(NSEvent*)anEvent
212
if(isGettingKeyCode) {
213
if([anEvent type]==NSKeyDown) // wait for keyup
215
if([anEvent type]!=NSKeyUp)
218
if([anEvent modifierFlags] & NSCommandKeyMask)
219
[switchString appendString:@"Cmd-"];
220
if([anEvent modifierFlags] & NSControlKeyMask)
221
[switchString appendString:@"Ctrl-"];
222
if([anEvent modifierFlags] & NSAlternateKeyMask)
223
[switchString appendString:@"Opt-"];
224
if([anEvent modifierFlags] & NSNumericPadKeyMask) // doesn't work
225
[switchString appendString:@"Num-"];
226
if([anEvent modifierFlags] & NSHelpKeyMask)
227
[switchString appendString:@"Help-"];
228
if([anEvent modifierFlags] & NSFunctionKeyMask) // powerbooks only
229
[switchString appendString:@"Fn-"];
231
[switchString appendString:[anEvent charactersIgnoringModifiers]];
232
[switchKeyButton setTitle:switchString];
234
keyCode = [anEvent keyCode];
235
modifiers = [anEvent modifierFlags];
243
+ (void)setKeymapFile:(NSString*)newFile
245
[[NSUserDefaults standardUserDefaults] setObject:newFile
246
forKey:@"KeymappingFile"];
249
+ (void)setUseKeymapFile:(BOOL)newUseKeymapFile
251
[[NSUserDefaults standardUserDefaults] setBool:newUseKeymapFile
252
forKey:@"UseKeymappingFile"];
255
+ (void)setSwitchString:(NSString*)newString
257
[[NSUserDefaults standardUserDefaults] setObject:newString
258
forKey:@"SwitchString"];
261
+ (void)setKeyCode:(int)newKeyCode
263
[[NSUserDefaults standardUserDefaults] setInteger:newKeyCode
264
forKey:@"SwitchKeyCode"];
267
+ (void)setModifiers:(int)newModifiers
269
[[NSUserDefaults standardUserDefaults] setInteger:newModifiers
270
forKey:@"SwitchModifiers"];
273
+ (void)setDisplay:(int)newDisplay
275
[[NSUserDefaults standardUserDefaults] setInteger:newDisplay
279
+ (void)setDockSwitch:(BOOL)newDockSwitch
281
[[NSUserDefaults standardUserDefaults] setBool:newDockSwitch
282
forKey:@"DockSwitch"];
285
+ (void)setFakeButtons:(BOOL)newFakeButtons
287
[[NSUserDefaults standardUserDefaults] setBool:newFakeButtons
288
forKey:@"FakeButtons"];
289
// Update the setting used by the X server thread
290
darwinFakeButtons = newFakeButtons;
293
+ (void)setButton2Mask:(int)newFakeMask
295
[[NSUserDefaults standardUserDefaults] setInteger:newFakeMask
296
forKey:@"Button2Mask"];
297
// Update the setting used by the X server thread
298
darwinFakeMouse2Mask = newFakeMask;
301
+ (void)setButton3Mask:(int)newFakeMask
303
[[NSUserDefaults standardUserDefaults] setInteger:newFakeMask
304
forKey:@"Button3Mask"];
305
// Update the setting used by the X server thread
306
darwinFakeMouse3Mask = newFakeMask;
309
+ (void)setMouseAccelChange:(BOOL)newMouseAccelChange
311
[[NSUserDefaults standardUserDefaults] setBool:newMouseAccelChange
312
forKey:@"AllowMouseAccelChange"];
313
// Update the setting used by the X server thread
314
quartzMouseAccelChange = newMouseAccelChange;
317
+ (void)setUseQDCursor:(int)newUseQDCursor
319
[[NSUserDefaults standardUserDefaults] setInteger:newUseQDCursor
320
forKey:@"UseQDCursor"];
323
+ (void)setModeWindow:(BOOL)newModeWindow
325
[[NSUserDefaults standardUserDefaults] setBool:newModeWindow
326
forKey:@"ShowModePickWindow"];
329
+ (void)setRootless:(BOOL)newRootless
331
[[NSUserDefaults standardUserDefaults] setBool:newRootless
332
forKey:@"UseRootlessMode"];
335
+ (void)setUseAGL:(BOOL)newUseAGL
337
[[NSUserDefaults standardUserDefaults] setBool:newUseAGL
338
forKey:@"UseAGLforGLX"];
341
+ (void)setStartupHelp:(BOOL)newStartupHelp
343
[[NSUserDefaults standardUserDefaults] setBool:newStartupHelp
344
forKey:@"ShowStartupHelp"];
347
+ (void)setSystemBeep:(BOOL)newSystemBeep
349
[[NSUserDefaults standardUserDefaults] setBool:newSystemBeep
350
forKey:@"UseSystemBeep"];
351
// Update the setting used by the X server thread
352
quartzUseSysBeep = newSystemBeep;
355
+ (void)setXinerama:(BOOL)newXinerama
357
[[NSUserDefaults standardUserDefaults] setBool:newXinerama
361
+ (void)setAddToPath:(BOOL)newAddToPath
363
[[NSUserDefaults standardUserDefaults] setBool:newAddToPath
364
forKey:@"AddToPath"];
367
+ (void)setAddToPathString:(NSString*)newAddToPathString
369
[[NSUserDefaults standardUserDefaults] setObject:newAddToPathString
370
forKey:@"AddToPathString"];
373
+ (void)setUseDefaultShell:(BOOL)newUseDefaultShell
375
[[NSUserDefaults standardUserDefaults] setBool:newUseDefaultShell
376
forKey:@"UseDefaultShell"];
379
+ (void)setShellString:(NSString*)newShellString
381
[[NSUserDefaults standardUserDefaults] setObject:newShellString
385
+ (void)setDepth:(int)newDepth
387
[[NSUserDefaults standardUserDefaults] setInteger:newDepth
393
[[NSUserDefaults standardUserDefaults] synchronize];
396
+ (BOOL)useKeymapFile
398
return [[NSUserDefaults standardUserDefaults]
399
boolForKey:@"UseKeymappingFile"];
402
+ (NSString*)keymapFile
404
return [[NSUserDefaults standardUserDefaults]
405
stringForKey:@"KeymappingFile"];
408
+ (NSString*)switchString
410
return [[NSUserDefaults standardUserDefaults]
411
stringForKey:@"SwitchString"];
414
+ (unsigned int)keyCode
416
return [[NSUserDefaults standardUserDefaults]
417
integerForKey:@"SwitchKeyCode"];
420
+ (unsigned int)modifiers
422
return [[NSUserDefaults standardUserDefaults]
423
integerForKey:@"SwitchModifiers"];
428
return [[NSUserDefaults standardUserDefaults]
429
integerForKey:@"Display"];
434
return [[NSUserDefaults standardUserDefaults] boolForKey:@"DockSwitch"];
439
return [[NSUserDefaults standardUserDefaults] boolForKey:@"FakeButtons"];
444
return [[NSUserDefaults standardUserDefaults]
445
integerForKey:@"Button2Mask"];
450
return [[NSUserDefaults standardUserDefaults]
451
integerForKey:@"Button3Mask"];
454
+ (BOOL)mouseAccelChange
456
return [[NSUserDefaults standardUserDefaults]
457
boolForKey:@"AllowMouseAccelChange"];
462
return [[NSUserDefaults standardUserDefaults]
463
integerForKey:@"UseQDCursor"];
468
return [[NSUserDefaults standardUserDefaults]
469
boolForKey:@"UseRootlessMode"];
474
return [[NSUserDefaults standardUserDefaults]
475
boolForKey:@"UseAGLforGLX"];
480
return [[NSUserDefaults standardUserDefaults]
481
boolForKey:@"ShowModePickWindow"];
486
return [[NSUserDefaults standardUserDefaults]
487
boolForKey:@"ShowStartupHelp"];
492
return [[NSUserDefaults standardUserDefaults] boolForKey:@"UseSystemBeep"];
497
return [[NSUserDefaults standardUserDefaults] boolForKey:@"Xinerama"];
502
return [[NSUserDefaults standardUserDefaults] boolForKey:@"AddToPath"];
505
+ (NSString*)addToPathString
507
return [[NSUserDefaults standardUserDefaults]
508
stringForKey:@"AddToPathString"];
511
+ (BOOL)useDefaultShell
513
return [[NSUserDefaults standardUserDefaults]
514
boolForKey:@"UseDefaultShell"];
517
+ (NSString*)shellString
519
return [[NSUserDefaults standardUserDefaults]
520
stringForKey:@"Shell"];
525
return [[NSUserDefaults standardUserDefaults]
526
integerForKey:@"Depth"];