summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2015-07-01 20:04:50 +0200
committerBastien Nocera <hadess@hadess.net>2015-07-02 19:11:13 +0200
commit367bfb724a4f8c00b613023a3141f70588f12242 (patch)
treeadbcb96234c4aa621bec5f39ec6e89eac0aad1ed
parentcb29d64b012b3c9ab11a04dd7b4933a73475d0f6 (diff)
downloadgnome-desktop-367bfb724a4f8c00b613023a3141f70588f12242.tar.gz
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
-rw-r--r--libgnome-desktop/gnome-rr.c55
-rw-r--r--libgnome-desktop/gnome-rr.h2
2 files changed, 57 insertions, 0 deletions
diff --git a/libgnome-desktop/gnome-rr.c b/libgnome-desktop/gnome-rr.c
index 2c56d5ca..fa6a7e35 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 3d4906b9..9311f07b 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,