diff --git a/src/bin/e_main.c b/src/bin/e_main.c index 55dffed00..fc9f2322c 100644 --- a/src/bin/e_main.c +++ b/src/bin/e_main.c @@ -1317,10 +1317,21 @@ _e_main_cb_signal_exit(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev return ECORE_CALLBACK_RENEW; } +static Ecore_Timer *hup_timer = NULL; + +static Eina_Bool +_cb_hup_timer(void *data EINA_UNUSED) +{ + hup_timer = NULL; + if (!e_sys_on_the_way_out_get()) e_sys_action_do(E_SYS_RESTART, NULL); + return EINA_FALSE; +} + static Eina_Bool _e_main_cb_signal_hup(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED) { - e_sys_action_do(E_SYS_RESTART, NULL); + if (hup_timer) ecore_timer_del(hup_timer); + hup_timer = ecore_timer_add(0.5, _cb_hup_timer, NULL); return ECORE_CALLBACK_RENEW; } diff --git a/src/bin/e_sys.c b/src/bin/e_sys.c index 5dc7754cc..27157a362 100644 --- a/src/bin/e_sys.c +++ b/src/bin/e_sys.c @@ -64,6 +64,8 @@ static Ecore_Timer *_e_sys_screensaver_unignore_timer = NULL; static double resume_backlight; +static Eina_Bool on_the_way_out = EINA_FALSE; + E_API int E_EVENT_SYS_SUSPEND = -1; E_API int E_EVENT_SYS_HIBERNATE = -1; E_API int E_EVENT_SYS_RESUME = -1; @@ -298,6 +300,10 @@ _e_sys_systemd_signal_prepare_shutdown(void *data EINA_UNUSED, const Eldbus_Mess if (!eldbus_message_arguments_get(msg, "b", &b)) return; printf("SSS: systemd said to prepare for shutdown! bool=%i @%1.8f\n", (int)b, ecore_time_get()); + if (b) + { + if (!e_sys_on_the_way_out_get()) e_sys_action_do(E_SYS_LOGOUT, NULL); + } } static void @@ -441,14 +447,18 @@ e_sys_action_do(E_Sys_Action a, char *param) case E_SYS_RESTART: case E_SYS_EXIT_NOW: case E_SYS_LOGOUT: + case E_SYS_HALT_NOW: + on_the_way_out = EINA_TRUE; + EINA_FALLTHROUGH; + case E_SYS_SUSPEND: case E_SYS_HIBERNATE: - case E_SYS_HALT_NOW: ret = _e_sys_action_do(a, param, EINA_FALSE); break; case E_SYS_HALT: case E_SYS_REBOOT: + on_the_way_out = EINA_TRUE; if (!e_util_immortal_check()) ret = _e_sys_action_do(a, param, EINA_FALSE); break; @@ -522,6 +532,12 @@ e_sys_con_extra_action_list_get(void) return extra_actions; } +E_API Eina_Bool +e_sys_on_the_way_out_get(void) +{ + return on_the_way_out; +} + static void _e_sys_systemd_inhibit_cb(void *data EINA_UNUSED, const Eldbus_Message *m, Eldbus_Pending *p EINA_UNUSED) { diff --git a/src/bin/e_sys.h b/src/bin/e_sys.h index 6b85c0f21..a096a371b 100644 --- a/src/bin/e_sys.h +++ b/src/bin/e_sys.h @@ -47,6 +47,7 @@ E_API E_Sys_Con_Action *e_sys_con_extra_action_register(const char *label, const void *data); E_API void e_sys_con_extra_action_unregister(E_Sys_Con_Action *sca); E_API const Eina_List *e_sys_con_extra_action_list_get(void); +E_API Eina_Bool e_sys_on_the_way_out_get(void); #endif #endif