~ubuntu-branches/ubuntu/gutsy/vnc4/gutsy

« back to all changes in this revision

Viewing changes to unix/xc/programs/Xserver/hw/darwin/quartz/Preferences.m

  • Committer: Bazaar Package Importer
  • Author(s): Ola Lundqvist
  • Date: 2006-05-15 20:35:17 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20060515203517-l4lre1ku942mn26k
Tags: 4.1.1+X4.3.0-10
* Correction of critical security issue. Thanks to Martin Kogler
  <e9925248@student.tuwien.ac.at> that informed me about the issue,
  and provided the patch.
  This flaw was originally found by Steve Wiseman of intelliadmin.com.
* Applied patch from Javier Kohen <jkohen@users.sourceforge.net> that
  inform the user that only 8 first characters of the password will
  actually be used when typing more than 8 characters, closes:
  #355619.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//
 
2
//  Preferences.m
 
3
//
 
4
//  This class keeps track of the user preferences.
 
5
//
 
6
/* $XFree86: xc/programs/Xserver/hw/darwin/quartz/Preferences.m,v 1.2 2003/01/15 02:34:06 torrey Exp $ */
 
7
 
 
8
#import "Preferences.h"
 
9
#import "quartzCommon.h"
 
10
#include <IOKit/hidsystem/IOLLEvent.h>  // for modifier masks
 
11
 
 
12
// Macros to build the path name
 
13
#ifndef XBINDIR
 
14
#define XBINDIR /usr/X11R6/bin
 
15
#endif
 
16
#define STR(s) #s
 
17
#define XSTRPATH(s) STR(s)
 
18
 
 
19
 
 
20
@implementation Preferences
 
21
 
 
22
+ (void)initialize
 
23
{
 
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",
 
43
        @"YES", @"Xinerama",
 
44
        @"YES", @"AddToPath",
 
45
        [NSString stringWithCString:XSTRPATH(XBINDIR)], @"AddToPathString",
 
46
        @"YES", @"UseDefaultShell",
 
47
        @"/bin/tcsh", @"Shell",
 
48
        [NSNumber numberWithInt:depth_Current], @"Depth", nil];
 
49
 
 
50
    [super initialize];
 
51
    [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
 
52
}
 
53
 
 
54
// Initialize internal state info of switch key button
 
55
- (void)initSwitchKey
 
56
{
 
57
    keyCode = [Preferences keyCode];
 
58
    modifiers = [Preferences modifiers];
 
59
    [switchString setString:[Preferences switchString]];
 
60
}
 
61
 
 
62
- (id)init
 
63
{
 
64
    self = [super init];
 
65
 
 
66
    isGettingKeyCode=NO;
 
67
    switchString=[[NSMutableString alloc] init];
 
68
    [self initSwitchKey];
 
69
 
 
70
    return self;
 
71
}
 
72
 
 
73
// Set a modifiers checkbox matrix to match a modifier mask
 
74
- (void)resetMatrix:(NSMatrix *)aMatrix withMask:(int)aMask
 
75
{
 
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];
 
81
}
 
82
 
 
83
// Generate a modifiers mask from a modifiers checkbox matrix
 
84
- (int)getMaskFromMatrix:(NSMatrix *)aMatrix
 
85
{
 
86
    int theMask = 0;
 
87
 
 
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;
 
98
 
 
99
    return theMask;
 
100
}
 
101
 
 
102
// Set the window controls to the state in user defaults
 
103
- (void)resetWindow
 
104
{
 
105
    if ([Preferences keymapFile] == nil)
 
106
        [keymapFileField setStringValue:@" "];
 
107
    else
 
108
        [keymapFileField setStringValue:[Preferences keymapFile]];
 
109
 
 
110
    if ([Preferences switchString] == nil)
 
111
        [switchKeyButton setTitle:@"--"];
 
112
    else
 
113
        [switchKeyButton setTitle:[Preferences switchString]];
 
114
 
 
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]
 
131
                           atRow:1 column:0];
 
132
    [useOtherShellField setStringValue:[Preferences shellString]];
 
133
    [depthButton selectItemAtIndex:[Preferences depth]];
 
134
}
 
135
 
 
136
- (void)awakeFromNib
 
137
{
 
138
    [self resetWindow];
 
139
}
 
140
 
 
141
// Preference window delegate
 
142
- (void)windowWillClose:(NSNotification *)aNotification
 
143
{
 
144
    [self resetWindow];
 
145
    [self initSwitchKey];
 
146
}
 
147
 
 
148
// User cancelled the changes
 
149
- (IBAction)close:(id)sender
 
150
{
 
151
    [window orderOut:nil];
 
152
    [self resetWindow];         // reset window controls
 
153
    [self initSwitchKey];       // reset switch key state
 
154
}
 
155
 
 
156
// Pick keymapping file
 
157
- (IBAction)pickFile:(id)sender
 
158
{
 
159
    int result;
 
160
    NSArray *fileTypes = [NSArray arrayWithObject:@"keymapping"];
 
161
    NSOpenPanel *oPanel = [NSOpenPanel openPanel];
 
162
 
 
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]];
 
168
    }
 
169
}
 
170
 
 
171
// User saved changes
 
172
- (IBAction)saveChanges:(id)sender
 
173
{
 
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];
 
199
 
 
200
    [window orderOut:nil];
 
201
}
 
202
 
 
203
- (IBAction)setKey:(id)sender
 
204
{
 
205
    [switchKeyButton setTitle:NSLocalizedString(@"Press key",@"")];
 
206
    isGettingKeyCode=YES;
 
207
    [switchString setString:@""];
 
208
}
 
209
 
 
210
- (BOOL)sendEvent:(NSEvent*)anEvent
 
211
{
 
212
    if(isGettingKeyCode) {
 
213
        if([anEvent type]==NSKeyDown) // wait for keyup
 
214
            return YES;
 
215
        if([anEvent type]!=NSKeyUp)
 
216
            return NO;
 
217
 
 
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-"];
 
230
        
 
231
        [switchString appendString:[anEvent charactersIgnoringModifiers]];
 
232
        [switchKeyButton setTitle:switchString];
 
233
        
 
234
        keyCode = [anEvent keyCode];
 
235
        modifiers = [anEvent modifierFlags];
 
236
        isGettingKeyCode=NO;
 
237
        
 
238
        return YES;
 
239
    }
 
240
    return NO;
 
241
}
 
242
 
 
243
+ (void)setKeymapFile:(NSString*)newFile
 
244
{
 
245
    [[NSUserDefaults standardUserDefaults] setObject:newFile
 
246
            forKey:@"KeymappingFile"];
 
247
}
 
248
 
 
249
+ (void)setUseKeymapFile:(BOOL)newUseKeymapFile
 
250
{
 
251
    [[NSUserDefaults standardUserDefaults] setBool:newUseKeymapFile
 
252
            forKey:@"UseKeymappingFile"];
 
253
}
 
254
 
 
255
+ (void)setSwitchString:(NSString*)newString
 
256
{
 
257
    [[NSUserDefaults standardUserDefaults] setObject:newString
 
258
            forKey:@"SwitchString"];
 
259
}
 
260
 
 
261
+ (void)setKeyCode:(int)newKeyCode
 
262
{
 
263
    [[NSUserDefaults standardUserDefaults] setInteger:newKeyCode
 
264
            forKey:@"SwitchKeyCode"];
 
265
}
 
266
 
 
267
+ (void)setModifiers:(int)newModifiers
 
268
{
 
269
    [[NSUserDefaults standardUserDefaults] setInteger:newModifiers
 
270
            forKey:@"SwitchModifiers"];
 
271
}
 
272
 
 
273
+ (void)setDisplay:(int)newDisplay
 
274
{
 
275
    [[NSUserDefaults standardUserDefaults] setInteger:newDisplay
 
276
            forKey:@"Display"];
 
277
}
 
278
 
 
279
+ (void)setDockSwitch:(BOOL)newDockSwitch
 
280
{
 
281
    [[NSUserDefaults standardUserDefaults] setBool:newDockSwitch
 
282
            forKey:@"DockSwitch"];
 
283
}
 
284
 
 
285
+ (void)setFakeButtons:(BOOL)newFakeButtons
 
286
{
 
287
    [[NSUserDefaults standardUserDefaults] setBool:newFakeButtons
 
288
            forKey:@"FakeButtons"];
 
289
    // Update the setting used by the X server thread
 
290
    darwinFakeButtons = newFakeButtons;
 
291
}
 
292
 
 
293
+ (void)setButton2Mask:(int)newFakeMask
 
294
{
 
295
    [[NSUserDefaults standardUserDefaults] setInteger:newFakeMask
 
296
            forKey:@"Button2Mask"];
 
297
    // Update the setting used by the X server thread
 
298
    darwinFakeMouse2Mask = newFakeMask;
 
299
}
 
300
 
 
301
+ (void)setButton3Mask:(int)newFakeMask
 
302
{
 
303
    [[NSUserDefaults standardUserDefaults] setInteger:newFakeMask
 
304
            forKey:@"Button3Mask"];
 
305
    // Update the setting used by the X server thread
 
306
    darwinFakeMouse3Mask = newFakeMask;
 
307
}
 
308
 
 
309
+ (void)setMouseAccelChange:(BOOL)newMouseAccelChange
 
310
{
 
311
    [[NSUserDefaults standardUserDefaults] setBool:newMouseAccelChange
 
312
            forKey:@"AllowMouseAccelChange"];
 
313
    // Update the setting used by the X server thread
 
314
    quartzMouseAccelChange = newMouseAccelChange;
 
315
}
 
316
 
 
317
+ (void)setUseQDCursor:(int)newUseQDCursor
 
318
{
 
319
    [[NSUserDefaults standardUserDefaults] setInteger:newUseQDCursor
 
320
            forKey:@"UseQDCursor"];
 
321
}
 
322
 
 
323
+ (void)setModeWindow:(BOOL)newModeWindow
 
324
{
 
325
    [[NSUserDefaults standardUserDefaults] setBool:newModeWindow
 
326
            forKey:@"ShowModePickWindow"];
 
327
}
 
328
 
 
329
+ (void)setRootless:(BOOL)newRootless
 
330
{
 
331
    [[NSUserDefaults standardUserDefaults] setBool:newRootless
 
332
            forKey:@"UseRootlessMode"];
 
333
}
 
334
 
 
335
+ (void)setUseAGL:(BOOL)newUseAGL
 
336
{
 
337
    [[NSUserDefaults standardUserDefaults] setBool:newUseAGL
 
338
            forKey:@"UseAGLforGLX"];
 
339
}
 
340
 
 
341
+ (void)setStartupHelp:(BOOL)newStartupHelp
 
342
{
 
343
    [[NSUserDefaults standardUserDefaults] setBool:newStartupHelp
 
344
            forKey:@"ShowStartupHelp"];
 
345
}
 
346
 
 
347
+ (void)setSystemBeep:(BOOL)newSystemBeep
 
348
{
 
349
    [[NSUserDefaults standardUserDefaults] setBool:newSystemBeep
 
350
            forKey:@"UseSystemBeep"];
 
351
    // Update the setting used by the X server thread
 
352
    quartzUseSysBeep = newSystemBeep;
 
353
}
 
354
 
 
355
+ (void)setXinerama:(BOOL)newXinerama
 
356
{
 
357
    [[NSUserDefaults standardUserDefaults] setBool:newXinerama
 
358
            forKey:@"Xinerama"];
 
359
}
 
360
 
 
361
+ (void)setAddToPath:(BOOL)newAddToPath
 
362
{
 
363
    [[NSUserDefaults standardUserDefaults] setBool:newAddToPath
 
364
            forKey:@"AddToPath"];
 
365
}
 
366
 
 
367
+ (void)setAddToPathString:(NSString*)newAddToPathString
 
368
{
 
369
    [[NSUserDefaults standardUserDefaults] setObject:newAddToPathString
 
370
            forKey:@"AddToPathString"];
 
371
}
 
372
 
 
373
+ (void)setUseDefaultShell:(BOOL)newUseDefaultShell
 
374
{
 
375
    [[NSUserDefaults standardUserDefaults] setBool:newUseDefaultShell
 
376
            forKey:@"UseDefaultShell"];
 
377
}
 
378
 
 
379
+ (void)setShellString:(NSString*)newShellString
 
380
{
 
381
    [[NSUserDefaults standardUserDefaults] setObject:newShellString
 
382
            forKey:@"Shell"];
 
383
}
 
384
 
 
385
+ (void)setDepth:(int)newDepth
 
386
{
 
387
    [[NSUserDefaults standardUserDefaults] setInteger:newDepth
 
388
            forKey:@"Depth"];
 
389
}
 
390
 
 
391
+ (void)saveToDisk
 
392
{
 
393
    [[NSUserDefaults standardUserDefaults] synchronize];
 
394
}
 
395
 
 
396
+ (BOOL)useKeymapFile
 
397
{
 
398
    return [[NSUserDefaults standardUserDefaults]
 
399
                boolForKey:@"UseKeymappingFile"];
 
400
}
 
401
 
 
402
+ (NSString*)keymapFile
 
403
{
 
404
    return [[NSUserDefaults standardUserDefaults]
 
405
                stringForKey:@"KeymappingFile"];
 
406
}
 
407
 
 
408
+ (NSString*)switchString
 
409
{
 
410
    return [[NSUserDefaults standardUserDefaults]
 
411
                stringForKey:@"SwitchString"];
 
412
}
 
413
 
 
414
+ (unsigned int)keyCode
 
415
{
 
416
    return [[NSUserDefaults standardUserDefaults]
 
417
                integerForKey:@"SwitchKeyCode"];
 
418
}
 
419
 
 
420
+ (unsigned int)modifiers
 
421
{
 
422
    return [[NSUserDefaults standardUserDefaults]
 
423
                integerForKey:@"SwitchModifiers"];
 
424
}
 
425
 
 
426
+ (int)display
 
427
{
 
428
    return [[NSUserDefaults standardUserDefaults]
 
429
                integerForKey:@"Display"];
 
430
}
 
431
 
 
432
+ (BOOL)dockSwitch
 
433
{
 
434
    return [[NSUserDefaults standardUserDefaults] boolForKey:@"DockSwitch"];
 
435
}
 
436
 
 
437
+ (BOOL)fakeButtons
 
438
{
 
439
    return [[NSUserDefaults standardUserDefaults] boolForKey:@"FakeButtons"];
 
440
}
 
441
 
 
442
+ (int)button2Mask
 
443
{
 
444
    return [[NSUserDefaults standardUserDefaults]
 
445
                integerForKey:@"Button2Mask"];
 
446
}
 
447
 
 
448
+ (int)button3Mask
 
449
{
 
450
    return [[NSUserDefaults standardUserDefaults]
 
451
                integerForKey:@"Button3Mask"];
 
452
}
 
453
 
 
454
+ (BOOL)mouseAccelChange
 
455
{
 
456
    return [[NSUserDefaults standardUserDefaults]
 
457
                boolForKey:@"AllowMouseAccelChange"];
 
458
}
 
459
 
 
460
+ (int)useQDCursor
 
461
{
 
462
    return [[NSUserDefaults standardUserDefaults]
 
463
                integerForKey:@"UseQDCursor"];
 
464
}
 
465
 
 
466
+ (BOOL)rootless
 
467
{
 
468
    return [[NSUserDefaults standardUserDefaults]
 
469
                boolForKey:@"UseRootlessMode"];
 
470
}
 
471
 
 
472
+ (BOOL)useAGL
 
473
{
 
474
    return [[NSUserDefaults standardUserDefaults]
 
475
                boolForKey:@"UseAGLforGLX"];
 
476
}
 
477
 
 
478
+ (BOOL)modeWindow
 
479
{
 
480
    return [[NSUserDefaults standardUserDefaults]
 
481
                boolForKey:@"ShowModePickWindow"];
 
482
}
 
483
 
 
484
+ (BOOL)startupHelp
 
485
{
 
486
    return [[NSUserDefaults standardUserDefaults]
 
487
                boolForKey:@"ShowStartupHelp"];
 
488
}
 
489
 
 
490
+ (BOOL)systemBeep
 
491
{
 
492
    return [[NSUserDefaults standardUserDefaults] boolForKey:@"UseSystemBeep"];
 
493
}
 
494
 
 
495
+ (BOOL)xinerama
 
496
{
 
497
    return [[NSUserDefaults standardUserDefaults] boolForKey:@"Xinerama"];
 
498
}
 
499
 
 
500
+ (BOOL)addToPath
 
501
{
 
502
    return [[NSUserDefaults standardUserDefaults] boolForKey:@"AddToPath"];
 
503
}
 
504
 
 
505
+ (NSString*)addToPathString
 
506
{
 
507
    return [[NSUserDefaults standardUserDefaults]
 
508
                stringForKey:@"AddToPathString"];
 
509
}
 
510
 
 
511
+ (BOOL)useDefaultShell
 
512
{
 
513
    return [[NSUserDefaults standardUserDefaults]
 
514
                boolForKey:@"UseDefaultShell"];
 
515
}
 
516
 
 
517
+ (NSString*)shellString
 
518
{
 
519
    return [[NSUserDefaults standardUserDefaults]
 
520
                stringForKey:@"Shell"];
 
521
}
 
522
 
 
523
+ (int)depth
 
524
{
 
525
    return [[NSUserDefaults standardUserDefaults]
 
526
                integerForKey:@"Depth"];
 
527
}
 
528
 
 
529
 
 
530
@end