[gtk/wip/chergert/quartz4u] macos: track changes to various settings
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/chergert/quartz4u] macos: track changes to various settings
- Date: Sun, 10 May 2020 03:38:16 +0000 (UTC)
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 (¤t_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 (¤t_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]