diff --git a/TODO b/TODO index afe4a4819..566eb032e 100644 --- a/TODO +++ b/TODO @@ -44,6 +44,7 @@ Some of the things (in very short form) that need to be done to E17... ESSENTIAL FEATURES ------------------------------------------------------------------------------- +* be able to set window to skip window list (and remember this) * emit signal to submenu entries if they have a submenu shown for them or not * add window placement options like place at pointer * shaded windows should not allow border changes by the user @@ -86,9 +87,9 @@ Some of the things (in very short form) that need to be done to E17... * break out ipc to set names for desktops (and get names/list them) * some sort of gui display of a desktop name (in the pager?) * window icons should be able to be chosen if e eapp icon overrides netwm - icon or the other way around. + icon or the other way around (and remember this). * transients should have option to always follow parent - (move/resize/raise/lower) + (move/resize/raise/lower) (and remember this). * actions to make current zone different (warp mouse to there) * actions to make the current container different * titlebar/border expansion/gadget panel for modules to put window widgets in @@ -128,22 +129,12 @@ Some of the things (in very short form) that need to be done to E17... * make xrandr support get rotation and store it * add separate app menu bars at top of screen support * add really nice "about" box with theme, authors credits list etc etc. -* "immortal" windows (e will not allow that window to be closed or will - refuse to exit as long as the immortal flags is set until it is unset to - stop users from doing silly things like logging out while important stuff - is happening in that window -a menu option for this woudl be nice) -* need to be able to remember client positons/etc. -* with remember need to be able lock in attributes so the app (or user or both) - cannot change them (eg this window is a fixed size and location - app cannot - ask for a new size or location) * gui config tools for bg's, keybindings, etc. etc. etc. * "control panel" app to launch the gui config tools * make it possible to disable border buttons/actions (tell theme what is disabled) -* modules need config executables with proper widgets (sliders, check boxes, - radio etc. not massive menus) -* remove module config menus (make them part of the module control panel and - as separate executables) +* modules need config dialogs instead of long winded menus +* remove module config menus (make them part of the module control panel etc.) ]]] [[[ diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 2c48968cb..06ca08ce4 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -1878,6 +1878,22 @@ e_border_resize_cancel(void) } } +Evas_List * +e_border_immortal_windows_get(void) +{ + Evas_List *list = NULL, *l; + + for (l = borders; l; l = l->next) + { + E_Border *bd; + + bd = l->data; + if (bd->lock_life) + list = evas_list_append(list, bd); + } + return list; +} + /* local subsystem functions */ static void _e_border_free(E_Border *bd) @@ -5532,7 +5548,7 @@ _e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key) NEW_LOCK_MI(_("Close"), lock_close); /* NEW_LOCK_MI(_("Focus In"), lock_focus_in);*/ /* NEW_LOCK_MI(_("Focus Out"), lock_focus_out);*/ -/* NEW_LOCK_MI(_("Lifespan"), lock_life);*/ + NEW_LOCK_MI(_("Lifespan"), lock_life); m = e_menu_new(); bd->border_remember_menu = m; diff --git a/src/bin/e_border.h b/src/bin/e_border.h index 03a6b22db..4b8b06563 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -511,6 +511,7 @@ EAPI Evas_List *e_border_lost_windows_get(E_Zone *zone); EAPI void e_border_ping(E_Border *bd); EAPI void e_border_move_cancel(void); EAPI void e_border_resize_cancel(void); +EAPI Evas_List *e_border_immortal_windows_get(void); extern EAPI int E_EVENT_BORDER_RESIZE; extern EAPI int E_EVENT_BORDER_MOVE; diff --git a/src/bin/e_int_menus.c b/src/bin/e_int_menus.c index 4fd1e7488..0be9f6926 100644 --- a/src/bin/e_int_menus.c +++ b/src/bin/e_int_menus.c @@ -331,7 +331,7 @@ _e_int_menus_main_restart(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) { - ecore_main_loop_quit(); + if (!e_util_immortal_check()) ecore_main_loop_quit(); } static void diff --git a/src/bin/e_ipc_handlers.h b/src/bin/e_ipc_handlers.h index ee39c8231..610c0529e 100644 --- a/src/bin/e_ipc_handlers.h +++ b/src/bin/e_ipc_handlers.h @@ -1028,7 +1028,7 @@ break; REQ_NULL(HDL); #elif (TYPE == E_WM_IN) GENERIC(HDL); - ecore_main_loop_quit(); + if (!e_util_immortal_check()) ecore_main_loop_quit(); END_GENERIC(); #elif (TYPE == E_REMOTE_IN) #endif diff --git a/src/bin/e_main.c b/src/bin/e_main.c index 14ac750dd..e8dc7d2c4 100644 --- a/src/bin/e_main.c +++ b/src/bin/e_main.c @@ -923,7 +923,7 @@ static int _e_main_cb_signal_exit(void *data __UNUSED__, int ev_type __UNUSED__, void *ev __UNUSED__) { /* called on ctrl-c, kill (pid) (also SIGINT, SIGTERM and SIGQIT) */ - ecore_main_loop_quit(); + if (!e_util_immortal_check()) ecore_main_loop_quit(); return 1; } diff --git a/src/bin/e_utils.c b/src/bin/e_utils.c index ea4092c27..fcca22fcc 100644 --- a/src/bin/e_utils.c +++ b/src/bin/e_utils.c @@ -235,3 +235,26 @@ e_util_both_str_empty(char *s1, char *s2) if (empty == 2) return 1; return 0; } + +int +e_util_immortal_check(void) +{ + Evas_List *wins; + + wins = e_border_immortal_windows_get(); + if (wins) + { + e_error_dialog_show(_("Cannot exit becaose of immortal windows."), + _("Some windows are left with still around with\n" + "the Lifespan lock enabled. This means that\n" + "Enlightenment will not allow itself to exit\n" + "until these windows have been closed or have\n" + "the lifespan lock removed.\n")); + /* FIXME: should really display a list of these lifespan locked */ + /* windows in a dialog and let the user disable their locks in */ + /* this dialog */ + evas_list_free(wins); + return 1; + } + return 0; +} diff --git a/src/bin/e_utils.h b/src/bin/e_utils.h index 2c0e9d0e5..980b2aab9 100644 --- a/src/bin/e_utils.h +++ b/src/bin/e_utils.h @@ -19,6 +19,7 @@ EAPI E_Zone *e_util_container_zone_number_get(int con_num, int zone_num); EAPI int e_util_head_exec(int head, char *cmd); EAPI int e_util_strcmp(char *s1, char *s2); EAPI int e_util_both_str_empty(char *s1, char *s2); - +EAPI int e_util_immortal_check(void); + #endif #endif