summaryrefslogtreecommitdiff
path: root/src/backends/x11/meta-monitor-manager-xrandr.c
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2019-01-11 14:45:44 +0100
committerJonas Ådahl <jadahl@gmail.com>2019-04-02 13:49:59 +0000
commit4cae9b5b1132a61cbff7c4aaa2addf83efa5e4c6 (patch)
tree88eeb3b91de2e374ee4ff920ffd73e77bdf29194 /src/backends/x11/meta-monitor-manager-xrandr.c
parent72aeeb8c378836f7eb6132bafe83354eb6a8963a (diff)
downloadmutter-4cae9b5b1132a61cbff7c4aaa2addf83efa5e4c6.tar.gz
monitor-manager: Clean up DPMS state tracking
DPMS is configured from a bit all over the place: via D-Bus, via X11 and when reading the current KMS state. Each of these places did it slightly differently, directly poking at the field in MetaMonitorManager. To make things a bit more managable, move the field into a new MetaMonitorManagerPrivate, and add helpers to get and set the current value. Prior to this, there were for example situations where the DPMS setting was changed, but without signal listeners being notified about it. https://gitlab.gnome.org/GNOME/mutter/merge_requests/506
Diffstat (limited to 'src/backends/x11/meta-monitor-manager-xrandr.c')
-rw-r--r--src/backends/x11/meta-monitor-manager-xrandr.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c
index 784bbde7c..45c81f4eb 100644
--- a/src/backends/x11/meta-monitor-manager-xrandr.c
+++ b/src/backends/x11/meta-monitor-manager-xrandr.c
@@ -121,6 +121,50 @@ meta_monitor_manager_xrandr_read_edid (MetaMonitorManager *manager,
return meta_output_xrandr_read_edid (output);
}
+static MetaPowerSave
+x11_dpms_state_to_power_save (CARD16 dpms_state)
+{
+ switch (dpms_state)
+ {
+ case DPMSModeOn:
+ return META_POWER_SAVE_ON;
+ case DPMSModeStandby:
+ return META_POWER_SAVE_STANDBY;
+ case DPMSModeSuspend:
+ return META_POWER_SAVE_SUSPEND;
+ case DPMSModeOff:
+ return META_POWER_SAVE_OFF;
+ default:
+ return META_POWER_SAVE_UNSUPPORTED;
+ }
+}
+
+static void
+meta_monitor_manager_xrandr_read_current_state (MetaMonitorManager *manager)
+{
+ MetaMonitorManagerXrandr *manager_xrandr =
+ META_MONITOR_MANAGER_XRANDR (manager);
+ MetaMonitorManagerClass *parent_class =
+ META_MONITOR_MANAGER_CLASS (meta_monitor_manager_xrandr_parent_class);
+ Display *xdisplay = meta_monitor_manager_xrandr_get_xdisplay (manager_xrandr);
+ BOOL dpms_capable, dpms_enabled;
+ CARD16 dpms_state;
+ MetaPowerSave power_save_mode;
+
+ dpms_capable = DPMSCapable (xdisplay);
+
+ if (dpms_capable &&
+ DPMSInfo (xdisplay, &dpms_state, &dpms_enabled) &&
+ dpms_enabled)
+ power_save_mode = x11_dpms_state_to_power_save (dpms_state);
+ else
+ power_save_mode = META_POWER_SAVE_UNSUPPORTED;
+
+ meta_monitor_manager_power_save_mode_changed (manager, power_save_mode);
+
+ parent_class->read_current_state (manager);
+}
+
static void
meta_monitor_manager_xrandr_set_power_save_mode (MetaMonitorManager *manager,
MetaPowerSave mode)
@@ -1046,6 +1090,7 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass)
object_class->constructed = meta_monitor_manager_xrandr_constructed;
manager_class->read_edid = meta_monitor_manager_xrandr_read_edid;
+ manager_class->read_current_state = meta_monitor_manager_xrandr_read_current_state;
manager_class->ensure_initial_config = meta_monitor_manager_xrandr_ensure_initial_config;
manager_class->apply_monitors_config = meta_monitor_manager_xrandr_apply_monitors_config;
manager_class->set_power_save_mode = meta_monitor_manager_xrandr_set_power_save_mode;