1// 2// NSUserDefaults+XQuartzDefaults.m 3// XQuartz 4// 5// Created by Jeremy Huddleston Sequoia on 2021.02.19. 6// Copyright (c) 2021 Apple Inc. All rights reserved. 7// 8 9#import "NSUserDefaults+XQuartzDefaults.h" 10#import <dispatch/dispatch.h> 11 12NSString * const XQuartzPrefKeyAppsMenu = @"apps_menu"; 13NSString * const XQuartzPrefKeyFakeButtons = @"enable_fake_buttons"; 14NSString * const XQuartzPrefKeyFakeButton2 = @"fake_button2"; 15NSString * const XQuartzPrefKeyFakeButton3 = @"fake_button3"; 16NSString * const XQuartzPrefKeyKeyEquivs = @"enable_key_equivalents"; 17NSString * const XQuartzPrefKeyFullscreenHotkeys = @"fullscreen_hotkeys"; 18NSString * const XQuartzPrefKeyFullscreenMenu = @"fullscreen_menu"; 19NSString * const XQuartzPrefKeySyncKeymap = @"sync_keymap"; 20NSString * const XQuartzPrefKeyDepth = @"depth"; 21NSString * const XQuartzPrefKeyNoAuth = @"no_auth"; 22NSString * const XQuartzPrefKeyNoTCP = @"nolisten_tcp"; 23NSString * const XQuartzPrefKeyDoneXinitCheck = @"done_xinit_check"; 24NSString * const XQuartzPrefKeyNoQuitAlert = @"no_quit_alert"; 25NSString * const XQuartzPrefKeyNoRANDRAlert = @"no_randr_alert"; 26NSString * const XQuartzPrefKeyOptionSendsAlt = @"option_sends_alt"; 27NSString * const XQuartzPrefKeyAppKitModifiers = @"appkit_modifiers"; 28NSString * const XQuartzPrefKeyWindowItemModifiers = @"window_item_modifiers"; 29NSString * const XQuartzPrefKeyRootless = @"rootless"; 30NSString * const XQuartzPrefKeyRENDERExtension = @"enable_render_extension"; 31NSString * const XQuartzPrefKeyTESTExtension = @"enable_test_extensions"; 32NSString * const XQuartzPrefKeyLoginShell = @"login_shell"; 33NSString * const XQuartzPrefKeyUpdateFeed = @"update_feed"; 34NSString * const XQuartzPrefKeyClickThrough = @"wm_click_through"; 35NSString * const XQuartzPrefKeyFocusFollowsMouse = @"wm_ffm"; 36NSString * const XQuartzPrefKeyFocusOnNewWindow = @"wm_focus_on_new_window"; 37 38NSString * const XQuartzPrefKeyScrollInDeviceDirection = @"scroll_in_device_direction"; 39NSString * const XQuartzPrefKeySyncPasteboard = @"sync_pasteboard"; 40NSString * const XQuartzPrefKeySyncPasteboardToClipboard = @"sync_pasteboard_to_clipboard"; 41NSString * const XQuartzPrefKeySyncPasteboardToPrimary = @"sync_pasteboard_to_primary"; 42NSString * const XQuartzPrefKeySyncClipboardToPasteBoard = @"sync_clipboard_to_pasteboard"; 43NSString * const XQuartzPrefKeySyncPrimaryOnSelect = @"sync_primary_on_select"; 44 45@implementation NSUserDefaults (XQuartzDefaults) 46 47+ (NSUserDefaults *)globalDefaults 48{ 49 static dispatch_once_t once; 50 static NSUserDefaults *defaults; 51 52 dispatch_once(&once, ^{ 53 NSString * const defaultsDomain = @".GlobalPreferences"; 54 defaults = [[[NSUserDefaults alloc] initWithSuiteName:defaultsDomain] retain]; 55 56 NSDictionary<NSString *, id> * const defaultDefaultsDict = @{ 57 @"AppleSpacesSwitchOnActivate" : @(YES), 58 }; 59 60 [defaults registerDefaults:defaultDefaultsDict]; 61 }); 62 63 return defaults; 64} 65 66+ (NSUserDefaults *)dockDefaults 67{ 68 static dispatch_once_t once; 69 static NSUserDefaults *defaults; 70 71 dispatch_once(&once, ^{ 72 NSString * const defaultsDomain = @"com.apple.dock"; 73 defaults = [[[NSUserDefaults alloc] initWithSuiteName:defaultsDomain] retain]; 74 75 NSDictionary<NSString *, id> * const defaultDefaultsDict = @{ 76 @"workspaces" : @(NO), 77 }; 78 79 [defaults registerDefaults:defaultDefaultsDict]; 80 }); 81 82 return defaults; 83} 84 85+ (NSUserDefaults *)xquartzDefaults 86{ 87 static dispatch_once_t once; 88 static NSUserDefaults *defaults; 89 90 dispatch_once(&once, ^{ 91 NSString * const defaultsDomain = @(BUNDLE_ID_PREFIX ".X11"); 92 NSString * const defaultDefaultsDomain = NSBundle.mainBundle.bundleIdentifier; 93 if ([defaultsDomain isEqualToString:defaultDefaultsDomain]) { 94 defaults = [NSUserDefaults.standardUserDefaults retain]; 95 } else { 96 defaults = [[[NSUserDefaults alloc] initWithSuiteName:defaultsDomain] retain]; 97 } 98 99 NSString *defaultWindowItemModifiers = @"command"; 100 NSString * const defaultWindowItemModifiersLocalized = NSLocalizedString(@"window item modifiers", @"window item modifiers"); 101 if (![defaultWindowItemModifiersLocalized isEqualToString:@"window item modifiers"]) { 102 defaultWindowItemModifiers = defaultWindowItemModifiersLocalized; 103 } 104 105 NSDictionary<NSString *, id> * const defaultDefaultsDict = @{ 106 XQuartzPrefKeyFakeButtons : @(NO), 107 // XQuartzPrefKeyFakeButton2 nil default 108 // XQuartzPrefKeyFakeButton3 nil default 109 XQuartzPrefKeyKeyEquivs : @(YES), 110 XQuartzPrefKeyFullscreenHotkeys : @(NO), 111 XQuartzPrefKeyFullscreenMenu : @(NO), 112 XQuartzPrefKeySyncKeymap : @(NO), 113 XQuartzPrefKeyDepth : @(-1), 114 XQuartzPrefKeyNoAuth : @(NO), 115 XQuartzPrefKeyNoTCP : @(NO), 116 XQuartzPrefKeyDoneXinitCheck : @(NO), 117 XQuartzPrefKeyNoQuitAlert : @(NO), 118 XQuartzPrefKeyNoRANDRAlert : @(NO), 119 XQuartzPrefKeyOptionSendsAlt : @(NO), 120 // XQuartzPrefKeyAppKitModifiers nil default 121 XQuartzPrefKeyWindowItemModifiers : defaultWindowItemModifiers, 122 XQuartzPrefKeyRootless : @(YES), 123 XQuartzPrefKeyRENDERExtension : @(YES), 124 XQuartzPrefKeyTESTExtension : @(NO), 125 XQuartzPrefKeyLoginShell : @"/bin/sh", 126 XQuartzPrefKeyClickThrough : @(NO), 127 XQuartzPrefKeyFocusFollowsMouse : @(NO), 128 XQuartzPrefKeyFocusOnNewWindow : @(YES), 129 130 XQuartzPrefKeyScrollInDeviceDirection : @(NO), 131 XQuartzPrefKeySyncPasteboard : @(YES), 132 XQuartzPrefKeySyncPasteboardToClipboard : @(YES), 133 XQuartzPrefKeySyncPasteboardToPrimary : @(YES), 134 XQuartzPrefKeySyncClipboardToPasteBoard : @(YES), 135 XQuartzPrefKeySyncPrimaryOnSelect : @(NO), 136 }; 137 138 [defaults registerDefaults:defaultDefaultsDict]; 139 140 NSString * const systemDefaultsPlistPath = [@(XQUARTZ_DATA_DIR) stringByAppendingPathComponent:@"defaults.plist"]; 141 NSDictionary <NSString *, id> * const systemDefaultsDict = [NSDictionary dictionaryWithContentsOfFile:systemDefaultsPlistPath]; 142 [defaults registerDefaults:systemDefaultsDict]; 143 }); 144 145 return defaults; 146} 147 148@end 149