[gtk/wip/chergert/quartz4u] macos: track changes to various settings



commit 1711d5f0aa398fc381c8e1a3d687d1f564c9e7f3
Author: Christian Hergert <chergert redhat com>
Date:   Sat May 9 20:37:16 2020 -0700

    macos: track changes to various settings

 gdk/macos/gdkmacosdisplay-private.h  |   1 +
 gdk/macos/gdkmacosdisplay-settings.c | 165 ++++++++++++++++++++++++++++-------
 gdk/macos/gdkmacosdisplay.c          |  26 ++++++
 3 files changed, 160 insertions(+), 32 deletions(-)
---
diff --git a/gdk/macos/gdkmacosdisplay-private.h b/gdk/macos/gdkmacosdisplay-private.h
index 3963a681f1..baf0df105a 100644
--- a/gdk/macos/gdkmacosdisplay-private.h
+++ b/gdk/macos/gdkmacosdisplay-private.h
@@ -70,6 +70,7 @@ NSWindow        *_gdk_macos_display_find_native_under_pointer      (GdkMacosDisp
 gboolean         _gdk_macos_display_get_setting                    (GdkMacosDisplay *self,
                                                                     const gchar     *setting,
                                                                     GValue          *value);
+void             _gdk_macos_display_reload_settings                (GdkMacosDisplay *self);
 
 G_END_DECLS
 
diff --git a/gdk/macos/gdkmacosdisplay-settings.c b/gdk/macos/gdkmacosdisplay-settings.c
index cf552cce07..558e0b81e0 100644
--- a/gdk/macos/gdkmacosdisplay-settings.c
+++ b/gdk/macos/gdkmacosdisplay-settings.c
@@ -20,9 +20,80 @@
  * SPDX-License-Identifier: LGPL-2.1-or-later
  */
 
+#include "config.h"
+
+#include <AppKit/AppKit.h>
+
+#include "gdkdisplayprivate.h"
+
 #include "gdkmacosdisplay-private.h"
 #include "gdkmacosutils-private.h"
 
+typedef struct
+{
+  const char *font_name;
+  int         xft_dpi;
+  int         double_click_time;
+  int         cursor_blink_timeout;
+  guint       enable_animations : 1;
+  guint       shell_shows_desktop : 1;
+  guint       shell_shows_menubar : 1;
+  guint       primary_button_warps_slider : 1;
+} GdkMacosSettings;
+
+static GdkMacosSettings current_settings;
+static gboolean current_settings_initialized;
+
+static void
+_gdk_macos_settings_load (GdkMacosSettings *settings)
+{
+  GDK_BEGIN_MACOS_ALLOC_POOL;
+
+  NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+  NSString *name;
+  NSInteger ival;
+  float fval;
+  char *str;
+  int pt_size;
+
+  g_assert (settings != NULL);
+
+  settings->shell_shows_desktop = TRUE;
+  settings->shell_shows_menubar = TRUE;
+  settings->enable_animations = TRUE;
+  settings->xft_dpi = 72 * 1024;
+
+  ival = [defaults integerForKey:@"NSTextInsertionPointBlinkPeriod"];
+  if (ival > 0)
+    settings->cursor_blink_timeout = ival;
+  else
+    settings->cursor_blink_timeout = 1000;
+
+  settings->primary_button_warps_slider =
+      [[NSUserDefaults standardUserDefaults] boolForKey:@"AppleScrollerPagingBehavior"] == YES;
+
+  fval = [defaults floatForKey:@"com.apple.mouse.doubleClickThreshold"];
+  if (fval == 0.0)
+    fval = 0.5;
+  settings->double_click_time = fval * 1000;
+
+  name = [[NSFont systemFontOfSize:0] familyName];
+  pt_size = (gint)[[NSFont userFontOfSize:0] pointSize];
+  /* Let's try to use the "views" font size (12pt) by default. This is
+   * used for lists/text/other "content" which is the largest parts of
+   * apps, using the "regular control" size (13pt) looks a bit out of
+   * place. We might have to tweak this.
+   *
+   * The size has to be hardcoded as there doesn't seem to be a way to
+   * get the views font size programmatically.
+   */
+  str = g_strdup_printf ("%s %d", [name UTF8String], pt_size);
+  settings->font_name = g_intern_string (str);
+  g_free (str);
+
+  GDK_END_MACOS_ALLOC_POOL;
+}
+
 gboolean
 _gdk_macos_display_get_setting (GdkMacosDisplay *self,
                                 const gchar     *setting,
@@ -36,54 +107,51 @@ _gdk_macos_display_get_setting (GdkMacosDisplay *self,
   g_return_val_if_fail (setting != NULL, FALSE);
   g_return_val_if_fail (value != NULL, FALSE);
 
+  if (!current_settings_initialized)
+    {
+      _gdk_macos_settings_load (&current_settings);
+      current_settings_initialized = TRUE;
+    }
 
   if (FALSE) {}
+  else if (strcmp (setting, "gtk-enable-animations") == 0)
+    {
+      g_value_set_boolean (value, current_settings.enable_animations);
+      ret = TRUE;
+    }
+  else if (strcmp (setting, "gtk-xft-dpi") == 0)
+    {
+      g_value_set_int (value, current_settings.xft_dpi);
+      ret = TRUE;
+    }
+  else if (strcmp (setting, "gtk-cursor-blink-timeout") == 0)
+    {
+      g_value_set_int (value, current_settings.cursor_blink_timeout);
+      ret = TRUE;
+    }
   else if (strcmp (setting, "gtk-double-click-time") == 0)
     {
-      NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-      float t = [defaults floatForKey:@"com.apple.mouse.doubleClickThreshold"];
-
-      /* No user setting, use the default in OS X. */
-      if (t == 0.0)
-        t = 0.5;
-
-      g_value_set_int (value, t * 1000);
-
+      g_value_set_int (value, current_settings.double_click_time);
       ret = TRUE;
     }
   else if (strcmp (setting, "gtk-font-name") == 0)
     {
-      NSString *name;
-      char *str;
-      gint size;
-
-      name = [[NSFont systemFontOfSize:0] familyName];
-      size = (gint)[[NSFont userFontOfSize:0] pointSize];
-
-      /* Let's try to use the "views" font size (12pt) by default. This is
-       * used for lists/text/other "content" which is the largest parts of
-       * apps, using the "regular control" size (13pt) looks a bit out of
-       * place. We might have to tweak this.
-       */
-
-      /* The size has to be hardcoded as there doesn't seem to be a way to
-       * get the views font size programmatically.
-       */
-      str = g_strdup_printf ("%s %d", [name UTF8String], size);
-      g_value_take_string (value, g_steal_pointer (&str));
-
+      g_value_set_static_string (value, current_settings.font_name);
       ret = TRUE;
     }
   else if (strcmp (setting, "gtk-primary-button-warps-slider") == 0)
     {
-      BOOL b = [[NSUserDefaults standardUserDefaults] boolForKey:@"AppleScrollerPagingBehavior"];
-      /* If the Apple property is YES, it means "warp" */
-      g_value_set_boolean (value, b == YES);
+      g_value_set_boolean (value, current_settings.primary_button_warps_slider);
       ret = TRUE;
     }
   else if (strcmp (setting, "gtk-shell-shows-desktop") == 0)
     {
-      g_value_set_boolean (value, TRUE);
+      g_value_set_boolean (value, current_settings.shell_shows_desktop);
+      ret = TRUE;
+    }
+  else if (strcmp (setting, "gtk-shell-shows-menubar") == 0)
+    {
+      g_value_set_boolean (value, current_settings.shell_shows_menubar);
       ret = TRUE;
     }
 
@@ -91,3 +159,36 @@ _gdk_macos_display_get_setting (GdkMacosDisplay *self,
 
   return ret;
 }
+
+void
+_gdk_macos_display_reload_settings (GdkMacosDisplay *self)
+{
+  GdkMacosSettings old_settings;
+
+  g_return_if_fail (GDK_IS_MACOS_DISPLAY (self));
+
+  old_settings = current_settings;
+  _gdk_macos_settings_load (&current_settings);
+  current_settings_initialized = TRUE;
+
+  if (old_settings.xft_dpi != current_settings.xft_dpi)
+    gdk_display_setting_changed (GDK_DISPLAY (self), "gtk-xft-dpi");
+
+  if (old_settings.double_click_time != current_settings.double_click_time)
+    gdk_display_setting_changed (GDK_DISPLAY (self), "gtk-double-click-time");
+
+  if (old_settings.enable_animations != current_settings.enable_animations)
+    gdk_display_setting_changed (GDK_DISPLAY (self), "gtk-enable-animations");
+
+  if (old_settings.font_name != current_settings.font_name)
+    gdk_display_setting_changed (GDK_DISPLAY (self), "gtk-font-name");
+
+  if (old_settings.primary_button_warps_slider != current_settings.primary_button_warps_slider)
+    gdk_display_setting_changed (GDK_DISPLAY (self), "gtk-primary-button-warps-slider");
+
+  if (old_settings.shell_shows_menubar != current_settings.shell_shows_menubar)
+    gdk_display_setting_changed (GDK_DISPLAY (self), "gtk-shell-shows-menubar");
+
+  if (old_settings.shell_shows_desktop != current_settings.shell_shows_desktop)
+    gdk_display_setting_changed (GDK_DISPLAY (self), "gtk-shell-shows-desktop");
+}
diff --git a/gdk/macos/gdkmacosdisplay.c b/gdk/macos/gdkmacosdisplay.c
index 955b507f84..72ca21a9a2 100644
--- a/gdk/macos/gdkmacosdisplay.c
+++ b/gdk/macos/gdkmacosdisplay.c
@@ -247,6 +247,20 @@ gdk_macos_display_monitors_changed_cb (CFNotificationCenterRef  center,
   _gdk_macos_display_reload_monitors (self);
 }
 
+static void
+gdk_macos_display_user_defaults_changed_cb (CFNotificationCenterRef  center,
+                                            void                    *observer,
+                                            CFStringRef              name,
+                                            const void              *object,
+                                            CFDictionaryRef          userInfo)
+{
+  GdkMacosDisplay *self = observer;
+
+  g_assert (GDK_IS_MACOS_DISPLAY (self));
+
+  _gdk_macos_display_reload_settings (self);
+}
+
 void
 _gdk_macos_display_reload_monitors (GdkMacosDisplay *self)
 {
@@ -539,6 +553,11 @@ gdk_macos_display_finalize (GObject *object)
                                       CFSTR ("NSApplicationDidChangeScreenParametersNotification"),
                                       NULL);
 
+  CFNotificationCenterRemoveObserver (CFNotificationCenterGetDistributedCenter (),
+                                      self,
+                                      CFSTR ("NSUserDefaultsDidChangeNotification"),
+                                      NULL);
+
   g_clear_pointer (&self->frame_source, g_source_unref);
   g_clear_pointer (&self->monitors, g_ptr_array_unref);
   g_clear_pointer (&self->name, g_free);
@@ -619,6 +638,13 @@ _gdk_macos_display_open (const gchar *display_name)
                                    NULL,
                                    CFNotificationSuspensionBehaviorDeliverImmediately);
 
+  CFNotificationCenterAddObserver (CFNotificationCenterGetDistributedCenter (),
+                                   self,
+                                   gdk_macos_display_user_defaults_changed_cb,
+                                   CFSTR ("NSUserDefaultsDidChangeNotification"),
+                                   NULL,
+                                   CFNotificationSuspensionBehaviorDeliverImmediately);
+
   if (event_source == NULL)
     {
       event_source = _gdk_macos_event_source_new (self);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]