diff options
author | Bastien Nocera <hadess@hadess.net> | 2018-02-22 17:14:13 +0100 |
---|---|---|
committer | Bastien Nocera <hadess@hadess.net> | 2018-02-27 16:29:33 +0100 |
commit | 522640a6df95312669871e4f881afe4e37e495f9 (patch) | |
tree | 640e2693568862491892d2c7fbfb3c9c85b79e1b | |
parent | 7100dbb1d754d81440c929ad9dc62efa7ffc559f (diff) | |
download | gnome-settings-daemon-522640a6df95312669871e4f881afe4e37e495f9.tar.gz |
xsettings: Expose monitored settings through D-Bus
A number of things that gnome-settings-daemon monitors for all the GTK+
applications aren't currently available for GTK+ Wayland clients, only
through XSettings.
As we already monitor fontconfig configurations, enabled GTK+ modules
and whether applications should use animations, export those through a
D-Bus interface.
See https://bugzilla.gnome.org/show_bug.cgi?id=786693
Based on patch by Martin Blanchard <tchaik@gmx.com>
https://bugzilla.gnome.org/show_bug.cgi?id=786694
-rw-r--r-- | plugins/xsettings/gsd-xsettings-manager.c | 136 |
1 files changed, 134 insertions, 2 deletions
diff --git a/plugins/xsettings/gsd-xsettings-manager.c b/plugins/xsettings/gsd-xsettings-manager.c index ca5fa502..eb55b8b7 100644 --- a/plugins/xsettings/gsd-xsettings-manager.c +++ b/plugins/xsettings/gsd-xsettings-manager.c @@ -71,6 +71,18 @@ #define FONT_HINTING_KEY "hinting" #define FONT_RGBA_ORDER_KEY "rgba-order" +#define GTK_SETTINGS_DBUS_PATH "/org/gtk/Settings" +#define GTK_SETTINGS_DBUS_NAME "org.gtk.Settings" + +static const gchar introspection_xml[] = +"<node name='/org/gtk/Settings'>" +" <interface name='org.gtk.Settings'>" +" <property name='FontconfigTimestamp' type='x' access='read'/>" +" <property name='Modules' type='s' access='read'/>" +" <property name='EnableAnimations' type='b' access='read'/>" +" </interface>" +"</node>"; + typedef enum _DisplayLayoutMode { DISPLAY_LAYOUT_MODE_LOGICAL = 1, DISPLAY_LAYOUT_MODE_PHYSICAL = 2 @@ -265,10 +277,12 @@ struct GnomeXSettingsManagerPrivate GSettings *plugin_settings; FcMonitor *fontconfig_monitor; + gint64 fontconfig_timestamp; GsdXSettingsGtk *gtk; GsdRemoteDisplayManager *remote_display; + gboolean enable_animations; guint display_config_watch_id; guint monitors_changed_id; @@ -278,7 +292,9 @@ struct GnomeXSettingsManagerPrivate guint notify_idle_id; + GDBusNodeInfo *introspection_data; GDBusConnection *dbus_connection; + guint gtk_settings_name_id; }; #define GSD_XSETTINGS_ERROR gsd_xsettings_error_quark () @@ -291,6 +307,8 @@ static void gnome_xsettings_manager_class_init (GnomeXSettingsManagerClass static void gnome_xsettings_manager_init (GnomeXSettingsManager *xsettings_manager); static void gnome_xsettings_manager_finalize (GObject *object); +static void register_manager_dbus (GnomeXSettingsManager *manager); + G_DEFINE_TYPE (GnomeXSettingsManager, gnome_xsettings_manager, G_TYPE_OBJECT) static gpointer manager_object = NULL; @@ -483,7 +501,9 @@ static gboolean notify_idle (gpointer data) { GnomeXSettingsManager *manager = data; + xsettings_manager_notify (manager->priv->manager); + manager->priv->notify_idle_id = 0; return G_SOURCE_REMOVE; } @@ -498,6 +518,49 @@ queue_notify (GnomeXSettingsManager *manager) g_source_set_name_by_id (manager->priv->notify_idle_id, "[gnome-settings-daemon] notify_idle"); } +typedef enum { + GTK_SETTINGS_FONTCONFIG_TIMESTAMP = 1 << 0, + GTK_SETTINGS_MODULES = 1 << 1, + GTK_SETTINGS_ENABLE_ANIMATIONS = 1 << 2 +} GtkSettingsMask; + +static void +send_dbus_event (GnomeXSettingsManager *manager, + GtkSettingsMask mask) +{ + GVariantBuilder props_builder; + GVariant *props_changed = NULL; + + g_variant_builder_init (&props_builder, G_VARIANT_TYPE ("a{sv}")); + + if (mask & GTK_SETTINGS_FONTCONFIG_TIMESTAMP) { + g_variant_builder_add (&props_builder, "{sv}", "FontconfigTimestamp", + g_variant_new_int64 (manager->priv->fontconfig_timestamp)); + } + + if (mask & GTK_SETTINGS_MODULES) { + const char *modules = gsd_xsettings_gtk_get_modules (manager->priv->gtk); + g_variant_builder_add (&props_builder, "{sv}", "Modules", + g_variant_new_string (modules ? modules : "")); + } + + if (mask & GTK_SETTINGS_ENABLE_ANIMATIONS) { + g_variant_builder_add (&props_builder, "{sv}", "EnableAnimations", + g_variant_new_boolean (manager->priv->enable_animations)); + } + + props_changed = g_variant_new ("(s@a{sv}@as)", GTK_SETTINGS_DBUS_NAME, + g_variant_builder_end (&props_builder), + g_variant_new_strv (NULL, 0)); + + g_dbus_connection_emit_signal (manager->priv->dbus_connection, + NULL, + GTK_SETTINGS_DBUS_PATH, + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + props_changed, NULL); +} + static double get_dpi_from_gsettings (GnomeXSettingsManager *manager) { @@ -889,18 +952,24 @@ gtk_modules_callback (GsdXSettingsGtk *gtk, } queue_notify (manager); + send_dbus_event (manager, GTK_SETTINGS_MODULES); } static void fontconfig_callback (FcMonitor *monitor, GnomeXSettingsManager *manager) { - int timestamp = time (NULL); + gint64 timestamp = g_get_real_time (); + gint timestamp_sec = (int)(timestamp / G_TIME_SPAN_SECOND); gnome_settings_profile_start (NULL); - xsettings_manager_set_int (manager->priv->manager, "Fontconfig/Timestamp", timestamp); + xsettings_manager_set_int (manager->priv->manager, "Fontconfig/Timestamp", timestamp_sec); + + manager->priv->fontconfig_timestamp = timestamp; + queue_notify (manager); + send_dbus_event (manager, GTK_SETTINGS_FONTCONFIG_TIMESTAMP); gnome_settings_profile_end (NULL); } @@ -1100,9 +1169,11 @@ force_disable_animation_changed (GObject *gobject, value = g_settings_get_boolean (settings, "enable-animations"); } + manager->priv->enable_animations = value; xsettings_manager_set_int (manager->priv->manager, "Gtk/EnableAnimations", value); queue_notify (manager); + send_dbus_event (manager, GTK_SETTINGS_ENABLE_ANIMATIONS); } static void @@ -1264,6 +1335,8 @@ gnome_xsettings_manager_start (GnomeXSettingsManager *manager, /* Xft settings */ update_xft_settings (manager); + register_manager_dbus (manager); + start_fontconfig_monitor (manager); start_shell_monitor (manager); @@ -1315,6 +1388,11 @@ gnome_xsettings_manager_stop (GnomeXSettingsManager *manager) p->plugin_settings = NULL; } + if (p->gtk_settings_name_id > 0) { + g_bus_unown_name (p->gtk_settings_name_id); + p->gtk_settings_name_id = 0; + } + if (p->fontconfig_monitor != NULL) { g_signal_handlers_disconnect_by_data (p->fontconfig_monitor, manager); fc_monitor_stop (p->fontconfig_monitor); @@ -1378,6 +1456,60 @@ gnome_xsettings_manager_finalize (GObject *object) G_OBJECT_CLASS (gnome_xsettings_manager_parent_class)->finalize (object); } +static GVariant * +handle_get_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + GnomeXSettingsManager *manager = user_data; + + if (g_strcmp0 (property_name, "FontconfigTimestamp") == 0) { + return g_variant_new_int64 (manager->priv->fontconfig_timestamp); + } else if (g_strcmp0 (property_name, "Modules") == 0) { + const char *modules = gsd_xsettings_gtk_get_modules (manager->priv->gtk); + return g_variant_new_string (modules ? modules : ""); + } else if (g_strcmp0 (property_name, "EnableAnimations") == 0) { + return g_variant_new_boolean (manager->priv->enable_animations); + } else { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, + "No such interface: %s", interface_name); + return NULL; + } +} + +static const GDBusInterfaceVTable interface_vtable = +{ + NULL, + handle_get_property, + NULL +}; + +static void +register_manager_dbus (GnomeXSettingsManager *manager) +{ + g_assert (manager->priv->dbus_connection != NULL); + + manager->priv->introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); + g_assert (manager->priv->introspection_data != NULL); + + g_dbus_connection_register_object (manager->priv->dbus_connection, + GTK_SETTINGS_DBUS_PATH, + manager->priv->introspection_data->interfaces[0], + &interface_vtable, + manager, + NULL, + NULL); + + manager->priv->gtk_settings_name_id = g_bus_own_name_on_connection (manager->priv->dbus_connection, + GTK_SETTINGS_DBUS_NAME, + G_BUS_NAME_OWNER_FLAGS_NONE, + NULL, NULL, NULL, NULL); +} + GnomeXSettingsManager * gnome_xsettings_manager_new (void) { |