xserver: Branch 'master' - 3 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 15 06:35:34 UTC 2022


 hw/xquartz/NSUserDefaults+XQuartzDefaults.h |   49 ++
 hw/xquartz/NSUserDefaults+XQuartzDefaults.m |  149 +++++++++
 hw/xquartz/X11Application.h                 |   48 --
 hw/xquartz/X11Application.m                 |  458 ++--------------------------
 hw/xquartz/X11Controller.m                  |  184 +++++------
 hw/xquartz/bundle/Xquartz.plist             |   27 -
 hw/xquartz/meson.build                      |    1 
 hw/xquartz/pbproxy/app-main.m               |   40 --
 hw/xquartz/pbproxy/meson.build              |    4 
 hw/xquartz/pbproxy/x-selection.m            |   45 --
 hw/xquartz/quartz.c                         |   12 
 11 files changed, 340 insertions(+), 677 deletions(-)

New commits:
commit f40610e0b4f2b4ae54ef6bbff756cb4a60e17e3b
Author: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
Date:   Sat Feb 20 14:21:01 2021 -0800

    xquartz: Fold spaces related preferences into NSUserDefaults+XQuartzDefaults
    
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>

diff --git a/hw/xquartz/NSUserDefaults+XQuartzDefaults.h b/hw/xquartz/NSUserDefaults+XQuartzDefaults.h
index b8fc4a631..2f180b241 100644
--- a/hw/xquartz/NSUserDefaults+XQuartzDefaults.h
+++ b/hw/xquartz/NSUserDefaults+XQuartzDefaults.h
@@ -42,6 +42,8 @@ extern NSString * const XQuartzPrefKeySyncPrimaryOnSelect;
 
 @interface NSUserDefaults (XQuartzDefaults)
 
++ (NSUserDefaults *)globalDefaults;
++ (NSUserDefaults *)dockDefaults;
 + (NSUserDefaults *)xquartzDefaults;
 
 @end
diff --git a/hw/xquartz/NSUserDefaults+XQuartzDefaults.m b/hw/xquartz/NSUserDefaults+XQuartzDefaults.m
index b73003bae..bd5dd2305 100644
--- a/hw/xquartz/NSUserDefaults+XQuartzDefaults.m
+++ b/hw/xquartz/NSUserDefaults+XQuartzDefaults.m
@@ -44,6 +44,44 @@ NSString * const XQuartzPrefKeySyncPrimaryOnSelect = @"sync_primary_on_select";
 
 @implementation NSUserDefaults (XQuartzDefaults)
 
++ (NSUserDefaults *)globalDefaults
+{
+    static dispatch_once_t once;
+    static NSUserDefaults *defaults;
+
+    dispatch_once(&once, ^{
+        NSString * const defaultsDomain = @".GlobalPreferences";
+        defaults = [[[NSUserDefaults alloc] initWithSuiteName:defaultsDomain] retain];
+
+        NSDictionary<NSString *, id> * const defaultDefaultsDict = @{
+            @"AppleSpacesSwitchOnActivate" : @(YES),
+        };
+
+        [defaults registerDefaults:defaultDefaultsDict];
+    });
+
+    return defaults;
+}
+
++ (NSUserDefaults *)dockDefaults
+{
+    static dispatch_once_t once;
+    static NSUserDefaults *defaults;
+
+    dispatch_once(&once, ^{
+        NSString * const defaultsDomain = @"com.apple.dock";
+        defaults = [[[NSUserDefaults alloc] initWithSuiteName:defaultsDomain] retain];
+
+        NSDictionary<NSString *, id> * const defaultDefaultsDict = @{
+            @"workspaces" : @(NO),
+        };
+
+        [defaults registerDefaults:defaultDefaultsDict];
+    });
+
+    return defaults;
+}
+
 + (NSUserDefaults *)xquartzDefaults
 {
     static dispatch_once_t once;
diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m
index 31df8c9d4..b0550b69a 100644
--- a/hw/xquartz/X11Application.m
+++ b/hw/xquartz/X11Application.m
@@ -417,7 +417,7 @@ QuartzModeBundleInit(void);
         case NSApplicationActivatedEventType:
             for_x = NO;
             if ([e window] == nil && x_was_active) {
-                BOOL order_all_windows = YES, workspaces, ok;
+                BOOL order_all_windows = YES;
                 for_appkit = NO;
 
 #if APPKIT_APPFLAGS_HACK
@@ -430,26 +430,9 @@ QuartzModeBundleInit(void);
                 [self set_front_process:nil];
 
                 /* Get the Spaces preference for SwitchOnActivate */
-                (void)CFPreferencesAppSynchronize(CFSTR("com.apple.dock"));
-                workspaces =
-                    CFPreferencesGetAppBooleanValue(CFSTR("workspaces"),
-                                                    CFSTR(
-                                                        "com.apple.dock"),
-                                                    &ok);
-                if (!ok)
-                    workspaces = NO;
-
+                BOOL const workspaces = [NSUserDefaults.dockDefaults boolForKey:@"workspaces"];
                 if (workspaces) {
-                    (void)CFPreferencesAppSynchronize(CFSTR(
-                                                          ".GlobalPreferences"));
-                    order_all_windows =
-                        CFPreferencesGetAppBooleanValue(CFSTR(
-                                                            "AppleSpacesSwitchOnActivate"),
-                                                        CFSTR(
-                                                            ".GlobalPreferences"),
-                                                        &ok);
-                    if (!ok)
-                        order_all_windows = YES;
+                    order_all_windows = [NSUserDefaults.globalDefaults boolForKey:@"AppleSpacesSwitchOnActivate"];
                 }
 
                 /* TODO: In the workspaces && !AppleSpacesSwitchOnActivate case, the windows are ordered
@@ -460,8 +443,7 @@ QuartzModeBundleInit(void);
                  *       be restoring one of them.
                  */
                 if ([e data2] & 0x10) {         // 0x10 (bfCPSOrderAllWindowsForward) is set when we use cmd-tab or the dock icon
-                    DarwinSendDDXEvent(kXquartzBringAllToFront, 1,
-                                       order_all_windows);
+                    DarwinSendDDXEvent(kXquartzBringAllToFront, 1, order_all_windows);
                 }
             }
             break;
commit 6134c73aebc3f928639e8f802be49ec8ecc17e66
Author: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
Date:   Sat Feb 20 14:00:14 2021 -0800

    xquartz pbproxy: Adopt NSUserDefaults+XQuartzDefaults for preferences
    
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>

diff --git a/hw/xquartz/pbproxy/app-main.m b/hw/xquartz/pbproxy/app-main.m
index eda9a9e67..825980caf 100644
--- a/hw/xquartz/pbproxy/app-main.m
+++ b/hw/xquartz/pbproxy/app-main.m
@@ -31,13 +31,6 @@
 #include "pbproxy.h"
 #import "x-selection.h"
 
-#include <pthread.h>
-#include <unistd.h> /*for getpid*/
-#include <Cocoa/Cocoa.h>
-
-static const char *app_prefs_domain = BUNDLE_ID_PREFIX ".xpbproxy";
-CFStringRef app_prefs_domain_cfstr;
-
 /* Stubs */
 char *display = NULL;
 
@@ -82,41 +75,8 @@ xq_asl_log(int level, const char *subsystem, const char *file,
 int
 main(int argc, const char *argv[])
 {
-    const char *s;
-    int i;
-
-#ifdef DEBUG
-    ErrorF("pid: %u\n", getpid());
-#endif
-
     xpbproxy_is_standalone = YES;
 
-    if ((s = getenv("X11_PREFS_DOMAIN")))
-        app_prefs_domain = s;
-
-    for (i = 1; i < argc; i++) {
-        if (strcmp(argv[i], "--prefs-domain") == 0 && i + 1 < argc) {
-            app_prefs_domain = argv[++i];
-        }
-        else if (strcmp(argv[i], "--help") == 0) {
-            ErrorF(
-                "usage: xpbproxy OPTIONS\n"
-                "Pasteboard proxying for X11.\n\n"
-                "--prefs-domain <domain>   Change the domain used for reading preferences\n"
-                "                          (default: %s)\n",
-                app_prefs_domain);
-            return 0;
-        }
-        else {
-            ErrorF("usage: xpbproxy OPTIONS...\n"
-                   "Try 'xpbproxy --help' for more information.\n");
-            return 1;
-        }
-    }
-
-    app_prefs_domain_cfstr = CFStringCreateWithCString(NULL, app_prefs_domain,
-                                                       kCFStringEncodingUTF8);
-
     signal(SIGINT, signal_handler);
     signal(SIGTERM, signal_handler);
     signal(SIGHUP, signal_handler);
diff --git a/hw/xquartz/pbproxy/meson.build b/hw/xquartz/pbproxy/meson.build
index bf0f06f75..eebb9fd70 100644
--- a/hw/xquartz/pbproxy/meson.build
+++ b/hw/xquartz/pbproxy/meson.build
@@ -8,9 +8,11 @@ endif
 libapplewm_dep = dependency('applewm', version: '>=1.4')
 
 libxpbproxy = static_library('xpbproxy',
-    ['main.m',
+    ['../NSUserDefaults+XQuartzDefaults.m',
+     'main.m',
      'x-input.m',
      'x-selection.m'],
+    include_directories: ['..'],
     dependencies: [applewmproto_dep, libapplewm_dep, dependency('xfixes'), dependency('x11')],
     objc_args: pbproxy_defs,
 )
diff --git a/hw/xquartz/pbproxy/x-selection.m b/hw/xquartz/pbproxy/x-selection.m
index 21b5b3172..f4f2b9a6b 100644
--- a/hw/xquartz/pbproxy/x-selection.m
+++ b/hw/xquartz/pbproxy/x-selection.m
@@ -38,6 +38,8 @@
 #import <AppKit/NSImage.h>
 #import <AppKit/NSBitmapImageRep.h>
 
+#import "NSUserDefaults+XQuartzDefaults.h"
+
 /*
  * The basic design of the pbproxy code is as follows.
  *
@@ -99,18 +101,6 @@ dump_prefs()
 }
 #endif
 
-extern CFStringRef app_prefs_domain_cfstr;
-
-static BOOL
-prefs_get_bool(CFStringRef key, BOOL defaultValue)
-{
-    Boolean value, ok;
-
-    value = CFPreferencesGetAppBooleanValue(key, app_prefs_domain_cfstr, &ok);
-
-    return ok ? (BOOL)value : defaultValue;
-}
-
 static void
 init_propdata(struct propdata *pdata)
 {
@@ -1394,35 +1384,18 @@ get_property(Window win, Atom property, struct propdata *pdata, Bool delete,
 
 - (void) reload_preferences
 {
-    /*
-     * It's uncertain how we could handle the synchronization failing, so cast to void.
-     * The prefs_get_bool should fall back to defaults if the org.x.X11 plist doesn't exist or is invalid.
-     */
-    (void)CFPreferencesAppSynchronize(app_prefs_domain_cfstr);
+    NSUserDefaults * const defaults = NSUserDefaults.xquartzDefaults;
+
 #ifdef STANDALONE_XPBPROXY
     if (xpbproxy_is_standalone)
         pbproxy_prefs.active = YES;
     else
 #endif
-    pbproxy_prefs.active = prefs_get_bool(CFSTR(
-                                              "sync_pasteboard"),
-                                          pbproxy_prefs.active);
-    pbproxy_prefs.primary_on_grab =
-        prefs_get_bool(CFSTR(
-                           "sync_primary_on_select"),
-                       pbproxy_prefs.primary_on_grab);
-    pbproxy_prefs.clipboard_to_pasteboard =
-        prefs_get_bool(CFSTR(
-                           "sync_clipboard_to_pasteboard"),
-                       pbproxy_prefs.clipboard_to_pasteboard);
-    pbproxy_prefs.pasteboard_to_primary =
-        prefs_get_bool(CFSTR(
-                           "sync_pasteboard_to_primary"),
-                       pbproxy_prefs.pasteboard_to_primary);
-    pbproxy_prefs.pasteboard_to_clipboard =
-        prefs_get_bool(CFSTR(
-                           "sync_pasteboard_to_clipboard"),
-                       pbproxy_prefs.pasteboard_to_clipboard);
+    pbproxy_prefs.active = [defaults boolForKey:XQuartzPrefKeySyncPasteboard];
+    pbproxy_prefs.primary_on_grab = [defaults boolForKey:XQuartzPrefKeySyncPrimaryOnSelect];
+    pbproxy_prefs.clipboard_to_pasteboard = [defaults boolForKey:XQuartzPrefKeySyncClipboardToPasteBoard];
+    pbproxy_prefs.pasteboard_to_primary = [defaults boolForKey:XQuartzPrefKeySyncPasteboardToPrimary];
+    pbproxy_prefs.pasteboard_to_clipboard = [defaults boolForKey:XQuartzPrefKeySyncPasteboardToClipboard];
 
     /* This is used for debugging. */
     //dump_prefs();
commit 963ba6d9adf578ec8d7ed12ae22dece76b895172
Author: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
Date:   Fri Feb 19 22:49:11 2021 -0800

    xquartz: Create a separate category for organizing user preferences
    
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>

diff --git a/hw/xquartz/NSUserDefaults+XQuartzDefaults.h b/hw/xquartz/NSUserDefaults+XQuartzDefaults.h
new file mode 100644
index 000000000..b8fc4a631
--- /dev/null
+++ b/hw/xquartz/NSUserDefaults+XQuartzDefaults.h
@@ -0,0 +1,47 @@
+//
+//  NSUserDefaults+XQuartzDefaults.h
+//  XQuartz
+//
+//  Created by Jeremy Huddleston Sequoia on 2021.02.19.
+//  Copyright (c) 2021 Apple Inc. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+extern NSString * const XQuartzPrefKeyAppsMenu;
+extern NSString * const XQuartzPrefKeyFakeButtons;
+extern NSString * const XQuartzPrefKeyFakeButton2;
+extern NSString * const XQuartzPrefKeyFakeButton3;
+extern NSString * const XQuartzPrefKeyKeyEquivs;
+extern NSString * const XQuartzPrefKeyFullscreenHotkeys;
+extern NSString * const XQuartzPrefKeyFullscreenMenu;
+extern NSString * const XQuartzPrefKeySyncKeymap;
+extern NSString * const XQuartzPrefKeyDepth;
+extern NSString * const XQuartzPrefKeyNoAuth;
+extern NSString * const XQuartzPrefKeyNoTCP;
+extern NSString * const XQuartzPrefKeyDoneXinitCheck;
+extern NSString * const XQuartzPrefKeyNoQuitAlert;
+extern NSString * const XQuartzPrefKeyNoRANDRAlert;
+extern NSString * const XQuartzPrefKeyOptionSendsAlt;
+extern NSString * const XQuartzPrefKeyAppKitModifiers;
+extern NSString * const XQuartzPrefKeyWindowItemModifiers;
+extern NSString * const XQuartzPrefKeyRootless;
+extern NSString * const XQuartzPrefKeyRENDERExtension;
+extern NSString * const XQuartzPrefKeyTESTExtension;
+extern NSString * const XQuartzPrefKeyLoginShell;
+extern NSString * const XQuartzPrefKeyClickThrough;
+extern NSString * const XQuartzPrefKeyFocusFollowsMouse;
+extern NSString * const XQuartzPrefKeyFocusOnNewWindow;
+
+extern NSString * const XQuartzPrefKeyScrollInDeviceDirection;
+extern NSString * const XQuartzPrefKeySyncPasteboard;
+extern NSString * const XQuartzPrefKeySyncPasteboardToClipboard;
+extern NSString * const XQuartzPrefKeySyncPasteboardToPrimary;
+extern NSString * const XQuartzPrefKeySyncClipboardToPasteBoard;
+extern NSString * const XQuartzPrefKeySyncPrimaryOnSelect;
+
+ at interface NSUserDefaults (XQuartzDefaults)
+
++ (NSUserDefaults *)xquartzDefaults;
+
+ at end
diff --git a/hw/xquartz/NSUserDefaults+XQuartzDefaults.m b/hw/xquartz/NSUserDefaults+XQuartzDefaults.m
new file mode 100644
index 000000000..b73003bae
--- /dev/null
+++ b/hw/xquartz/NSUserDefaults+XQuartzDefaults.m
@@ -0,0 +1,111 @@
+//
+//  NSUserDefaults+XQuartzDefaults.m
+//  XQuartz
+//
+//  Created by Jeremy Huddleston Sequoia on 2021.02.19.
+//  Copyright (c) 2021 Apple Inc. All rights reserved.
+//
+
+#import "NSUserDefaults+XQuartzDefaults.h"
+#import <dispatch/dispatch.h>
+
+NSString * const XQuartzPrefKeyAppsMenu = @"apps_menu";
+NSString * const XQuartzPrefKeyFakeButtons = @"enable_fake_buttons";
+NSString * const XQuartzPrefKeyFakeButton2 = @"fake_button2";
+NSString * const XQuartzPrefKeyFakeButton3 = @"fake_button3";
+NSString * const XQuartzPrefKeyKeyEquivs = @"enable_key_equivalents";
+NSString * const XQuartzPrefKeyFullscreenHotkeys = @"fullscreen_hotkeys";
+NSString * const XQuartzPrefKeyFullscreenMenu = @"fullscreen_menu";
+NSString * const XQuartzPrefKeySyncKeymap = @"sync_keymap";
+NSString * const XQuartzPrefKeyDepth = @"depth";
+NSString * const XQuartzPrefKeyNoAuth = @"no_auth";
+NSString * const XQuartzPrefKeyNoTCP = @"nolisten_tcp";
+NSString * const XQuartzPrefKeyDoneXinitCheck = @"done_xinit_check";
+NSString * const XQuartzPrefKeyNoQuitAlert = @"no_quit_alert";
+NSString * const XQuartzPrefKeyNoRANDRAlert = @"no_randr_alert";
+NSString * const XQuartzPrefKeyOptionSendsAlt = @"option_sends_alt";
+NSString * const XQuartzPrefKeyAppKitModifiers = @"appkit_modifiers";
+NSString * const XQuartzPrefKeyWindowItemModifiers = @"window_item_modifiers";
+NSString * const XQuartzPrefKeyRootless = @"rootless";
+NSString * const XQuartzPrefKeyRENDERExtension = @"enable_render_extension";
+NSString * const XQuartzPrefKeyTESTExtension = @"enable_test_extensions";
+NSString * const XQuartzPrefKeyLoginShell = @"login_shell";
+NSString * const XQuartzPrefKeyUpdateFeed = @"update_feed";
+NSString * const XQuartzPrefKeyClickThrough = @"wm_click_through";
+NSString * const XQuartzPrefKeyFocusFollowsMouse = @"wm_ffm";
+NSString * const XQuartzPrefKeyFocusOnNewWindow = @"wm_focus_on_new_window";
+
+NSString * const XQuartzPrefKeyScrollInDeviceDirection = @"scroll_in_device_direction";
+NSString * const XQuartzPrefKeySyncPasteboard = @"sync_pasteboard";
+NSString * const XQuartzPrefKeySyncPasteboardToClipboard = @"sync_pasteboard_to_clipboard";
+NSString * const XQuartzPrefKeySyncPasteboardToPrimary = @"sync_pasteboard_to_primary";
+NSString * const XQuartzPrefKeySyncClipboardToPasteBoard = @"sync_clipboard_to_pasteboard";
+NSString * const XQuartzPrefKeySyncPrimaryOnSelect = @"sync_primary_on_select";
+
+ at implementation NSUserDefaults (XQuartzDefaults)
+
++ (NSUserDefaults *)xquartzDefaults
+{
+    static dispatch_once_t once;
+    static NSUserDefaults *defaults;
+
+    dispatch_once(&once, ^{
+        NSString * const defaultsDomain = @(BUNDLE_ID_PREFIX ".X11");
+        NSString * const defaultDefaultsDomain = NSBundle.mainBundle.bundleIdentifier;
+        if ([defaultsDomain isEqualToString:defaultDefaultsDomain]) {
+            defaults = [NSUserDefaults.standardUserDefaults retain];
+        } else {
+            defaults = [[[NSUserDefaults alloc] initWithSuiteName:defaultsDomain] retain];
+        }
+
+        NSArray * const defaultAppsMenu = @[
+            @[NSLocalizedString(@"Terminal", @"Terminal"), @"xterm", @"n"],
+        ];
+
+        NSString *defaultWindowItemModifiers = @"command";
+        NSString * const defaultWindowItemModifiersLocalized = NSLocalizedString(@"window item modifiers", @"window item modifiers");
+        if (![defaultWindowItemModifiersLocalized isEqualToString:@"window item modifiers"]) {
+            defaultWindowItemModifiers = defaultWindowItemModifiersLocalized;
+        }
+
+        NSDictionary<NSString *, id> * const defaultDefaultsDict = @{
+            XQuartzPrefKeyAppsMenu : defaultAppsMenu,
+            XQuartzPrefKeyFakeButtons : @(NO),
+            // XQuartzPrefKeyFakeButton2 nil default
+            // XQuartzPrefKeyFakeButton3 nil default
+            XQuartzPrefKeyKeyEquivs : @(YES),
+            XQuartzPrefKeyFullscreenHotkeys : @(NO),
+            XQuartzPrefKeyFullscreenMenu : @(NO),
+            XQuartzPrefKeySyncKeymap : @(NO),
+            XQuartzPrefKeyDepth : @(-1),
+            XQuartzPrefKeyNoAuth : @(NO),
+            XQuartzPrefKeyNoTCP : @(NO),
+            XQuartzPrefKeyDoneXinitCheck : @(NO),
+            XQuartzPrefKeyNoQuitAlert : @(NO),
+            XQuartzPrefKeyNoRANDRAlert : @(NO),
+            XQuartzPrefKeyOptionSendsAlt : @(NO),
+            // XQuartzPrefKeyAppKitModifiers nil default
+            XQuartzPrefKeyWindowItemModifiers : defaultWindowItemModifiers,
+            XQuartzPrefKeyRootless : @(YES),
+            XQuartzPrefKeyRENDERExtension : @(YES),
+            XQuartzPrefKeyTESTExtension : @(NO),
+            XQuartzPrefKeyLoginShell : @"/bin/sh",
+            XQuartzPrefKeyClickThrough : @(NO),
+            XQuartzPrefKeyFocusFollowsMouse : @(NO),
+            XQuartzPrefKeyFocusOnNewWindow : @(YES),
+
+            XQuartzPrefKeyScrollInDeviceDirection : @(NO),
+            XQuartzPrefKeySyncPasteboard : @(YES),
+            XQuartzPrefKeySyncPasteboardToClipboard : @(YES),
+            XQuartzPrefKeySyncPasteboardToPrimary : @(YES),
+            XQuartzPrefKeySyncClipboardToPasteBoard : @(YES),
+            XQuartzPrefKeySyncPrimaryOnSelect : @(NO),
+        };
+
+        [defaults registerDefaults:defaultDefaultsDict];
+    });
+
+    return defaults;
+}
+
+ at end
diff --git a/hw/xquartz/X11Application.h b/hw/xquartz/X11Application.h
index d3ff4ebd0..1ef98bee3 100644
--- a/hw/xquartz/X11Application.h
+++ b/hw/xquartz/X11Application.h
@@ -42,20 +42,6 @@
 @property (nonatomic, readwrite, strong) X11Controller *controller;
 @property (nonatomic, readonly, assign) OSX_BOOL x_active;
 
-- (CFPropertyListRef)prefs_get_copy:(NSString *)key CF_RETURNS_RETAINED;
-- (int)prefs_get_integer:(NSString *)key default:(int)def;
-- (const char *)prefs_get_string:(NSString *)key default:(const char *)def;
-- (float)prefs_get_float:(NSString *)key default:(float)def;
-- (int)prefs_get_boolean:(NSString *)key default:(int)def;
-- (NSURL *)prefs_copy_url:(NSString *)key default:(NSURL *)def
-   NS_RETURNS_RETAINED;
-- (NSArray *)prefs_get_array:(NSString *)key;
-- (void)prefs_set_integer:(NSString *)key value:(int)value;
-- (void)prefs_set_float:(NSString *)key value:(float)value;
-- (void)prefs_set_boolean:(NSString *)key value:(int)value;
-- (void)prefs_set_array:(NSString *)key value:(NSArray *)value;
-- (void)prefs_set_string:(NSString *)key value:(NSString *)value;
-- (void)prefs_synchronize;
 @end
 
 extern X11Application * X11App;
@@ -84,40 +70,6 @@ X11ApplicationCanEnterRandR(void);
 void
 X11ApplicationMain(int argc, char **argv, char **envp);
 
-#define PREFS_APPSMENU                "apps_menu"
-#define PREFS_FAKEBUTTONS             "enable_fake_buttons"
-#define PREFS_KEYEQUIVS               "enable_key_equivalents"
-#define PREFS_FULLSCREEN_HOTKEYS      "fullscreen_hotkeys"
-#define PREFS_FULLSCREEN_MENU         "fullscreen_menu"
-#define PREFS_SYNC_KEYMAP             "sync_keymap"
-#define PREFS_DEPTH                   "depth"
-#define PREFS_NO_AUTH                 "no_auth"
-#define PREFS_NO_TCP                  "nolisten_tcp"
-#define PREFS_DONE_XINIT_CHECK        "done_xinit_check"
-#define PREFS_NO_QUIT_ALERT           "no_quit_alert"
-#define PREFS_NO_RANDR_ALERT          "no_randr_alert"
-#define PREFS_OPTION_SENDS_ALT        "option_sends_alt"
-#define PREFS_FAKE_BUTTON2            "fake_button2"
-#define PREFS_FAKE_BUTTON3            "fake_button3"
-#define PREFS_APPKIT_MODIFIERS        "appkit_modifiers"
-#define PREFS_WINDOW_ITEM_MODIFIERS   "window_item_modifiers"
-#define PREFS_ROOTLESS                "rootless"
-#define PREFS_RENDER_EXTENSION        "enable_render_extension"
-#define PREFS_TEST_EXTENSIONS         "enable_test_extensions"
-#define PREFS_XP_OPTIONS              "xp_options"
-#define PREFS_LOGIN_SHELL             "login_shell"
-#define PREFS_UPDATE_FEED             "update_feed"
-#define PREFS_CLICK_THROUGH           "wm_click_through"
-#define PREFS_FFM                     "wm_ffm"
-#define PREFS_FOCUS_ON_NEW_WINDOW     "wm_focus_on_new_window"
-
-#define PREFS_SCROLL_IN_DEV_DIRECTION "scroll_in_device_direction"
 extern Bool XQuartzScrollInDeviceDirection;
 
-#define PREFS_SYNC_PB                "sync_pasteboard"
-#define PREFS_SYNC_PB_TO_CLIPBOARD   "sync_pasteboard_to_clipboard"
-#define PREFS_SYNC_PB_TO_PRIMARY     "sync_pasteboard_to_primary"
-#define PREFS_SYNC_CLIPBOARD_TO_PB   "sync_clipboard_to_pasteboard"
-#define PREFS_SYNC_PRIMARY_ON_SELECT "sync_primary_on_select"
-
 #endif /* X11APPLICATION_H */
diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m
index a100f5a6f..31df8c9d4 100644
--- a/hw/xquartz/X11Application.m
+++ b/hw/xquartz/X11Application.m
@@ -35,6 +35,7 @@
 #endif
 
 #import "X11Application.h"
+#import "NSUserDefaults+XQuartzDefaults.h"
 
 #include "darwin.h"
 #include "quartz.h"
@@ -55,8 +56,6 @@
 extern int
 xpbproxy_run(void);
 
-#define DEFAULTS_FILE X11LIBDIR "/X11/xserver/Xquartz.plist"
-
 #ifndef XSERVER_VERSION
 #define XSERVER_VERSION "?"
 #endif
@@ -101,8 +100,6 @@ static BOOL bgMouseLocationUpdated = FALSE;
 
 X11Application *X11App;
 
-CFStringRef app_prefs_domain_cfstr = NULL;
-
 #define ALL_KEY_MASKS (NSShiftKeyMask | NSControlKeyMask | \
                        NSAlternateKeyMask | NSCommandKeyMask)
 
@@ -524,404 +521,50 @@ QuartzModeBundleInit(void);
     (void)[self.controller application:self openFile:cmd];
 }
 
-/* user preferences */
-
-/* Note that these functions only work for arrays whose elements
-   can be toll-free-bridged between NS and CF worlds. */
-
-static const void *
-cfretain(CFAllocatorRef a, const void *b)
-{
-    return CFRetain(b);
-}
-
-static void
-cfrelease(CFAllocatorRef a, const void *b)
-{
-    CFRelease(b);
-}
-
-CF_RETURNS_RETAINED
-static CFMutableArrayRef
-nsarray_to_cfarray(NSArray *in)
-{
-    CFMutableArrayRef out;
-    CFArrayCallBacks cb;
-    NSObject *ns;
-    const CFTypeRef *cf;
-    int i, count;
-
-    memset(&cb, 0, sizeof(cb));
-    cb.version = 0;
-    cb.retain = cfretain;
-    cb.release = cfrelease;
-
-    count = [in count];
-    out = CFArrayCreateMutable(NULL, count, &cb);
-
-    for (i = 0; i < count; i++) {
-        ns = [in objectAtIndex:i];
-
-        if ([ns isKindOfClass:[NSArray class]])
-            cf = (CFTypeRef)nsarray_to_cfarray((NSArray *)ns);
-        else
-            cf = CFRetain((CFTypeRef)ns);
-
-        CFArrayAppendValue(out, cf);
-        CFRelease(cf);
-    }
-
-    return out;
-}
 
-static NSMutableArray *
-cfarray_to_nsarray(CFArrayRef in)
+- (void) read_defaults
 {
-    NSMutableArray *out;
-    const CFTypeRef *cf;
-    NSObject *ns;
-    int i, count;
-
-    count = CFArrayGetCount(in);
-    out = [[NSMutableArray alloc] initWithCapacity:count];
-
-    for (i = 0; i < count; i++) {
-        cf = CFArrayGetValueAtIndex(in, i);
+    NSUserDefaults * const defaults = NSUserDefaults.xquartzDefaults;
 
-        if (CFGetTypeID(cf) == CFArrayGetTypeID())
-            ns = cfarray_to_nsarray((CFArrayRef)cf);
-        else
-            ns = [(id) cf retain];
-
-        [out addObject:ns];
-        [ns release];
-    }
+    XQuartzRootlessDefault = [defaults boolForKey:XQuartzPrefKeyRootless];
+    XQuartzFullscreenMenu = [defaults boolForKey:XQuartzPrefKeyFullscreenMenu];
+    XQuartzFullscreenDisableHotkeys = ![defaults boolForKey:XQuartzPrefKeyFullscreenHotkeys];
 
-    return out;
-}
+    darwinFakeButtons = [defaults boolForKey:XQuartzPrefKeyFakeButtons];
+    XQuartzOptionSendsAlt = [defaults boolForKey:XQuartzPrefKeyOptionSendsAlt];
 
-- (CFPropertyListRef) prefs_get_copy:(NSString *)key
-{
-    CFPropertyListRef value;
-
-    value = CFPreferencesCopyAppValue((CFStringRef)key,
-                                      app_prefs_domain_cfstr);
-
-    if (value == NULL) {
-        static CFDictionaryRef defaults;
-
-        if (defaults == NULL) {
-            CFStringRef error = NULL;
-            CFDataRef data;
-            CFURLRef url;
-            SInt32 error_code;
-
-            url = (CFURLCreateFromFileSystemRepresentation
-                       (NULL, (unsigned char *)DEFAULTS_FILE,
-                       strlen(DEFAULTS_FILE), false));
-            if (CFURLCreateDataAndPropertiesFromResource(NULL, url, &data,
-                                                         NULL, NULL,
-                                                         &error_code)) {
-                defaults = (CFPropertyListCreateFromXMLData
-                                (NULL, data,
-                                kCFPropertyListMutableContainersAndLeaves,
-                                &error));
-                if (error != NULL) CFRelease(error);
-                CFRelease(data);
-            }
-            CFRelease(url);
-
-            if (defaults != NULL) {
-                NSMutableArray *apps, *elt;
-                int count, i;
-                NSString *name, *nname;
-
-                /* Localize the names in the default apps menu. */
-
-                apps =
-                    [(NSDictionary *) defaults objectForKey:@PREFS_APPSMENU];
-                if (apps != nil) {
-                    count = [apps count];
-                    for (i = 0; i < count; i++) {
-                        elt = [apps objectAtIndex:i];
-                        if (elt != nil &&
-                            [elt isKindOfClass:[NSArray class]]) {
-                            name = [elt objectAtIndex:0];
-                            if (name != nil) {
-                                nname = NSLocalizedString(name, nil);
-                                if (nname != nil && nname != name)
-                                    [elt replaceObjectAtIndex:0 withObject:
-                                     nname];
-                            }
-                        }
-                    }
-                }
-            }
+    if (darwinFakeButtons) {
+        NSString * const fake2 = [defaults stringForKey:XQuartzPrefKeyFakeButton2];
+        if (fake2) {
+            darwinFakeMouse2Mask = DarwinParseModifierList(fake2.UTF8String, TRUE);
         }
 
-        if (defaults != NULL) value = CFDictionaryGetValue(defaults, key);
-        if (value != NULL) CFRetain(value);
-    }
-
-    return value;
-}
-
-- (int) prefs_get_integer:(NSString *)key default:(int)def
-{
-    CFPropertyListRef value;
-    int ret;
-
-    value = [self prefs_get_copy:key];
-
-    if (value != NULL && CFGetTypeID(value) == CFNumberGetTypeID())
-        CFNumberGetValue(value, kCFNumberIntType, &ret);
-    else if (value != NULL && CFGetTypeID(value) == CFStringGetTypeID())
-        ret = CFStringGetIntValue(value);
-    else
-        ret = def;
-
-    if (value != NULL) CFRelease(value);
-
-    return ret;
-}
-
-- (const char *) prefs_get_string:(NSString *)key default:(const char *)def
-{
-    CFPropertyListRef value;
-    const char *ret = NULL;
-
-    value = [self prefs_get_copy:key];
-
-    if (value != NULL && CFGetTypeID(value) == CFStringGetTypeID()) {
-        NSString *s = (NSString *)value;
-
-        ret = [s UTF8String];
-    }
-
-    if (value != NULL) CFRelease(value);
-
-    return ret != NULL ? ret : def;
-}
-
-- (NSURL *) prefs_copy_url:(NSString *)key default:(NSURL *)def
-{
-    CFPropertyListRef value;
-    NSURL *ret = NULL;
-
-    value = [self prefs_get_copy:key];
-
-    if (value != NULL && CFGetTypeID(value) == CFStringGetTypeID()) {
-        NSString *s = (NSString *)value;
-
-        ret = [NSURL URLWithString:s];
-        [ret retain];
-    }
-
-    if (value != NULL) CFRelease(value);
-
-    return ret != NULL ? ret : def;
-}
-
-- (float) prefs_get_float:(NSString *)key default:(float)def
-{
-    CFPropertyListRef value;
-    float ret = def;
-
-    value = [self prefs_get_copy:key];
-
-    if (value != NULL
-        && CFGetTypeID(value) == CFNumberGetTypeID()
-        && CFNumberIsFloatType(value))
-        CFNumberGetValue(value, kCFNumberFloatType, &ret);
-    else if (value != NULL && CFGetTypeID(value) == CFStringGetTypeID())
-        ret = CFStringGetDoubleValue(value);
-
-    if (value != NULL) CFRelease(value);
-
-    return ret;
-}
-
-- (int) prefs_get_boolean:(NSString *)key default:(int)def
-{
-    CFPropertyListRef value;
-    int ret = def;
-
-    value = [self prefs_get_copy:key];
-
-    if (value != NULL) {
-        if (CFGetTypeID(value) == CFNumberGetTypeID())
-            CFNumberGetValue(value, kCFNumberIntType, &ret);
-        else if (CFGetTypeID(value) == CFBooleanGetTypeID())
-            ret = CFBooleanGetValue(value);
-        else if (CFGetTypeID(value) == CFStringGetTypeID()) {
-            const char *tem = [(NSString *) value UTF8String];
-            if (strcasecmp(tem, "true") == 0 || strcasecmp(tem, "yes") == 0)
-                ret = YES;
-            else
-                ret = NO;
+        NSString * const fake3 = [defaults stringForKey:XQuartzPrefKeyFakeButton3];
+        if (fake3) {
+            darwinFakeMouse3Mask = DarwinParseModifierList(fake3.UTF8String, TRUE);
         }
-
-        CFRelease(value);
     }
-    return ret;
-}
-
-- (NSArray *) prefs_get_array:(NSString *)key
-{
-    NSArray *ret = nil;
-    CFPropertyListRef value;
-
-    value = [self prefs_get_copy:key];
 
-    if (value != NULL) {
-        if (CFGetTypeID(value) == CFArrayGetTypeID())
-            ret = [cfarray_to_nsarray (value)autorelease];
-
-        CFRelease(value);
+    NSString * const appKitModifiers = [defaults stringForKey:XQuartzPrefKeyAppKitModifiers];
+    if (appKitModifiers) {
+        darwinAppKitModMask = DarwinParseModifierList(appKitModifiers.UTF8String, TRUE);
     }
 
-    return ret;
-}
-
-- (void) prefs_set_integer:(NSString *)key value:(int)value
-{
-    CFNumberRef x;
-
-    x = CFNumberCreate(NULL, kCFNumberIntType, &value);
-
-    CFPreferencesSetValue((CFStringRef)key, (CFTypeRef)x,
-                          app_prefs_domain_cfstr,
-                          kCFPreferencesCurrentUser,
-                          kCFPreferencesAnyHost);
-
-    CFRelease(x);
-}
-
-- (void) prefs_set_float:(NSString *)key value:(float)value
-{
-    CFNumberRef x;
-
-    x = CFNumberCreate(NULL, kCFNumberFloatType, &value);
-
-    CFPreferencesSetValue((CFStringRef)key, (CFTypeRef)x,
-                          app_prefs_domain_cfstr,
-                          kCFPreferencesCurrentUser,
-                          kCFPreferencesAnyHost);
-
-    CFRelease(x);
-}
-
-- (void) prefs_set_boolean:(NSString *)key value:(int)value
-{
-    CFPreferencesSetValue(
-        (CFStringRef)key,
-        (CFTypeRef)(value ? kCFBooleanTrue
-                    : kCFBooleanFalse),
-        app_prefs_domain_cfstr,
-        kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
-
-}
-
-- (void) prefs_set_array:(NSString *)key value:(NSArray *)value
-{
-    CFArrayRef cfarray;
-
-    cfarray = nsarray_to_cfarray(value);
-    CFPreferencesSetValue((CFStringRef)key,
-                          (CFTypeRef)cfarray,
-                          app_prefs_domain_cfstr,
-                          kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
-    CFRelease(cfarray);
-}
-
-- (void) prefs_set_string:(NSString *)key value:(NSString *)value
-{
-    CFPreferencesSetValue((CFStringRef)key, (CFTypeRef)value,
-                          app_prefs_domain_cfstr, kCFPreferencesCurrentUser,
-                          kCFPreferencesAnyHost);
-}
-
-- (void) prefs_synchronize
-{
-    CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
-}
-
-- (void) read_defaults
-{
-    NSString *nsstr;
-    const char *tem;
-
-    XQuartzRootlessDefault = [self prefs_get_boolean:@PREFS_ROOTLESS
-                              default               :XQuartzRootlessDefault];
-    XQuartzFullscreenMenu = [self prefs_get_boolean:@PREFS_FULLSCREEN_MENU
-                             default               :XQuartzFullscreenMenu];
-    XQuartzFullscreenDisableHotkeys =
-        ![self prefs_get_boolean:@PREFS_FULLSCREEN_HOTKEYS
-          default               :!
-          XQuartzFullscreenDisableHotkeys];
-    darwinFakeButtons = [self prefs_get_boolean:@PREFS_FAKEBUTTONS
-                         default               :darwinFakeButtons];
-    XQuartzOptionSendsAlt = [self prefs_get_boolean:@PREFS_OPTION_SENDS_ALT
-                             default               :XQuartzOptionSendsAlt];
-
-    if (darwinFakeButtons) {
-        const char *fake2, *fake3;
-
-        fake2 = [self prefs_get_string:@PREFS_FAKE_BUTTON2 default:NULL];
-        fake3 = [self prefs_get_string:@PREFS_FAKE_BUTTON3 default:NULL];
-
-        if (fake2 != NULL) darwinFakeMouse2Mask = DarwinParseModifierList(
-                fake2, TRUE);
-        if (fake3 != NULL) darwinFakeMouse3Mask = DarwinParseModifierList(
-                fake3, TRUE);
+    NSString * const windowItemModifiers = [defaults stringForKey:XQuartzPrefKeyWindowItemModifiers];
+    if (windowItemModifiers) {
+        windowItemModMask = DarwinParseModifierList(windowItemModifiers.UTF8String, FALSE);
     }
 
-    tem = [self prefs_get_string:@PREFS_APPKIT_MODIFIERS default:NULL];
-    if (tem != NULL) darwinAppKitModMask = DarwinParseModifierList(tem, TRUE);
+    XQuartzEnableKeyEquivalents = [defaults boolForKey:XQuartzPrefKeyKeyEquivs];
 
-    tem = [self prefs_get_string:@PREFS_WINDOW_ITEM_MODIFIERS default:NULL];
-    if (tem != NULL) {
-        windowItemModMask = DarwinParseModifierList(tem, FALSE);
-    }
-    else {
-        nsstr = NSLocalizedString(@"window item modifiers",
-                                  @"window item modifiers");
-        if (nsstr != NULL) {
-            tem = [nsstr UTF8String];
-            if ((tem != NULL) && strcmp(tem, "window item modifiers")) {
-                windowItemModMask = DarwinParseModifierList(tem, FALSE);
-            }
-        }
-    }
-
-    XQuartzEnableKeyEquivalents = [self prefs_get_boolean:@PREFS_KEYEQUIVS
-                                   default               :
-                                   XQuartzEnableKeyEquivalents];
-
-    darwinSyncKeymap = [self prefs_get_boolean:@PREFS_SYNC_KEYMAP
-                        default               :darwinSyncKeymap];
-
-    darwinDesiredDepth = [self prefs_get_integer:@PREFS_DEPTH
-                          default               :darwinDesiredDepth];
+    darwinSyncKeymap = [defaults boolForKey:XQuartzPrefKeySyncKeymap];
 
-    noTestExtensions = ![self prefs_get_boolean:@PREFS_TEST_EXTENSIONS
-                         default               :FALSE];
+    darwinDesiredDepth = [defaults integerForKey:XQuartzPrefKeyDepth];
 
-    noRenderExtension = ![self prefs_get_boolean:@PREFS_RENDER_EXTENSION
-                          default               :TRUE];
+    noTestExtensions = ![defaults boolForKey:XQuartzPrefKeyTESTExtension];
+    noRenderExtension = ![defaults boolForKey:XQuartzPrefKeyRENDERExtension];
 
-    XQuartzScrollInDeviceDirection =
-        [self prefs_get_boolean:@PREFS_SCROLL_IN_DEV_DIRECTION
-         default               :
-         XQuartzScrollInDeviceDirection];
-
-#if XQUARTZ_SPARKLE
-    NSURL *url = [self prefs_copy_url:@PREFS_UPDATE_FEED default:nil];
-    if (url) {
-        [[SUUpdater sharedUpdater] setFeedURL:url];
-        [url release];
-    }
-#endif
+    XQuartzScrollInDeviceDirection = [defaults boolForKey:XQuartzPrefKeyScrollInDeviceDirection];
 }
 
 /* This will end up at the end of the responder chain. */
@@ -1018,8 +661,9 @@ Bool
 X11ApplicationCanEnterRandR(void)
 {
     NSString *title, *msg;
+    NSUserDefaults * const defaults = NSUserDefaults.xquartzDefaults;
 
-    if ([X11App prefs_get_boolean:@PREFS_NO_RANDR_ALERT default:NO] ||
+    if ([defaults boolForKey:XQuartzPrefKeyNoRANDRAlert] ||
         XQuartzShieldingWindowLevel != 0)
         return TRUE;
 
@@ -1042,8 +686,7 @@ X11ApplicationCanEnterRandR(void)
 
     switch (alert_result) {
     case NSAlertOtherReturn:
-        [X11App prefs_set_boolean:@PREFS_NO_RANDR_ALERT value:YES];
-        [X11App prefs_synchronize];
+        [defaults setBool:YES forKey:XQuartzPrefKeyNoRANDRAlert];
 
     case NSAlertDefaultReturn:
         return YES;
@@ -1058,8 +701,9 @@ check_xinitrc(void)
 {
     char *tem, buf[1024];
     NSString *msg;
+    NSUserDefaults * const defaults = NSUserDefaults.xquartzDefaults;
 
-    if ([X11App prefs_get_boolean:@PREFS_DONE_XINIT_CHECK default:NO])
+    if ([defaults boolForKey:XQuartzPrefKeyDoneXinitCheck])
         return;
 
     tem = getenv("HOME");
@@ -1093,8 +737,7 @@ check_xinitrc(void)
     }
 
 done:
-    [X11App prefs_set_boolean:@PREFS_DONE_XINIT_CHECK value:YES];
-    [X11App prefs_synchronize];
+    [defaults setBool:YES forKey:XQuartzPrefKeyDoneXinitCheck];
 }
 
 static inline pthread_t
@@ -1130,15 +773,8 @@ X11ApplicationMain(int argc, char **argv, char **envp)
 
     @autoreleasepool {
         X11App = (X11Application *)[X11Application sharedApplication];
+        [X11App read_defaults];
 
-        app_prefs_domain_cfstr = (CFStringRef)[[NSBundle mainBundle] bundleIdentifier];
-
-        if (app_prefs_domain_cfstr == NULL) {
-            ErrorF("X11ApplicationMain: Unable to determine bundle identifier.  Your installation of XQuartz may be broken.\n");
-            app_prefs_domain_cfstr = CFSTR(BUNDLE_ID_PREFIX ".X11");
-        }
-
-        [NSApp read_defaults];
         [NSBundle loadNibNamed:@"main" owner:NSApp];
         [NSNotificationCenter.defaultCenter addObserver:NSApp
                                                selector:@selector (became_key:)
diff --git a/hw/xquartz/X11Controller.m b/hw/xquartz/X11Controller.m
index 3efda5083..3b55bb6a5 100644
--- a/hw/xquartz/X11Controller.m
+++ b/hw/xquartz/X11Controller.m
@@ -36,6 +36,7 @@
 
 #import "X11Controller.h"
 #import "X11Application.h"
+#import "NSUserDefaults+XQuartzDefaults.h"
 
 #include "opaque.h"
 #include "darwin.h"
@@ -74,21 +75,19 @@ extern char *bundle_id_prefix;
 - (void) awakeFromNib
 {
     X11Application *xapp = NSApp;
-    NSArray *array;
 
     /* Point X11Application at ourself. */
     xapp.controller = self;
 
-    array = [xapp prefs_get_array:@PREFS_APPSMENU];
-    if (array != nil) {
-        int count;
+    NSUserDefaults * const defaults = NSUserDefaults.xquartzDefaults;
+    NSArray *appsMenu = [defaults arrayForKey:XQuartzPrefKeyAppsMenu];
+
+    if (appsMenu) {
+        int count = appsMenu.count;
 
         /* convert from [TITLE1 COMMAND1 TITLE2 COMMAND2 ...]
            to [[TITLE1 COMMAND1] [TITLE2 COMMAND2] ...] format. */
-
-        count = [array count];
-        if (count > 0
-            && ![[array objectAtIndex:0] isKindOfClass:[NSArray class]]) {
+        if (count > 0 && ![appsMenu[0] isKindOfClass:NSArray.class]) {
             int i;
             NSMutableArray *copy, *sub;
 
@@ -96,24 +95,24 @@ extern char *bundle_id_prefix;
 
             for (i = 0; i < count / 2; i++) {
                 sub = [[NSMutableArray alloc] initWithCapacity:3];
-                [sub addObject:[array objectAtIndex:i * 2]];
-                [sub addObject:[array objectAtIndex:i * 2 + 1]];
+                [sub addObject:appsMenu[i * 2]];
+                [sub addObject:appsMenu[i * 2 + 1]];
                 [sub addObject:@""];
                 [copy addObject:sub];
                 [sub release];
             }
 
-            array = copy;
+            appsMenu = copy;
+            [defaults setObject:appsMenu forKey:XQuartzPrefKeyAppsMenu];
         }
 
-        [self set_apps_menu:array];
+        [self set_apps_menu:appsMenu];
     }
 
-    [[NSNotificationCenter defaultCenter]
-     addObserver: self
-        selector: @selector(apps_table_done:)
-            name: NSWindowWillCloseNotification
-          object: self.apps_table.window];
+    [NSNotificationCenter.defaultCenter addObserver:self
+                                           selector:@selector(apps_table_done:)
+                                               name:NSWindowWillCloseNotification
+                                             object:self.apps_table.window];
 }
 
 - (void) item_selected:sender
@@ -349,9 +348,12 @@ extern char *bundle_id_prefix;
     int stdout_pipe[2];
     int stderr_pipe[2];
 
-    newargv[0] = [X11App prefs_get_string:@PREFS_LOGIN_SHELL default:"/bin/sh"];
+    NSUserDefaults * const defaults = NSUserDefaults.xquartzDefaults;
+    NSString * const shell = [defaults stringForKey:XQuartzPrefKeyLoginShell];
+
+    newargv[0] = shell.fileSystemRepresentation;
     newargv[1] = "-c";
-    newargv[2] = [filename UTF8String];
+    newargv[2] = filename.fileSystemRepresentation;
     newargv[3] = NULL;
 
     s = getenv("DISPLAY");
@@ -494,8 +496,8 @@ extern char *bundle_id_prefix;
     [self remove_apps_menu];
     [self install_apps_menu:table_apps];
 
-    [NSApp prefs_set_array:@PREFS_APPSMENU value:table_apps];
-    [NSApp prefs_synchronize];
+    NSUserDefaults * const defaults = NSUserDefaults.xquartzDefaults;
+    [defaults setObject:table_apps forKey:XQuartzPrefKeyAppsMenu];
 
     [[apps_table window] orderOut:sender];
 
@@ -672,15 +674,15 @@ extern char *bundle_id_prefix;
 
 - (IBAction) enable_fullscreen_changed:sender
 {
-    XQuartzRootlessDefault = !self.enable_fullscreen.intValue;
+    XQuartzRootlessDefault = !self.enable_fullscreen.state;
 
     [self.enable_fullscreen_menu setEnabled:!XQuartzRootlessDefault];
     [self.enable_fullscreen_menu_text setTextColor:XQuartzRootlessDefault ? NSColor.disabledControlTextColor : NSColor.controlTextColor];
 
     DarwinSendDDXEvent(kXquartzSetRootless, 1, XQuartzRootlessDefault);
 
-    [NSApp prefs_set_boolean:@PREFS_ROOTLESS value:XQuartzRootlessDefault];
-    [NSApp prefs_synchronize];
+    NSUserDefaults * const defaults = NSUserDefaults.xquartzDefaults;
+    [defaults setBool:XQuartzRootlessDefault forKey:XQuartzPrefKeyRootless];
 }
 
 - (IBAction) toggle_fullscreen:sender
@@ -693,55 +695,43 @@ extern char *bundle_id_prefix;
     if (!sender)
         return;
 
+    NSUserDefaults * const defaults = NSUserDefaults.xquartzDefaults;
+
     if (sender == self.fake_buttons) {
-        darwinFakeButtons = self.fake_buttons.intValue;
-        [NSApp prefs_set_boolean:@PREFS_FAKEBUTTONS value:darwinFakeButtons];
-    }
-    else if (sender == self.enable_keyequivs) {
-        XQuartzEnableKeyEquivalents = self.enable_keyequivs.intValue;
-        [NSApp prefs_set_boolean:@PREFS_KEYEQUIVS value:
-         XQuartzEnableKeyEquivalents];
-    }
-    else if (sender == self.sync_keymap) {
-        darwinSyncKeymap = self.sync_keymap.intValue;
-        [NSApp prefs_set_boolean:@PREFS_SYNC_KEYMAP value:darwinSyncKeymap];
-    }
-    else if (sender == self.enable_fullscreen_menu) {
-        XQuartzFullscreenMenu = self.enable_fullscreen_menu.intValue;
-        [NSApp prefs_set_boolean:@PREFS_FULLSCREEN_MENU value:
-         XQuartzFullscreenMenu];
-    }
-    else if (sender == self.option_sends_alt) {
+        darwinFakeButtons = !!self.fake_buttons.state;
+        [defaults setBool:darwinFakeButtons forKey:XQuartzPrefKeyFakeButtons];
+    } else if (sender == self.enable_keyequivs) {
+        XQuartzEnableKeyEquivalents = !!self.enable_keyequivs.state;
+        [defaults setBool:XQuartzEnableKeyEquivalents forKey:XQuartzPrefKeyKeyEquivs];
+    } else if (sender == self.sync_keymap) {
+        darwinSyncKeymap = !!self.sync_keymap.state;
+        [defaults setBool:darwinSyncKeymap forKey:XQuartzPrefKeySyncKeymap];
+    } else if (sender == self.enable_fullscreen_menu) {
+        XQuartzFullscreenMenu = !!self.enable_fullscreen_menu.state;
+        [defaults setBool:XQuartzFullscreenMenu forKey:XQuartzPrefKeyFullscreenMenu];
+    } else if (sender == self.option_sends_alt) {
         BOOL prev_opt_sends_alt = XQuartzOptionSendsAlt;
 
-        XQuartzOptionSendsAlt = self.option_sends_alt.intValue;
-        [NSApp prefs_set_boolean:@PREFS_OPTION_SENDS_ALT value:
-         XQuartzOptionSendsAlt];
+        XQuartzOptionSendsAlt = !!self.option_sends_alt.state;
+        [defaults setBool:XQuartzOptionSendsAlt forKey:XQuartzPrefKeyOptionSendsAlt];
 
         if (prev_opt_sends_alt != XQuartzOptionSendsAlt)
             QuartsResyncKeymap(TRUE);
-    }
-    else if (sender == self.click_through) {
-        [NSApp prefs_set_boolean:@PREFS_CLICK_THROUGH value:self.click_through.intValue];
-    }
-    else if (sender == self.focus_follows_mouse) {
-        [NSApp prefs_set_boolean:@PREFS_FFM value:self.focus_follows_mouse.intValue];
-    }
-    else if (sender == self.focus_on_new_window) {
-        [NSApp prefs_set_boolean:@PREFS_FOCUS_ON_NEW_WINDOW value:self.focus_on_new_window.intValue];
-    }
-    else if (sender == self.enable_auth) {
-        [NSApp prefs_set_boolean:@PREFS_NO_AUTH value:!self.enable_auth.intValue];
-    }
-    else if (sender == self.enable_tcp) {
-        [NSApp prefs_set_boolean:@PREFS_NO_TCP value:!self.enable_tcp.intValue];
-    }
-    else if (sender == self.depth) {
-        [NSApp prefs_set_integer:@PREFS_DEPTH value:self.depth.selectedTag];
-    }
-    else if (sender == self.sync_pasteboard) {
+    } else if (sender == self.click_through) {
+        [defaults setBool:!!self.click_through.state forKey:XQuartzPrefKeyClickThrough];
+    } else if (sender == self.focus_follows_mouse) {
+        [defaults setBool:!!self.focus_follows_mouse.state forKey:XQuartzPrefKeyFocusFollowsMouse];
+    } else if (sender == self.focus_on_new_window) {
+        [defaults setBool:!!self.focus_on_new_window.state forKey:XQuartzPrefKeyFocusOnNewWindow];
+    } else if (sender == self.enable_auth) {
+        [defaults setBool:!self.enable_auth.state forKey:XQuartzPrefKeyNoAuth];
+    } else if (sender == self.enable_tcp) {
+        [defaults setBool:!self.enable_tcp.state forKey:XQuartzPrefKeyNoTCP];
+    } else if (sender == self.depth) {
+        [defaults setInteger:self.depth.selectedTag forKey:XQuartzPrefKeyDepth];
+    } else if (sender == self.sync_pasteboard) {
         BOOL pbproxy_active = self.sync_pasteboard.intValue;
-        [NSApp prefs_set_boolean:@PREFS_SYNC_PB value:pbproxy_active];
+        [defaults setBool:pbproxy_active forKey:XQuartzPrefKeySyncPasteboard];
 
         [self.sync_pasteboard_to_clipboard setEnabled:pbproxy_active];
         [self.sync_pasteboard_to_primary setEnabled:pbproxy_active];
@@ -751,33 +741,27 @@ extern char *bundle_id_prefix;
         // setEnabled doesn't do this...
         [self.sync_text1 setTextColor:pbproxy_active ? NSColor.controlTextColor : NSColor.disabledControlTextColor];
         [self.sync_text2 setTextColor:pbproxy_active ? NSColor.controlTextColor : NSColor.disabledControlTextColor];
+    } else if (sender == self.sync_pasteboard_to_clipboard) {
+        [defaults setBool:!!self.sync_pasteboard_to_clipboard.state forKey:XQuartzPrefKeySyncPasteboardToClipboard];
+    } else if (sender == self.sync_pasteboard_to_primary) {
+        [defaults setBool:!!self.sync_pasteboard_to_primary.state forKey:XQuartzPrefKeySyncPasteboardToPrimary];
+    } else if (sender == self.sync_clipboard_to_pasteboard) {
+        [defaults setBool:!!self.sync_clipboard_to_pasteboard.state forKey:XQuartzPrefKeySyncClipboardToPasteBoard];
+    } else if (sender == self.sync_primary_immediately) {
+        [defaults setBool:!!self.sync_primary_immediately.state forKey:XQuartzPrefKeySyncPrimaryOnSelect];
+    } else if (sender == self.scroll_in_device_direction) {
+        XQuartzScrollInDeviceDirection = !!self.scroll_in_device_direction.state;
+        [defaults setBool:XQuartzScrollInDeviceDirection forKey:XQuartzPrefKeyScrollInDeviceDirection];
     }
-    else if (sender == self.sync_pasteboard_to_clipboard) {
-        [NSApp prefs_set_boolean:@PREFS_SYNC_PB_TO_CLIPBOARD value:self.sync_pasteboard_to_clipboard.intValue];
-    }
-    else if (sender == self.sync_pasteboard_to_primary) {
-        [NSApp prefs_set_boolean:@PREFS_SYNC_PB_TO_PRIMARY value:self.sync_pasteboard_to_primary.intValue];
-    }
-    else if (sender == self.sync_clipboard_to_pasteboard) {
-        [NSApp prefs_set_boolean:@PREFS_SYNC_CLIPBOARD_TO_PB value:self.sync_clipboard_to_pasteboard.intValue];
-    }
-    else if (sender == self.sync_primary_immediately) {
-        [NSApp prefs_set_boolean:@PREFS_SYNC_PRIMARY_ON_SELECT value:self.sync_primary_immediately.intValue];
-    }
-    else if (sender == self.scroll_in_device_direction) {
-        XQuartzScrollInDeviceDirection = self.scroll_in_device_direction.intValue;
-        [NSApp prefs_set_boolean:@PREFS_SCROLL_IN_DEV_DIRECTION value:XQuartzScrollInDeviceDirection];
-    }
-
-    [NSApp prefs_synchronize];
 
     DarwinSendDDXEvent(kXquartzReloadPreferences, 0);
 }
 
 - (IBAction) prefs_show:sender
 {
-    BOOL pbproxy_active =
-        [NSApp prefs_get_boolean:@PREFS_SYNC_PB default:YES];
+    NSUserDefaults * const defaults = NSUserDefaults.xquartzDefaults;
+
+    BOOL pbproxy_active = [defaults boolForKey:XQuartzPrefKeySyncPasteboard];
 
     [self.scroll_in_device_direction setIntValue:XQuartzScrollInDeviceDirection];
 
@@ -785,20 +769,20 @@ extern char *bundle_id_prefix;
     [self.enable_keyequivs setIntValue:XQuartzEnableKeyEquivalents];
     [self.sync_keymap setIntValue:darwinSyncKeymap];
     [self.option_sends_alt setIntValue:XQuartzOptionSendsAlt];
-    [self.click_through setIntValue:[NSApp prefs_get_boolean:@PREFS_CLICK_THROUGH default:NO]];
-    [self.focus_follows_mouse setIntValue:[NSApp prefs_get_boolean:@PREFS_FFM default:NO]];
-    [self.focus_on_new_window setIntValue:[NSApp prefs_get_boolean:@PREFS_FOCUS_ON_NEW_WINDOW default:YES]];
+    [self.click_through setIntValue:[defaults boolForKey:XQuartzPrefKeyClickThrough]];
+    [self.focus_follows_mouse setIntValue:[defaults boolForKey:XQuartzPrefKeyFocusFollowsMouse]];
+    [self.focus_on_new_window setIntValue:[defaults boolForKey:XQuartzPrefKeyFocusOnNewWindow]];
 
-    [self.enable_auth setIntValue:![NSApp prefs_get_boolean:@PREFS_NO_AUTH default:NO]];
-    [self.enable_tcp setIntValue:![NSApp prefs_get_boolean:@PREFS_NO_TCP default:NO]];
+    [self.enable_auth setIntValue:![defaults boolForKey:XQuartzPrefKeyNoAuth]];
+    [self.enable_tcp setIntValue:![defaults boolForKey:XQuartzPrefKeyNoTCP]];
 
-    [self.depth selectItemAtIndex:[self.depth indexOfItemWithTag:[NSApp prefs_get_integer:@PREFS_DEPTH default:-1]]];
+    [self.depth selectItemAtIndex:[self.depth indexOfItemWithTag:[defaults integerForKey:XQuartzPrefKeyDepth]]];
 
     [self.sync_pasteboard setIntValue:pbproxy_active];
-    [self.sync_pasteboard_to_clipboard setIntValue:[NSApp prefs_get_boolean:@PREFS_SYNC_PB_TO_CLIPBOARD default:YES]];
-    [self.sync_pasteboard_to_primary setIntValue:[NSApp prefs_get_boolean:@PREFS_SYNC_PB_TO_PRIMARY default:YES]];
-    [self.sync_clipboard_to_pasteboard setIntValue:[NSApp prefs_get_boolean:@PREFS_SYNC_CLIPBOARD_TO_PB default:YES]];
-    [self.sync_primary_immediately setIntValue:[NSApp prefs_get_boolean:@PREFS_SYNC_PRIMARY_ON_SELECT default:NO]];
+    [self.sync_pasteboard_to_clipboard setIntValue:[defaults boolForKey:XQuartzPrefKeySyncPasteboardToClipboard]];
+    [self.sync_pasteboard_to_primary setIntValue:[defaults boolForKey:XQuartzPrefKeySyncPasteboardToPrimary]];
+    [self.sync_clipboard_to_pasteboard setIntValue:[defaults boolForKey:XQuartzPrefKeySyncClipboardToPasteBoard]];
+    [self.sync_primary_immediately setIntValue:[defaults boolForKey:XQuartzPrefKeySyncPrimaryOnSelect]];
 
     [self.sync_pasteboard_to_clipboard setEnabled:pbproxy_active];
     [self.sync_pasteboard_to_primary setEnabled:pbproxy_active];
@@ -863,9 +847,11 @@ extern char *bundle_id_prefix;
     NSString *msg;
     NSString *title;
 
-    if (self.can_quit ||
-        [X11App prefs_get_boolean:@PREFS_NO_QUIT_ALERT default:NO])
+    NSUserDefaults * const defaults = NSUserDefaults.xquartzDefaults;
+
+    if (self.can_quit || [defaults boolForKey:XQuartzPrefKeyNoQuitAlert]) {
         return NSTerminateNow;
+    }
 
     /* Make sure we're frontmost. */
     [NSApp activateIgnoringOtherApps:YES];
@@ -887,8 +873,6 @@ extern char *bundle_id_prefix;
 
 - (void) applicationWillTerminate:(NSNotification *)aNotification _X_NORETURN
 {
-    [X11App prefs_synchronize];
-
     /* shutdown the X server, it will exit () for us. */
     DarwinSendDDXEvent(kXquartzQuit, 0);
 
diff --git a/hw/xquartz/bundle/Xquartz.plist b/hw/xquartz/bundle/Xquartz.plist
deleted file mode 100644
index e15704516..000000000
--- a/hw/xquartz/bundle/Xquartz.plist
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-
-<!-- This file contains system-wide defaults for the Apple X11 server -->
-
-<plist version="1.0">
-<dict>
-	<key>apps_menu</key>
-	<array>
-		<array>
-			<string>Terminal</string>
-			<string>xterm</string>
-			<string>n</string>
-		</array>
-		<array>
-			<string>xman</string>
-			<string>xman</string>
-			<string></string>
-		</array>
-		<array>
-			<string>xlogo</string>
-			<string>xlogo</string>
-			<string></string>
-		</array>
-	</array>
-</dict>
-</plist>
diff --git a/hw/xquartz/meson.build b/hw/xquartz/meson.build
index ec143b599..deae2b3c9 100644
--- a/hw/xquartz/meson.build
+++ b/hw/xquartz/meson.build
@@ -20,6 +20,7 @@ endif
 
 # libxquartz
 srcs_libxquartz = [
+    'NSUserDefaults+XQuartzDefaults.m',
     'X11Application.m',
     'X11Controller.m',
     'applewm.c',
diff --git a/hw/xquartz/quartz.c b/hw/xquartz/quartz.c
index 233570a75..4bbe56b93 100644
--- a/hw/xquartz/quartz.c
+++ b/hw/xquartz/quartz.c
@@ -85,14 +85,16 @@ int aquaMenuBarHeight = 0;
 QuartzModeProcsPtr quartzProcs = NULL;
 const char             *quartzOpenGLBundle = NULL;
 
-Bool XQuartzFullscreenDisableHotkeys = TRUE;
-Bool XQuartzOptionSendsAlt = FALSE;
-Bool XQuartzEnableKeyEquivalents = TRUE;
+/* These are initialized by X11Application with default values set in NSUserDefaults+XQuartzDefaults */
+Bool XQuartzFullscreenDisableHotkeys;
+Bool XQuartzOptionSendsAlt;
+Bool XQuartzEnableKeyEquivalents;
+Bool XQuartzFullscreenMenu;
+Bool XQuartzRootlessDefault;
+
 Bool XQuartzFullscreenVisible = FALSE;
-Bool XQuartzRootlessDefault = TRUE;
 Bool XQuartzIsRootless = TRUE;
 Bool XQuartzServerVisible = FALSE;
-Bool XQuartzFullscreenMenu = FALSE;
 
 int32_t XQuartzShieldingWindowLevel = 0;
 


More information about the xorg-commit mailing list