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