[gnome-settings-daemon] power: Use a DBus property for screen brightness



commit a4c3299c97ced9c9bcdc69800464103ba47a0a56
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Tue Apr 23 20:04:01 2013 -0400

    power: Use a DBus property for screen brightness
    
    A property is easier for clients to manage, as they'll automatically
    get new PropertiesChanged signals when the value changes, and with
    GDBus bindings, properties are cached field lookups that don't require
    asynchronous access.
    
    If there are any errors when fetching the new brightness, the value
    -1 is returned, so the interface has been modified slightly to support
    signed values.
    
    Also adapt the color and media-keys plugins to the new interface.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=698754

 plugins/color/gsd-color-manager.c           |   31 ++------
 plugins/media-keys/gsd-media-keys-manager.c |    2 +-
 plugins/power/gsd-power-manager.c           |  122 +++++++++++++++++----------
 3 files changed, 84 insertions(+), 71 deletions(-)
---
diff --git a/plugins/color/gsd-color-manager.c b/plugins/color/gsd-color-manager.c
index 93064e7..a1530d9 100644
--- a/plugins/color/gsd-color-manager.c
+++ b/plugins/color/gsd-color-manager.c
@@ -642,26 +642,6 @@ gcm_session_use_output_profile_for_screen (GsdColorManager *manager,
 #define GSD_DBUS_PATH_POWER            GSD_DBUS_PATH "/Power"
 
 static void
-gcm_session_set_output_percentage_cb (GObject *source_object,
-                                      GAsyncResult *res,
-                                      gpointer user_data)
-{
-        GDBusConnection *connection = G_DBUS_CONNECTION (source_object);
-        GError *error = NULL;
-        GVariant *retval;
-        retval = g_dbus_connection_call_finish (connection,
-                                                res,
-                                                &error);
-        if (retval == NULL) {
-                g_warning ("failed to set output brightness: %s",
-                           error->message);
-                g_error_free (error);
-                return;
-        }
-        g_variant_unref (retval);
-}
-
-static void
 gcm_session_set_output_percentage (guint percentage)
 {
         GDBusConnection *connection;
@@ -673,13 +653,14 @@ gcm_session_set_output_percentage (guint percentage)
         g_dbus_connection_call (connection,
                                 GSD_DBUS_NAME_POWER,
                                 GSD_DBUS_PATH_POWER,
-                                GSD_DBUS_INTERFACE_POWER_SCREEN,
-                                "SetPercentage",
-                                g_variant_new ("(u)", percentage),
+                                "org.freedesktop.DBus.Properties",
+                                "Set",
+                                g_variant_new_parsed ("('" GSD_DBUS_INTERFACE_POWER_SCREEN "',"
+                                                      "'Brightness', %v)",
+                                                      g_variant_new_int32 (percentage)),
                                 NULL,
                                 G_DBUS_CALL_FLAGS_NONE,
-                                -1, NULL,
-                                gcm_session_set_output_percentage_cb, NULL);
+                                -1, NULL, NULL, NULL);
         g_object_unref (connection);
 }
 
diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c
index 6b74abf..8041f41 100644
--- a/plugins/media-keys/gsd-media-keys-manager.c
+++ b/plugins/media-keys/gsd-media-keys-manager.c
@@ -1852,7 +1852,7 @@ update_screen_cb (GObject             *source_object,
         }
 
         /* update the dialog with the new value */
-        g_variant_get (new_percentage, "(u)", &percentage);
+        g_variant_get (new_percentage, "(i)", &percentage);
         show_osd (manager, "display-brightness-symbolic", NULL, percentage);
         g_variant_unref (new_percentage);
 }
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
index 9f06aaf..11b1cdd 100644
--- a/plugins/power/gsd-power-manager.c
+++ b/plugins/power/gsd-power-manager.c
@@ -103,20 +103,13 @@ static const gchar introspection_xml[] =
 "    </method>"
 "  </interface>"
 "  <interface name='org.gnome.SettingsDaemon.Power.Screen'>"
+"    <property name='Brightness' type='i' access='readwrite'/>"
 "    <method name='StepUp'>"
-"      <arg type='u' name='new_percentage' direction='out'/>"
+"      <arg type='i' name='new_percentage' direction='out'/>"
 "    </method>"
 "    <method name='StepDown'>"
-"      <arg type='u' name='new_percentage' direction='out'/>"
-"    </method>"
-"    <method name='GetPercentage'>"
-"      <arg type='u' name='percentage' direction='out'/>"
-"    </method>"
-"    <method name='SetPercentage'>"
-"      <arg type='u' name='percentage' direction='in'/>"
-"      <arg type='u' name='new_percentage' direction='out'/>"
+"      <arg type='i' name='new_percentage' direction='out'/>"
 "    </method>"
-"    <signal name='Changed'/>"
 "  </interface>"
 "  <interface name='org.gnome.SettingsDaemon.Power.Keyboard'>"
 "    <method name='StepUp'>"
@@ -2222,25 +2215,24 @@ idle_watch_id_to_string (GsdPowerManager *manager, guint id)
 }
 
 static void
-backlight_emit_changed (GsdPowerManager *manager)
+backlight_emit_changed (GsdPowerManager *manager,
+                        gint32           value)
 {
-        gboolean ret;
-        GError *error = NULL;
+        GVariant *params;
 
         /* 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_SCREEN,
-                                             "Changed",
-                                             NULL,
-                                             &error);
-        if (!ret) {
-                g_warning ("failed to emit Changed: %s", error->message);
-                g_error_free (error);
-        }
+
+        params = g_variant_new_parsed ("('" GSD_POWER_DBUS_INTERFACE_SCREEN "', [{'Brightness', %v}], @as 
[])",
+                                       g_variant_new_int32 (value));
+
+        g_dbus_connection_emit_signal (manager->priv->connection,
+                                       NULL,
+                                       GSD_POWER_DBUS_PATH,
+                                       "org.freedesktop.DBus.Properties",
+                                       "PropertiesChanged",
+                                       params, NULL);
 }
 
 static gboolean
@@ -3584,9 +3576,7 @@ handle_method_call_screen (GsdPowerManager *manager,
                            GVariant *parameters,
                            GDBusMethodInvocation *invocation)
 {
-        gboolean ret = FALSE;
         gint value = -1;
-        guint value_tmp;
         GError *error = NULL;
 
         if (!manager->priv->backlight_available) {
@@ -3597,29 +3587,14 @@ handle_method_call_screen (GsdPowerManager *manager,
                 goto out;
         }
 
-        if (g_strcmp0 (method_name, "GetPercentage") == 0) {
-                g_debug ("screen get percentage");
-                value = backlight_get_percentage (manager->priv->rr_screen, &error);
-
-        } else if (g_strcmp0 (method_name, "SetPercentage") == 0) {
-                g_debug ("screen set percentage");
-                g_variant_get (parameters, "(u)", &value_tmp);
-                ret = backlight_set_percentage (manager->priv->rr_screen, value_tmp, &error);
-                if (ret) {
-                        value = value_tmp;
-                        backlight_emit_changed (manager);
-                }
-
-        } else if (g_strcmp0 (method_name, "StepUp") == 0) {
+        if (g_strcmp0 (method_name, "StepUp") == 0) {
                 g_debug ("screen step up");
                 value = backlight_step_up (manager->priv->rr_screen, &error);
-                if (value != -1)
-                        backlight_emit_changed (manager);
+                backlight_emit_changed (manager, value);
         } else if (g_strcmp0 (method_name, "StepDown") == 0) {
                 g_debug ("screen step down");
                 value = backlight_step_down (manager->priv->rr_screen, &error);
-                if (value != -1)
-                        backlight_emit_changed (manager);
+                backlight_emit_changed (manager, value);
         } else {
                 g_assert_not_reached ();
         }
@@ -3791,6 +3766,21 @@ handle_get_property_main (GsdPowerManager *manager,
 }
 
 static GVariant *
+handle_get_property_screen (GsdPowerManager *manager,
+                            const gchar *property_name)
+{
+        GVariant *retval = NULL;
+
+        if (g_strcmp0 (property_name, "Brightness") == 0) {
+                guint32 value;
+                value = backlight_get_percentage (manager->priv->rr_screen, NULL);
+                retval = g_variant_new_int32 (value);
+        }
+
+        return retval;
+}
+
+static GVariant *
 handle_get_property (GDBusConnection *connection,
                      const gchar *sender,
                      const gchar *object_path,
@@ -3808,17 +3798,59 @@ handle_get_property (GDBusConnection *connection,
 
         if (g_strcmp0 (interface_name, GSD_POWER_DBUS_INTERFACE) == 0) {
                 return handle_get_property_main (manager, property_name);
+        } else if (g_strcmp0 (interface_name, GSD_POWER_DBUS_INTERFACE_SCREEN) == 0) {
+                return handle_get_property_screen (manager, property_name);
         } else {
                 g_warning ("not recognised interface: %s", interface_name);
                 return NULL;
         }
 }
 
+static gboolean
+handle_set_property_screen (GsdPowerManager *manager,
+                            const gchar *property_name,
+                            GVariant *value)
+{
+        if (g_strcmp0 (property_name, "Brightness") == 0) {
+                guint32 brightness_value;
+                g_variant_get (value, "i", &brightness_value);
+                return backlight_set_percentage (manager->priv->rr_screen,
+                                                 brightness_value, NULL);
+        }
+
+        return FALSE;
+}
+
+static gboolean
+handle_set_property (GDBusConnection *connection,
+                     const gchar *sender,
+                     const gchar *object_path,
+                     const gchar *interface_name,
+                     const gchar *property_name,
+                     GVariant *value,
+                     GError **error, gpointer user_data)
+{
+        GsdPowerManager *manager = GSD_POWER_MANAGER (user_data);
+
+        /* Check session pointer as a proxy for whether the manager is in the
+           start or stop state */
+        if (manager->priv->session == NULL) {
+                return FALSE;
+        }
+
+        if (g_strcmp0 (interface_name, GSD_POWER_DBUS_INTERFACE_SCREEN) == 0) {
+                return handle_set_property_screen (manager, property_name, value);
+        } else {
+                g_warning ("not recognised interface: %s", interface_name);
+                return FALSE;
+        }
+}
+
 static const GDBusInterfaceVTable interface_vtable =
 {
         handle_method_call,
         handle_get_property,
-        NULL, /* SetProperty */
+        handle_set_property
 };
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]