diff --git a/config/illume/e.src b/config/illume/e.src index a2a0bea2a..7e8768fbd 100644 --- a/config/illume/e.src +++ b/config/illume/e.src @@ -1612,6 +1612,7 @@ group "E_Config" struct { value "screensaver_ask_presentation" uchar: 1; value "screensaver_ask_presentation_timeout" double: 30.0000000000000000000000000; value "screensaver_suspend" uchar: 1; + value "screensaver_suspend_on_ac" uchar: 0; value "screensaver_suspend_delay" double: 5.0000000000000000000000000; value "dpms_enable" int: 1; value "dpms_standby_enable" int: 1; diff --git a/config/standard/e.src b/config/standard/e.src index f1db1b5e3..3bd883141 100644 --- a/config/standard/e.src +++ b/config/standard/e.src @@ -1773,6 +1773,7 @@ group "E_Config" struct { value "screensaver_ask_presentation" uchar: 1; value "screensaver_ask_presentation_timeout" double: 30.0000000000000000000000000; value "screensaver_suspend" uchar: 0; + value "screensaver_suspend_on_ac" uchar: 0; value "screensaver_suspend_delay" double: 15.0000000000000000000000000; value "dpms_enable" int: 1; value "dpms_standby_enable" int: 1; diff --git a/src/bin/e_config.c b/src/bin/e_config.c index 7b5ae5333..b8cd21dc2 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -798,6 +798,7 @@ e_config_init(void) E_CONFIG_VAL(D, T, screensaver_ask_presentation_timeout, DOUBLE); E_CONFIG_VAL(D, T, screensaver_suspend, UCHAR); + E_CONFIG_VAL(D, T, screensaver_suspend_on_ac, UCHAR); E_CONFIG_VAL(D, T, screensaver_suspend_delay, DOUBLE); E_CONFIG_VAL(D, T, dpms_enable, INT); diff --git a/src/bin/e_config.h b/src/bin/e_config.h index aad490a70..4b4a917d7 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -225,6 +225,7 @@ struct _E_Config double screensaver_ask_presentation_timeout; // GUI unsigned char screensaver_suspend; + unsigned char screensaver_suspend_on_ac; double screensaver_suspend_delay; int dpms_enable; // GUI diff --git a/src/bin/e_screensaver.c b/src/bin/e_screensaver.c index 02c2b8640..237be18e0 100644 --- a/src/bin/e_screensaver.c +++ b/src/bin/e_screensaver.c @@ -9,6 +9,7 @@ static Ecore_Event_Handler *_e_screensaver_handler_border_iconify = NULL; static Ecore_Event_Handler *_e_screensaver_handler_border_uniconify = NULL; static Ecore_Event_Handler *_e_screensaver_handler_border_desk_set = NULL; static Ecore_Event_Handler *_e_screensaver_handler_desk_show = NULL; +static Ecore_Event_Handler *_e_screensaver_handler_powersave = NULL; static E_Dialog *_e_screensaver_ask_presentation_dia = NULL; static int _e_screensaver_ask_presentation_count = 0; @@ -18,6 +19,7 @@ static int _e_screensaver_blanking = 0; static int _e_screensaver_expose = 0; static Ecore_Timer *_e_screensaver_suspend_timer = NULL; +static Eina_Bool _e_screensaver_on = EINA_FALSE; EAPI void e_screensaver_update(void) @@ -160,12 +162,31 @@ _e_screensaver_ask_presentation_mode(void) _e_screensaver_ask_presentation_dia = dia; } +static Eina_Bool +_e_screensaver_handler_powersave_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__) +{ + if ((_e_screensaver_on) && (!_e_screensaver_suspend_timer)) + { + if (e_config->screensaver_suspend) + { + if ((e_config->screensaver_suspend_on_ac) || + (e_powersave_mode_get() > E_POWERSAVE_MODE_LOW)) + e_sys_action_do(E_SYS_SUSPEND, NULL); + } + } + return ECORE_CALLBACK_PASS_ON; +} + static Eina_Bool _e_screensaver_suspend_cb(void *data __UNUSED__) { _e_screensaver_suspend_timer = NULL; if (e_config->screensaver_suspend) - e_sys_action_do(E_SYS_SUSPEND, NULL); + { + if ((e_config->screensaver_suspend_on_ac) || + (e_powersave_mode_get() > E_POWERSAVE_MODE_LOW)) + e_sys_action_do(E_SYS_SUSPEND, NULL); + } return EINA_FALSE; } @@ -177,6 +198,7 @@ _e_screensaver_handler_screensaver_notify_cb(void *data __UNUSED__, int type __U if (e->on) { + _e_screensaver_on = EINA_TRUE; if (_e_screensaver_suspend_timer) { ecore_timer_del(_e_screensaver_suspend_timer); @@ -189,6 +211,7 @@ _e_screensaver_handler_screensaver_notify_cb(void *data __UNUSED__, int type __U } else { + _e_screensaver_on = EINA_FALSE; if (_e_screensaver_suspend_timer) { ecore_timer_del(_e_screensaver_suspend_timer); @@ -266,6 +289,9 @@ e_screensaver_init(void) _e_screensaver_handler_desk_show = ecore_event_handler_add (E_EVENT_DESK_SHOW, _e_screensaver_handler_desk_show_cb, NULL); + _e_screensaver_handler_powersave = ecore_event_handler_add + (E_EVENT_POWERSAVE_UPDATE, _e_screensaver_handler_powersave_cb, NULL); + _e_screensaver_timeout = ecore_x_screensaver_timeout_get(); _e_screensaver_interval = ecore_x_screensaver_interval_get(); _e_screensaver_blanking = ecore_x_screensaver_blank_get(); @@ -284,6 +310,13 @@ e_screensaver_shutdown(void) ecore_timer_del(_e_screensaver_suspend_timer); _e_screensaver_suspend_timer = NULL; } + + if (_e_screensaver_handler_powersave) + { + ecore_event_handler_del(_e_screensaver_handler_powersave); + _e_screensaver_handler_powersave = NULL; + } + if (_e_screensaver_handler_config_mode) { ecore_event_handler_del(_e_screensaver_handler_config_mode); diff --git a/src/modules/battery/e_mod_main.c b/src/modules/battery/e_mod_main.c index db10e7f29..0dc371acc 100644 --- a/src/modules/battery/e_mod_main.c +++ b/src/modules/battery/e_mod_main.c @@ -570,8 +570,10 @@ _battery_update(int full, int time_left, int time_full, Eina_Bool have_battery, e_powersave_mode_set(E_POWERSAVE_MODE_LOW); else { - if ((have_power) || (full > 95)) + if (have_power) e_powersave_mode_set(E_POWERSAVE_MODE_LOW); + else if (full > 95) + e_powersave_mode_set(E_POWERSAVE_MODE_MEDIUM); else if (full > 30) e_powersave_mode_set(E_POWERSAVE_MODE_HIGH); else diff --git a/src/modules/conf_display/e_int_config_screensaver.c b/src/modules/conf_display/e_int_config_screensaver.c index df56cbe24..5c5b3c898 100644 --- a/src/modules/conf_display/e_int_config_screensaver.c +++ b/src/modules/conf_display/e_int_config_screensaver.c @@ -29,6 +29,7 @@ struct _E_Config_Dialog_Data double ask_presentation_timeout; int screensaver_suspend; + int screensaver_suspend_on_ac; double screensaver_suspend_delay; Eina_List *disable_list; @@ -73,6 +74,7 @@ _fill_data(E_Config_Dialog_Data *cfdata) cfdata->ask_presentation = e_config->screensaver_ask_presentation; cfdata->ask_presentation_timeout = e_config->screensaver_ask_presentation_timeout; cfdata->screensaver_suspend = e_config->screensaver_suspend; + cfdata->screensaver_suspend_on_ac = e_config->screensaver_suspend_on_ac; cfdata->screensaver_suspend_delay = e_config->screensaver_suspend_delay; } @@ -105,6 +107,7 @@ _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) e_config->screensaver_ask_presentation = cfdata->ask_presentation; e_config->screensaver_ask_presentation_timeout = cfdata->ask_presentation_timeout; e_config->screensaver_suspend = cfdata->screensaver_suspend; + e_config->screensaver_suspend_on_ac = cfdata->screensaver_suspend_on_ac; e_config->screensaver_suspend_delay = cfdata->screensaver_suspend_delay; /* Apply settings */ @@ -125,6 +128,7 @@ _basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfda (e_config->screensaver_ask_presentation != cfdata->ask_presentation) || (e_config->screensaver_ask_presentation_timeout != cfdata->ask_presentation_timeout) || (e_config->screensaver_suspend != cfdata->screensaver_suspend) || + (e_config->screensaver_suspend_on_ac != cfdata->screensaver_suspend_on_ac) || (e_config->screensaver_suspend_delay != cfdata->screensaver_suspend_delay)); } @@ -147,6 +151,10 @@ _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data &(cfdata->screensaver_suspend)); cfdata->disable_list = eina_list_append(cfdata->disable_list, ow); e_widget_list_object_append(ol, ow, 1, 1, 0.5); + ow = e_widget_check_add(evas, _("Even if on power"), + &(cfdata->screensaver_suspend_on_ac)); + cfdata->disable_list = eina_list_append(cfdata->disable_list, ow); + e_widget_list_object_append(ol, ow, 1, 1, 0.5); ow = e_widget_label_add(evas, _("Delay until suspend")); cfdata->disable_list = eina_list_append(cfdata->disable_list, ow); e_widget_list_object_append(ol, ow, 1, 1, 0.5);