From 325ea8da548bac876d7c707b616e1bb4190305f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Wed, 13 Dec 2023 17:31:07 +0100 Subject: [PATCH] xsettings: Get UI scaling factor from dedicated D-Bus API Instead of getting the UI scaling factor from the display configuration API, get it from a new X11 properties API exposed by mutter. --- plugins/xsettings/gsd-xsettings-manager.c | 140 ++++++++-------------- 1 file changed, 53 insertions(+), 87 deletions(-) diff --git a/plugins/xsettings/gsd-xsettings-manager.c b/plugins/xsettings/gsd-xsettings-manager.c index f8ec6ebc..8a8f069f 100644 --- a/plugins/xsettings/gsd-xsettings-manager.c +++ b/plugins/xsettings/gsd-xsettings-manager.c @@ -609,81 +609,47 @@ get_dpi_from_gsettings (GsdXSettingsManager *manager) return dpi * factor; } -static gboolean -get_legacy_ui_scale (GVariantIter *properties, - int *scale) -{ - const char *key; - GVariant *value; - - *scale = 0; - - while (g_variant_iter_loop (properties, "{&sv}", &key, &value)) { - if (!g_str_equal (key, "legacy-ui-scaling-factor")) - continue; - - *scale = g_variant_get_int32 (value); - break; - } - - if (*scale < 1) { - g_warning ("Failed to get current UI legacy scaling factor"); - *scale = 1; - return FALSE; - } - - return TRUE; -} - -#define MODE_FORMAT "(siiddada{sv})" -#define MODES_FORMAT "a" MODE_FORMAT - -#define MONITOR_SPEC_FORMAT "(ssss)" -#define MONITOR_FORMAT "(" MONITOR_SPEC_FORMAT MODES_FORMAT "a{sv})" -#define MONITORS_FORMAT "a" MONITOR_FORMAT - -#define LOGICAL_MONITOR_FORMAT "(iiduba" MONITOR_SPEC_FORMAT "a{sv})" -#define LOGICAL_MONITORS_FORMAT "a" LOGICAL_MONITOR_FORMAT - -#define CURRENT_STATE_FORMAT "(u" MONITORS_FORMAT LOGICAL_MONITORS_FORMAT "a{sv})" - static int get_window_scale (GsdXSettingsManager *manager) { g_autoptr(GError) error = NULL; - g_autoptr(GVariant) current_state = NULL; + g_autoptr(GVariant) res = NULL; + g_autoptr(GVariant) ui_scaling_factor_variant = NULL; g_autoptr(GVariantIter) properties = NULL; - int scale = 1; - - current_state = - g_dbus_connection_call_sync (manager->dbus_connection, - "org.gnome.Mutter.DisplayConfig", - "/org/gnome/Mutter/DisplayConfig", - "org.gnome.Mutter.DisplayConfig", - "GetCurrentState", - NULL, - NULL, - G_DBUS_CALL_FLAGS_NO_AUTO_START, - -1, - NULL, - &error); - if (!current_state) { - g_warning ("Failed to get current display configuration state: %s", - error->message); + int ui_scaling_factor = 1; + + res = g_dbus_connection_call_sync (manager->dbus_connection, + "org.gnome.Mutter.X11", + "/org/gnome/Mutter/X11", + "org.freedesktop.DBus.Properties", + "Get", + g_variant_new ("(ss)", + "org.gnome.Mutter.X11", + "UiScalingFactor"), + NULL, + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, + NULL, + &error); + if (!res) { + if (g_error_matches (error, + G_DBUS_ERROR, + G_DBUS_ERROR_NAME_HAS_NO_OWNER)) { + /* Mutter X11 interface is not yet on the bus, this is expected + * while starting up, it'll appear on the bus right away. + */ + } else { + g_warning ("Failed to get current UI scaling factor: %s", + error->message); + } + return 1; } - g_variant_get (current_state, - CURRENT_STATE_FORMAT, - NULL, - NULL, - NULL, - &properties); - - if (!get_legacy_ui_scale (properties, &scale)) - g_warning ("Failed to get current UI legacy scaling factor"); + g_variant_get (res, "(v)", &ui_scaling_factor_variant); + g_variant_get (ui_scaling_factor_variant, "i", &ui_scaling_factor); - return scale; + return ui_scaling_factor; } typedef struct { @@ -1120,33 +1086,33 @@ setup_xsettings_managers (GsdXSettingsManager *manager) } static void -monitors_changed (GsdXSettingsManager *manager) +ui_scaling_factor_changed (GsdXSettingsManager *manager) { update_xft_settings (manager); queue_notify (manager); } static void -on_monitors_changed (GDBusConnection *connection, - const gchar *sender_name, - const gchar *object_path, - const gchar *interface_name, - const gchar *signal_name, - GVariant *parameters, - gpointer data) +on_mutter_x11_properties_changed (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer data) { GsdXSettingsManager *manager = data; - monitors_changed (manager); + ui_scaling_factor_changed (manager); } static void -on_display_config_name_appeared_handler (GDBusConnection *connection, - const gchar *name, - const gchar *name_owner, - gpointer data) +on_mutter_x11_name_appeared_handler (GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer data) { GsdXSettingsManager *manager = data; - monitors_changed (manager); + ui_scaling_factor_changed (manager); } static void @@ -1422,20 +1388,20 @@ gsd_xsettings_manager_start (GsdXSettingsManager *manager, manager->monitors_changed_id = g_dbus_connection_signal_subscribe (manager->dbus_connection, - "org.gnome.Mutter.DisplayConfig", - "org.gnome.Mutter.DisplayConfig", - "MonitorsChanged", - "/org/gnome/Mutter/DisplayConfig", + "org.gnome.Mutter.X11", + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + "/org/gnome/Mutter/X11", NULL, G_DBUS_SIGNAL_FLAGS_NONE, - on_monitors_changed, + on_mutter_x11_properties_changed, manager, NULL); manager->display_config_watch_id = g_bus_watch_name_on_connection (manager->dbus_connection, - "org.gnome.Mutter.DisplayConfig", + "org.gnome.Mutter.X11", G_BUS_NAME_WATCHER_FLAGS_NONE, - on_display_config_name_appeared_handler, + on_mutter_x11_name_appeared_handler, NULL, manager, NULL); -- 2.45.1