[gnome-desktop] gnome-rr: Add dpms-mode property



commit 367bfb724a4f8c00b613023a3141f70588f12242
Author: Bastien Nocera <hadess hadess net>
Date:   Wed Jul 1 20:04:50 2015 +0200

    gnome-rr: Add dpms-mode property
    
    So that other parts of the desktop environment can monitor the state of
    the power saving mode, and disable their own power consuming tasks when
    the screens are off.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=751794

 libgnome-desktop/gnome-rr.c |   55 +++++++++++++++++++++++++++++++++++++++++++
 libgnome-desktop/gnome-rr.h |    2 +
 2 files changed, 57 insertions(+), 0 deletions(-)
---
diff --git a/libgnome-desktop/gnome-rr.c b/libgnome-desktop/gnome-rr.c
index 2c56d5c..fa6a7e3 100644
--- a/libgnome-desktop/gnome-rr.c
+++ b/libgnome-desktop/gnome-rr.c
@@ -42,6 +42,7 @@
 enum {
     SCREEN_PROP_0,
     SCREEN_PROP_GDK_SCREEN,
+    SCREEN_PROP_DPMS_MODE,
     SCREEN_PROP_LAST,
 };
 
@@ -672,6 +673,14 @@ name_owner_changed (GObject       *object,
     g_free (new_name_owner);
 }
 
+static void
+power_save_mode_changed (GObject       *object,
+                         GParamSpec    *pspec,
+                         GnomeRRScreen *self)
+{
+        g_object_notify (G_OBJECT (self), "dpms-mode");
+}
+
 static gboolean
 gnome_rr_screen_initable_init (GInitable *initable, GCancellable *canc, GError **error)
 {
@@ -697,6 +706,8 @@ gnome_rr_screen_initable_init (GInitable *initable, GCancellable *canc, GError *
                             G_CALLBACK (name_owner_changed), self, 0);
     g_signal_connect_object (priv->proxy, "monitors-changed",
                             G_CALLBACK (screen_on_monitors_changed), self, 0);
+    g_signal_connect_object (priv->proxy, "notify::power-save-mode",
+                             G_CALLBACK (power_save_mode_changed), self, 0);
     return TRUE;
 }
 
@@ -726,6 +737,8 @@ on_proxy_acquired (GObject      *object,
                             G_CALLBACK (name_owner_changed), self, 0);
     g_signal_connect_object (priv->proxy, "monitors-changed",
                             G_CALLBACK (screen_on_monitors_changed), self, 0);
+    g_signal_connect_object (priv->proxy, "notify::power-save-mode",
+                             G_CALLBACK (power_save_mode_changed), self, 0);
     g_task_return_boolean (task, TRUE);
 }
 
@@ -815,6 +828,9 @@ gnome_rr_screen_set_property (GObject *gobject, guint property_id, const GValue
     case SCREEN_PROP_GDK_SCREEN:
         priv->gdk_screen = g_value_get_object (value);
         return;
+    case SCREEN_PROP_DPMS_MODE:
+        gnome_rr_screen_set_dpms_mode (self, g_value_get_enum (value), NULL);
+        return;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, property_id, property);
         return;
@@ -832,6 +848,14 @@ gnome_rr_screen_get_property (GObject *gobject, guint property_id, GValue *value
     case SCREEN_PROP_GDK_SCREEN:
         g_value_set_object (value, priv->gdk_screen);
         return;
+    case SCREEN_PROP_DPMS_MODE: {
+        GnomeRRDpmsMode mode;
+        if (gnome_rr_screen_get_dpms_mode (self, &mode, NULL))
+                g_value_set_enum (value, mode);
+        else
+                g_value_set_enum (value, GNOME_RR_DPMS_UNKNOWN);
+        }
+        return;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, property_id, property);
         return;
@@ -864,6 +888,19 @@ gnome_rr_screen_class_init (GnomeRRScreenClass *klass)
                    G_PARAM_STATIC_STRINGS)
             );
 
+    g_object_class_install_property(
+            gobject_class,
+            SCREEN_PROP_DPMS_MODE,
+            g_param_spec_enum (
+                    "dpms-mode",
+                    "DPMS Mode",
+                    "The DPMS mode for this GnomeRRScreen",
+                    GNOME_TYPE_RR_DPMS_MODE,
+                    GNOME_RR_DPMS_UNKNOWN,
+                    G_PARAM_READWRITE |
+                    G_PARAM_STATIC_STRINGS)
+            );
+
     screen_signals[SCREEN_CHANGED] = g_signal_new("changed",
             G_TYPE_FROM_CLASS (gobject_class),
             G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
@@ -2189,3 +2226,21 @@ _gnome_rr_output_get_tile_info (GnomeRROutput *output,
     *tile = output->tile_info;
     return TRUE;
 }
+
+GType
+gnome_rr_dpms_mode_get_type (void)
+{
+  static GType etype = 0;
+  if (etype == 0) {
+    static const GEnumValue values[] = {
+      { GNOME_RR_DPMS_ON, "GNOME_RR_DPMS_ON", "on" },
+      { GNOME_RR_DPMS_STANDBY, "GNOME_RR_DPMS_STANDBY", "standby" },
+      { GNOME_RR_DPMS_SUSPEND, "GNOME_RR_DPMS_SUSPEND", "suspend" },
+      { GNOME_RR_DPMS_OFF, "GNOME_RR_DPMS_OFF", "off" },
+      { GNOME_RR_DPMS_UNKNOWN, "GNOME_RR_DPMS_UNKNOWN", "unknown" },
+      { 0, NULL, NULL }
+    };
+    etype = g_enum_register_static ("GnomeRRDpmsModeType", values);
+  }
+  return etype;
+}
diff --git a/libgnome-desktop/gnome-rr.h b/libgnome-desktop/gnome-rr.h
index 3d4906b..9311f07 100644
--- a/libgnome-desktop/gnome-rr.h
+++ b/libgnome-desktop/gnome-rr.h
@@ -97,11 +97,13 @@ typedef enum {
 #define GNOME_TYPE_RR_OUTPUT (gnome_rr_output_get_type())
 #define GNOME_TYPE_RR_CRTC   (gnome_rr_crtc_get_type())
 #define GNOME_TYPE_RR_MODE   (gnome_rr_mode_get_type())
+#define GNOME_TYPE_RR_DPMS_MODE (gnome_rr_dpms_mode_get_type())
 
 GType gnome_rr_screen_get_type (void);
 GType gnome_rr_output_get_type (void);
 GType gnome_rr_crtc_get_type (void);
 GType gnome_rr_mode_get_type (void);
+GType gnome_rr_dpms_mode_get_type (void);
 
 /* GnomeRRScreen */
 GnomeRRScreen * gnome_rr_screen_new                (GdkScreen             *screen,


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