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);