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

Reply via email to