Enlightenment CVS committal Author : raster Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_actions.c e_apps.c e_config.c e_int_menus.c e_int_menus.h e_menu.c e_sys.c e_sys.h Log Message: main menu cleanups. sys actions check error/status etc. logout implemented, and used. need to have status for reboot/halt and for suspend and hibernate. =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_actions.c,v retrieving revision 1.80 retrieving revision 1.81 diff -u -3 -r1.80 -r1.81 --- e_actions.c 3 Sep 2006 08:51:31 -0000 1.80 +++ e_actions.c 9 Sep 2006 07:00:14 -0000 1.81 @@ -1113,6 +1113,9 @@ else if (!strcmp(name, "favorites")) return e_int_menus_favorite_apps_new(); else if (!strcmp(name, "all")) return e_int_menus_all_apps_new(); else if (!strcmp(name, "clients")) return e_int_menus_clients_new(); + else if (!strcmp(name, "lost_clients")) return e_int_menus_lost_clients_new(); + else if (!strcmp(name, "configuration")) return e_int_menus_config_new(); + else if (!strcmp(name, "system")) return e_int_menus_sys_new(); return NULL; } ACT_FN_GO(menu_show) =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_apps.c,v retrieving revision 1.178 retrieving revision 1.179 diff -u -3 -r1.178 -r1.179 --- e_apps.c 7 Sep 2006 08:53:09 -0000 1.178 +++ e_apps.c 9 Sep 2006 07:00:14 -0000 1.179 @@ -14,7 +14,7 @@ */ #define DEBUG 0 -#define APP_CACHE 1 +#define APP_CACHE 0 /* local subsystem functions */ typedef struct _E_App_Change_Info E_App_Change_Info; typedef struct _E_App_Callback E_App_Callback; =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_config.c,v retrieving revision 1.201 retrieving revision 1.202 diff -u -3 -r1.201 -r1.202 --- e_config.c 1 Sep 2006 15:37:23 -0000 1.201 +++ e_config.c 9 Sep 2006 07:00:14 -0000 1.202 @@ -877,7 +877,7 @@ "restart", NULL); CFG_KEYBIND(E_BINDING_CONTEXT_ANY, "Delete", E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT, 0, - "exit", NULL); + "logout", NULL); CFG_KEYBIND(E_BINDING_CONTEXT_ANY, "Escape", E_BINDING_MODIFIER_ALT, 0, "exebuf", NULL); =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_int_menus.c,v retrieving revision 1.160 retrieving revision 1.161 diff -u -3 -r1.160 -r1.161 --- e_int_menus.c 5 Sep 2006 03:30:36 -0000 1.160 +++ e_int_menus.c 9 Sep 2006 07:00:14 -0000 1.161 @@ -12,9 +12,9 @@ E_Menu *all_apps; E_Menu *desktops; E_Menu *clients; -// E_Menu *gadgets; E_Menu *config; E_Menu *lost_clients; + E_Menu *sys; }; /* local subsystem functions */ @@ -25,6 +25,7 @@ static int _e_int_menus_main_lock_defer_cb (void *data); static void _e_int_menus_main_lock (void *data, E_Menu *m, E_Menu_Item*mi); static void _e_int_menus_main_restart (void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_int_menus_main_logout (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_main_exit (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_main_halt (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_main_reboot (void *data, E_Menu *m, E_Menu_Item *mi); @@ -48,12 +49,12 @@ static void _e_int_menus_clients_cleanup_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_desktops_pre_cb (void *data, E_Menu *m); static void _e_int_menus_desktops_item_cb (void *data, E_Menu *m, E_Menu_Item *mi); -//static void _e_int_menus_gadgets_pre_cb (void *data, E_Menu *m); -//static void _e_int_menus_gadgets_edit_mode_cb(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_themes_about (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_lost_clients_pre_cb (void *data, E_Menu *m); static void _e_int_menus_lost_clients_free_hook(void *obj); static void _e_int_menus_lost_clients_item_cb (void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_int_menus_sys_pre_cb (void *data, E_Menu *m); +static void _e_int_menus_sys_free_hook (void *obj); static void _e_int_menus_augmentation_add (E_Menu *m, Evas_List *augmentation); static void _e_int_menus_augmentation_del (E_Menu *m, Evas_List *augmentation); @@ -119,15 +120,6 @@ e_util_menu_item_edje_icon_set(mi, "enlightenment/lost_windows"); e_menu_item_submenu_set(mi, subm); -/* - subm = e_int_menus_gadgets_new(); - dat->gadgets = subm; - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Gadgets")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/gadgets"); - e_menu_item_submenu_set(mi, subm); -*/ - mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); @@ -151,52 +143,13 @@ mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); - if (e_sys_action_possible_get(E_SYS_HALT) || - e_sys_action_possible_get(E_SYS_REBOOT) || - e_sys_action_possible_get(E_SYS_SUSPEND) || - e_sys_action_possible_get(E_SYS_HIBERNATE)) - { - if (e_sys_action_possible_get(E_SYS_SUSPEND)) - { - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Suspend your Computer")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/suspend"); - e_menu_item_callback_set(mi, _e_int_menus_main_suspend, NULL); - } - if (e_sys_action_possible_get(E_SYS_HIBERNATE)) - { - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Hibernate your Computer")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/hibernate"); - e_menu_item_callback_set(mi, _e_int_menus_main_hibernate, NULL); - } - if (e_sys_action_possible_get(E_SYS_REBOOT)) - { - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Reboot your Computer")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/reboot"); - e_menu_item_callback_set(mi, _e_int_menus_main_reboot, NULL); - } - if (e_sys_action_possible_get(E_SYS_HALT)) - { - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Shut Down your Computer")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/halt"); - e_menu_item_callback_set(mi, _e_int_menus_main_halt, NULL); - } - mi = e_menu_item_new(m); - e_menu_item_separator_set(mi, 1); - } - + subm = e_int_menus_sys_new(); + dat->sys = subm; mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Restart Enlightenment")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/reset"); - e_menu_item_callback_set(mi, _e_int_menus_main_restart, NULL); + e_menu_item_label_set(mi, _("System")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/system"); + e_menu_item_submenu_set(mi, subm); - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Exit Enlightenment")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/exit"); - e_menu_item_callback_set(mi, _e_int_menus_main_exit, NULL); return m; } @@ -281,24 +234,25 @@ e_menu_pre_activate_callback_set(m, _e_int_menus_clients_pre_cb, NULL); return m; } -/* + EAPI E_Menu * -e_int_menus_gadgets_new(void) +e_int_menus_lost_clients_new(void) { E_Menu *m; m = e_menu_new(); - e_menu_pre_activate_callback_set(m, _e_int_menus_gadgets_pre_cb, NULL); + e_menu_pre_activate_callback_set(m, _e_int_menus_lost_clients_pre_cb, NULL); return m; } -*/ + EAPI E_Menu * -e_int_menus_lost_clients_new(void) +e_int_menus_sys_new(void) { E_Menu *m; - + m = e_menu_new(); - e_menu_pre_activate_callback_set(m, _e_int_menus_lost_clients_pre_cb, NULL); + e_menu_pre_activate_callback_set(m, _e_int_menus_sys_pre_cb, NULL); + return m; } @@ -363,9 +317,9 @@ e_object_del(E_OBJECT(dat->apps)); e_object_del(E_OBJECT(dat->desktops)); e_object_del(E_OBJECT(dat->clients)); -// e_object_del(E_OBJECT(dat->gadgets)); e_object_del(E_OBJECT(dat->config)); e_object_del(E_OBJECT(dat->lost_clients)); + e_object_del(E_OBJECT(dat->sys)); free(dat); } } @@ -442,6 +396,15 @@ } static void +_e_int_menus_main_logout(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Action *a; + + a = e_action_find("logout"); + if ((a) && (a->func.go)) a->func.go(NULL, NULL); +} + +static void _e_int_menus_main_exit(void *data, E_Menu *m, E_Menu_Item *mi) { E_Action *a; @@ -638,11 +601,6 @@ e_menu_pre_activate_callback_set(m, NULL, NULL); mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Lock Screen")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/desklock"); - e_menu_item_callback_set(mi, _e_int_menus_main_lock, NULL); - - mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Show/Hide All Windows")); e_util_menu_item_edje_icon_set(mi, "enlightenment/showhide"); e_menu_item_callback_set(mi, _e_int_menus_main_showhide, NULL); @@ -766,6 +724,99 @@ } static void +_e_int_menus_sys_pre_cb(void *data, E_Menu *m) +{ + E_Menu_Item *mi; + Evas_List *l; + + e_menu_pre_activate_callback_set(m, NULL, NULL); + + l = evas_hash_find(_e_int_menus_augmentation, "sys"); + if (l) + { + _e_int_menus_augmentation_add(m, l); + + mi = e_menu_item_new(m); + e_menu_item_separator_set(mi, 1); + } + + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Lock Screen")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/desklock"); + e_menu_item_callback_set(mi, _e_int_menus_main_lock, NULL); + + mi = e_menu_item_new(m); + e_menu_item_separator_set(mi, 1); + + if (e_sys_action_possible_get(E_SYS_HALT) || + e_sys_action_possible_get(E_SYS_REBOOT) || + e_sys_action_possible_get(E_SYS_SUSPEND) || + e_sys_action_possible_get(E_SYS_HIBERNATE)) + { + if (e_sys_action_possible_get(E_SYS_SUSPEND)) + { + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Suspend")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/suspend"); + e_menu_item_callback_set(mi, _e_int_menus_main_suspend, NULL); + } + if (e_sys_action_possible_get(E_SYS_HIBERNATE)) + { + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Hibernate")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/hibernate"); + e_menu_item_callback_set(mi, _e_int_menus_main_hibernate, NULL); + } + if (e_sys_action_possible_get(E_SYS_REBOOT)) + { + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Reboot")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/reboot"); + e_menu_item_callback_set(mi, _e_int_menus_main_reboot, NULL); + } + if (e_sys_action_possible_get(E_SYS_HALT)) + { + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Shut Down")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/halt"); + e_menu_item_callback_set(mi, _e_int_menus_main_halt, NULL); + } + mi = e_menu_item_new(m); + e_menu_item_separator_set(mi, 1); + } + + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Restart Enlightenment")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/reset"); + e_menu_item_callback_set(mi, _e_int_menus_main_restart, NULL); + + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Exit Enlightenment")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/exit"); + e_menu_item_callback_set(mi, _e_int_menus_main_exit, NULL); + + mi = e_menu_item_new(m); + e_menu_item_separator_set(mi, 1); + + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Logout")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/logout"); + e_menu_item_callback_set(mi, _e_int_menus_main_logout, NULL); + + e_object_free_attach_func_set(E_OBJECT(m), _e_int_menus_sys_free_hook); +} + +static void +_e_int_menus_sys_free_hook(void *obj) +{ + E_Menu *m; + + m = obj; + + _e_int_menus_augmentation_del(m, evas_hash_find(_e_int_menus_augmentation, "sys")); +} + +static void _e_int_menus_clients_pre_cb(void *data, E_Menu *m) { E_Menu_Item *mi; @@ -922,52 +973,7 @@ zone = data; e_place_zone_region_smart_cleanup(zone); } -/* -static void -_e_int_menus_gadgets_pre_cb(void *data, E_Menu *m) -{ - E_Menu_Item *mi; - E_Menu *root; - - e_menu_pre_activate_callback_set(m, NULL, NULL); - root = e_menu_root_get(m); - if ((root) && (root->zone)) - { - mi = e_menu_item_new(m); - e_menu_item_check_set(mi, 1); - if (e_gadman_mode_get(root->zone->container->gadman) == E_GADMAN_MODE_EDIT) - e_menu_item_toggle_set(mi, 1); - else - e_menu_item_toggle_set(mi, 0); - e_menu_item_label_set(mi, _("Edit Mode")); - e_menu_item_callback_set(mi, _e_int_menus_gadgets_edit_mode_cb, root->zone->container->gadman); - } - else - { - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("(Unused)")); - e_menu_item_callback_set(mi, NULL, NULL); - } -} -static void -_e_int_menus_gadgets_edit_mode_cb(void *data, E_Menu *m, E_Menu_Item *mi) -{ - E_Gadman *gm; - - gm = data; - if (e_menu_item_toggle_get(mi)) - { -// e_gadcon_all_edit_begin(); - e_gadman_mode_set(gm, E_GADMAN_MODE_EDIT); - } - else - { -// e_gadcon_all_edit_end(); - e_gadman_mode_set(gm, E_GADMAN_MODE_NORMAL); - } -} -*/ static void _e_int_menus_lost_clients_pre_cb(void *data, E_Menu *m) { =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_int_menus.h,v retrieving revision 1.16 retrieving revision 1.17 diff -u -3 -r1.16 -r1.17 --- e_int_menus.h 21 Aug 2006 04:35:52 -0000 1.16 +++ e_int_menus.h 9 Sep 2006 07:00:14 -0000 1.17 @@ -12,8 +12,8 @@ struct _E_Int_Menu_Augmentation { struct { - void (*func)(void *data, E_Menu *m); - void *data; + void (*func)(void *data, E_Menu *m); + void *data; } add, del; }; @@ -24,9 +24,8 @@ EAPI E_Menu *e_int_menus_favorite_apps_new(void); EAPI E_Menu *e_int_menus_all_apps_new(void); EAPI E_Menu *e_int_menus_config_new(void); -EAPI E_Menu *e_int_menus_gadgets_new(void); -EAPI E_Menu *e_int_menus_themes_new(void); EAPI E_Menu *e_int_menus_lost_clients_new(void); +EAPI E_Menu *e_int_menus_sys_new(void); EAPI E_Int_Menu_Augmentation *e_int_menus_menu_augmentation_add(const char *menu, void (*func_add) (void *data, E_Menu *m), =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_menu.c,v retrieving revision 1.67 retrieving revision 1.68 diff -u -3 -r1.67 -r1.68 --- e_menu.c 7 Sep 2006 10:33:57 -0000 1.67 +++ e_menu.c 9 Sep 2006 07:00:14 -0000 1.68 @@ -1848,10 +1848,10 @@ m->cur.x = m->parent_item->menu->cur.x + m->parent_item->menu->cur.w; parent_item_bottom = m->parent_item->menu->cur.y + m->parent_item->y; - if(m->cur.h > m->zone->h) + if (m->cur.h > m->zone->h) { /* menu is larger than screen */ - if(parent_item_bottom > (m->zone->h / 2)) + if (parent_item_bottom > (m->zone->h / 2)) /* more is shown if menu goes up */ m->cur.y = (parent_item_bottom - (m->container_h + 1)); else @@ -1861,10 +1861,10 @@ else { /* menu is smaller than screen */ - if(((parent_item_bottom + m->cur.h - m->container_y) > m->zone->h) && + if (((parent_item_bottom + m->cur.h - m->container_y) > m->zone->h) && (parent_item_bottom > (m->zone->h / 2))) /* menu is partially out of screen and more is shown if menu goes up */ - m->cur.y = (parent_item_bottom - (m->container_h + 1)); + m->cur.y = (parent_item_bottom - (m->container_h + 1)) + m->parent_item->h; else m->cur.y = parent_item_bottom - m->container_y; } =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_sys.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- e_sys.c 3 Sep 2006 08:51:32 -0000 1.1 +++ e_sys.c 9 Sep 2006 07:00:14 -0000 1.2 @@ -5,9 +5,17 @@ /* local subsystem functions */ static int _e_sys_cb_exit(void *data, int type, void *event); +static void _e_sys_cb_logout_logout(void *data, E_Dialog *dia); +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 int _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_current_action(void); +static void _e_sys_action_failed(void); +static int _e_sys_action_do(E_Sys_Action a, char *param); static Ecore_Event_Handler *_e_sys_exe_exit_handler = NULL; -static int _e_sys_exe_pending = 0; static Ecore_Exe *_e_sys_halt_check_exe = NULL; static Ecore_Exe *_e_sys_reboot_check_exe = NULL; static Ecore_Exe *_e_sys_suspend_check_exe = NULL; @@ -17,6 +25,12 @@ static int _e_sys_can_suspend = 0; 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 Ecore_Exe *_e_sys_exe = NULL; +static double _e_sys_logout_begin_time = 0.0; +static Ecore_Timer *_e_sys_logout_timer = NULL; + /* externally accessible functions */ EAPI int e_sys_init(void) @@ -26,18 +40,17 @@ /* this is not optimal - but it does work cleanly */ _e_sys_exe_exit_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _e_sys_cb_exit, NULL); + /* exec out sys helper and ask it to test if we are allowed to do these + * things + */ snprintf(buf, sizeof(buf), "%s/enlightenment_sys -t halt", e_prefix_bin_get()); _e_sys_halt_check_exe = ecore_exe_run(buf, NULL); - _e_sys_exe_pending++; snprintf(buf, sizeof(buf), "%s/enlightenment_sys -t reboot", e_prefix_bin_get()); _e_sys_reboot_check_exe = ecore_exe_run(buf, NULL); - _e_sys_exe_pending++; snprintf(buf, sizeof(buf), "%s/enlightenment_sys -t suspend", e_prefix_bin_get()); _e_sys_suspend_check_exe = ecore_exe_run(buf, NULL); - _e_sys_exe_pending++; snprintf(buf, sizeof(buf), "%s/enlightenment_sys -t hibernate", e_prefix_bin_get()); _e_sys_hibernate_check_exe = ecore_exe_run(buf, NULL); - _e_sys_exe_pending++; return 1; } @@ -82,60 +95,33 @@ EAPI int e_sys_action_do(E_Sys_Action a, char *param) { - char buf[4096]; + int ret; + if (_e_sys_action_current != E_SYS_NONE) + { + _e_sys_current_action(); + return 0; + } switch (a) { case E_SYS_EXIT: - if (!e_util_immortal_check()) - ecore_main_loop_quit(); - break; case E_SYS_RESTART: - restart = 1; - ecore_main_loop_quit(); - break; case E_SYS_EXIT_NOW: - exit(0); - break; case E_SYS_LOGOUT: - /* FIXME: go through to every window and if it wants delete req - ask - * it to delete, otherwise just close it. set handler for window - * deletes, and once all windows are deleted - exit, OR if a timer - * expires - pop up dialog saying something is not responding - */ + case E_SYS_SUSPEND: + case E_SYS_HIBERNATE: + ret = _e_sys_action_do(a, param); break; case E_SYS_HALT: - /* shutdown -h now */ - snprintf(buf, sizeof(buf), "%s/enlightenment_sys halt", - e_prefix_bin_get()); - ecore_exe_run(buf, NULL); - /* FIXME: track command return value and have dialog */ - break; case E_SYS_REBOOT: - /* shutdown -r now */ - snprintf(buf, sizeof(buf), "%s/enlightenment_sys reboot", - e_prefix_bin_get()); - ecore_exe_run(buf, NULL); - /* FIXME: track command return value and have dialog */ - break; - case E_SYS_SUSPEND: - /* /etc/acpi/sleep.sh force */ - snprintf(buf, sizeof(buf), "%s/enlightenment_sys suspend", - e_prefix_bin_get()); - ecore_exe_run(buf, NULL); - /* FIXME: track command return value and have dialog */ - break; - case E_SYS_HIBERNATE: - /* /etc/acpi/hibernate.sh force */ - snprintf(buf, sizeof(buf), "%s/enlightenment_sys hibernate", - e_prefix_bin_get()); - ecore_exe_run(buf, NULL); - /* FIXME: track command return value and have dialog */ + if (!e_util_immortal_check()) _e_sys_logout_begin(a); + return 1; break; default: return 0; } - return 0; + _e_sys_action_current = a; + return ret; } /* local subsystem functions */ @@ -145,14 +131,25 @@ Ecore_Exe_Event_Del *ev; ev = event; + if ((_e_sys_exe) && (ev->exe == _e_sys_exe)) + { + if (ev->exit_code != 0) _e_sys_action_failed(); + _e_sys_action_current = E_SYS_NONE; + _e_sys_exe = NULL; + /* if we have a suspend or hibernate status popup/dialog - close it + * here as we have finished suspend/hibernate (and probably just + * came back out of suspend/hibernate */ + return 1; + } if ((_e_sys_halt_check_exe) && (ev->exe == _e_sys_halt_check_exe)) { + /* exit_code: 0 == OK, 5 == suid root removed, 7 == group id error + * 10 == permission denied, 20 == action undefined */ if (ev->exit_code == 0) { _e_sys_can_halt = 1; _e_sys_halt_check_exe = NULL; } - _e_sys_exe_pending--; } else if ((_e_sys_reboot_check_exe) && (ev->exe == _e_sys_reboot_check_exe)) { @@ -161,7 +158,6 @@ _e_sys_can_reboot = 1; _e_sys_reboot_check_exe = NULL; } - _e_sys_exe_pending--; } else if ((_e_sys_suspend_check_exe) && (ev->exe == _e_sys_suspend_check_exe)) { @@ -170,7 +166,6 @@ _e_sys_can_suspend = 1; _e_sys_suspend_check_exe = NULL; } - _e_sys_exe_pending--; } else if ((_e_sys_hibernate_check_exe) && (ev->exe == _e_sys_hibernate_check_exe)) { @@ -179,14 +174,322 @@ _e_sys_can_hibernate = 1; _e_sys_hibernate_check_exe = NULL; } - _e_sys_exe_pending--; } + return 1; +} + +static void +_e_sys_cb_logout_logout(void *data, E_Dialog *dia) +{ + if (_e_sys_logout_timer) + { + ecore_timer_del(_e_sys_logout_timer); + _e_sys_logout_timer = NULL; + } + _e_sys_logout_begin_time = 0.0; + _e_sys_logout_after(); + e_object_del(E_OBJECT(dia)); +} + +static void +_e_sys_cb_logout_wait(void *data, E_Dialog *dia) +{ + if (_e_sys_logout_timer) ecore_timer_del(_e_sys_logout_timer); + _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)); +} + +static void +_e_sys_cb_logout_abort(void *data, E_Dialog *dia) +{ + if (_e_sys_logout_timer) + { + ecore_timer_del(_e_sys_logout_timer); + _e_sys_logout_timer = NULL; + } + _e_sys_logout_begin_time = 0.0; + e_object_del(E_OBJECT(dia)); + _e_sys_action_current = E_SYS_NONE; + _e_sys_action_after = E_SYS_NONE; +} + +static int +_e_sys_cb_logout_timer(void *data) +{ + Evas_List *l; + int pending = 0; + + for (l = e_border_client_list(); l; l = l->next) + { + E_Border *bd; + + bd = l->data; + if (!bd->internal) pending++; + } + if (pending == 0) goto after; + 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) + { + E_Dialog *dia; + + dia = e_dialog_new(e_container_current_get(e_manager_current_get()), "E", "_sys_error_logout_slow"); + if (dia) + { + e_dialog_title_set(dia, _("Logout problems")); + e_dialog_icon_set(dia, "enlightenment/logout", 64); + e_dialog_text_set(dia, + _("Logout is taking too long. Some<br>" + "applications refuse to close.<br>" + "Do you want to finish the logout<br>" + "anyway without closing these<br>" + "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_win_centered_set(dia->win, 1); + e_dialog_show(dia); + _e_sys_logout_begin_time = ecore_time_get() + (60 * 60 * 24 * 365); + } + _e_sys_logout_timer = NULL; + return 0; + } + } + return 1; + after: + _e_sys_logout_after(); + _e_sys_logout_timer = NULL; + return 0; +} + +static void +_e_sys_logout_after(void) +{ + _e_sys_action_do(_e_sys_action_after, NULL); + _e_sys_action_current = E_SYS_NONE; + _e_sys_action_after = E_SYS_NONE; +} + +static void +_e_sys_logout_begin(E_Sys_Action a_after) +{ + Evas_List *l; + + /* start logout - at end do the a_after action */ + _e_sys_action_after = a_after; + /* FIXME: go through to every window and if it wants delete req - ask + * it to delete, otherwise just close it. set handler for window + * deletes, and once all windows are deleted - exit, OR if a timer + * expires - pop up dialog saying something is not responding + */ + for (l = e_border_client_list(); l; l = l->next) + { + E_Border *bd; + + bd = l->data; + e_border_act_close_begin(bd); + } + /* and poll to see if all pending windows are gone yet every 0.5 sec */ + _e_sys_logout_begin_time = ecore_time_get(); + if (_e_sys_logout_timer) ecore_timer_del(_e_sys_logout_timer); + _e_sys_logout_timer = ecore_timer_add(0.5, _e_sys_cb_logout_timer, NULL); +} + +static void +_e_sys_current_action(void) +{ + /* display dialog that currently an action is in progress */ + E_Dialog *dia; + + dia = e_dialog_new(e_container_current_get(e_manager_current_get()), "E", "_sys_error_action_busy"); + if (!dia) return; + + e_dialog_title_set(dia, _("Enlightenment is busy with another request")); + e_dialog_icon_set(dia, "enlightenment/sys", 64); + switch (_e_sys_action_current) + { + case E_SYS_LOGOUT: + e_dialog_text_set(dia, + _("Enlightenment is busy logging out<br>" + "You cannot perform other system actions<br>" + "once a logout has begun.") + ); + break; + case E_SYS_HALT: + e_dialog_text_set(dia, + _("Enlightenment is shutting the system down.<br>" + "You cannot do any other system actions<br>" + "once a shutdown has been started.") + ); + break; + case E_SYS_REBOOT: + e_dialog_text_set(dia, + _("Enlightenment is rebooting the system.<br>" + "You cannot do any other system actions<br>" + "once a reboot has begun.") + ); + break; + case E_SYS_SUSPEND: + e_dialog_text_set(dia, + _("Enlightenment is suspending the system.<br>" + "Until suspend is complete you cannot perform<br>" + "any other system actions.") + ); + break; + case E_SYS_HIBERNATE: + e_dialog_text_set(dia, + _("Enlightenment is hibernating the system.<br>" + "You cannot perform an other system actions<br>" + "until this is complete.") + ); + break; + default: + e_dialog_text_set(dia, + _("EEK! This should not happen") + ); + break; + } + e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL); + e_dialog_button_focus_num(dia, 0); + e_win_centered_set(dia->win, 1); + e_dialog_show(dia); +} + +static void +_e_sys_action_failed(void) +{ + /* display dialog that the current action failed */ + E_Dialog *dia; + + dia = e_dialog_new(e_container_current_get(e_manager_current_get()), "E", "_sys_error_action_failed"); + if (!dia) return; - if (_e_sys_exe_pending <= 0) + e_dialog_title_set(dia, _("Enlightenment is busy with another request")); + e_dialog_icon_set(dia, "enlightenment/sys", 64); + switch (_e_sys_action_current) { - if (_e_sys_exe_exit_handler) - ecore_event_handler_del(_e_sys_exe_exit_handler); - _e_sys_exe_exit_handler = NULL; + case E_SYS_HALT: + e_dialog_text_set(dia, + _("Shutting down of your system failed.") + ); + break; + case E_SYS_REBOOT: + e_dialog_text_set(dia, + _("Rebooting your system failed.") + ); + break; + case E_SYS_SUSPEND: + e_dialog_text_set(dia, + _("Suspend of your system failed.") + ); + break; + case E_SYS_HIBERNATE: + e_dialog_text_set(dia, + _("Hibernating your system failed.") + ); + break; + default: + e_dialog_text_set(dia, + _("EEK! This should not happen") + ); + break; + } + e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL); + e_dialog_button_focus_num(dia, 0); + e_win_centered_set(dia->win, 1); + e_dialog_show(dia); +} + +static int +_e_sys_action_do(E_Sys_Action a, char *param) +{ + char buf[4096]; + + switch (a) + { + case E_SYS_EXIT: + if (!e_util_immortal_check()) ecore_main_loop_quit(); + break; + case E_SYS_RESTART: + restart = 1; + ecore_main_loop_quit(); + break; + case E_SYS_EXIT_NOW: + exit(0); + break; + case E_SYS_LOGOUT: + _e_sys_logout_begin(E_SYS_EXIT); + break; + case E_SYS_HALT: + /* shutdown -h now */ + if (e_util_immortal_check()) return 0; + snprintf(buf, sizeof(buf), "%s/enlightenment_sys halt", + e_prefix_bin_get()); + if (_e_sys_exe) + { + _e_sys_current_action(); + return 0; + } + else + { + _e_sys_exe = ecore_exe_run(buf, NULL); + /* FIXME: display halt status */ + } + break; + case E_SYS_REBOOT: + /* shutdown -r now */ + if (e_util_immortal_check()) return 0; + snprintf(buf, sizeof(buf), "%s/enlightenment_sys reboot", + e_prefix_bin_get()); + if (_e_sys_exe) + { + _e_sys_current_action(); + return 0; + } + else + { + _e_sys_exe = ecore_exe_run(buf, NULL); + /* FIXME: display reboot status */ + } + break; + case E_SYS_SUSPEND: + /* /etc/acpi/sleep.sh force */ + snprintf(buf, sizeof(buf), "%s/enlightenment_sys suspend", + e_prefix_bin_get()); + if (_e_sys_exe) + { + _e_sys_current_action(); + return 0; + } + else + { + _e_sys_exe = ecore_exe_run(buf, NULL); + /* FIXME: display suspend status */ + } + break; + case E_SYS_HIBERNATE: + /* /etc/acpi/hibernate.sh force */ + snprintf(buf, sizeof(buf), "%s/enlightenment_sys hibernate", + e_prefix_bin_get()); + if (_e_sys_exe) + { + _e_sys_current_action(); + return 0; + } + else + { + _e_sys_exe = ecore_exe_run(buf, NULL); + /* FIXME: display hibernate status */ + } + break; + default: + return 0; } return 1; } =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_sys.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- e_sys.h 3 Sep 2006 08:51:32 -0000 1.1 +++ e_sys.h 9 Sep 2006 07:00:14 -0000 1.2 @@ -7,6 +7,7 @@ enum _E_Sys_Action { + E_SYS_NONE, E_SYS_EXIT, E_SYS_RESTART, E_SYS_EXIT_NOW, ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs