From a6c68aaf5e162452cdf951e74d8e2b84a545c28d Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Fri, 9 Dec 2022 08:44:59 +0000 Subject: [PATCH] blanking/screensaver/dpms - in x poll 10s and force blank settings so some apps/clients mess with screensaver/blanking/dpms behind e's back. work around this - every 10 sec poll and check (ugly) and if things are nto set as they should be ... force them to be set that way. may lead to fights over this but too many people complaining about steam or other apps messing with this. --- src/bin/e_comp_x.c | 15 +++++++++ src/bin/e_dpms.c | 22 ++++++------- src/bin/e_dpms.h | 4 +++ src/bin/e_screensaver.c | 71 +++++++++++++++++++++++++++++++++++------ src/bin/e_screensaver.h | 1 + 5 files changed, 90 insertions(+), 23 deletions(-) diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c index 408be95ff..bb552637a 100644 --- a/src/bin/e_comp_x.c +++ b/src/bin/e_comp_x.c @@ -77,6 +77,7 @@ static int screen_size_index = -1; static Ecore_X_Atom backlight_atom = 0; static Ecore_Timer *mouse_in_fix_check_timer = NULL; +static Ecore_Timer *_e_comp_x_blank_apply_timer = NULL; static Eina_Hash *dead_wins; @@ -6031,6 +6032,13 @@ _e_comp_x_screens_setup(void) return EINA_FALSE; } +static Eina_Bool +_e_comp_x_blank_apply(void *data EINA_UNUSED) +{ + e_screensaver_force_update(); + return EINA_TRUE; +} + E_API Eina_Bool e_comp_x_init(void) { @@ -6198,6 +6206,8 @@ e_comp_x_init(void) e_config->screensaver_blanking, e_config->screensaver_expose); e_comp_x_devices_config_apply(EINA_FALSE); + _e_comp_x_blank_apply_timer = ecore_timer_add + (10.0, _e_comp_x_blank_apply, NULL); } else e_dnd_init(); @@ -6208,6 +6218,11 @@ e_comp_x_init(void) E_API void e_comp_x_shutdown(void) { + if (_e_comp_x_blank_apply_timer) + { + ecore_timer_del(_e_comp_x_blank_apply_timer); + _e_comp_x_blank_apply_timer = NULL; + } _e_comp_x_del(e_comp); E_FREE_LIST(handlers, ecore_event_handler_del); E_FREE_FUNC(clients_win_hash, eina_hash_free); diff --git a/src/bin/e_dpms.c b/src/bin/e_dpms.c index 33f394665..c8ad8b873 100644 --- a/src/bin/e_dpms.c +++ b/src/bin/e_dpms.c @@ -21,10 +21,6 @@ static Ecore_Timer *suspend_timer; static Ecore_Timer *off_timer; #endif -#define STANDBY 10 -#define SUSPEND 11 -#define OFF 12 - E_API void e_dpms_update(void) { @@ -53,9 +49,9 @@ e_dpms_update(void) if (e_config->screensaver_enable) { off = suspend = standby = e_screensaver_timeout_get(EINA_FALSE); - standby += STANDBY; - suspend += SUSPEND; - off += OFF; + standby += E_DPMS_STANDBY; + suspend += E_DPMS_SUSPEND; + off += E_DPMS_OFF; } if (_e_dpms_timeout_standby != standby) { @@ -101,9 +97,9 @@ e_dpms_force_update(void) if (e_config->screensaver_enable) { off = suspend = standby = e_screensaver_timeout_get(EINA_FALSE); - standby += STANDBY; - suspend += SUSPEND; - off += OFF; + standby += E_DPMS_STANDBY; + suspend += E_DPMS_SUSPEND; + off += E_DPMS_OFF; } #ifndef HAVE_WAYLAND_ONLY if (e_comp->comp_type != E_PIXMAP_TYPE_X) return; @@ -171,9 +167,9 @@ _e_dpms_off(void *d EINA_UNUSED) static Eina_Bool _e_dpms_screensaver_on() { - standby_timer = ecore_timer_loop_add(STANDBY, _e_dpms_standby, NULL); - suspend_timer = ecore_timer_loop_add(SUSPEND, _e_dpms_suspend, NULL); - off_timer = ecore_timer_loop_add(OFF, _e_dpms_off, NULL); + standby_timer = ecore_timer_loop_add(E_DPMS_STANDBY, _e_dpms_standby, NULL); + suspend_timer = ecore_timer_loop_add(E_DPMS_SUSPEND, _e_dpms_suspend, NULL); + off_timer = ecore_timer_loop_add(E_DPMS_OFF, _e_dpms_off, NULL); return ECORE_CALLBACK_RENEW; } diff --git a/src/bin/e_dpms.h b/src/bin/e_dpms.h index 37ec666ba..fdfed89ab 100644 --- a/src/bin/e_dpms.h +++ b/src/bin/e_dpms.h @@ -3,6 +3,10 @@ #ifndef E_DPMS_H #define E_DPMS_H +#define E_DPMS_STANDBY 10 +#define E_DPMS_SUSPEND 11 +#define E_DPMS_OFF 12 + EINTERN int e_dpms_init(void); EINTERN int e_dpms_shutdown(void); diff --git a/src/bin/e_screensaver.c b/src/bin/e_screensaver.c index 96dde1eb9..855049993 100644 --- a/src/bin/e_screensaver.c +++ b/src/bin/e_screensaver.c @@ -88,6 +88,65 @@ e_screensaver_ignore_get(void) return _screensaver_ignore; } +static int +_e_screensaver_timeout_get(void) +{ + int timeout = e_screensaver_timeout_get(EINA_TRUE); + + if (!((e_config->screensaver_enable) && + (!((e_util_fullscreen_current_any()) && + (e_config->no_dpms_on_fullscreen))))) + timeout = 0; + if ((e_msgbus_data) && + (e_msgbus_data->screensaver_inhibits)) + timeout = 0; + return timeout; +} + +E_API void +e_screensaver_force_update(void) +{ +#ifndef HAVE_WAYLAND_ONLY + if (e_comp->comp_type != E_PIXMAP_TYPE_WL) + { + int timeout = _e_screensaver_timeout_get(); + int x_timeout = ecore_x_screensaver_timeout_get(); + + if (!e_config->screensaver_dpms_off) + { + Eina_Bool x_dpms = ecore_x_dpms_enabled_get(); + unsigned int x_standby = 0, x_suspend = 0, x_off = 0; + unsigned int standby = 0, suspend = 0, off = 0; + + if (e_config->screensaver_enable != x_dpms) + { + printf("SCRSV: someone else messed with screen dpms!\n"); + ecore_x_dpms_enabled_set(e_config->screensaver_enable); + } + off = suspend = standby = e_screensaver_timeout_get(EINA_FALSE); + standby += E_DPMS_STANDBY; + suspend += E_DPMS_SUSPEND; + off += E_DPMS_OFF; + ecore_x_dpms_timeouts_get(&x_standby, &x_suspend, &x_off); + if ((x_standby != standby) || (x_suspend != suspend) || + (x_off != off)) + { + printf("SCRSV: someone else messed with screen dpms timeouts!\n"); + ecore_x_dpms_timeouts_set(standby, suspend, off); + } + } + if (timeout != x_timeout) + { + printf("SCRSV: someone else messed with screen blanking!\n"); + ecore_x_screensaver_set(timeout, + e_config->screensaver_interval, + e_config->screensaver_blanking, + e_config->screensaver_expose); + } + } +#endif +} + E_API void e_screensaver_update(void) { @@ -109,15 +168,7 @@ e_screensaver_update(void) _e_screensaver_cfg_timeout = e_config->screensaver_timeout; _e_screensaver_cfg_dim = dim_timeout; - timeout = e_screensaver_timeout_get(EINA_TRUE); - if (!((e_config->screensaver_enable) && - (!((e_util_fullscreen_current_any()) && - (e_config->no_dpms_on_fullscreen))))) - timeout = 0; - if (e_msgbus_data) - { - if (e_msgbus_data->screensaver_inhibits) timeout = 0; - } + timeout = _e_screensaver_timeout_get(); if (_e_screensaver_timeout != timeout) { @@ -153,7 +204,7 @@ e_screensaver_update(void) // screen doesn't turn off at all because x thinks internally // that the monitor is still off... so this is odd, but it's // necessary on some hardware. - if ((real_changed) && (!e_config->screensaver_dpms_off)) + if (real_changed && (!e_config->screensaver_dpms_off)) { ecore_x_dpms_enabled_set(!e_config->screensaver_enable); ecore_x_dpms_enabled_set(e_config->screensaver_enable); diff --git a/src/bin/e_screensaver.h b/src/bin/e_screensaver.h index a8cd8753d..9db8e7ff3 100644 --- a/src/bin/e_screensaver.h +++ b/src/bin/e_screensaver.h @@ -11,6 +11,7 @@ E_API void e_screensaver_ignore(void); E_API void e_screensaver_unignore(void); E_API Eina_Bool e_screensaver_ignore_get(void); +E_API void e_screensaver_force_update(void); E_API void e_screensaver_update(void); E_API int e_screensaver_timeout_get(Eina_Bool use_idle);