summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2018-02-22 17:14:13 +0100
committerBastien Nocera <hadess@hadess.net>2018-02-27 16:29:33 +0100
commit522640a6df95312669871e4f881afe4e37e495f9 (patch)
tree640e2693568862491892d2c7fbfb3c9c85b79e1b
parent7100dbb1d754d81440c929ad9dc62efa7ffc559f (diff)
downloadgnome-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.c136
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)
{