[gnome-settings-daemon] power: Emit GDBusProxy-compatible PropertiesChanged signal
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon] power: Emit GDBusProxy-compatible PropertiesChanged signal
- Date: Wed, 25 Jan 2012 12:49:30 +0000 (UTC)
commit 07b1ed63016f1725be251fa6ce8c15e0498539b5
Author: Colin Walters <walters verbum org>
Date: Tue Nov 15 13:06:38 2011 -0500
power: Emit GDBusProxy-compatible PropertiesChanged signal
This is needed for gnome-shell which is now ported to use GDBusProxy;
the proxy doesn't know about the power plugin's custom Changed signal.
Given that the old interface was added for the Shell's benefit in
http://git.gnome.org/browse/gnome-power-manager/commit/?id=a85e6cf9
remove the old interface.
https://bugzilla.gnome.org/show_bug.cgi?id=667371
plugins/power/gsd-power-manager.c | 124 +++++++++++++++++++++++-------------
1 files changed, 79 insertions(+), 45 deletions(-)
---
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
index f435704..cad84e4 100644
--- a/plugins/power/gsd-power-manager.c
+++ b/plugins/power/gsd-power-manager.c
@@ -91,8 +91,6 @@ static const gchar introspection_xml[] =
"</property>"
"<property name='Tooltip' type='s' access='read'>"
"</property>"
- "<signal name='Changed'>"
- "</signal>"
"<method name='GetPrimaryDevice'>"
"<arg name='device' type='(susdut)' direction='out' />"
"</method>"
@@ -206,6 +204,8 @@ static void gsd_power_manager_finalize (GObject *object);
static UpDevice *engine_get_composite_device (GsdPowerManager *manager, UpDevice *original_device);
static UpDevice *engine_update_composite_device (GsdPowerManager *manager, UpDevice *original_device);
+static GIcon *engine_get_icon (GsdPowerManager *manager);
+static gchar *engine_get_summary (GsdPowerManager *manager);
static void do_power_action_type (GsdPowerManager *manager, GsdPowerActionType action_type);
G_DEFINE_TYPE (GsdPowerManager, gsd_power_manager, G_TYPE_OBJECT)
@@ -332,26 +332,81 @@ typedef enum {
WARNING_ACTION = 4
} GsdPowerManagerWarning;
+static GVariant *
+engine_get_icon_property_variant (GsdPowerManager *manager)
+{
+ GIcon *icon;
+ GVariant *retval;
+
+ icon = engine_get_icon (manager);
+ if (icon != NULL) {
+ char *str;
+ str = g_icon_to_string (icon);
+ g_object_unref (icon);
+ retval = g_variant_new_string (str);
+ g_free (str);
+ } else {
+ retval = g_variant_new_string ("");
+ }
+ return retval;
+}
+
+static GVariant *
+engine_get_tooltip_property_variant (GsdPowerManager *manager)
+{
+ char *tooltip;
+ GVariant *retval;
+
+ tooltip = engine_get_summary (manager);
+ retval = g_variant_new_string (tooltip != NULL ? tooltip : "");
+ g_free (tooltip);
+
+ return retval;
+}
+
static void
-engine_emit_changed (GsdPowerManager *manager)
+engine_emit_changed (GsdPowerManager *manager,
+ gboolean icon_changed,
+ gboolean state_changed)
{
- gboolean ret;
+ GVariantBuilder props_builder;
+ GVariant *props_changed = NULL;
GError *error = NULL;
/* not yet connected to the bus */
if (manager->priv->connection == NULL)
return;
- ret = g_dbus_connection_emit_signal (manager->priv->connection,
- NULL,
- GSD_POWER_DBUS_PATH,
- GSD_POWER_DBUS_INTERFACE,
- "Changed",
- NULL,
- &error);
- if (!ret) {
- g_warning ("failed to emit Changed: %s", error->message);
- g_error_free (error);
+
+ g_variant_builder_init (&props_builder, G_VARIANT_TYPE ("a{sv}"));
+
+ if (icon_changed)
+ g_variant_builder_add (&props_builder, "{sv}", "Icon",
+ engine_get_icon_property_variant (manager));
+ if (state_changed)
+ g_variant_builder_add (&props_builder, "{sv}", "Tooltip",
+ engine_get_tooltip_property_variant (manager));
+
+ props_changed = g_variant_new ("(s a{sv}@as)", GSD_POWER_DBUS_INTERFACE,
+ g_variant_builder_end (&props_builder),
+ g_variant_new_strv (NULL, 0));
+ g_variant_ref_sink (props_changed);
+
+ if (!g_dbus_connection_emit_signal (manager->priv->connection,
+ NULL,
+ GSD_POWER_DBUS_PATH,
+ "org.freedesktop.DBus.Properties",
+ "PropertiesChanged",
+ props_changed,
+ &error))
+ goto out;
+
+ out:
+ if (error) {
+ g_warning ("%s", error->message);
+ g_clear_error (&error);
}
+ if (props_changed)
+ g_variant_unref (props_changed);
}
static GsdPowerManagerWarning
@@ -696,19 +751,15 @@ engine_recalculate_state_summary (GsdPowerManager *manager)
static void
engine_recalculate_state (GsdPowerManager *manager)
{
- gboolean ret;
- gboolean has_changed = FALSE;
+ gboolean icon_changed = FALSE;
+ gboolean state_changed = FALSE;
- ret = engine_recalculate_state_icon (manager);
- if (ret)
- has_changed = TRUE;
- ret = engine_recalculate_state_summary (manager);
- if (ret)
- has_changed = TRUE;
+ icon_changed = engine_recalculate_state_icon (manager);
+ state_changed = engine_recalculate_state_summary (manager);
/* only emit if the icon or summary has changed */
- if (has_changed)
- engine_emit_changed (manager);
+ if (icon_changed || state_changed)
+ engine_emit_changed (manager, icon_changed, state_changed);
}
static UpDevice *
@@ -770,7 +821,6 @@ engine_update_composite_device (GsdPowerManager *manager,
gboolean is_charging = FALSE;
gboolean is_discharging = FALSE;
gboolean is_fully_charged = TRUE;
- gboolean has_changed;
GPtrArray *array;
UpDevice *device;
UpDeviceState state;
@@ -855,9 +905,8 @@ engine_update_composite_device (GsdPowerManager *manager,
NULL);
/* force update of icon */
- has_changed = engine_recalculate_state_icon (manager);
- if (has_changed)
- engine_emit_changed (manager);
+ if (engine_recalculate_state_icon (manager))
+ engine_emit_changed (manager, TRUE, FALSE);
out:
/* return composite device or original device */
return device;
@@ -4040,24 +4089,9 @@ handle_get_property (GDBusConnection *connection,
GVariant *retval = NULL;
if (g_strcmp0 (property_name, "Icon") == 0) {
- GIcon *icon;
-
- icon = engine_get_icon (manager);
- if (icon != NULL) {
- char *str;
- str = g_icon_to_string (icon);
- g_object_unref (icon);
- retval = g_variant_new_string (str);
- g_free (str);
- } else {
- retval = g_variant_new_string ("");
- }
+ retval = engine_get_icon_property_variant (manager);
} else if (g_strcmp0 (property_name, "Tooltip") == 0) {
- char *tooltip;
-
- tooltip = engine_get_summary (manager);
- retval = g_variant_new_string (tooltip != NULL ? tooltip : "");
- g_free (tooltip);
+ retval = engine_get_tooltip_property_variant (manager);
}
return retval;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]