From f959cd241413c9be91712906e7c5ed61f43db096 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ga=C3=ABl=20Bonithon?= <gael@xfce.org>
Date: Wed, 6 Dec 2023 19:57:09 +0100
Subject: [PATCH] Remove DPMS support

It's not xfce4-screensaver's job as long as xfce4-power-manager exists.
The DPMS should only be configurable in one place, which simplifies life
for both the user and the developer.
---
 src/gs-manager.c                    | 115 ----------------------------
 src/gs-prefs.c                      |  44 -----------
 src/gs-prefs.h                      |  19 -----
 src/xfce4-screensaver-configure.py  |  35 +--------
 src/xfce4-screensaver-preferences.c |   2 +-
 5 files changed, 2 insertions(+), 213 deletions(-)

diff --git a/src/gs-manager.c b/src/gs-manager.c
index f5284700..cb9cbce8 100644
--- a/src/gs-manager.c
+++ b/src/gs-manager.c
@@ -24,11 +24,8 @@
 #include <config.h>
 
 #include <gdk/gdk.h>
-#include <gdk/gdkx.h>
 #include <gio/gio.h>
 
-#include <X11/extensions/dpms.h>
-
 #include "gs-debug.h"
 #include "gs-grab.h"
 #include "gs-job.h"
@@ -38,10 +35,6 @@
 
 static void     gs_manager_finalize   (GObject        *object);
 
-static void     remove_dpms_timer     (GSManager      *manager);
-static void     add_dpms_timer        (GSManager      *manager,
-                                       glong           timeout);
-
 struct GSManagerPrivate {
     GHashTable     *windows;
     GHashTable     *jobs;
@@ -61,11 +54,8 @@ struct GSManagerPrivate {
 
     guint           lock_timeout_id;
     guint           cycle_timeout_id;
-    guint           dpms_timeout_id;
 
     GSGrab         *grab;
-    guint           deepsleep_idle_id;
-    gboolean        deepsleep;
 };
 
 enum {
@@ -87,9 +77,6 @@ static guint         signals[LAST_SIGNAL] = { 0, };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GSManager, gs_manager, G_TYPE_OBJECT)
 
-static void         remove_deepsleep_idle   (GSManager *manager);
-static void         add_deepsleep_idle      (GSManager *manager);
-
 static void
 manager_maybe_stop_job_for_window (GSManager *manager,
                                    GSWindow  *window) {
@@ -449,63 +436,12 @@ gs_manager_init (GSManager *manager) {
                                                  NULL, (GDestroyNotify) remove_job);
     manager->priv->windows = g_hash_table_new_full (g_direct_hash, g_direct_equal,
                                                     NULL, (GDestroyNotify) gs_window_destroy);
-
-    add_deepsleep_idle(manager);
-}
-
-static gboolean
-activate_dpms_timeout (gpointer user_data) {
-    GSManager *manager = user_data;
-    BOOL state;
-    CARD16 power_level;
-
-    if (manager->priv->active) {
-        if (DPMSInfo(gdk_x11_get_default_xdisplay(), &power_level, &state)) {
-            if (state) {
-                if (power_level == DPMSModeOn) {
-                    gs_debug("DPMS: On -> Standby");
-                    DPMSForceLevel (gdk_x11_get_default_xdisplay(), DPMSModeStandby);
-                    remove_dpms_timer (manager);
-                    add_dpms_timer (manager, manager->priv->prefs->dpms_off_timeout * 60);
-                    return FALSE;
-                } else if (power_level == DPMSModeStandby || power_level == DPMSModeSuspend) {
-                    gs_debug("DPMS: %s -> Off", power_level == DPMSModeStandby ? "Standby" : "Suspend");
-                    DPMSForceLevel (gdk_x11_get_default_xdisplay(), DPMSModeOff);
-                }
-            }
-        }
-    }
-
-    manager->priv->dpms_timeout_id = 0;
-    return FALSE;
-}
-
-static void
-remove_dpms_timer (GSManager *manager) {
-    if (manager->priv->dpms_timeout_id != 0) {
-        g_source_remove (manager->priv->dpms_timeout_id);
-        manager->priv->dpms_timeout_id = 0;
-    }
-}
-
-static void
-add_dpms_timer (GSManager *manager,
-                glong      timeout) {
-    if (manager->priv->prefs->mode != GS_MODE_BLANK_ONLY)
-        return;
-
-    if (timeout == 0)
-        return;
-
-    gs_debug ("Scheduling DPMS change after screensaver is idling for %i seconds(s)", timeout);
-    manager->priv->dpms_timeout_id = g_timeout_add_seconds (timeout, activate_dpms_timeout, manager);
 }
 
 static void
 remove_timers (GSManager *manager) {
     remove_lock_timer (manager);
     remove_cycle_timer (manager);
-    remove_dpms_timer (manager);
 }
 
 static gboolean
@@ -629,48 +565,6 @@ window_grab_broken_cb (GSWindow           *window,
     }
 }
 
-static void
-remove_deepsleep_idle (GSManager *manager) {
-    if (manager->priv->deepsleep_idle_id > 0) {
-        g_source_remove (manager->priv->deepsleep_idle_id);
-        manager->priv->deepsleep_idle_id = 0;
-    }
-}
-
-static gboolean
-deepsleep_idle (gpointer user_data) {
-    GSManager *manager = user_data;
-    BOOL state;
-    CARD16 power_level;
-
-    if (!DPMSInfo(gdk_x11_get_default_xdisplay(), &power_level, &state)) {
-        if (manager->priv->deepsleep) {
-            gs_debug ("Unable to read DPMS state, exiting deep sleep");
-            manager->priv->deepsleep = FALSE;
-        }
-        return TRUE;
-    }
-
-    if (power_level == DPMSModeOn) {
-        if (manager->priv->deepsleep) {
-            gs_debug ("Exiting deep sleep");
-            manager->priv->deepsleep = FALSE;
-        }
-    } else if (!manager->priv->throttled && !manager->priv->deepsleep) {
-        gs_debug ("Entering deep sleep, suspending jobs");
-        manager->priv->deepsleep = TRUE;
-        g_hash_table_foreach (manager->priv->jobs, (GHFunc) suspend_job, manager);
-    }
-
-    return TRUE;
-}
-
-static void
-add_deepsleep_idle (GSManager *manager) {
-    remove_deepsleep_idle(manager);
-    manager->priv->deepsleep_idle_id = g_timeout_add_seconds (15, deepsleep_idle, manager);
-}
-
 static gboolean
 window_map_event_cb (GSWindow  *window,
                      GdkEvent  *event,
@@ -698,9 +592,6 @@ manager_show_window (GSManager *manager,
         add_cycle_timer (manager, manager->priv->prefs->cycle);
     }
 
-    remove_dpms_timer (manager);
-    add_dpms_timer (manager, manager->priv->prefs->dpms_sleep_timeout);
-
     /* FIXME: only emit signal once */
     g_signal_emit (manager, signals[ACTIVATED], 0);
 }
@@ -768,8 +659,6 @@ handle_window_dialog_up (GSManager *manager,
         gs_debug ("Suspending jobs");
         g_hash_table_foreach (manager->priv->jobs, (GHFunc) suspend_job, manager);
     }
-
-    remove_dpms_timer (manager);
 }
 
 static void
@@ -801,9 +690,6 @@ handle_window_dialog_down (GSManager *manager,
         g_hash_table_foreach (manager->priv->jobs, (GHFunc) resume_job, manager);
     }
 
-    remove_dpms_timer (manager);
-    add_dpms_timer (manager, manager->priv->prefs->dpms_sleep_timeout);
-
     g_signal_emit (manager, signals[AUTH_REQUEST_END], 0);
 }
 
@@ -1021,7 +907,6 @@ gs_manager_finalize (GObject *object) {
 
     g_return_if_fail (manager->priv != NULL);
 
-    remove_deepsleep_idle (manager);
     remove_timers(manager);
     gs_grab_release (manager->priv->grab, TRUE);
     g_hash_table_destroy (manager->priv->jobs);
diff --git a/src/gs-prefs.c b/src/gs-prefs.c
index f8740066..5bebf88b 100644
--- a/src/gs-prefs.c
+++ b/src/gs-prefs.c
@@ -143,30 +143,6 @@ _gs_prefs_set_cycle_timeout (GSPrefs *prefs,
     prefs->cycle = value * 60;
 }
 
-static void
-_gs_prefs_set_dpms_sleep_timeout (GSPrefs *prefs,
-                                  int      value) {
-    if (value < 0)
-        value = 0;
-
-    if (value > 60)
-        value = 60;
-
-    prefs->dpms_sleep_timeout = value;
-}
-
-static void
-_gs_prefs_set_dpms_off_timeout (GSPrefs *prefs,
-                                int      value) {
-    if (value < 0)
-        value = 0;
-
-    if (value > 60)
-        value = 60;
-
-    prefs->dpms_off_timeout = value;
-}
-
 static void
 _gs_prefs_set_mode (GSPrefs    *prefs,
                     gint        mode) {
@@ -371,16 +347,6 @@ gs_prefs_load_from_settings (GSPrefs *prefs) {
                                     DEFAULT_KEY_CYCLE_DELAY);
     _gs_prefs_set_cycle_timeout (prefs, value);
 
-    value = xfconf_channel_get_double (prefs->priv->channel,
-                                       KEY_DPMS_SLEEP_AFTER,
-                                       DEFAULT_KEY_DPMS_SLEEP_AFTER);
-    _gs_prefs_set_dpms_sleep_timeout (prefs, (int)value);
-
-    value = xfconf_channel_get_double (prefs->priv->channel,
-                                       KEY_DPMS_OFF_AFTER,
-                                       DEFAULT_KEY_DPMS_OFF_AFTER);
-    _gs_prefs_set_dpms_off_timeout (prefs, (int)value);
-
     mode = xfconf_channel_get_int (prefs->priv->channel,
                                    KEY_MODE,
                                    DEFAULT_KEY_MODE);
@@ -517,16 +483,6 @@ key_changed_cb (XfconfChannel *channel,
 
         delay = xfconf_channel_get_int (channel, property, DEFAULT_KEY_CYCLE_DELAY);
         _gs_prefs_set_cycle_timeout (prefs, delay);
-    } else if (strcmp (property, KEY_DPMS_SLEEP_AFTER) == 0) {
-        double delay;
-
-        delay = xfconf_channel_get_double (channel, property, DEFAULT_KEY_DPMS_SLEEP_AFTER);
-        _gs_prefs_set_dpms_sleep_timeout (prefs, (int)delay);
-    } else if (strcmp (property, KEY_DPMS_OFF_AFTER) == 0) {
-        double delay;
-
-        delay = xfconf_channel_get_double (channel, property, DEFAULT_KEY_DPMS_OFF_AFTER);
-        _gs_prefs_set_dpms_off_timeout (prefs, (int)delay);
     } else if (strcmp (property, KEY_KEYBOARD_ENABLED) == 0) {
         gboolean enabled;
 
diff --git a/src/gs-prefs.h b/src/gs-prefs.h
index 7b1f8e12..4537a5ff 100644
--- a/src/gs-prefs.h
+++ b/src/gs-prefs.h
@@ -185,22 +185,6 @@ G_BEGIN_DECLS
 #define KEY_USER_SWITCH_ENABLED "/lock/user-switching/enabled"
 #define DEFAULT_KEY_USER_SWITCH_ENABLED TRUE
 
-/**
- * Blank screensaver DPMS sleep timeout (seconds)
- * This value controls the timeout after blanking the screen to suspend the display.
- * A value of 0 means that it is disabled.
- */
-#define KEY_DPMS_SLEEP_AFTER "/screensavers/xfce-blank/dpms-sleep-after"
-#define DEFAULT_KEY_DPMS_SLEEP_AFTER 5
-
-/**
- * Blank screensaver DPMS power timeout (minutes)
- * This value controls the timeout after blanking the screen to power off the display.
- * A value of 0 means that it is disabled.
- */
-#define KEY_DPMS_OFF_AFTER "/screensavers/xfce-blank/dpms-off-after"
-#define DEFAULT_KEY_DPMS_OFF_AFTER 15
-
 typedef enum
 {
     GS_MODE_BLANK_ONLY,
@@ -238,9 +222,6 @@ typedef struct
 
     GSList          *themes;   /* the screensaver themes to run */
     GSSaverMode      mode; /* theme selection mode */
-
-    guint            dpms_sleep_timeout; /* blank: # of minutes to wait before sleeping the display */
-    guint            dpms_off_timeout; /* blank: # of minutes after sleep to power off the display */
 } GSPrefs;
 
 typedef struct
diff --git a/src/xfce4-screensaver-configure.py b/src/xfce4-screensaver-configure.py
index 596eb583..16769f82 100755
--- a/src/xfce4-screensaver-configure.py
+++ b/src/xfce4-screensaver-configure.py
@@ -144,27 +144,6 @@ class DesktopScreensaverSettings(ScreensaverSettings):
         self.name = name
 
     def load_from_file(self, filename):
-        if self.name == "xfce-blank":
-            self.valid = True
-
-            self.options = self.parse_internal()
-            self.label = _("Blank screen")
-            comment = _("Powered by Display Power Management Signaling (DPMS),\n"
-                        "Xfce Screensaver can automatically suspend your displays\n"
-                        "to save power.\n\n"
-                        "Xfce Power Manager and other applications also manage\n"
-                        "DPMS settings. If the settings here won't work, make sure\n"
-                        "display power management wasn't disabled there.\n"
-                        "If your displays are powering off at different\n"
-                        "intervals, be sure to check for conflicting settings.")
-            self.arguments = []
-            self.description = comment
-
-            if self.options:
-                self.configurable = True
-
-            return True
-
         if not os.path.exists(filename):
             return False
 
@@ -194,15 +173,6 @@ class DesktopScreensaverSettings(ScreensaverSettings):
 
     def parse_internal(self):
         options = OrderedDict()
-        if self.name == "xfce-blank":
-            options["dpms-sleep-after"] = {'id': 'dpms-sleep-after', 'type': 'slider',
-                                           'label': _("After blanking, put display to sleep after:"),
-                                           'default': 5, 'low': 0, 'high': 60, 'step': 1,
-                                           'low-label': _("Never"), 'high-label': _("60 seconds")}
-            options["dpms-off-after"] = {'id': 'dpms-off-after', 'type': 'slider',
-                                         'label': _("After sleeping, switch display off after:"),
-                                         'default': 15, 'low': 0, 'high': 60, 'step': 1,
-                                         'low-label': _("Never"), 'high-label': _("60 minutes")}
         if self.name == "xfce-floaters":
             options["number-of-images"] = {'id': 'number-of-images', 'type': 'spinbutton',
                                            'label': _("Max number of images"), 'argument': '-n %',
@@ -715,9 +685,6 @@ def get_filename(theme):
             if os.path.exists(cfg):
                 return cfg
 
-    if theme == "xfce-blank":
-        return ""
-
     return None
 
 
@@ -784,7 +751,7 @@ if __name__ == "__main__":
 
     if fname.endswith(".xml"):
         obj = XmlScreensaverSettings(saver)
-    elif fname.endswith(".desktop") or saver == "xfce-blank":
+    elif fname.endswith(".desktop"):
         obj = DesktopScreensaverSettings(saver)
     else:
         show_fatal(primary, _("Unrecognized file type: %s") % fname)
diff --git a/src/xfce4-screensaver-preferences.c b/src/xfce4-screensaver-preferences.c
index b9504149..46812c20 100644
--- a/src/xfce4-screensaver-preferences.c
+++ b/src/xfce4-screensaver-preferences.c
@@ -279,7 +279,7 @@ config_set_theme (const char *theme_id) {
         active_theme = g_strdup (theme_id);
     }
 
-    if (mode != GS_MODE_RANDOM) {
+    if (mode != GS_MODE_RANDOM && mode != GS_MODE_BLANK_ONLY) {
         GtkWidget *configure_button = GTK_WIDGET (gtk_builder_get_object (builder, "configure_button"));
         gtk_widget_set_sensitive (configure_button, TRUE);
     }
-- 
GitLab