Do not activate DPMS, Screen Saver or Locker if there is a fullscreen window.

I guess there is nothing more annoying than having a fullscreen window
to watch a quick movie, read some text or webpage or whatever and have
the DPMS to show, or the screensaver to be activated or your screen to
be locked.

This patch uses the new border signal and counts, if there is at least
one fullscreen border, then avoid doing these annoyances.

I'm not accounting for any border parameter/property, like if it is in
a visible screen or desktop. I hope this is fine, otherwise let me know.

I also asked and common sense at IRC (at least to me and englebass) is
that there is no need to configure such behavior, so there is no
configure option for it.

I'm also thinking about maximized windows to have a configurable
behavior to match this, but I'm not sure.



SVN revision: 49262
This commit is contained in:
Gustavo Sverzut Barbieri 2010-05-28 22:13:20 +00:00
parent 1c3afc74b2
commit 9e581982f7
3 changed files with 105 additions and 3 deletions

View File

@ -64,6 +64,9 @@ static int _e_desklock_user_idle = 0;
static double _e_desklock_autolock_time = 0.0;
static E_Dialog *_e_desklock_ask_presentation_dia = NULL;
static int _e_desklock_ask_presentation_count = 0;
static Ecore_Event_Handler *_e_desklock_handler_border_fullscreen = NULL;
static Ecore_Event_Handler *_e_desklock_handler_border_unfullscreen = NULL;
static int _e_desklock_fullscreen_count = 0;
/***********************************************************************/
@ -93,6 +96,8 @@ static char *_desklock_auth_get_current_host(void);
#endif
static void _e_desklock_ask_presentation_mode(void);
static int _e_desklock_handler_border_fullscreen_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__);
static int _e_desklock_handler_border_unfullscreen_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__);
EAPI int E_EVENT_DESKLOCK = 0;
@ -103,6 +108,14 @@ e_desklock_init(void)
_e_desklock_idle_poller = ecore_poller_add(ECORE_POLLER_CORE, 256,
_e_desklock_cb_idle_poller, NULL);
if (!_e_desklock_handler_border_fullscreen)
_e_desklock_handler_border_fullscreen = ecore_event_handler_add
(E_EVENT_BORDER_FULLSCREEN, _e_desklock_handler_border_fullscreen_cb, NULL);
if (!_e_desklock_handler_border_unfullscreen)
_e_desklock_handler_border_unfullscreen = ecore_event_handler_add
(E_EVENT_BORDER_UNFULLSCREEN, _e_desklock_handler_border_unfullscreen_cb, NULL);
if (e_config->desklock_background)
e_filereg_register(e_config->desklock_background);
@ -114,6 +127,18 @@ e_desklock_init(void)
EAPI int
e_desklock_shutdown(void)
{
if (_e_desklock_handler_border_fullscreen)
{
ecore_event_handler_del(_e_desklock_handler_border_fullscreen);
_e_desklock_handler_border_fullscreen = NULL;
}
if (_e_desklock_handler_border_unfullscreen)
{
ecore_event_handler_del(_e_desklock_handler_border_unfullscreen);
_e_desklock_handler_border_unfullscreen = NULL;
}
e_desklock_hide();
if (e_config->desklock_background)
e_filereg_deregister(e_config->desklock_background);
@ -141,6 +166,7 @@ _user_wallpaper_get(void)
EAPI int
e_desklock_show_autolocked(void)
{
if (_e_desklock_fullscreen_count > 0) return 0;
if (_e_desklock_autolock_time < 1.0)
_e_desklock_autolock_time = ecore_loop_time_get();
return e_desklock_show();
@ -900,7 +926,8 @@ _e_desklock_cb_custom_desklock_exit(void *data __UNUSED__, int type __UNUSED__,
static int
_e_desklock_cb_idle_poller(void *data __UNUSED__)
{
if ((e_config->desklock_autolock_idle) && (!e_config->mode.presentation))
if ((e_config->desklock_autolock_idle) && (!e_config->mode.presentation) &&
(_e_desklock_fullscreen_count <= 0))
{
double idle, max;
@ -1047,3 +1074,20 @@ _e_desklock_ask_presentation_mode(void)
_e_desklock_ask_presentation_dia = dia;
}
static int
_e_desklock_handler_border_fullscreen_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
{
_e_desklock_fullscreen_count++;
if (_e_desklock_fullscreen_count == 1) e_desklock_init();
return 1;
}
static int
_e_desklock_handler_border_unfullscreen_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
{
_e_desklock_fullscreen_count--;
if (_e_desklock_fullscreen_count == 0) e_desklock_init();
else if (_e_desklock_fullscreen_count < 0) _e_desklock_fullscreen_count = 0;
return 1;
}

View File

@ -4,6 +4,9 @@
#include "e.h"
static Ecore_Event_Handler *_e_dpms_handler_config_mode = NULL;
static Ecore_Event_Handler *_e_dpms_handler_border_fullscreen = NULL;
static Ecore_Event_Handler *_e_dpms_handler_border_unfullscreen = NULL;
static int _e_dpms_fullscreen_count = 0;
static int
_e_dpms_handler_config_mode_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
@ -12,16 +15,42 @@ _e_dpms_handler_config_mode_cb(void *data __UNUSED__, int type __UNUSED__, void
return 1;
}
static int
_e_dpms_handler_border_fullscreen_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
{
_e_dpms_fullscreen_count++;
if (_e_dpms_fullscreen_count == 1) e_dpms_init();
return 1;
}
static int
_e_dpms_handler_border_unfullscreen_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
{
_e_dpms_fullscreen_count--;
if (_e_dpms_fullscreen_count == 0) e_dpms_init();
else if (_e_dpms_fullscreen_count < 0) _e_dpms_fullscreen_count = 0;
return 1;
}
EAPI int
e_dpms_init(void)
{
int standby=0, suspend=0, off=0;
int enabled = ((e_config->dpms_enable) && (!e_config->mode.presentation));
int enabled = ((e_config->dpms_enable) && (!e_config->mode.presentation) &&
(_e_dpms_fullscreen_count <= 0));
if (!_e_dpms_handler_config_mode)
_e_dpms_handler_config_mode = ecore_event_handler_add
(E_EVENT_CONFIG_MODE_CHANGED, _e_dpms_handler_config_mode_cb, NULL);
if (!_e_dpms_handler_border_fullscreen)
_e_dpms_handler_border_fullscreen = ecore_event_handler_add
(E_EVENT_BORDER_FULLSCREEN, _e_dpms_handler_border_fullscreen_cb, NULL);
if (!_e_dpms_handler_border_unfullscreen)
_e_dpms_handler_border_unfullscreen = ecore_event_handler_add
(E_EVENT_BORDER_UNFULLSCREEN, _e_dpms_handler_border_unfullscreen_cb, NULL);
ecore_x_dpms_enabled_set(enabled);
if (!enabled)
return 1;

View File

@ -5,8 +5,11 @@
static Ecore_Event_Handler *_e_screensaver_handler_config_mode = NULL;
static Ecore_Event_Handler *_e_screensaver_handler_screensaver_notify = NULL;
static Ecore_Event_Handler *_e_screensaver_handler_border_fullscreen = NULL;
static Ecore_Event_Handler *_e_screensaver_handler_border_unfullscreen = NULL;
static E_Dialog *_e_screensaver_ask_presentation_dia = NULL;
static int _e_screensaver_ask_presentation_count = 0;
static int _e_screensaver_fullscreen_count = 0;
static int
_e_screensaver_handler_config_mode_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
@ -149,6 +152,23 @@ _e_screensaver_handler_screensaver_notify_cb(void *data __UNUSED__, int type __U
return 1;
}
static int
_e_screensaver_handler_border_fullscreen_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
{
_e_screensaver_fullscreen_count++;
if (_e_screensaver_fullscreen_count == 1) e_screensaver_init();
return 1;
}
static int
_e_screensaver_handler_border_unfullscreen_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
{
_e_screensaver_fullscreen_count--;
if (_e_screensaver_fullscreen_count == 0) e_screensaver_init();
else if (_e_screensaver_fullscreen_count < 0) _e_screensaver_fullscreen_count = 0;
return 1;
}
EAPI int
e_screensaver_init(void)
{
@ -162,7 +182,16 @@ e_screensaver_init(void)
_e_screensaver_handler_screensaver_notify = ecore_event_handler_add
(ECORE_X_EVENT_SCREENSAVER_NOTIFY, _e_screensaver_handler_screensaver_notify_cb, NULL);
if ((e_config->screensaver_enable) && (!e_config->mode.presentation))
if (!_e_screensaver_handler_border_fullscreen)
_e_screensaver_handler_border_fullscreen = ecore_event_handler_add
(E_EVENT_BORDER_FULLSCREEN, _e_screensaver_handler_border_fullscreen_cb, NULL);
if (!_e_screensaver_handler_border_unfullscreen)
_e_screensaver_handler_border_unfullscreen = ecore_event_handler_add
(E_EVENT_BORDER_UNFULLSCREEN, _e_screensaver_handler_border_unfullscreen_cb, NULL);
if ((e_config->screensaver_enable) && (!e_config->mode.presentation) &&
(_e_screensaver_fullscreen_count <= 0))
timeout = e_config->screensaver_timeout;
interval = e_config->screensaver_interval;