diff --git a/data/themes/default.edc b/data/themes/default.edc
index c6df999a3..ff7538e5a 100644
--- a/data/themes/default.edc
+++ b/data/themes/default.edc
@@ -38383,6 +38383,18 @@ collections {
color: 0 0 0 255;
}
}
+ part { name: "suspender"; type: RECT;
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ visible: 0;
+ color: 0 0 0 0;
+ }
+ description { state: "visible" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ color: 0 0 0 255;
+ }
+ }
}
programs {
program { name: "save-on";
@@ -38414,6 +38426,68 @@ collections {
transition: ACCELERATE 0.25 CURRENT;
target: "shadow";
}
+ program { name: "suspend";
+ signal: "e,state,sys,suspend";
+ source: "e";
+ action: STATE_SET "visible" 0.0;
+ transition: ACCELERATE 0.5 CURRENT;
+ target: "suspender";
+ after: "suspend_done";
+ }
+ program { name: "suspend_done";
+ action: SIGNAL_EMIT "e,state,sys,suspend,done" "e";
+ }
+ program { name: "hibernate";
+ signal: "e,state,sys,hibernate";
+ source: "e";
+ action: STATE_SET "visible" 0.0;
+ transition: ACCELERATE 0.5 CURRENT;
+ target: "suspender";
+ after: "hibernate_done";
+ }
+ program { name: "hibernate_done";
+ action: SIGNAL_EMIT "e,state,sys,hibernate,done" "e";
+ }
+ program { name: "resume";
+ signal: "e,state,sys,resume";
+ source: "e";
+ action: STATE_SET "default" 0.0;
+ transition: DECELERATE 1.0 CURRENT;
+ target: "suspender";
+ }
+ program { name: "reboot";
+ signal: "e,state,sys,reboot";
+ source: "e";
+ action: STATE_SET "visible" 0.0;
+ transition: ACCELERATE 0.5 CURRENT;
+ target: "suspender";
+ after: "reboot_done";
+ }
+ program { name: "reboot_done";
+ action: SIGNAL_EMIT "e,state,sys,reboot,done" "e";
+ }
+ program { name: "halt";
+ signal: "e,state,sys,halt";
+ source: "e";
+ action: STATE_SET "visible" 0.0;
+ transition: ACCELERATE 0.5 CURRENT;
+ target: "suspender";
+ after: "halt_done";
+ }
+ program { name: "halt_done";
+ action: SIGNAL_EMIT "e,state,sys,halt,done" "e";
+ }
+ program { name: "logout";
+ signal: "e,state,sys,logout";
+ source: "e";
+ action: STATE_SET "visible" 0.0;
+ transition: ACCELERATE 0.5 CURRENT;
+ target: "suspender";
+ after: "logout_done";
+ }
+ program { name: "logout_done";
+ action: SIGNAL_EMIT "e,state,sys,logout,done" "e";
+ }
}
}
diff --git a/src/bin/e_sys.c b/src/bin/e_sys.c
index 40b93159a..51f33846d 100644
--- a/src/bin/e_sys.c
+++ b/src/bin/e_sys.c
@@ -8,10 +8,10 @@ static void _e_sys_cb_logout_wait(void *data, E_Dialog *dia);
static void _e_sys_cb_logout_abort(void *data, E_Dialog *dia);
static Eina_Bool _e_sys_cb_logout_timer(void *data);
static void _e_sys_logout_after(void);
-static void _e_sys_logout_begin(E_Sys_Action a_after);
+static void _e_sys_logout_begin(E_Sys_Action a_after, Eina_Bool raw);
static void _e_sys_current_action(void);
static void _e_sys_action_failed(void);
-static int _e_sys_action_do(E_Sys_Action a, char *param);
+static int _e_sys_action_do(E_Sys_Action a, char *param, Eina_Bool raw);
static void _e_sys_dialog_cb_delete(E_Obj_Dialog *od);
static Ecore_Event_Handler *_e_sys_exe_exit_handler = NULL;
@@ -26,12 +26,21 @@ static int _e_sys_can_hibernate = 0;
static E_Sys_Action _e_sys_action_current = E_SYS_NONE;
static E_Sys_Action _e_sys_action_after = E_SYS_NONE;
+static Eina_Bool _e_sys_action_after_raw = EINA_FALSE;
static Ecore_Exe *_e_sys_exe = NULL;
static double _e_sys_begin_time = 0.0;
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 Ecore_Timer *_e_sys_susp_hib_check_timer = NULL;
+static double _e_sys_susp_hib_check_last_tick = 0.0;
+static void (*_e_sys_suspend_func) (void) = NULL;
+static void (*_e_sys_hibernate_func) (void) = NULL;
+static void (*_e_sys_reboot_func) (void) = NULL;
+static void (*_e_sys_shutdown_func) (void) = NULL;
+static void (*_e_sys_logout_func) (void) = NULL;
+static void (*_e_sys_resume_func) (void) = NULL;
static const int E_LOGOUT_AUTO_TIME = 60;
static const int E_LOGOUT_WAIT_TIME = 15;
@@ -112,12 +121,61 @@ e_sys_action_do(E_Sys_Action a, char *param)
case E_SYS_SUSPEND:
case E_SYS_HIBERNATE:
case E_SYS_HALT_NOW:
- ret = _e_sys_action_do(a, param);
+ ret = _e_sys_action_do(a, param, EINA_FALSE);
+ break;
+
+ case E_SYS_HALT:
+ if (!e_util_immortal_check())
+ {
+ if (_e_sys_shutdown_func) _e_sys_shutdown_func();
+ else _e_sys_logout_begin(a, EINA_FALSE);
+ }
+ return 1;
+ break;
+ case E_SYS_REBOOT:
+ if (!e_util_immortal_check())
+ {
+ if (_e_sys_reboot_func) _e_sys_reboot_func();
+ else _e_sys_logout_begin(a, EINA_FALSE);
+ }
+ return 1;
+ break;
+
+ default:
+ break;
+ }
+
+ if (ret) _e_sys_action_current = a;
+ else _e_sys_action_current = E_SYS_NONE;
+
+ return ret;
+}
+
+EAPI int
+e_sys_action_raw_do(E_Sys_Action a, char *param)
+{
+ int ret = 0;
+
+ if (_e_sys_action_current != E_SYS_NONE)
+ {
+ _e_sys_current_action();
+ return 0;
+ }
+ switch (a)
+ {
+ case E_SYS_EXIT:
+ case E_SYS_RESTART:
+ case E_SYS_EXIT_NOW:
+ case E_SYS_LOGOUT:
+ case E_SYS_SUSPEND:
+ case E_SYS_HIBERNATE:
+ case E_SYS_HALT_NOW:
+ ret = _e_sys_action_do(a, param, EINA_TRUE);
break;
case E_SYS_HALT:
case E_SYS_REBOOT:
- if (!e_util_immortal_check()) _e_sys_logout_begin(a);
+ if (!e_util_immortal_check()) _e_sys_logout_begin(a, EINA_TRUE);
return 1;
break;
@@ -171,6 +229,52 @@ e_sys_con_extra_action_list_get(void)
return extra_actions;
}
+EAPI void
+e_sys_handlers_set(void (*suspend_func) (void),
+ void (*hibernate_func) (void),
+ void (*reboot_func) (void),
+ void (*shutdown_func) (void),
+ void (*logout_func) (void),
+ void (*resume_func) (void))
+{
+ _e_sys_suspend_func = suspend_func;
+ _e_sys_hibernate_func = hibernate_func;
+ _e_sys_reboot_func = reboot_func;
+ _e_sys_shutdown_func = shutdown_func;
+ _e_sys_logout_func = logout_func;
+ _e_sys_resume_func = resume_func;
+}
+
+static Eina_Bool
+_e_sys_susp_hib_check_timer_cb(void *data __UNUSED__)
+{
+ double t = ecore_time_unix_get();
+
+ if ((t - _e_sys_susp_hib_check_last_tick) > 0.2)
+ {
+ _e_sys_susp_hib_check_timer = NULL;
+ if (_e_sys_dialog)
+ {
+ e_object_del(E_OBJECT(_e_sys_dialog));
+ _e_sys_dialog = NULL;
+ }
+ if (_e_sys_resume_func) _e_sys_resume_func();
+ return EINA_FALSE;
+ }
+ _e_sys_susp_hib_check_last_tick = t;
+ return EINA_TRUE;
+}
+
+static void
+_e_sys_susp_hib_check(void)
+{
+ if (_e_sys_susp_hib_check_timer)
+ ecore_timer_del(_e_sys_susp_hib_check_timer);
+ _e_sys_susp_hib_check_last_tick = ecore_time_unix_get();
+ _e_sys_susp_hib_check_timer =
+ ecore_timer_add(0.1, _e_sys_susp_hib_check_timer_cb, NULL);
+}
+
/* local subsystem functions */
static Eina_Bool
_e_sys_cb_timer(void *data __UNUSED__)
@@ -302,6 +406,7 @@ _e_sys_cb_logout_abort(void *data __UNUSED__, E_Dialog *dia)
_e_sys_logout_confirm_dialog = NULL;
_e_sys_action_current = E_SYS_NONE;
_e_sys_action_after = E_SYS_NONE;
+ _e_sys_action_after_raw = EINA_FALSE;
if (_e_sys_dialog)
{
e_object_del(E_OBJECT(_e_sys_dialog));
@@ -415,29 +520,34 @@ _e_sys_logout_after(void)
_e_sys_dialog = NULL;
}
_e_sys_action_current = _e_sys_action_after;
- _e_sys_action_do(_e_sys_action_after, NULL);
+ _e_sys_action_do(_e_sys_action_after, NULL, _e_sys_action_after_raw);
_e_sys_action_after = E_SYS_NONE;
+ _e_sys_action_after_raw = EINA_FALSE;
}
static void
-_e_sys_logout_begin(E_Sys_Action a_after)
+_e_sys_logout_begin(E_Sys_Action a_after, Eina_Bool raw)
{
Eina_List *l;
E_Border *bd;
E_Obj_Dialog *od;
/* start logout - at end do the a_after action */
- od = e_obj_dialog_new(e_container_current_get(e_manager_current_get()),
- _("Logout in progress"), "E", "_sys_logout");
- e_obj_dialog_obj_theme_set(od, "base/theme/sys", "e/sys/logout");
- e_obj_dialog_obj_part_text_set(od, "e.textblock.message",
- _("Logout in progress.
"
- "Please wait."));
- e_obj_dialog_show(od);
- e_obj_dialog_icon_set(od, "system-log-out");
- if (_e_sys_dialog) e_object_del(E_OBJECT(_e_sys_dialog));
- _e_sys_dialog = od;
+ if (!raw)
+ {
+ od = e_obj_dialog_new(e_container_current_get(e_manager_current_get()),
+ _("Logout in progress"), "E", "_sys_logout");
+ e_obj_dialog_obj_theme_set(od, "base/theme/sys", "e/sys/logout");
+ e_obj_dialog_obj_part_text_set(od, "e.textblock.message",
+ _("Logout in progress.
"
+ "Please wait."));
+ e_obj_dialog_show(od);
+ e_obj_dialog_icon_set(od, "system-log-out");
+ if (_e_sys_dialog) e_object_del(E_OBJECT(_e_sys_dialog));
+ _e_sys_dialog = od;
+ }
_e_sys_action_after = a_after;
+ _e_sys_action_after_raw = raw;
EINA_LIST_FOREACH(e_border_client_list(), l, bd)
{
e_border_act_close_begin(bd);
@@ -545,7 +655,7 @@ _e_sys_action_failed(void)
}
static int
-_e_sys_action_do(E_Sys_Action a, char *param __UNUSED__)
+_e_sys_action_do(E_Sys_Action a, char *param __UNUSED__, Eina_Bool raw)
{
char buf[PATH_MAX];
E_Obj_Dialog *od;
@@ -578,7 +688,22 @@ _e_sys_action_do(E_Sys_Action a, char *param __UNUSED__)
case E_SYS_LOGOUT:
// XXX TODO: check for e_fm_op_registry entries and confirm
- _e_sys_logout_begin(E_SYS_EXIT);
+ if (raw)
+ {
+ _e_sys_logout_begin(E_SYS_EXIT, raw);
+ }
+ else
+ {
+ if (_e_sys_logout_func)
+ {
+ _e_sys_logout_func();
+ return 0;
+ }
+ else
+ {
+ _e_sys_logout_begin(E_SYS_EXIT, raw);
+ }
+ }
break;
case E_SYS_HALT:
@@ -596,19 +721,35 @@ _e_sys_action_do(E_Sys_Action a, char *param __UNUSED__)
}
else
{
- _e_sys_begin_time = ecore_time_get();
- _e_sys_exe = ecore_exe_run(buf, NULL);
- od = e_obj_dialog_new(e_container_current_get(e_manager_current_get()),
- _("Power off"), "E", "_sys_halt");
- e_obj_dialog_obj_theme_set(od, "base/theme/sys", "e/sys/halt");
- e_obj_dialog_obj_part_text_set(od, "e.textblock.message",
- _("Power off.
"
- "Please wait."));
- e_obj_dialog_show(od);
- e_obj_dialog_icon_set(od, "system-shutdown");
- if (_e_sys_dialog) e_object_del(E_OBJECT(_e_sys_dialog));
- e_obj_dialog_cb_delete_set(od, _e_sys_dialog_cb_delete);
- _e_sys_dialog = od;
+ if (raw)
+ {
+ _e_sys_begin_time = ecore_time_get();
+ _e_sys_exe = ecore_exe_run(buf, NULL);
+ }
+ else
+ {
+ if (_e_sys_shutdown_func)
+ {
+ _e_sys_shutdown_func();
+ return 0;
+ }
+ else
+ {
+ _e_sys_begin_time = ecore_time_get();
+ _e_sys_exe = ecore_exe_run(buf, NULL);
+ od = e_obj_dialog_new(e_container_current_get(e_manager_current_get()),
+ _("Power off"), "E", "_sys_halt");
+ e_obj_dialog_obj_theme_set(od, "base/theme/sys", "e/sys/halt");
+ e_obj_dialog_obj_part_text_set(od, "e.textblock.message",
+ _("Power off.
"
+ "Please wait."));
+ e_obj_dialog_show(od);
+ e_obj_dialog_icon_set(od, "system-shutdown");
+ if (_e_sys_dialog) e_object_del(E_OBJECT(_e_sys_dialog));
+ e_obj_dialog_cb_delete_set(od, _e_sys_dialog_cb_delete);
+ _e_sys_dialog = od;
+ }
+ }
/* FIXME: display halt status */
}
break;
@@ -627,19 +768,35 @@ _e_sys_action_do(E_Sys_Action a, char *param __UNUSED__)
}
else
{
- _e_sys_begin_time = ecore_time_get();
- _e_sys_exe = ecore_exe_run(buf, NULL);
- od = e_obj_dialog_new(e_container_current_get(e_manager_current_get()),
- _("Resetting"), "E", "_sys_reboot");
- e_obj_dialog_obj_theme_set(od, "base/theme/sys", "e/sys/reboot");
- e_obj_dialog_obj_part_text_set(od, "e.textblock.message",
- _("Resetting.
"
- "Please wait."));
- e_obj_dialog_show(od);
- e_obj_dialog_icon_set(od, "system-restart");
- if (_e_sys_dialog) e_object_del(E_OBJECT(_e_sys_dialog));
- e_obj_dialog_cb_delete_set(od, _e_sys_dialog_cb_delete);
- _e_sys_dialog = od;
+ if (raw)
+ {
+ _e_sys_begin_time = ecore_time_get();
+ _e_sys_exe = ecore_exe_run(buf, NULL);
+ }
+ else
+ {
+ if (_e_sys_reboot_func)
+ {
+ _e_sys_reboot_func();
+ return 0;
+ }
+ else
+ {
+ _e_sys_begin_time = ecore_time_get();
+ _e_sys_exe = ecore_exe_run(buf, NULL);
+ od = e_obj_dialog_new(e_container_current_get(e_manager_current_get()),
+ _("Resetting"), "E", "_sys_reboot");
+ e_obj_dialog_obj_theme_set(od, "base/theme/sys", "e/sys/reboot");
+ e_obj_dialog_obj_part_text_set(od, "e.textblock.message",
+ _("Resetting.
"
+ "Please wait."));
+ e_obj_dialog_show(od);
+ e_obj_dialog_icon_set(od, "system-restart");
+ if (_e_sys_dialog) e_object_del(E_OBJECT(_e_sys_dialog));
+ e_obj_dialog_cb_delete_set(od, _e_sys_dialog_cb_delete);
+ _e_sys_dialog = od;
+ }
+ }
/* FIXME: display reboot status */
}
break;
@@ -657,21 +814,43 @@ _e_sys_action_do(E_Sys_Action a, char *param __UNUSED__)
}
else
{
- if (e_config->desklock_on_suspend) e_desklock_show(EINA_TRUE);
-
- _e_sys_begin_time = ecore_time_get();
- _e_sys_exe = ecore_exe_run(buf, NULL);
- od = e_obj_dialog_new(e_container_current_get(e_manager_current_get()),
- _("Suspending"), "E", "_sys_suspend");
- e_obj_dialog_obj_theme_set(od, "base/theme/sys", "e/sys/suspend");
- e_obj_dialog_obj_part_text_set(od, "e.textblock.message",
- _("Suspending.
"
- "Please wait."));
- e_obj_dialog_show(od);
- e_obj_dialog_icon_set(od, "system-suspend");
- if (_e_sys_dialog) e_object_del(E_OBJECT(_e_sys_dialog));
- e_obj_dialog_cb_delete_set(od, _e_sys_dialog_cb_delete);
- _e_sys_dialog = od;
+ if (raw)
+ {
+ _e_sys_susp_hib_check();
+ if (e_config->desklock_on_suspend)
+ e_desklock_show(EINA_TRUE);
+ _e_sys_begin_time = ecore_time_get();
+ _e_sys_exe = ecore_exe_run(buf, NULL);
+ }
+ else
+ {
+ if (_e_sys_suspend_func)
+ {
+ _e_sys_suspend_func();
+ return 0;
+ }
+ else
+ {
+ if (e_config->desklock_on_suspend)
+ e_desklock_show(EINA_TRUE);
+
+ _e_sys_susp_hib_check();
+
+ _e_sys_begin_time = ecore_time_get();
+ _e_sys_exe = ecore_exe_run(buf, NULL);
+ od = e_obj_dialog_new(e_container_current_get(e_manager_current_get()),
+ _("Suspending"), "E", "_sys_suspend");
+ e_obj_dialog_obj_theme_set(od, "base/theme/sys", "e/sys/suspend");
+ e_obj_dialog_obj_part_text_set(od, "e.textblock.message",
+ _("Suspending.
"
+ "Please wait."));
+ e_obj_dialog_show(od);
+ e_obj_dialog_icon_set(od, "system-suspend");
+ if (_e_sys_dialog) e_object_del(E_OBJECT(_e_sys_dialog));
+ e_obj_dialog_cb_delete_set(od, _e_sys_dialog_cb_delete);
+ _e_sys_dialog = od;
+ }
+ }
/* FIXME: display suspend status */
}
break;
@@ -689,21 +868,44 @@ _e_sys_action_do(E_Sys_Action a, char *param __UNUSED__)
}
else
{
- if (e_config->desklock_on_suspend) e_desklock_show(EINA_TRUE);
-
- _e_sys_begin_time = ecore_time_get();
- _e_sys_exe = ecore_exe_run(buf, NULL);
- od = e_obj_dialog_new(e_container_current_get(e_manager_current_get()),
- _("Hibernating"), "E", "_sys_hibernate");
- e_obj_dialog_obj_theme_set(od, "base/theme/sys", "e/sys/hibernate");
- e_obj_dialog_obj_part_text_set(od, "e.textblock.message",
- _("Hibernating.
"
- "Please wait."));
- e_obj_dialog_show(od);
- e_obj_dialog_icon_set(od, "system-suspend-hibernate");
- if (_e_sys_dialog) e_object_del(E_OBJECT(_e_sys_dialog));
- _e_sys_dialog = od;
- e_obj_dialog_cb_delete_set(od, _e_sys_dialog_cb_delete);
+ if (_e_sys_hibernate_func)
+ {
+ _e_sys_hibernate_func();
+ return 0;
+ }
+ else
+ {
+ if (raw)
+ {
+ if (e_config->desklock_on_suspend)
+ e_desklock_show(EINA_TRUE);
+
+ _e_sys_susp_hib_check();
+ _e_sys_begin_time = ecore_time_get();
+ _e_sys_exe = ecore_exe_run(buf, NULL);
+ }
+ else
+ {
+ if (e_config->desklock_on_suspend)
+ e_desklock_show(EINA_TRUE);
+
+ _e_sys_susp_hib_check();
+
+ _e_sys_begin_time = ecore_time_get();
+ _e_sys_exe = ecore_exe_run(buf, NULL);
+ od = e_obj_dialog_new(e_container_current_get(e_manager_current_get()),
+ _("Hibernating"), "E", "_sys_hibernate");
+ e_obj_dialog_obj_theme_set(od, "base/theme/sys", "e/sys/hibernate");
+ e_obj_dialog_obj_part_text_set(od, "e.textblock.message",
+ _("Hibernating.
"
+ "Please wait."));
+ e_obj_dialog_show(od);
+ e_obj_dialog_icon_set(od, "system-suspend-hibernate");
+ if (_e_sys_dialog) e_object_del(E_OBJECT(_e_sys_dialog));
+ _e_sys_dialog = od;
+ e_obj_dialog_cb_delete_set(od, _e_sys_dialog_cb_delete);
+ }
+ }
/* FIXME: display hibernate status */
}
break;
@@ -713,7 +915,7 @@ _e_sys_action_do(E_Sys_Action a, char *param __UNUSED__)
}
return 1;
}
-
+
static void
_e_sys_dialog_cb_delete(E_Obj_Dialog *od __UNUSED__)
{
diff --git a/src/bin/e_sys.h b/src/bin/e_sys.h
index b492be5c0..6e51cda27 100644
--- a/src/bin/e_sys.h
+++ b/src/bin/e_sys.h
@@ -35,6 +35,7 @@ EINTERN int e_sys_init(void);
EINTERN int e_sys_shutdown(void);
EAPI int e_sys_action_possible_get(E_Sys_Action a);
EAPI int e_sys_action_do(E_Sys_Action a, char *param);
+EAPI int e_sys_action_raw_do(E_Sys_Action a, char *param);
EAPI E_Sys_Con_Action *e_sys_con_extra_action_register(const char *label,
const char *icon_group,
@@ -43,6 +44,12 @@ EAPI E_Sys_Con_Action *e_sys_con_extra_action_register(const char *label,
const void *data);
EAPI void e_sys_con_extra_action_unregister(E_Sys_Con_Action *sca);
EAPI const Eina_List *e_sys_con_extra_action_list_get(void);
+EAPI void e_sys_handlers_set(void (*suspend_func) (void),
+ void (*hibernate_func) (void),
+ void (*reboot_func) (void),
+ void (*shutdown_func) (void),
+ void (*logout_func) (void),
+ void (*resume_func) (void));
#endif
#endif
diff --git a/src/modules/comp/e_mod_comp.c b/src/modules/comp/e_mod_comp.c
index 7ce163019..3c1b6077c 100644
--- a/src/modules/comp/e_mod_comp.c
+++ b/src/modules/comp/e_mod_comp.c
@@ -3636,11 +3636,99 @@ _e_mod_comp_del(E_Comp *c)
//////////////////////////////////////////////////////////////////////////
+
+static void
+_e_mod_comp_sys_done_cb(void *data, Evas_Object *obj, const char *sig, const char *src)
+{
+ edje_object_signal_callback_del(obj, sig, src, _e_mod_comp_sys_done_cb);
+ e_sys_action_raw_do((E_Sys_Action)(long)data, NULL);
+}
+
+static void
+_e_mod_comp_sys_emit_cb_wait(E_Sys_Action a, const char *sig, const char *rep)
+{
+ Eina_List *l, *ll;
+ E_Comp_Zone *cz;
+ E_Comp *c;
+ Eina_Bool first = EINA_TRUE;
+
+ EINA_LIST_FOREACH(compositors, l, c)
+ {
+ EINA_LIST_FOREACH(c->zones, ll, cz)
+ {
+ edje_object_signal_emit(cz->base, sig, "e");
+ edje_object_signal_emit(cz->over, sig, "e");
+ if ((rep) && (first))
+ edje_object_signal_callback_add(cz->over, rep, "e",
+ _e_mod_comp_sys_done_cb,
+ (void *)(long)a);
+ first = EINA_FALSE;
+ }
+ }
+}
+
+static void
+_e_mod_comp_sys_suspend(void)
+{
+ _e_mod_comp_sys_emit_cb_wait(E_SYS_SUSPEND,
+ "e,state,sys,suspend",
+ "e,state,sys,suspend,done");
+}
+
+static void
+_e_mod_comp_sys_hibernate(void)
+{
+ _e_mod_comp_sys_emit_cb_wait(E_SYS_HIBERNATE,
+ "e,state,sys,hibernate",
+ "e,state,sys,hibernate,done");
+}
+
+static void
+_e_mod_comp_sys_reboot(void)
+{
+ _e_mod_comp_sys_emit_cb_wait(E_SYS_REBOOT,
+ "e,state,sys,reboot",
+ "e,state,sys,reboot,done");
+}
+
+static void
+_e_mod_comp_sys_shutdown(void)
+{
+ _e_mod_comp_sys_emit_cb_wait(E_SYS_HALT,
+ "e,state,sys,halt",
+ "e,state,sys,halt,done");
+}
+
+static void
+_e_mod_comp_sys_logout(void)
+{
+ _e_mod_comp_sys_emit_cb_wait(E_SYS_LOGOUT,
+ "e,state,sys,logout",
+ "e,state,sys,logout,done");
+}
+
+static void
+_e_mod_comp_sys_resume(void)
+{
+ _e_mod_comp_sys_emit_cb_wait(E_SYS_SUSPEND,
+ "e,state,sys,resume",
+ NULL);
+}
+
+//////////////////////////////////////////////////////////////////////////
+
Eina_Bool
e_mod_comp_init(void)
{
Eina_List *l;
E_Manager *man;
+
+ e_sys_handlers_set(_e_mod_comp_sys_suspend,
+ _e_mod_comp_sys_hibernate,
+ _e_mod_comp_sys_reboot,
+ _e_mod_comp_sys_shutdown,
+ _e_mod_comp_sys_logout,
+ _e_mod_comp_sys_resume);
windows = eina_hash_string_superfast_new(NULL);
borders = eina_hash_string_superfast_new(NULL);
@@ -3744,6 +3832,8 @@ e_mod_comp_shutdown(void)
damages = NULL;
windows = NULL;
borders = NULL;
+
+ e_sys_handlers_set(NULL, NULL, NULL, NULL, NULL, NULL);
}
void