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
This commit is contained in:
xcomputerman 2005-01-05 10:37:53 +00:00 committed by xcomputerman
parent 5cbe105940
commit 38899921b8
9 changed files with 74 additions and 9 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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;
}

View File

@ -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));

View File

@ -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);

View File

@ -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);
}

View File

@ -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;

View File

@ -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);

View File

@ -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);