diff --git a/config/default/e.src b/config/default/e.src index 321b0e845..7dc7302bf 100644 --- a/config/default/e.src +++ b/config/default/e.src @@ -1,5 +1,5 @@ group "E_Config" struct { - value "config_version" int: 65841; + value "config_version" int: 65842; value "show_splash" int: 0; value "init_default_theme" string: "default.edj"; value "desktop_default_name" string: "Desktop %i, %i"; @@ -450,6 +450,8 @@ group "E_Config" struct { value "desklock_autolock_idle" int: 0; value "desklock_autolock_idle_timeout" double: 300.0000000000000000000000000; value "desklock_use_custom_desklock" int: 0; + value "desklock_ask_presentation" uchar 1; + value "desklock_ask_presentation_timeout" double: 30; value "display_res_restore" int: 0; value "display_res_width" int: 1; value "display_res_height" int: 1; @@ -460,6 +462,8 @@ group "E_Config" struct { value "screensaver_interval" int: 5; value "screensaver_blanking" int: 2; value "screensaver_expose" int: 2; + value "screensaver_ask_presentation" uchar 1; + value "screensaver_ask_presentation_timeout" double: 30; value "dpms_enable" int: 1; value "dpms_standby_enable" int: 1; value "dpms_suspend_enable" int: 1; diff --git a/config/illume/e.src b/config/illume/e.src index ca90890f0..865ec42d4 100644 --- a/config/illume/e.src +++ b/config/illume/e.src @@ -1,5 +1,5 @@ group "E_Config" struct { - value "config_version" int: 65841; + value "config_version" int: 65842; value "show_splash" int: 1; value "init_default_theme" string: "default.edj"; value "desktop_default_name" string: "Desktop %i, %i"; @@ -660,6 +660,8 @@ group "E_Config" struct { value "desklock_autolock_idle" int: 0; value "desklock_autolock_idle_timeout" double: 300.0000000000000000000000000; value "desklock_use_custom_desklock" int: 0; + value "desklock_ask_presentation" uchar 1; + value "desklock_ask_presentation_timeout" double: 30; value "display_res_restore" int: 0; value "display_res_width" int: 1; value "display_res_height" int: 1; @@ -670,6 +672,8 @@ group "E_Config" struct { value "screensaver_interval" int: 5; value "screensaver_blanking" int: 2; value "screensaver_expose" int: 2; + value "screensaver_ask_presentation" uchar 1; + value "screensaver_ask_presentation_timeout" double: 30; value "dpms_enable" int: 0; value "dpms_standby_enable" int: 0; value "dpms_suspend_enable" int: 0; diff --git a/config/minimalist/e.src b/config/minimalist/e.src index 94a4e62a7..a4dfa7da2 100644 --- a/config/minimalist/e.src +++ b/config/minimalist/e.src @@ -1,5 +1,5 @@ group "E_Config" struct { - value "config_version" int: 65841; + value "config_version" int: 65842; value "show_splash" int: 1; value "init_default_theme" string: "default.edj"; value "desktop_default_background" string: "Light_Gradient.edj"; @@ -1864,6 +1864,8 @@ group "E_Config" struct { value "desklock_autolock_idle" int: 0; value "desklock_autolock_idle_timeout" double: 300.0000000000000000000000000; value "desklock_use_custom_desklock" int: 0; + value "desklock_ask_presentation" uchar 1; + value "desklock_ask_presentation_timeout" double: 30; value "display_res_restore" int: 0; value "display_res_width" int: 1; value "display_res_height" int: 1; @@ -1874,6 +1876,8 @@ group "E_Config" struct { value "screensaver_interval" int: 5; value "screensaver_blanking" int: 2; value "screensaver_expose" int: 2; + value "screensaver_ask_presentation" uchar 1; + value "screensaver_ask_presentation_timeout" double: 30; value "dpms_enable" int: 0; value "dpms_standby_enable" int: 0; value "dpms_suspend_enable" int: 0; diff --git a/config/netbook/e.src b/config/netbook/e.src index 230f3947b..0675c41ba 100644 --- a/config/netbook/e.src +++ b/config/netbook/e.src @@ -1,5 +1,5 @@ group "E_Config" struct { - value "config_version" int: 65841; + value "config_version" int: 65842; value "show_splash" int: 1; value "init_default_theme" string: "default.edj"; value "desktop_default_background" string: "Dark_Gradient.edj"; @@ -1928,6 +1928,8 @@ group "E_Config" struct { value "desklock_autolock_idle" int: 0; value "desklock_autolock_idle_timeout" double: 300.0000000000000000000000000; value "desklock_use_custom_desklock" int: 0; + value "desklock_ask_presentation" uchar 1; + value "desklock_ask_presentation_timeout" double: 30; value "display_res_restore" int: 0; value "display_res_width" int: 1; value "display_res_height" int: 1; @@ -1938,6 +1940,8 @@ group "E_Config" struct { value "screensaver_interval" int: 5; value "screensaver_blanking" int: 2; value "screensaver_expose" int: 2; + value "screensaver_ask_presentation" uchar 1; + value "screensaver_ask_presentation_timeout" double: 30; value "dpms_enable" int: 0; value "dpms_standby_enable" int: 0; value "dpms_suspend_enable" int: 0; diff --git a/config/scaleable/e.src b/config/scaleable/e.src index 1e718aa13..d865acdef 100644 --- a/config/scaleable/e.src +++ b/config/scaleable/e.src @@ -1,5 +1,5 @@ group "E_Config" struct { - value "config_version" int: 65841; + value "config_version" int: 65842; value "show_splash" int: 1; value "init_default_theme" string: "default.edj"; value "desktop_default_name" string: "Desktop %i, %i"; @@ -1951,6 +1951,8 @@ group "E_Config" struct { value "desklock_autolock_idle" int: 0; value "desklock_autolock_idle_timeout" double: 300.0000000000000000000000000; value "desklock_use_custom_desklock" int: 0; + value "desklock_ask_presentation" uchar 1; + value "desklock_ask_presentation_timeout" double: 30; value "display_res_restore" int: 0; value "display_res_width" int: 1; value "display_res_height" int: 1; @@ -1961,6 +1963,8 @@ group "E_Config" struct { value "screensaver_interval" int: 5; value "screensaver_blanking" int: 2; value "screensaver_expose" int: 2; + value "screensaver_ask_presentation" uchar 1; + value "screensaver_ask_presentation_timeout" double: 30; value "dpms_enable" int: 0; value "dpms_standby_enable" int: 0; value "dpms_suspend_enable" int: 0; diff --git a/config/standard/e.src b/config/standard/e.src index 611a36a24..6a98183d5 100644 --- a/config/standard/e.src +++ b/config/standard/e.src @@ -1,5 +1,5 @@ group "E_Config" struct { - value "config_version" int: 65841; + value "config_version" int: 65842; value "show_splash" int: 1; value "init_default_theme" string: "default.edj"; value "desktop_default_name" string: "Desktop %i, %i"; @@ -1961,6 +1961,8 @@ group "E_Config" struct { value "desklock_autolock_idle" int: 0; value "desklock_autolock_idle_timeout" double: 300.0000000000000000000000000; value "desklock_use_custom_desklock" int: 0; + value "desklock_ask_presentation" uchar 1; + value "desklock_ask_presentation_timeout" double: 30; value "display_res_restore" int: 0; value "display_res_width" int: 1; value "display_res_height" int: 1; @@ -1971,6 +1973,8 @@ group "E_Config" struct { value "screensaver_interval" int: 5; value "screensaver_blanking" int: 2; value "screensaver_expose" int: 2; + value "screensaver_ask_presentation" uchar 1; + value "screensaver_ask_presentation_timeout" double: 30; value "dpms_enable" int: 0; value "dpms_standby_enable" int: 0; value "dpms_suspend_enable" int: 0; diff --git a/src/bin/e_config.c b/src/bin/e_config.c index a02d1228a..d8b87848d 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -572,6 +572,9 @@ e_config_init(void) E_CONFIG_VAL(D, T, desklock_autolock_idle_timeout, DOUBLE); E_CONFIG_VAL(D, T, desklock_use_custom_desklock, INT); E_CONFIG_VAL(D, T, desklock_custom_desklock_cmd, STR); + E_CONFIG_VAL(D, T, desklock_ask_presentation, UCHAR); + E_CONFIG_VAL(D, T, desklock_ask_presentation_timeout, DOUBLE); + E_CONFIG_VAL(D, T, display_res_restore, INT); E_CONFIG_VAL(D, T, display_res_width, INT); E_CONFIG_VAL(D, T, display_res_height, INT); @@ -583,7 +586,9 @@ e_config_init(void) E_CONFIG_VAL(D, T, screensaver_interval, INT); E_CONFIG_VAL(D, T, screensaver_blanking, INT); E_CONFIG_VAL(D, T, screensaver_expose, INT); - + E_CONFIG_VAL(D, T, screensaver_ask_presentation, UCHAR); + E_CONFIG_VAL(D, T, screensaver_ask_presentation_timeout, DOUBLE); + E_CONFIG_VAL(D, T, dpms_enable, INT); E_CONFIG_VAL(D, T, dpms_standby_enable, INT); E_CONFIG_VAL(D, T, dpms_suspend_enable, INT); @@ -815,6 +820,7 @@ e_config_load(void) } } #define IFCFG(v) if ((e_config->config_version & 0xffff) < (v)) { +#define IFCFGELSE } else { #define IFCFGEND } #define COPYVAL(x) do {e_config->x = tcfg->x;} while (0) #define COPYPTR(x) do {e_config->x = tcfg->x; tcfg->x = NULL;} while (0) @@ -897,6 +903,18 @@ e_config_load(void) COPYVAL(desklock_post_screensaver_time); IFCFGEND; + IFCFG(0x0132); + COPYVAL(desklock_ask_presentation); + COPYVAL(desklock_ask_presentation_timeout); + COPYVAL(screensaver_ask_presentation); + COPYVAL(screensaver_ask_presentation_timeout); + IFCFGELSE; + e_config->desklock_ask_presentation = 1; + e_config->desklock_ask_presentation_timeout = 30.0; + e_config->screensaver_ask_presentation = 1; + e_config->screensaver_ask_presentation_timeout = 30.0; + IFCFGEND; + e_config->config_version = E_CONFIG_FILE_VERSION; _e_config_free(tcfg); } @@ -987,6 +1005,8 @@ e_config_load(void) E_CONFIG_LIMIT(e_config->desklock_autolock_idle, 0, 1); E_CONFIG_LIMIT(e_config->desklock_autolock_idle_timeout, 1.0, 5400.0); E_CONFIG_LIMIT(e_config->desklock_use_custom_desklock, 0, 1); + E_CONFIG_LIMIT(e_config->desklock_ask_presentation, 0, 1); + E_CONFIG_LIMIT(e_config->desklock_ask_presentation_timeout, 1.0, 300.0); E_CONFIG_LIMIT(e_config->display_res_restore, 0, 1); E_CONFIG_LIMIT(e_config->display_res_width, 1, 8192); E_CONFIG_LIMIT(e_config->display_res_height, 1, 8192); @@ -1012,7 +1032,9 @@ e_config_load(void) E_CONFIG_LIMIT(e_config->screensaver_interval, 0, 5400); E_CONFIG_LIMIT(e_config->screensaver_blanking, 0, 2); E_CONFIG_LIMIT(e_config->screensaver_expose, 0, 2); - + E_CONFIG_LIMIT(e_config->screensaver_ask_presentation, 0, 1); + E_CONFIG_LIMIT(e_config->screensaver_ask_presentation_timeout, 1.0, 300.0); + E_CONFIG_LIMIT(e_config->clientlist_group_by, 0, 2); E_CONFIG_LIMIT(e_config->clientlist_include_all_zones, 0, 1); E_CONFIG_LIMIT(e_config->clientlist_separate_with, 0, 2); diff --git a/src/bin/e_config.h b/src/bin/e_config.h index 3716018fd..b7711419f 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -35,7 +35,7 @@ typedef struct _E_Event_Config_Icon_Theme E_Event_Config_Icon_Theme; /* increment this whenever a new set of config values are added but the users * config doesn't need to be wiped - simply new values need to be put in */ -#define E_CONFIG_FILE_GENERATION 0x0131 +#define E_CONFIG_FILE_GENERATION 0x0132 #define E_CONFIG_FILE_VERSION ((E_CONFIG_FILE_EPOCH << 16) | E_CONFIG_FILE_GENERATION) #define E_EVAS_ENGINE_DEFAULT 0 @@ -223,12 +223,16 @@ struct _E_Config double desklock_autolock_idle_timeout; // GUI int desklock_use_custom_desklock; // GUI const char *desklock_custom_desklock_cmd; // GUI - + Eina_Bool desklock_ask_presentation; // GUI + double desklock_ask_presentation_timeout; // GUI + int screensaver_enable; // GUI int screensaver_timeout; // GUI int screensaver_interval; // GUI int screensaver_blanking; // GUI int screensaver_expose; // GUI + Eina_Bool screensaver_ask_presentation; // GUI + double screensaver_ask_presentation_timeout; // GUI int dpms_enable; // GUI int dpms_standby_enable; // GUI diff --git a/src/bin/e_desklock.c b/src/bin/e_desklock.c index 06dbc6b12..7b65bc6c7 100644 --- a/src/bin/e_desklock.c +++ b/src/bin/e_desklock.c @@ -61,6 +61,9 @@ static Ecore_Exe *_e_custom_desklock_exe = NULL; static Ecore_Event_Handler *_e_custom_desklock_exe_handler = NULL; static Ecore_Poller *_e_desklock_idle_poller = NULL; 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; /***********************************************************************/ @@ -89,6 +92,8 @@ static char *_desklock_auth_get_current_user(void); static char *_desklock_auth_get_current_host(void); #endif +static void _e_desklock_ask_presentation_mode(void); + EAPI int E_EVENT_DESKLOCK = 0; EAPI int @@ -133,6 +138,13 @@ _user_wallpaper_get(void) "e/desklock/background"); } +EAPI int +e_desklock_show_autolocked(void) +{ + _e_desklock_autolock_time = ecore_loop_time_get(); + return e_desklock_show(); +} + EAPI int e_desklock_show(void) { @@ -434,6 +446,24 @@ e_desklock_hide(void) ev = E_NEW(E_Event_Desklock, 1); ev->on = 0; ecore_event_add(E_EVENT_DESKLOCK, ev, NULL, NULL); + + if (_e_desklock_autolock_time > 0.0) + { + if ((e_config->desklock_ask_presentation) && + (e_config->desklock_ask_presentation_timeout > 0.0)) + { + double max, now; + + now = ecore_loop_time_get(); + max = _e_desklock_autolock_time + e_config->desklock_ask_presentation_timeout; + if (now <= max) + _e_desklock_ask_presentation_mode(); + } + else + _e_desklock_ask_presentation_count = 0; + + _e_desklock_autolock_time = 0.0; + } } static int @@ -889,11 +919,18 @@ _e_desklock_cb_idle_poller(void *data) { if ((e_config->desklock_autolock_idle) && (!e_config->mode.presentation)) { + double idle, max; + /* If a desklock is already up, bail */ if ((_e_custom_desklock_exe) || (edd)) return 1; + idle = ecore_x_screensaver_idle_time_get(); + max = e_config->desklock_autolock_idle_timeout; + if (_e_desklock_ask_presentation_count > 0) + max *= _e_desklock_ask_presentation_count; + /* If we have exceeded our idle time... */ - if (ecore_x_screensaver_idle_time_get() >= e_config->desklock_autolock_idle_timeout) + if (idle >= max) { /* * Unfortunately, not all "desklocks" stay up for as long as @@ -907,7 +944,7 @@ _e_desklock_cb_idle_poller(void *data) if (!_e_desklock_user_idle) { _e_desklock_user_idle = 1; - e_desklock_show(); + e_desklock_show_autolocked(); } } else @@ -917,3 +954,99 @@ _e_desklock_cb_idle_poller(void *data) /* Make sure our poller persists. */ return 1; } + +static void +_e_desklock_ask_presentation_del(void *data) +{ + if (_e_desklock_ask_presentation_dia == data) + _e_desklock_ask_presentation_dia = NULL; +} + +static void +_e_desklock_ask_presentation_yes(void *data __UNUSED__, E_Dialog *dia) +{ + e_config->mode.presentation = 1; + e_config_mode_changed(); + e_config_save_queue(); + e_object_del(E_OBJECT(dia)); + _e_desklock_ask_presentation_count = 0; +} + +static void +_e_desklock_ask_presentation_no(void *data __UNUSED__, E_Dialog *dia) +{ + e_object_del(E_OBJECT(dia)); + _e_desklock_ask_presentation_count = 0; +} + +static void +_e_desklock_ask_presentation_no_increase(void *data __UNUSED__, E_Dialog *dia) +{ + int timeout, interval, blanking, expose; + + _e_desklock_ask_presentation_count++; + timeout = e_config->screensaver_timeout * _e_desklock_ask_presentation_count; + interval = e_config->screensaver_interval; + blanking = e_config->screensaver_blanking; + expose = e_config->screensaver_expose; + + ecore_x_screensaver_set(timeout, interval, blanking, expose); + e_object_del(E_OBJECT(dia)); +} + +static void +_e_desklock_ask_presentation_no_forever(void *data __UNUSED__, E_Dialog *dia) +{ + e_config->desklock_ask_presentation = 0; + e_config_save_queue(); + e_object_del(E_OBJECT(dia)); + _e_desklock_ask_presentation_count = 0; +} + +static void +_e_desklock_ask_presentation_mode(void) +{ + E_Manager *man; + E_Container *con; + E_Dialog *dia; + + if (_e_desklock_ask_presentation_dia) + return; + + man = e_manager_current_get(); + if (!man) return; + con = e_container_current_get(man); + if (!con) return; + dia = e_dialog_new(con, "E", "_desklock_ask_presentation"); + if (!dia) return; + + e_dialog_title_set(dia, _("Activate Presentation Mode?")); + e_dialog_icon_set(dia, "dialog-ask", 64); + e_dialog_text_set + (dia, + _("You unlocked desktop too fast.

" + "Would you like to enabe presentation mode and " + "temporarily disable screen saver, lock and power saving?")); + + e_object_del_attach_func_set + (E_OBJECT(dia), _e_desklock_ask_presentation_del); + e_dialog_button_add + (dia, _("Yes"), NULL, _e_desklock_ask_presentation_yes, NULL); + e_dialog_button_add + (dia, _("No"), NULL, _e_desklock_ask_presentation_no, NULL); + e_dialog_button_add + (dia, _("No, but increase timeout"), NULL, + _e_desklock_ask_presentation_no_increase, NULL); + e_dialog_button_add + (dia, _("No, and stop asking"), NULL, + _e_desklock_ask_presentation_no_forever, NULL); + + e_dialog_button_focus_num(dia, 0); + e_dialog_resizable_set(dia, 1); + e_widget_list_homogeneous_set(dia->box_object, 0); + e_util_win_auto_resize_fill(dia->win); + e_win_centered_set(dia->win, 1); + e_dialog_show(dia); + + _e_desklock_ask_presentation_dia = dia; +} diff --git a/src/bin/e_desklock.h b/src/bin/e_desklock.h index d5bc32758..11ee6a045 100644 --- a/src/bin/e_desklock.h +++ b/src/bin/e_desklock.h @@ -15,6 +15,7 @@ EAPI int e_desklock_init(void); EAPI int e_desklock_shutdown(void); EAPI int e_desklock_show(void); +EAPI int e_desklock_show_autolocked(void); EAPI void e_desklock_hide(void); extern EAPI int E_EVENT_DESKLOCK; diff --git a/src/bin/e_manager.c b/src/bin/e_manager.c index 26fdebe34..9b57fd98d 100644 --- a/src/bin/e_manager.c +++ b/src/bin/e_manager.c @@ -795,7 +795,7 @@ _e_manager_cb_ping(void *data, int ev_type __UNUSED__, void *ev) static int _e_manager_cb_timer_post_screensaver_lock(void *data __UNUSED__) { - e_desklock_show(); + e_desklock_show_autolocked(); timer_post_screensaver_lock = NULL; return 0; } @@ -817,7 +817,7 @@ _e_manager_cb_screensaver_notify(void *data __UNUSED__, int ev_type __UNUSED__, { if (e_config->desklock_post_screensaver_time <= 1.0) { - e_desklock_show(); + e_desklock_show_autolocked(); } else { diff --git a/src/bin/e_screensaver.c b/src/bin/e_screensaver.c index 6ed2b0820..54d4a6339 100644 --- a/src/bin/e_screensaver.c +++ b/src/bin/e_screensaver.c @@ -4,6 +4,9 @@ #include "e.h" static Ecore_Event_Handler *_e_screensaver_handler_config_mode = NULL; +static Ecore_Event_Handler *_e_screensaver_handler_screensaver_notify = NULL; +static E_Dialog *_e_screensaver_ask_presentation_dia = NULL; +static int _e_screensaver_ask_presentation_count = 0; static int _e_screensaver_handler_config_mode_cb(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__) @@ -12,6 +15,126 @@ _e_screensaver_handler_config_mode_cb(void *data __UNUSED__, int type __UNUSED__ return 1; } +static void +_e_screensaver_ask_presentation_del(void *data) +{ + if (_e_screensaver_ask_presentation_dia == data) + _e_screensaver_ask_presentation_dia = NULL; +} + +static void +_e_screensaver_ask_presentation_yes(void *data __UNUSED__, E_Dialog *dia) +{ + e_config->mode.presentation = 1; + e_config_mode_changed(); + e_config_save_queue(); + e_object_del(E_OBJECT(dia)); + _e_screensaver_ask_presentation_count = 0; +} + +static void +_e_screensaver_ask_presentation_no(void *data __UNUSED__, E_Dialog *dia) +{ + e_object_del(E_OBJECT(dia)); + _e_screensaver_ask_presentation_count = 0; +} + +static void +_e_screensaver_ask_presentation_no_increase(void *data __UNUSED__, E_Dialog *dia) +{ + int timeout, interval, blanking, expose; + + _e_screensaver_ask_presentation_count++; + timeout = e_config->screensaver_timeout * _e_screensaver_ask_presentation_count; + interval = e_config->screensaver_interval; + blanking = e_config->screensaver_blanking; + expose = e_config->screensaver_expose; + + ecore_x_screensaver_set(timeout, interval, blanking, expose); + e_object_del(E_OBJECT(dia)); +} + +static void +_e_screensaver_ask_presentation_no_forever(void *data __UNUSED__, E_Dialog *dia) +{ + e_config->screensaver_ask_presentation = 0; + e_config_save_queue(); + e_object_del(E_OBJECT(dia)); + _e_screensaver_ask_presentation_count = 0; +} + +static void +_e_screensaver_ask_presentation_mode(void) +{ + E_Manager *man; + E_Container *con; + E_Dialog *dia; + + if (_e_screensaver_ask_presentation_dia) + return; + + man = e_manager_current_get(); + if (!man) return; + con = e_container_current_get(man); + if (!con) return; + dia = e_dialog_new(con, "E", "_screensaver_ask_presentation"); + if (!dia) return; + + e_dialog_title_set(dia, _("Activate Presentation Mode?")); + e_dialog_icon_set(dia, "dialog-ask", 64); + e_dialog_text_set + (dia, + _("You disabled screensaver too fast.

" + "Would you like to enabe presentation mode and " + "temporarily disable screen saver, lock and power saving?")); + + e_object_del_attach_func_set + (E_OBJECT(dia), _e_screensaver_ask_presentation_del); + e_dialog_button_add + (dia, _("Yes"), NULL, _e_screensaver_ask_presentation_yes, NULL); + e_dialog_button_add + (dia, _("No"), NULL, _e_screensaver_ask_presentation_no, NULL); + e_dialog_button_add + (dia, _("No, but increase timeout"), NULL, + _e_screensaver_ask_presentation_no_increase, NULL); + e_dialog_button_add + (dia, _("No, and stop asking"), NULL, + _e_screensaver_ask_presentation_no_forever, NULL); + + e_dialog_button_focus_num(dia, 0); + e_dialog_resizable_set(dia, 1); + e_widget_list_homogeneous_set(dia->box_object, 0); + e_util_win_auto_resize_fill(dia->win); + e_win_centered_set(dia->win, 1); + e_dialog_show(dia); + + _e_screensaver_ask_presentation_dia = dia; +} + +static int +_e_screensaver_handler_screensaver_notify_cb(void *data __UNUSED__, int type __UNUSED__, void *event) +{ + Ecore_X_Event_Screensaver_Notify *e = event; + static double last_start = 0.0; + + if (e->on) + { + last_start = ecore_loop_time_get(); + _e_screensaver_ask_presentation_count = 0; + } + else if ((last_start > 0.0) && (e_config->screensaver_ask_presentation)) + { + double current = ecore_loop_time_get(); + if (last_start + e_config->screensaver_ask_presentation_timeout >= current) + _e_screensaver_ask_presentation_mode(); + last_start = 0.0; + } + else if (_e_screensaver_ask_presentation_count) + _e_screensaver_ask_presentation_count = 0; + + return 1; +} + EAPI int e_screensaver_init(void) { @@ -21,6 +144,10 @@ e_screensaver_init(void) _e_screensaver_handler_config_mode = ecore_event_handler_add (E_EVENT_CONFIG_MODE_CHANGED, _e_screensaver_handler_config_mode_cb, NULL); + if (!_e_screensaver_handler_screensaver_notify) + _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)) timeout = e_config->screensaver_timeout; diff --git a/src/bin/e_widget_list.c b/src/bin/e_widget_list.c index 08700abc2..5e93f010b 100644 --- a/src/bin/e_widget_list.c +++ b/src/bin/e_widget_list.c @@ -70,6 +70,13 @@ e_widget_list_object_append(Evas_Object *obj, Evas_Object *sobj, int fill, int e evas_object_show(sobj); } +EAPI void +e_widget_list_homogeneous_set(Evas_Object *obj, int homogenous) +{ + E_Widget_Data *wd = e_widget_data_get(obj); + e_box_homogenous_set(wd->o_box, homogenous); +} + static void _e_wid_del_hook(Evas_Object *obj) { diff --git a/src/bin/e_widget_list.h b/src/bin/e_widget_list.h index 29eb0b8d0..f30c4da79 100644 --- a/src/bin/e_widget_list.h +++ b/src/bin/e_widget_list.h @@ -8,7 +8,8 @@ EAPI Evas_Object *e_widget_list_add(Evas *evas, int homogenous, int horiz); EAPI void e_widget_list_object_append(Evas_Object *obj, Evas_Object *sobj, int fill, int expand, double align); - +EAPI void e_widget_list_homogeneous_set(Evas_Object *obj, int homogenous); + #endif #endif diff --git a/src/modules/conf_desklock/e_int_config_desklock.c b/src/modules/conf_desklock/e_int_config_desklock.c index 4681c6797..b564e860a 100644 --- a/src/modules/conf_desklock/e_int_config_desklock.c +++ b/src/modules/conf_desklock/e_int_config_desklock.c @@ -26,6 +26,8 @@ static int _zone_count_get(void); static void _cb_disable_check(void *data, Evas_Object *obj); +static void _cb_ask_presentation_changed(void *data, Evas_Object *obj); + struct _E_Config_Dialog_Data { E_Config_Dialog *cfd; @@ -53,6 +55,8 @@ struct _E_Config_Dialog_Data char *custom_lock_cmd; int login_zone; int zone; + int ask_presentation; + double ask_presentation_timeout; struct { struct { @@ -61,6 +65,10 @@ struct _E_Config_Dialog_Data Evas_Object *post_screensaver_label; Evas_Object *post_screensaver_slider; } basic; + struct { + Evas_Object *ask_presentation_label; + Evas_Object *ask_presentation_slider; + } adv; } gui; }; @@ -135,6 +143,9 @@ _fill_data(E_Config_Dialog_Data *cfdata) cfdata->login_zone = e_config->desklock_login_box_zone; cfdata->zone = 0; } + + cfdata->ask_presentation = e_config->desklock_ask_presentation; + cfdata->ask_presentation_timeout = e_config->desklock_ask_presentation_timeout; } static void * @@ -422,8 +433,30 @@ _adv_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) 1, 0, 1, 0); e_widget_table_object_append(mt, of, 1, 1, 1, 1, 1, 1, 1, 1); + + of = e_widget_framelist_add(evas, _("Enter Presentation Mode"), 0); + + ow = e_widget_check_add(evas, _("Suggest entering presentation mode"), &(cfdata->ask_presentation)); + e_widget_on_change_hook_set(ow, _cb_ask_presentation_changed, cfdata); + e_widget_framelist_object_append(of, ow); + + ow = e_widget_label_add(evas, _("If deactivated before")); + cfdata->gui.adv.ask_presentation_label = ow; + e_widget_framelist_object_append(of, ow); + + ow = e_widget_slider_add(evas, 1, 0, _("%1.0f seconds"), + 1.0, 300.0, 10.0, 0, + &(cfdata->ask_presentation_timeout), NULL, 100); + cfdata->gui.adv.ask_presentation_slider = ow; + e_widget_framelist_object_append(of, ow); + + _cb_ask_presentation_changed(cfdata, NULL); + + e_widget_table_object_append(mt, of, 1, 2, 1, 1, 1, 1, 1, 1); + + ow = _basic_create(cfd, evas, cfdata); - e_widget_table_object_append(mt, ow, 2, 1, 1, 1, 1, 1, 1, 1); + e_widget_table_object_append(mt, ow, 2, 1, 1, 2, 1, 1, 1, 1); of = e_widget_framelist_add(evas, _("Custom Screenlock"), 0); custom_screenlock_check = e_widget_check_add(evas, _("Use custom screenlock"), @@ -432,7 +465,7 @@ _adv_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) ow = e_widget_entry_add(evas, &(cfdata->custom_lock_cmd), NULL, NULL, NULL); e_widget_disabled_set(ow, !cfdata->custom_lock); // set state from saved config e_widget_framelist_object_append(of, ow); - e_widget_table_object_append(mt, of, 1, 2, 2, 1, 1, 1, 1, 1); + e_widget_table_object_append(mt, of, 1, 3, 2, 1, 1, 1, 1, 1); // handler for enable/disable widget array e_widget_on_change_hook_set(custom_screenlock_check, _cb_disable_check, ow); @@ -447,6 +480,8 @@ _adv_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) e_config->desklock_autolock_idle = cfdata->auto_lock; e_config->desklock_autolock_screensaver = cfdata->screensaver_lock; e_config->desklock_autolock_idle_timeout = cfdata->idle_time * 60; + e_config->desklock_ask_presentation = cfdata->ask_presentation; + e_config->desklock_ask_presentation_timeout = cfdata->ask_presentation_timeout; if (cfdata->bg) { @@ -515,7 +550,8 @@ _adv_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) else if (e_config->desklock_custom_desklock_cmd != cfdata->custom_lock_cmd) return 1; - return 0; + return ((e_config->desklock_ask_presentation != cfdata->ask_presentation) || + (e_config->desklock_ask_presentation_timeout != cfdata->ask_presentation_timeout)); } static void @@ -727,3 +763,15 @@ _cb_disable_check(void *data, Evas_Object *obj) e_widget_disabled_set((Evas_Object *) data, !e_widget_check_checked_get(obj)); } + +static void +_cb_ask_presentation_changed(void *data, Evas_Object *obj __UNUSED__) +{ + E_Config_Dialog_Data *cfdata = data; + Eina_Bool disable; + + disable = (!cfdata->ask_presentation); + + e_widget_disabled_set(cfdata->gui.adv.ask_presentation_label, disable); + e_widget_disabled_set(cfdata->gui.adv.ask_presentation_slider, disable); +} diff --git a/src/modules/conf_screensaver/e_int_config_screensaver.c b/src/modules/conf_screensaver/e_int_config_screensaver.c index 1d4c46730..946720e6d 100644 --- a/src/modules/conf_screensaver/e_int_config_screensaver.c +++ b/src/modules/conf_screensaver/e_int_config_screensaver.c @@ -16,8 +16,9 @@ static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, static int _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); static Evas_Object *_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); -static void _cb_disable_check(void *data, Evas_Object *obj); -static void _cb_disable_check_list(void *data, Evas_Object *obj); +static void _cb_disable_basic(void *data, Evas_Object *obj); +static void _cb_disable_adv(void *data, Evas_Object *obj); +static void _cb_ask_presentation_changed(void *data, Evas_Object *obj); struct _E_Config_Dialog_Data { @@ -28,8 +29,21 @@ struct _E_Config_Dialog_Data double interval; int blanking; int exposures; + int ask_presentation; + double ask_presentation_timeout; Eina_List *disable_list; + + struct { + struct { + Evas_Object *label; + Evas_Object *slider; + } basic; + struct { + Evas_Object *ask_presentation_label; + Evas_Object *ask_presentation_slider; + } adv; + } gui; }; EAPI E_Config_Dialog * @@ -64,6 +78,8 @@ _fill_data(E_Config_Dialog_Data *cfdata) cfdata->interval = e_config->screensaver_interval; cfdata->blanking = e_config->screensaver_blanking; cfdata->exposures = e_config->screensaver_expose; + cfdata->ask_presentation = e_config->screensaver_ask_presentation; + cfdata->ask_presentation_timeout = e_config->screensaver_ask_presentation_timeout; } static void * @@ -92,6 +108,8 @@ _apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) e_config->screensaver_interval = cfdata->interval; e_config->screensaver_blanking = cfdata->blanking; e_config->screensaver_expose = cfdata->exposures; + e_config->screensaver_ask_presentation = cfdata->ask_presentation; + e_config->screensaver_ask_presentation_timeout = cfdata->ask_presentation_timeout; /* Apply settings */ e_screensaver_init(); @@ -120,14 +138,15 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf of = e_widget_framelist_add(evas, _("Screensaver Timer(s)"), 0); ob = e_widget_label_add(evas, _("Time until X screensaver starts")); + cfdata->gui.basic.label = ob; e_widget_framelist_object_append(of, ob); ob = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), 1.0, 90.0, 1.0, 0, &(cfdata->timeout), NULL, 100); - e_widget_disabled_set(ob, !cfdata->enable_screensaver); // set state from saved config + cfdata->gui.basic.slider = ob; e_widget_framelist_object_append(of, ob); - // handler for enable/disable widget - e_widget_on_change_hook_set(xscreensaver_check, _cb_disable_check, ob); + e_widget_on_change_hook_set(xscreensaver_check, _cb_disable_basic, cfdata); + _cb_disable_basic(cfdata, NULL); e_widget_list_object_append(o, of, 1, 1, 0.5); return o; @@ -157,34 +176,52 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data of = e_widget_framelist_add(evas, _("Screensaver Timer(s)"), 0); ob = e_widget_label_add(evas, _("Time until X screensaver starts")); + cfdata->disable_list = eina_list_append(cfdata->disable_list, ob); e_widget_framelist_object_append(of, ob); ob = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), 1.0, 90.0, 1.0, 0, &(cfdata->timeout), NULL, 200); cfdata->disable_list = eina_list_append(cfdata->disable_list, ob); - e_widget_disabled_set(ob, !cfdata->enable_screensaver); // set state from saved config e_widget_framelist_object_append(of, ob); ob = e_widget_label_add(evas, _("Time until X screensaver alternates")); + cfdata->disable_list = eina_list_append(cfdata->disable_list, ob); e_widget_framelist_object_append(of, ob); ob = e_widget_slider_add(evas, 1, 0, _("%1.0f seconds"), 1.0, 300.0, 1.0, 0, &(cfdata->interval), NULL, 200); cfdata->disable_list = eina_list_append(cfdata->disable_list, ob); - e_widget_disabled_set(ob, !cfdata->enable_screensaver); // set state from saved config e_widget_framelist_object_append(of, ob); e_widget_list_object_append(o, of, 1, 1, 0.5); + of = e_widget_framelist_add(evas, _("Enter Presentation Mode"), 0); + + ob = e_widget_check_add(evas, _("Suggest entering presentation mode"), &(cfdata->ask_presentation)); + e_widget_on_change_hook_set(ob, _cb_ask_presentation_changed, cfdata); + cfdata->disable_list = eina_list_append(cfdata->disable_list, ob); + e_widget_framelist_object_append(of, ob); + + ob = e_widget_label_add(evas, _("If deactivated before")); + cfdata->gui.adv.ask_presentation_label = ob; + cfdata->disable_list = eina_list_append(cfdata->disable_list, ob); + e_widget_framelist_object_append(of, ob); + + ob = e_widget_slider_add(evas, 1, 0, _("%1.0f seconds"), + 1.0, 300.0, 10.0, 0, + &(cfdata->ask_presentation_timeout), NULL, 200); + cfdata->gui.adv.ask_presentation_slider = ob; + cfdata->disable_list = eina_list_append(cfdata->disable_list, ob); + e_widget_framelist_object_append(of, ob); + + e_widget_list_object_append(o, of, 1, 1, 0.5); + of = e_widget_framelist_add(evas, _("Blanking"), 0); rg = e_widget_radio_group_new(&(cfdata->blanking)); ob = e_widget_radio_add(evas, _("Default"), E_CONFIG_BLANKING_DEFAULT, rg); - e_widget_disabled_set(ob, !cfdata->enable_screensaver); // set state from saved config cfdata->disable_list = eina_list_append(cfdata->disable_list, ob); e_widget_framelist_object_append(of, ob); ob = e_widget_radio_add(evas, _("Preferred"), E_CONFIG_BLANKING_PREFERRED, rg); - e_widget_disabled_set(ob, !cfdata->enable_screensaver); // set state from saved config cfdata->disable_list = eina_list_append(cfdata->disable_list, ob); e_widget_framelist_object_append(of, ob); ob = e_widget_radio_add(evas, _("Not Preferred"), E_CONFIG_BLANKING_NOT_PREFERRED, rg); - e_widget_disabled_set(ob, !cfdata->enable_screensaver); // set state from saved config cfdata->disable_list = eina_list_append(cfdata->disable_list, ob); e_widget_framelist_object_append(of, ob); e_widget_list_object_append(o, of, 1, 1, 0.5); @@ -192,47 +229,54 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data of = e_widget_framelist_add(evas, _("Exposure Events"), 0); rg = e_widget_radio_group_new(&(cfdata->exposures)); ob = e_widget_radio_add(evas, _("Default"), E_CONFIG_EXPOSURES_DEFAULT, rg); - e_widget_disabled_set(ob, !cfdata->enable_screensaver); // set state from saved config cfdata->disable_list = eina_list_append(cfdata->disable_list, ob); e_widget_framelist_object_append(of, ob); ob = e_widget_radio_add(evas, _("Allow"), E_CONFIG_EXPOSURES_ALLOWED, rg); - e_widget_disabled_set(ob, !cfdata->enable_screensaver); // set state from saved config cfdata->disable_list = eina_list_append(cfdata->disable_list, ob); e_widget_framelist_object_append(of, ob); ob = e_widget_radio_add(evas, _("Don't Allow"), E_CONFIG_EXPOSURES_NOT_ALLOWED, rg); - e_widget_disabled_set(ob, !cfdata->enable_screensaver); // set state from saved config cfdata->disable_list = eina_list_append(cfdata->disable_list, ob); e_widget_framelist_object_append(of, ob); e_widget_list_object_append(o, of, 1, 1, 0.5); // handler for enable/disable widget array - e_widget_on_change_hook_set(xscreensaver_check, _cb_disable_check_list, cfdata->disable_list); + e_widget_on_change_hook_set(xscreensaver_check, _cb_disable_adv, cfdata); + _cb_disable_adv(cfdata, NULL); return o; } -/*! - * @param data A Evas_Object to chain together with the checkbox - * @param obj A Evas_Object checkbox created with e_widget_check_add() - */ static void -_cb_disable_check(void *data, Evas_Object *obj) +_cb_disable_basic(void *data, Evas_Object *obj) { - e_widget_disabled_set((Evas_Object *) data, - !e_widget_check_checked_get(obj)); + E_Config_Dialog_Data *cfdata = data; + Eina_Bool disable = !cfdata->enable_screensaver; + + e_widget_disabled_set(cfdata->gui.basic.label, disable); + e_widget_disabled_set(cfdata->gui.basic.slider, disable); } -/*! - * @param data A Eina_List of Evas_Object to chain widgets together with the checkbox - * @param obj A Evas_Object checkbox created with e_widget_check_add() - */ static void -_cb_disable_check_list(void *data, Evas_Object *obj) +_cb_disable_adv(void *data, Evas_Object *obj __UNUSED__) { - Eina_List *list = (Eina_List*) data; - Eina_List *l; + E_Config_Dialog_Data *cfdata = data; + const Eina_List *l; Evas_Object *o; - EINA_LIST_FOREACH(list, l, o) - e_widget_disabled_set(o, !e_widget_check_checked_get(obj)); + EINA_LIST_FOREACH(cfdata->disable_list, l, o) + e_widget_disabled_set(o, !cfdata->enable_screensaver); + + _cb_ask_presentation_changed(cfdata, NULL); +} + +static void +_cb_ask_presentation_changed(void *data, Evas_Object *obj __UNUSED__) +{ + E_Config_Dialog_Data *cfdata = data; + Eina_Bool disable; + + disable = ((!cfdata->enable_screensaver) || (!cfdata->ask_presentation)); + + e_widget_disabled_set(cfdata->gui.adv.ask_presentation_label, disable); + e_widget_disabled_set(cfdata->gui.adv.ask_presentation_slider, disable); }