xserver-multidpi/hw/darwin/quartz/Preferences.m
2007-11-05 05:45:21 -08:00

599 lines
17 KiB
Objective-C

//
// Preferences.m
//
// This class keeps track of the user preferences.
//
/*
* Copyright (c) 2002-2004 Torrey T. Lyons. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Except as contained in this notice, the name(s) of the above copyright
* holders shall not be used in advertising or otherwise to promote the
* sale, use or other dealings in this Software without prior written
* authorization.
*/
#include <dix-config.h>
#import "quartzCommon.h"
#define BOOL xBOOL
#include "darwin.h"
#undef BOOL
#import "Preferences.h"
#include <IOKit/hidsystem/IOLLEvent.h> // for modifier masks
// Macros to build the path name
#ifndef XBINDIR
#define XBINDIR /usr/X11/bin
#endif
#define STR(s) #s
#define XSTRPATH(s) STR(s)
// Keys for user defaults dictionary
static NSString *X11EnableKeyEquivalentsKey = @"EnableKeyEquivalents";
@implementation Preferences
+ (void)initialize
{
// Provide user defaults if needed
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:0], @"Display",
@"YES", @"FakeButtons",
[NSNumber numberWithInt:NX_COMMANDMASK], @"Button2Mask",
[NSNumber numberWithInt:NX_ALTERNATEMASK], @"Button3Mask",
NSLocalizedString(@"USA.keymapping",@""), @"KeymappingFile",
@"YES", @"UseKeymappingFile",
NSLocalizedString(@"Cmd-Opt-a",@""), @"SwitchString",
@"YES", @"UseRootlessMode",
@"YES", @"UseAGLforGLX",
@"YES", @"ShowModePickWindow",
@"YES", @"ShowStartupHelp",
[NSNumber numberWithInt:0], @"SwitchKeyCode",
[NSNumber numberWithInt:(NSCommandKeyMask | NSAlternateKeyMask)],
@"SwitchModifiers", @"NO", @"UseSystemBeep",
@"YES", X11EnableKeyEquivalentsKey,
@"YES", @"DockSwitch",
@"NO", @"AllowMouseAccelChange",
[NSNumber numberWithInt:qdCursor_Not8Bit], @"UseQDCursor",
@"YES", @"Xinerama",
@"YES", @"AddToPath",
[NSString stringWithCString:XSTRPATH(XBINDIR)], @"AddToPathString",
@"YES", @"UseDefaultShell",
@"/bin/tcsh", @"Shell",
[NSNumber numberWithInt:depth_Current], @"Depth",
#ifdef BUILD_XPR
[NSArray arrayWithObjects:@"xpr.bundle", @"cr.bundle", nil],
#else
[NSArray arrayWithObjects:@"cr.bundle", nil],
#endif
@"DisplayModeBundles", nil];
[super initialize];
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
}
// Initialize internal state info of switch key button
- (void)initSwitchKey
{
keyCode = [Preferences keyCode];
modifiers = [Preferences modifiers];
[switchString setString:[Preferences switchString]];
}
- (id)init
{
self = [super init];
isGettingKeyCode=NO;
switchString=[[NSMutableString alloc] init];
[self initSwitchKey];
return self;
}
// Set a modifiers checkbox matrix to match a modifier mask
- (void)resetMatrix:(NSMatrix *)aMatrix withMask:(int)aMask
{
[aMatrix setState:(aMask & NX_SHIFTMASK) atRow:0 column:0];
[aMatrix setState:(aMask & NX_CONTROLMASK) atRow:1 column:0];
[aMatrix setState:(aMask & NX_COMMANDMASK) atRow:2 column:0];
[aMatrix setState:(aMask & NX_ALTERNATEMASK) atRow:3 column:0];
[aMatrix setState:(aMask & NX_SECONDARYFNMASK) atRow:4 column:0];
}
// Generate a modifiers mask from a modifiers checkbox matrix
- (int)getMaskFromMatrix:(NSMatrix *)aMatrix
{
int theMask = 0;
if ([[aMatrix cellAtRow:0 column:0] state])
theMask |= NX_SHIFTMASK;
if ([[aMatrix cellAtRow:1 column:0] state])
theMask |= NX_CONTROLMASK;
if ([[aMatrix cellAtRow:2 column:0] state])
theMask |= NX_COMMANDMASK;
if ([[aMatrix cellAtRow:3 column:0] state])
theMask |= NX_ALTERNATEMASK;
if ([[aMatrix cellAtRow:4 column:0] state])
theMask |= NX_SECONDARYFNMASK;
return theMask;
}
// Set the window controls to the state in user defaults
- (void)resetWindow
{
if ([Preferences keymapFile] == nil)
[keymapFileField setStringValue:@" "];
else
[keymapFileField setStringValue:[Preferences keymapFile]];
if ([Preferences switchString] == nil)
[switchKeyButton setTitle:@"--"];
else
[switchKeyButton setTitle:[Preferences switchString]];
[displayField setIntValue:[Preferences display]];
[dockSwitchButton setIntValue:[Preferences dockSwitch]];
[fakeButton setIntValue:[Preferences fakeButtons]];
[self resetMatrix:button2ModifiersMatrix
withMask:[Preferences button2Mask]];
[self resetMatrix:button3ModifiersMatrix
withMask:[Preferences button3Mask]];
[modeMatrix setState:[Preferences rootless] atRow:0 column:1];
[startupHelpButton setIntValue:[Preferences startupHelp]];
[modeWindowButton setIntValue:[Preferences modeWindow]];
[systemBeepButton setIntValue:[Preferences systemBeep]];
[mouseAccelChangeButton setIntValue:[Preferences mouseAccelChange]];
[useXineramaButton setIntValue:[Preferences xinerama]];
[addToPathButton setIntValue:[Preferences addToPath]];
[addToPathField setStringValue:[Preferences addToPathString]];
[useDefaultShellMatrix setState:![Preferences useDefaultShell]
atRow:1 column:0];
[useOtherShellField setStringValue:[Preferences shellString]];
[depthButton selectItemAtIndex:[Preferences depth]];
}
- (void)awakeFromNib
{
[self resetWindow];
}
// Preference window delegate
- (void)windowWillClose:(NSNotification *)aNotification
{
[self resetWindow];
[self initSwitchKey];
}
// User cancelled the changes
- (IBAction)close:(id)sender
{
[window orderOut:nil];
[self resetWindow]; // reset window controls
[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:YES];
[Preferences setDisplay:[displayField intValue]];
[Preferences setDockSwitch:[dockSwitchButton intValue]];
[Preferences setFakeButtons:[fakeButton intValue]];
[Preferences setButton2Mask:
[self getMaskFromMatrix:button2ModifiersMatrix]];
[Preferences setButton3Mask:
[self getMaskFromMatrix:button3ModifiersMatrix]];
[Preferences setRootless:[[modeMatrix cellAtRow:0 column:1] state]];
[Preferences setModeWindow:[modeWindowButton intValue]];
[Preferences setStartupHelp:[startupHelpButton intValue]];
[Preferences setSystemBeep:[systemBeepButton intValue]];
[Preferences setMouseAccelChange:[mouseAccelChangeButton intValue]];
[Preferences setXinerama:[useXineramaButton intValue]];
[Preferences setAddToPath:[addToPathButton intValue]];
[Preferences setAddToPathString:[addToPathField stringValue]];
[Preferences setUseDefaultShell:
[[useDefaultShellMatrix cellAtRow:0 column:0] state]];
[Preferences setShellString:[useOtherShellField stringValue]];
[Preferences setDepth:[depthButton indexOfSelectedItem]];
[Preferences saveToDisk];
[window orderOut:nil];
}
- (IBAction)setKey:(id)sender
{
[switchKeyButton setTitle:NSLocalizedString(@"Press key",@"")];
isGettingKeyCode=YES;
[switchString setString:@""];
}
- (BOOL)sendEvent:(NSEvent *)anEvent
{
if(isGettingKeyCode) {
if([anEvent type]==NSKeyDown) // wait for keyup
return YES;
if([anEvent type]!=NSKeyUp)
return NO;
if([anEvent modifierFlags] & NSCommandKeyMask)
[switchString appendString:@"Cmd-"];
if([anEvent modifierFlags] & NSControlKeyMask)
[switchString appendString:@"Ctrl-"];
if([anEvent modifierFlags] & NSAlternateKeyMask)
[switchString appendString:@"Opt-"];
if([anEvent modifierFlags] & NSNumericPadKeyMask) // doesn't work
[switchString appendString:@"Num-"];
if([anEvent modifierFlags] & NSHelpKeyMask)
[switchString appendString:@"Help-"];
if([anEvent modifierFlags] & NSFunctionKeyMask) // powerbooks only
[switchString appendString:@"Fn-"];
[switchString appendString:[anEvent charactersIgnoringModifiers]];
[switchKeyButton setTitle:switchString];
keyCode = [anEvent keyCode];
modifiers = [anEvent modifierFlags];
isGettingKeyCode=NO;
return YES;
}
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"];
}
+ (void)setKeyCode:(int)newKeyCode
{
[[NSUserDefaults standardUserDefaults] setInteger:newKeyCode
forKey:@"SwitchKeyCode"];
}
+ (void)setModifiers:(int)newModifiers
{
[[NSUserDefaults standardUserDefaults] setInteger:newModifiers
forKey:@"SwitchModifiers"];
}
+ (void)setDisplay:(int)newDisplay
{
[[NSUserDefaults standardUserDefaults] setInteger:newDisplay
forKey:@"Display"];
}
+ (void)setDockSwitch:(BOOL)newDockSwitch
{
[[NSUserDefaults standardUserDefaults] setBool:newDockSwitch
forKey:@"DockSwitch"];
}
+ (void)setFakeButtons:(BOOL)newFakeButtons
{
[[NSUserDefaults standardUserDefaults] setBool:newFakeButtons
forKey:@"FakeButtons"];
// Update the setting used by the X server thread
darwinFakeButtons = newFakeButtons;
}
+ (void)setButton2Mask:(int)newFakeMask
{
[[NSUserDefaults standardUserDefaults] setInteger:newFakeMask
forKey:@"Button2Mask"];
// Update the setting used by the X server thread
darwinFakeMouse2Mask = newFakeMask;
}
+ (void)setButton3Mask:(int)newFakeMask
{
[[NSUserDefaults standardUserDefaults] setInteger:newFakeMask
forKey:@"Button3Mask"];
// Update the setting used by the X server thread
darwinFakeMouse3Mask = newFakeMask;
}
+ (void)setMouseAccelChange:(BOOL)newMouseAccelChange
{
[[NSUserDefaults standardUserDefaults] setBool:newMouseAccelChange
forKey:@"AllowMouseAccelChange"];
// Update the setting used by the X server thread
// darwinMouseAccelChange = newMouseAccelChange;
}
+ (void)setUseQDCursor:(int)newUseQDCursor
{
[[NSUserDefaults standardUserDefaults] setInteger:newUseQDCursor
forKey:@"UseQDCursor"];
}
+ (void)setModeWindow:(BOOL)newModeWindow
{
[[NSUserDefaults standardUserDefaults] setBool:newModeWindow
forKey:@"ShowModePickWindow"];
}
+ (void)setRootless:(BOOL)newRootless
{
[[NSUserDefaults standardUserDefaults] setBool:newRootless
forKey:@"UseRootlessMode"];
}
+ (void)setUseAGL:(BOOL)newUseAGL
{
[[NSUserDefaults standardUserDefaults] setBool:newUseAGL
forKey:@"UseAGLforGLX"];
}
+ (void)setStartupHelp:(BOOL)newStartupHelp
{
[[NSUserDefaults standardUserDefaults] setBool:newStartupHelp
forKey:@"ShowStartupHelp"];
}
+ (void)setSystemBeep:(BOOL)newSystemBeep
{
[[NSUserDefaults standardUserDefaults] setBool:newSystemBeep
forKey:@"UseSystemBeep"];
// Update the setting used by the X server thread
quartzUseSysBeep = newSystemBeep;
}
+ (void)setEnableKeyEquivalents:(BOOL)newKeyEquivs
{
[[NSUserDefaults standardUserDefaults] setBool:newKeyEquivs
forKey:X11EnableKeyEquivalentsKey];
// Update the setting used by the X server thread
quartzEnableKeyEquivalents = newKeyEquivs;
}
+ (void)setXinerama:(BOOL)newXinerama
{
[[NSUserDefaults standardUserDefaults] setBool:newXinerama
forKey:@"Xinerama"];
}
+ (void)setAddToPath:(BOOL)newAddToPath
{
[[NSUserDefaults standardUserDefaults] setBool:newAddToPath
forKey:@"AddToPath"];
}
+ (void)setAddToPathString:(NSString *)newAddToPathString
{
[[NSUserDefaults standardUserDefaults] setObject:newAddToPathString
forKey:@"AddToPathString"];
}
+ (void)setUseDefaultShell:(BOOL)newUseDefaultShell
{
[[NSUserDefaults standardUserDefaults] setBool:newUseDefaultShell
forKey:@"UseDefaultShell"];
}
+ (void)setShellString:(NSString *)newShellString
{
[[NSUserDefaults standardUserDefaults] setObject:newShellString
forKey:@"Shell"];
}
+ (void)setDepth:(int)newDepth
{
[[NSUserDefaults standardUserDefaults] setInteger:newDepth
forKey:@"Depth"];
}
+ (void)setDisplayModeBundles:(NSArray *)newBundles
{
[[NSUserDefaults standardUserDefaults] setObject:newBundles
forKey:@"DisplayModeBundles"];
}
+ (void)saveToDisk
{
[[NSUserDefaults standardUserDefaults] synchronize];
}
+ (BOOL)useKeymapFile
{
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"UseKeymappingFile"];
}
+ (NSString *)keymapFile
{
return [[NSUserDefaults standardUserDefaults]
stringForKey:@"KeymappingFile"];
}
+ (NSString *)switchString
{
return [[NSUserDefaults standardUserDefaults]
stringForKey:@"SwitchString"];
}
+ (unsigned int)keyCode
{
return [[NSUserDefaults standardUserDefaults]
integerForKey:@"SwitchKeyCode"];
}
+ (unsigned int)modifiers
{
return [[NSUserDefaults standardUserDefaults]
integerForKey:@"SwitchModifiers"];
}
+ (int)display
{
return [[NSUserDefaults standardUserDefaults]
integerForKey:@"Display"];
}
+ (BOOL)dockSwitch
{
return [[NSUserDefaults standardUserDefaults] boolForKey:@"DockSwitch"];
}
+ (BOOL)fakeButtons
{
return [[NSUserDefaults standardUserDefaults] boolForKey:@"FakeButtons"];
}
+ (int)button2Mask
{
return [[NSUserDefaults standardUserDefaults]
integerForKey:@"Button2Mask"];
}
+ (int)button3Mask
{
return [[NSUserDefaults standardUserDefaults]
integerForKey:@"Button3Mask"];
}
+ (BOOL)mouseAccelChange
{
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"AllowMouseAccelChange"];
}
+ (int)useQDCursor
{
return [[NSUserDefaults standardUserDefaults]
integerForKey:@"UseQDCursor"];
}
+ (BOOL)rootless
{
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"UseRootlessMode"];
}
+ (BOOL)useAGL
{
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"UseAGLforGLX"];
}
+ (BOOL)modeWindow
{
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"ShowModePickWindow"];
}
+ (BOOL)startupHelp
{
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"ShowStartupHelp"];
}
+ (BOOL)systemBeep
{
return [[NSUserDefaults standardUserDefaults] boolForKey:@"UseSystemBeep"];
}
+ (BOOL)enableKeyEquivalents
{
return [[NSUserDefaults standardUserDefaults] boolForKey:X11EnableKeyEquivalentsKey];
}
+ (BOOL)xinerama
{
return [[NSUserDefaults standardUserDefaults] boolForKey:@"Xinerama"];
}
+ (BOOL)addToPath
{
return [[NSUserDefaults standardUserDefaults] boolForKey:@"AddToPath"];
}
+ (NSString *)addToPathString
{
return [[NSUserDefaults standardUserDefaults]
stringForKey:@"AddToPathString"];
}
+ (BOOL)useDefaultShell
{
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"UseDefaultShell"];
}
+ (NSString *)shellString
{
return [[NSUserDefaults standardUserDefaults]
stringForKey:@"Shell"];
}
+ (int)depth
{
return [[NSUserDefaults standardUserDefaults]
integerForKey:@"Depth"];
}
+ (NSArray *)displayModeBundles
{
return [[NSUserDefaults standardUserDefaults]
objectForKey:@"DisplayModeBundles"];
}
@end