diff --git a/src/bin/e_sys.c b/src/bin/e_sys.c index fe6d75734..2bc197c26 100644 --- a/src/bin/e_sys.c +++ b/src/bin/e_sys.c @@ -33,6 +33,10 @@ static Ecore_Exe *_e_sys_exe = NULL; static double _e_sys_logout_begin_time = 0.0; static Ecore_Timer *_e_sys_logout_timer = NULL; static E_Obj_Dialog *_e_sys_dialog = NULL; +static E_Dialog *_e_sys_logout_confirm_dialog = NULL; + +static const int E_LOGOUT_AUTO_TIME = 60; +static const int E_LOGOUT_WAIT_TIME = 15; /* externally accessible functions */ EAPI int @@ -255,6 +259,7 @@ _e_sys_cb_logout_logout(void *data, E_Dialog *dia) _e_sys_logout_begin_time = 0.0; _e_sys_logout_after(); e_object_del(E_OBJECT(dia)); + _e_sys_logout_confirm_dialog = NULL; } static void @@ -264,6 +269,7 @@ _e_sys_cb_logout_wait(void *data, E_Dialog *dia) _e_sys_logout_timer = ecore_timer_add(0.5, _e_sys_cb_logout_timer, NULL); _e_sys_logout_begin_time = ecore_time_get(); e_object_del(E_OBJECT(dia)); + _e_sys_logout_confirm_dialog = NULL; } static void @@ -276,6 +282,7 @@ _e_sys_cb_logout_abort(void *data, E_Dialog *dia) } _e_sys_logout_begin_time = 0.0; e_object_del(E_OBJECT(dia)); + _e_sys_logout_confirm_dialog = NULL; _e_sys_action_current = E_SYS_NONE; _e_sys_action_after = E_SYS_NONE; if (_e_sys_dialog) @@ -285,6 +292,30 @@ _e_sys_cb_logout_abort(void *data, E_Dialog *dia) } } +static void +_e_sys_logout_confirm_dialog_update(int remaining) +{ + char txt[4096]; + + if (!_e_sys_logout_confirm_dialog) + { + fputs("ERROR: updating logout confirm dialog, but none exists!\n", + stderr); + return; + } + + snprintf(txt, sizeof(txt), + _("Logout is taking too long.
" + "Some applications refuse to close.
" + "Do you want to finish the logout
" + "anyway without closing these
" + "applications first?

" + "Auto logout in %d seconds."), + remaining); + + e_dialog_text_set(_e_sys_logout_confirm_dialog, txt); +} + static int _e_sys_cb_logout_timer(void *data) { @@ -297,37 +328,56 @@ _e_sys_cb_logout_timer(void *data) if (!bd->internal) pending++; } if (pending == 0) goto after; + else if (_e_sys_logout_confirm_dialog) + { + int remaining = E_LOGOUT_AUTO_TIME - + round(ecore_loop_time_get() - _e_sys_logout_begin_time); + /* it has taken 60 (E_LOGOUT_AUTO_TIME) seconds of waiting the + * confirm dialog and we still have apps that will not go + * away. Do the action as user may be far away or forgot it. + * + * NOTE: this is the behavior for many operating systems and I + * guess the reason is people that hit "shutdown" and + * put their laptops in their backpacks in the hope + * everything will be turned off properly. + */ + if (remaining > 0) + { + _e_sys_logout_confirm_dialog_update(remaining); + return 1; + } + else + { + _e_sys_cb_logout_logout(NULL, _e_sys_logout_confirm_dialog); + return 0; + } + } else { /* it has taken 15 seconds of waiting and we still have apps that * will not go away */ - if ((ecore_time_get() - _e_sys_logout_begin_time) > 15.0) + double now = ecore_loop_time_get(); + if ((now - _e_sys_logout_begin_time) > E_LOGOUT_WAIT_TIME) { E_Dialog *dia; dia = e_dialog_new(e_container_current_get(e_manager_current_get()), "E", "_sys_error_logout_slow"); if (dia) { + _e_sys_logout_confirm_dialog = dia; e_dialog_title_set(dia, _("Logout problems")); e_dialog_icon_set(dia, "system-log-out", 64); - e_dialog_text_set(dia, - _("Logout is taking too long. Some
" - "applications refuse to close.
" - "Do you want to finish the logout
" - "anyway without closing these
" - "applications first?") - ); e_dialog_button_add(dia, _("Logout now"), NULL, _e_sys_cb_logout_logout, NULL); e_dialog_button_add(dia, _("Wait longer"), NULL, _e_sys_cb_logout_wait, NULL); e_dialog_button_add(dia, _("Cancel Logout"), NULL, _e_sys_cb_logout_abort, NULL); e_dialog_button_focus_num(dia, 1); + _e_sys_logout_confirm_dialog_update(E_LOGOUT_AUTO_TIME); e_win_centered_set(dia->win, 1); e_dialog_show(dia); - _e_sys_logout_begin_time = 0.0; + _e_sys_logout_begin_time = now; } - _e_sys_logout_timer = NULL; - return 0; + return 1; } } return 1;