From 38899921b85e094a39067661234df0669655f697 Mon Sep 17 00:00:00 2001 From: xcomputerman Date: Wed, 5 Jan 2005 10:37:53 +0000 Subject: [PATCH] More bugfixes/updates: - Add subsystem init/shutdown functions for e_desk and e_zone - Fix bug in desk remove function - Prevent duplicate desktop names being automatically generated - When uniconifying, set window desktop to current - Don't display iconified windows when desktop switching - Selecting a window in the window list switches to that window's desktop SVN revision: 12779 --- src/bin/e_border.c | 16 ++++++++++++++++ src/bin/e_border.h | 1 + src/bin/e_container.c | 2 ++ src/bin/e_desk.c | 25 ++++++++++++++++++++----- src/bin/e_desk.h | 2 ++ src/bin/e_int_menus.c | 12 +++++++++++- src/bin/e_main.c | 4 ++++ src/bin/e_zone.c | 19 ++++++++++++++++--- src/bin/e_zone.h | 2 ++ 9 files changed, 74 insertions(+), 9 deletions(-) diff --git a/src/bin/e_border.c b/src/bin/e_border.c index e615342d2..dcf90f73c 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -243,6 +243,17 @@ e_border_new(E_Container *con, Ecore_X_Window win, int first_map) return bd; } +void +e_border_desk_set(E_Border *bd, E_Desk *desk) +{ + E_OBJECT_CHECK(bd); + E_OBJECT_CHECK(desk); + if (bd->desk == desk) return; + bd->desk->clients = evas_list_remove(bd->desk->clients, bd); + desk->clients = evas_list_append(desk->clients, bd); + bd->desk = desk; +} + void e_border_show(E_Border *bd) { @@ -610,10 +621,15 @@ e_border_iconify(E_Border *bd) void e_border_uniconify(E_Border *bd) { + E_Desk *desk; + E_OBJECT_CHECK(bd); if ((bd->shading)) return; if (bd->iconic) { + desk = e_desk_current_get(bd->desk->zone); + if (desk != bd->desk) + e_border_desk_set(bd, desk); bd->iconic = 0; e_border_show(bd); e_iconify_border_remove(bd); diff --git a/src/bin/e_border.h b/src/bin/e_border.h index 8874cb392..1cf3f289b 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -189,6 +189,7 @@ EAPI E_Border *e_border_new(E_Container *con, Ecore_X_Window win, int first_map) EAPI void e_border_free(E_Border *bd); EAPI void e_border_ref(E_Border *bd); EAPI void e_border_unref(E_Border *bd); +EAPI void e_border_desk_set(E_Border *bd, E_Desk *desk); EAPI void e_border_show(E_Border *bd); EAPI void e_border_hide(E_Border *bd); EAPI void e_border_move(E_Border *bd, int x, int y); diff --git a/src/bin/e_container.c b/src/bin/e_container.c index 8e17db7e9..a4041f0db 100644 --- a/src/bin/e_container.c +++ b/src/bin/e_container.c @@ -20,12 +20,14 @@ static void _e_container_resize_handle(E_Container *con); static void _e_container_event_container_resize_free(void *data, void *ev); int E_EVENT_CONTAINER_RESIZE = 0; +static int container_count; /* externally accessible functions */ int e_container_init(void) { E_EVENT_CONTAINER_RESIZE = ecore_event_type_new(); + container_count = 0; return 1; } diff --git a/src/bin/e_desk.c b/src/bin/e_desk.c index 2f1f13633..3c169abdb 100644 --- a/src/bin/e_desk.c +++ b/src/bin/e_desk.c @@ -9,6 +9,20 @@ */ static void _e_desk_free(E_Desk *desk); +static int desk_count; + +int +e_desk_init(void) +{ + desk_count = 0; + return 1; +} + +int +e_desk_shutdown(void) +{ + return 1; +} E_Desk * e_desk_new(E_Zone *zone) @@ -23,7 +37,7 @@ e_desk_new(E_Zone *zone) desk->clients = NULL; desk->zone = zone; - desk->num = evas_list_count(zone->desks) + 1; + desk->num = ++desk_count; snprintf(name, sizeof(name), "Desktop %d", desk->num); desk->name = strdup(name); e_object_ref(E_OBJECT(zone)); @@ -53,7 +67,7 @@ e_desk_show(E_Desk *desk) { E_Border *bd = l->data; - if (bd->desk->zone == desk->zone) + if (bd->desk->zone == desk->zone && !bd->iconic) { if (bd->desk == desk) { @@ -83,7 +97,7 @@ e_desk_remove(E_Desk *desk) E_OBJECT_CHECK(desk); if (evas_list_count(desk->zone->desks) < 2) return; - l = evas_list_find(desk->zone->desks, desk); + l = evas_list_find_list(desk->zone->desks, desk); l = l->prev; if (!l) l = evas_list_last(desk->zone->desks); previous = l->data; @@ -91,10 +105,11 @@ e_desk_remove(E_Desk *desk) for (l = desk->clients; l; l = l->next) { E_Border *bd = l->data; - bd->desk = previous; + e_border_desk_set(bd, previous); } desk->zone->desks = evas_list_remove(desk->zone->desks, desk); - e_desk_show(previous); + if (desk->visible) + e_desk_show(previous); evas_list_free(desk->clients); e_object_del(E_OBJECT(desk)); diff --git a/src/bin/e_desk.h b/src/bin/e_desk.h index 724e43c2d..086b49ddf 100644 --- a/src/bin/e_desk.h +++ b/src/bin/e_desk.h @@ -17,6 +17,8 @@ struct _E_Desk Evas_List *clients; }; +EAPI int e_desk_init(void); +EAPI int e_desk_shutdown(void); EAPI E_Desk *e_desk_new(E_Zone *zone); EAPI void e_desk_name_set(E_Desk *desk, const char *name); EAPI void e_desk_show(E_Desk *desk); diff --git a/src/bin/e_int_menus.c b/src/bin/e_int_menus.c index f5372ffd3..985dafdbd 100644 --- a/src/bin/e_int_menus.c +++ b/src/bin/e_int_menus.c @@ -353,6 +353,7 @@ _e_int_menus_desktops_add_cb(void *data, E_Menu *m, E_Menu_Item *mi) E_Desk *desk; E_Zone *zone = e_zone_current_get(root->con); desk = e_desk_new(zone); + e_desk_show(desk); } } @@ -368,7 +369,15 @@ _e_int_menus_desktops_del_cb(void *data, E_Menu *m, E_Menu_Item *mi) zone = e_zone_current_get(root->con); desk = e_desk_current_get(zone); - e_desk_remove(desk); + + if (evas_list_count(zone->desks) > 1) + { + e_desk_remove(desk); + } + else + { + e_error_dialog_show("Enlightenment", "You cannot remove the last desktop."); + } } } @@ -441,6 +450,7 @@ _e_int_menus_clients_item_cb (void *data, E_Menu *m, E_Menu_Item *mi) if (bd->iconic) e_border_uniconify(bd); + e_desk_show(bd->desk); e_border_raise(bd); e_border_focus_set(bd, 1, 1); } diff --git a/src/bin/e_main.c b/src/bin/e_main.c index 68297229e..4fb6a406b 100644 --- a/src/bin/e_main.c +++ b/src/bin/e_main.c @@ -493,6 +493,8 @@ _e_main_screens_init(void) if (!e_manager_init()) return 0; if (!e_container_init()) return 0; + if (!e_zone_init()) return 0; + if (!e_desk_init()) return 0; num = 0; roots = ecore_x_window_root_list(&num); @@ -560,6 +562,8 @@ _e_main_screens_init(void) static int _e_main_screens_shutdown(void) { + e_desk_shutdown(); + e_zone_shutdown(); e_container_shutdown(); e_manager_shutdown(); return 1; diff --git a/src/bin/e_zone.c b/src/bin/e_zone.c index 00bbebc82..39d011a9a 100644 --- a/src/bin/e_zone.c +++ b/src/bin/e_zone.c @@ -12,6 +12,21 @@ static void _e_zone_cb_bg_mouse_down(void *data, Evas *evas, Evas_Object *obj, v static void _e_zone_cb_bg_mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event_info); static void _e_zone_cb_bg_mouse_move(void *data, Evas *evas, Evas_Object *obj, void *event_info); +static int zone_count; + +int +e_zone_init(void) +{ + zone_count = 0; + return 1; +} + +int +e_zone_shutdown(void) +{ + return 1; +} + E_Zone * e_zone_new(E_Container *con, int x, int y, int w, int h) { @@ -21,8 +36,6 @@ e_zone_new(E_Container *con, int x, int y, int w, int h) zone = E_OBJECT_ALLOC(E_Zone, _e_zone_free); if (!zone) return NULL; - printf("NEW ZONE! %d %d %d %d\n", x, y, w, h); - zone->container = con; zone->name = NULL; @@ -30,7 +43,7 @@ e_zone_new(E_Container *con, int x, int y, int w, int h) zone->y = y; zone->w = w; zone->h = h; - zone->num = evas_list_count(con->zones) + 1; + zone->num = ++zone_count; e_object_ref(E_OBJECT(con)); con->zones = evas_list_append(con->zones, zone); diff --git a/src/bin/e_zone.h b/src/bin/e_zone.h index e99e45929..32de5fea7 100644 --- a/src/bin/e_zone.h +++ b/src/bin/e_zone.h @@ -20,6 +20,8 @@ struct _E_Zone }; +EAPI int e_zone_init(void); +EAPI int e_zone_shutdown(void); EAPI E_Zone *e_zone_new(E_Container *con, int x, int y, int w, int h); EAPI void e_zone_move(E_Zone *zone, int x, int y); EAPI void e_zone_resize(E_Zone *zone, int w, int h);