From f3595ebd0896537ae3c275a727fa51c5a80a5eb6 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Thu, 25 Sep 2014 19:39:14 -0600 Subject: [PATCH] monitor-manager: Make sure to emit PropertiesChanged for PowerSaveMode We overrode the property for PowerSaveMode, which meant that gdbus's auto-generated PropertiesChanged code wasn't being run. This really confused gnome-rr and gnome-settings-daemon's power plugin about the current DPMS state of the display, since they used their cached PowerSaveMode properties, and never saw a PropertiesChanged being emitted. If a display was on, they set it to off, and then set it back on, the setting back on would never fire, since they thought the display was already off. To fix this, remove our custom property override and just respond to notifications on the object. Namely, this fixes the DPMS management when receiving notifications so that it now properly times out. --- src/backends/meta-monitor-manager.c | 93 +++++++++-------------------- 1 file changed, 28 insertions(+), 65 deletions(-) diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c index 127074d0b..ac48685bb 100644 --- a/src/backends/meta-monitor-manager.c +++ b/src/backends/meta-monitor-manager.c @@ -44,12 +44,6 @@ enum { SIGNALS_LAST }; -enum { - PROP_0, - PROP_POWER_SAVE_MODE, - PROP_LAST -}; - static int signals[SIGNALS_LAST]; static void meta_monitor_manager_display_config_init (MetaDBusDisplayConfigIface *iface); @@ -167,11 +161,39 @@ make_logical_config (MetaMonitorManager *manager) manager->monitor_infos = (void*)g_array_free (monitor_infos, FALSE); } +static void +power_save_mode_changed (MetaMonitorManager *manager, + GParamSpec *pspec, + gpointer user_data) +{ + MetaMonitorManagerClass *klass; + int mode = meta_dbus_display_config_get_power_save_mode (META_DBUS_DISPLAY_CONFIG (manager)); + + if (mode == META_POWER_SAVE_UNSUPPORTED) + return; + + /* If DPMS is unsupported, force the property back. */ + if (manager->power_save_mode == META_POWER_SAVE_UNSUPPORTED) + { + meta_dbus_display_config_set_power_save_mode (META_DBUS_DISPLAY_CONFIG (manager), META_POWER_SAVE_UNSUPPORTED); + return; + } + + klass = META_MONITOR_MANAGER_GET_CLASS (manager); + if (klass->set_power_save_mode) + klass->set_power_save_mode (manager, mode); + + manager->power_save_mode = mode; +} + static void meta_monitor_manager_constructed (GObject *object) { MetaMonitorManager *manager = META_MONITOR_MANAGER (object); + g_signal_connect_object (manager, "notify::power-save-mode", + G_CALLBACK (power_save_mode_changed), manager, 0); + manager->in_init = TRUE; manager->config = meta_monitor_config_new (); @@ -214,23 +236,6 @@ meta_monitor_manager_constructed (GObject *object) manager->in_init = FALSE; } -static void -meta_monitor_manager_set_power_save_mode (MetaMonitorManager *manager, - MetaPowerSave mode) -{ - MetaMonitorManagerClass *klass; - - if (manager->power_save_mode == META_POWER_SAVE_UNSUPPORTED || - mode == META_POWER_SAVE_UNSUPPORTED) - return; - - klass = META_MONITOR_MANAGER_GET_CLASS (manager); - if (klass->set_power_save_mode) - klass->set_power_save_mode (manager, mode); - - manager->power_save_mode = mode; -} - void meta_monitor_manager_free_output_array (MetaOutput *old_outputs, int n_old_outputs) @@ -298,44 +303,6 @@ meta_monitor_manager_dispose (GObject *object) G_OBJECT_CLASS (meta_monitor_manager_parent_class)->dispose (object); } -static void -meta_monitor_manager_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - MetaMonitorManager *self = META_MONITOR_MANAGER (object); - - switch (prop_id) - { - case PROP_POWER_SAVE_MODE: - meta_monitor_manager_set_power_save_mode (self, g_value_get_int (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -meta_monitor_manager_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - MetaMonitorManager *self = META_MONITOR_MANAGER (object); - - switch (prop_id) - { - case PROP_POWER_SAVE_MODE: - g_value_set_int (value, self->power_save_mode); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - static GBytes * meta_monitor_manager_real_read_edid (MetaMonitorManager *manager, MetaOutput *output) @@ -356,8 +323,6 @@ meta_monitor_manager_class_init (MetaMonitorManagerClass *klass) GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->constructed = meta_monitor_manager_constructed; - object_class->get_property = meta_monitor_manager_get_property; - object_class->set_property = meta_monitor_manager_set_property; object_class->dispose = meta_monitor_manager_dispose; object_class->finalize = meta_monitor_manager_finalize; @@ -371,8 +336,6 @@ meta_monitor_manager_class_init (MetaMonitorManagerClass *klass) 0, NULL, NULL, NULL, G_TYPE_NONE, 0); - - g_object_class_override_property (object_class, PROP_POWER_SAVE_MODE, "power-save-mode"); } static const double known_diagonals[] = {