enlightenment/src/bin/e_dpms.c

219 lines
6.4 KiB
C

#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 Ecore_Event_Handler *_e_dpms_handler_border_remove = NULL;
static Ecore_Event_Handler *_e_dpms_handler_border_iconify = NULL;
static Ecore_Event_Handler *_e_dpms_handler_border_uniconify = NULL;
static Ecore_Event_Handler *_e_dpms_handler_border_desk_set = NULL;
static Ecore_Event_Handler *_e_dpms_handler_desk_show = NULL;
static unsigned int _e_dpms_timeout_standby = 0;
static unsigned int _e_dpms_timeout_suspend = 0;
static unsigned int _e_dpms_timeout_off = 0;
static int _e_dpms_enabled = EINA_FALSE;
EAPI void
e_dpms_update(void)
{
unsigned int standby = 0, suspend = 0, off = 0;
int enabled;
Eina_Bool changed = EINA_FALSE;
enabled = ((e_config->screensaver_enable) &&
(!e_config->mode.presentation) &&
((!e_util_fullscreen_current_any()) && (!e_config->no_dpms_on_fullscreen))
);
if (_e_dpms_enabled != enabled)
{
_e_dpms_enabled = enabled;
#ifndef HAVE_WAYLAND_ONLY
if (e_comp_get(NULL)->comp_type == E_PIXMAP_TYPE_X)
ecore_x_dpms_enabled_set(enabled);
#endif
}
if (!enabled) return;
if (e_config->screensaver_enable)
{
off = suspend = standby = e_screensaver_timeout_get(EINA_FALSE);
standby += 5;
suspend += 6;
off += 7;
}
if (_e_dpms_timeout_standby != standby)
{
_e_dpms_timeout_standby = standby;
changed = EINA_TRUE;
}
if (_e_dpms_timeout_suspend != suspend)
{
_e_dpms_timeout_suspend = suspend;
changed = EINA_TRUE;
}
if (_e_dpms_timeout_off != off)
{
_e_dpms_timeout_off = off;
changed = EINA_TRUE;
}
#ifndef HAVE_WAYLAND_ONLY
if (e_comp_get(NULL)->comp_type == E_PIXMAP_TYPE_X)
{
if (changed) ecore_x_dpms_timeouts_set(standby, suspend, off);
}
#endif
}
EAPI void
e_dpms_force_update(void)
{
unsigned int standby = 0, suspend = 0, off = 0;
int enabled;
enabled = ((e_config->screensaver_enable) &&
(!e_config->mode.presentation));
#ifndef HAVE_WAYLAND_ONLY
if (e_comp_get(NULL)->comp_type == E_PIXMAP_TYPE_X)
ecore_x_dpms_enabled_set(enabled);
#endif
if (!enabled) return;
if (e_config->screensaver_enable)
{
off = suspend = standby = e_screensaver_timeout_get(EINA_FALSE);
standby += 5;
suspend += 6;
off += 7;
}
#ifndef HAVE_WAYLAND_ONLY
if (e_comp_get(NULL)->comp_type != E_PIXMAP_TYPE_X) return;
ecore_x_dpms_timeouts_set(standby + 10, suspend + 10, off + 10);
ecore_x_dpms_timeouts_set(standby, suspend, off);
#endif
}
static Eina_Bool
_e_dpms_handler_config_mode_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
{
e_dpms_update();
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_e_dpms_handler_border_fullscreen_check_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
{
if (e_config->no_dpms_on_fullscreen) e_dpms_update();
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_e_dpms_handler_border_desk_set_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
{
if (e_config->no_dpms_on_fullscreen) e_dpms_update();
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_e_dpms_handler_desk_show_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
{
if (e_config->no_dpms_on_fullscreen) e_dpms_update();
return ECORE_CALLBACK_PASS_ON;
}
EINTERN int
e_dpms_init(void)
{
_e_dpms_handler_config_mode = ecore_event_handler_add
(E_EVENT_CONFIG_MODE_CHANGED, _e_dpms_handler_config_mode_cb, NULL);
_e_dpms_handler_border_fullscreen = ecore_event_handler_add
(E_EVENT_CLIENT_FULLSCREEN, _e_dpms_handler_border_fullscreen_check_cb, NULL);
_e_dpms_handler_border_unfullscreen = ecore_event_handler_add
(E_EVENT_CLIENT_UNFULLSCREEN, _e_dpms_handler_border_fullscreen_check_cb, NULL);
_e_dpms_handler_border_remove = ecore_event_handler_add
(E_EVENT_CLIENT_REMOVE, _e_dpms_handler_border_fullscreen_check_cb, NULL);
_e_dpms_handler_border_iconify = ecore_event_handler_add
(E_EVENT_CLIENT_ICONIFY, _e_dpms_handler_border_fullscreen_check_cb, NULL);
_e_dpms_handler_border_uniconify = ecore_event_handler_add
(E_EVENT_CLIENT_UNICONIFY, _e_dpms_handler_border_fullscreen_check_cb, NULL);
_e_dpms_handler_border_desk_set = ecore_event_handler_add
(E_EVENT_CLIENT_DESK_SET, _e_dpms_handler_border_desk_set_cb, NULL);
_e_dpms_handler_desk_show = ecore_event_handler_add
(E_EVENT_DESK_SHOW, _e_dpms_handler_desk_show_cb, NULL);
#ifndef HAVE_WAYLAND_ONLY
if (e_comp_get(NULL)->comp_type == E_PIXMAP_TYPE_X)
{
_e_dpms_enabled = ecore_x_dpms_enabled_get();
ecore_x_dpms_timeouts_get
(&_e_dpms_timeout_standby, &_e_dpms_timeout_suspend, &_e_dpms_timeout_off);
}
#endif
e_dpms_force_update();
return 1;
}
EINTERN int
e_dpms_shutdown(void)
{
if (_e_dpms_handler_config_mode)
{
ecore_event_handler_del(_e_dpms_handler_config_mode);
_e_dpms_handler_config_mode = NULL;
}
if (_e_dpms_handler_border_fullscreen)
{
ecore_event_handler_del(_e_dpms_handler_border_fullscreen);
_e_dpms_handler_border_fullscreen = NULL;
}
if (_e_dpms_handler_border_unfullscreen)
{
ecore_event_handler_del(_e_dpms_handler_border_unfullscreen);
_e_dpms_handler_border_unfullscreen = NULL;
}
if (_e_dpms_handler_border_remove)
{
ecore_event_handler_del(_e_dpms_handler_border_remove);
_e_dpms_handler_border_remove = NULL;
}
if (_e_dpms_handler_border_iconify)
{
ecore_event_handler_del(_e_dpms_handler_border_iconify);
_e_dpms_handler_border_iconify = NULL;
}
if (_e_dpms_handler_border_uniconify)
{
ecore_event_handler_del(_e_dpms_handler_border_uniconify);
_e_dpms_handler_border_uniconify = NULL;
}
if (_e_dpms_handler_border_desk_set)
{
ecore_event_handler_del(_e_dpms_handler_border_desk_set);
_e_dpms_handler_border_desk_set = NULL;
}
if (_e_dpms_handler_desk_show)
{
ecore_event_handler_del(_e_dpms_handler_desk_show);
_e_dpms_handler_desk_show = NULL;
}
return 1;
}