Anyone against?
Sebastian
Index: e/src/bin/e_border.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_border.c,v
retrieving revision 1.101
diff -u -r1.101 e_border.c
--- e/src/bin/e_border.c 15 Feb 2005 17:11:13 -0000 1.101
+++ e/src/bin/e_border.c 17 Feb 2005 17:42:28 -0000
@@ -296,7 +296,7 @@
bd->zone = e_zone_current_get(con);
bd->zone->clients = evas_list_append(bd->zone->clients, bd);
- bd->desk = e_desk_current_get(bd->zone);
+ bd->desk = e_zone_desk_current_get(bd->zone);
bd->desk->clients = evas_list_append(bd->desk->clients, bd);
con->clients = evas_list_append(con->clients, bd);
borders = evas_list_append(borders, bd);
@@ -333,11 +333,11 @@
int x, y;
e_desk_xy_get(bd->desk, &x, &y);
- desk = e_desk_at_xy_get(bd->zone, x, y);
+ desk = e_zone_desk_at_xy_get(bd->zone, x, y);
if (desk)
e_border_desk_set(bd, desk);
else
- e_border_desk_set(bd, e_desk_current_get(bd->zone));
+ e_border_desk_set(bd, e_zone_desk_current_get(bd->zone));
}
ev = calloc(1, sizeof(E_Event_Border_Zone_Set));
@@ -365,8 +365,7 @@
bd->desk->clients = evas_list_remove(bd->desk->clients, bd);
desk->clients = evas_list_append(desk->clients, bd);
bd->desk = desk;
- if (bd->zone != desk->zone)
- e_border_zone_set(bd, desk->zone);
+ e_border_zone_set(bd, desk->zone);
ev = calloc(1, sizeof(E_Event_Border_Desk_Set));
ev->border = bd;
@@ -892,9 +891,8 @@
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);
+ desk = e_zone_desk_current_get(bd->desk->zone);
+ e_border_desk_set(bd, desk);
bd->iconic = 0;
e_border_show(bd);
/* FIXME: DEPRECATED?
@@ -931,7 +929,7 @@
E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE);
bd->sticky = 0;
e_hints_window_sticky_set(bd->client.win, 0);
- e_border_desk_set(bd, e_desk_current_get(bd->zone));
+ e_border_desk_set(bd, e_zone_desk_current_get(bd->zone));
ev = E_NEW(E_Event_Border_Unstick, 1);
ev->border = bd;
@@ -2544,7 +2542,7 @@
e_border_iconify(bd);
/* If a window isn't iconic, and is one the current desk,
* show it! */
- else if (bd->desk == e_desk_current_get(bd->zone))
+ else if (bd->desk == e_zone_desk_current_get(bd->zone))
e_border_show(bd);
ecore_x_icccm_move_resize_send(bd->client.win,
Index: e/src/bin/e_desk.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_desk.c,v
retrieving revision 1.21
diff -u -r1.21 e_desk.c
--- e/src/bin/e_desk.c 15 Feb 2005 16:54:47 -0000 1.21
+++ e/src/bin/e_desk.c 17 Feb 2005 17:42:29 -0000
@@ -46,6 +46,8 @@
desk->clients = NULL;
desk->zone = zone;
desk->num = ++desk_count;
+ desk->x = x;
+ desk->y = y;
snprintf(name, sizeof(name), "Desktop %d, %d", x, y);
desk->name = strdup(name);
return desk;
@@ -56,8 +58,7 @@
{
E_OBJECT_CHECK(desk);
E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
- if (desk->name)
- free(desk->name);
+ E_FREE(desk->name);
desk->name = strdup(name);
}
@@ -65,7 +66,6 @@
e_desk_show(E_Desk *desk)
{
Evas_List *l;
- int x, y;
E_Event_Desk_Show *ev;
E_OBJECT_CHECK(desk);
@@ -89,20 +89,14 @@
}
}
- for (x = 0; x < desk->zone->desk_x_count; x++)
+ for (l = desk->zone->desks; l; l = l->next)
{
- for (y = 0; y < desk->zone->desk_y_count; y++)
- {
- E_Desk *next;
- next = e_desk_at_xy_get(desk->zone,x, y);
- next->visible = 0;
- if (next == desk)
- {
- desk->zone->desk_x_current = x;
- desk->zone->desk_y_current = y;
- }
- }
+ E_Desk *next;
+
+ next = l->data;
+ next->visible = 0;
}
+ e_zone_desk_current_set(desk->zone, desk);
desk->visible = 1;
ev = E_NEW(E_Event_Desk_Show, 1);
@@ -135,103 +129,48 @@
e_zone_desk_count_set(zone, zone->desk_x_count - 1, zone->desk_y_count);
}
-E_Desk *
-e_desk_current_get(E_Zone *zone)
-{
- E_OBJECT_CHECK_RETURN(zone, NULL);
- E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
-
- return e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current);
-}
-
-E_Desk *
-e_desk_at_xy_get(E_Zone *zone, int x, int y)
-{
- E_OBJECT_CHECK_RETURN(zone, NULL);
- E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
-
- if (x >= zone->desk_x_count || y >= zone->desk_y_count)
- return NULL;
-
- return (E_Desk *) zone->desks[x + (y * zone->desk_x_count)];
-}
-
void
e_desk_xy_get(E_Desk *desk, int *x, int *y)
{
- int xx, yy;
-
E_OBJECT_CHECK(desk);
E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
- for (xx = 0; xx < desk->zone->desk_x_count; xx++)
- {
- for (yy = 0; yy < desk->zone->desk_y_count; yy++)
- {
- E_Desk *next;
- next = e_desk_at_xy_get(desk->zone, xx, yy);
-
- if (next == desk)
- {
- *x = xx;
- *y = yy;
- return;
- }
- }
- }
+ *x = desk->x;
+ *y = desk->y;
}
void
e_desk_next(E_Zone *zone)
{
- int x, y;
+ Evas_List *l;
E_OBJECT_CHECK(zone);
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
- if (zone->desk_x_count < 2 && zone->desk_y_count < 2)
- return;
-
- x = zone->desk_x_current;
- y = zone->desk_y_current;
-
- x++;
- if (x == zone->desk_x_count)
- {
- x = 0;
- y++;
- if (y == zone->desk_y_count)
- y = 0;
- }
-
- e_desk_show(e_desk_at_xy_get(zone, x, y));
+ for (l = zone->desks; l; l = l->next)
+ if (l->data == zone->current)
+ {
+ if (l->next)
+ e_desk_show(E_DESK(l->next));
+ break;
+ }
}
void
e_desk_prev(E_Zone *zone)
{
- int x, y;
+ Evas_List *l;
E_OBJECT_CHECK(zone);
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
- if (zone->desk_x_count < 2 && zone->desk_y_count < 2)
- return;
-
- x = zone->desk_x_current;
- y = zone->desk_y_current;
-
- x--;
- if (x < 0)
- {
- x = zone->desk_x_count - 1;
- y--;
- if (y < 0)
- y = zone->desk_y_count - 1;
-
- }
-
- e_desk_show(e_desk_at_xy_get(zone, x, y));
+ for (l = zone->desks; l; l = l->next)
+ if (l->data == zone->current)
+ {
+ if (l->prev)
+ e_desk_show(E_DESK(l->prev));
+ break;
+ }
}
static void
Index: e/src/bin/e_desk.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_desk.h,v
retrieving revision 1.11
diff -u -r1.11 e_desk.h
--- e/src/bin/e_desk.h 15 Feb 2005 12:11:31 -0000 1.11
+++ e/src/bin/e_desk.h 17 Feb 2005 17:42:29 -0000
@@ -11,6 +11,7 @@
#define E_DESK_H
#define E_DESK_TYPE 0xE0b01005
+#define E_DESK(x) ((E_Desk *)(x))
struct _E_Desk
{
@@ -21,6 +22,9 @@
int num;
char visible : 1;
+ /* Position */
+ int x, y;
+
Evas_Object *bg_object;
Evas_List *clients;
@@ -36,8 +40,6 @@
EAPI E_Desk *e_desk_new(E_Zone *zone, int x, int y);
EAPI void e_desk_name_set(E_Desk *desk, const char *name);
EAPI void e_desk_show(E_Desk *desk);
-EAPI E_Desk *e_desk_current_get(E_Zone *zone);
-EAPI E_Desk *e_desk_at_xy_get(E_Zone *zone, int x, int y);
EAPI void e_desk_xy_get(E_Desk *desk, int *x, int *y);
EAPI void e_desk_next(E_Zone *zone);
EAPI void e_desk_prev(E_Zone *zone);
Index: e/src/bin/e_int_menus.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_int_menus.c,v
retrieving revision 1.37
diff -u -r1.37 e_int_menus.c
--- e/src/bin/e_int_menus.c 15 Feb 2005 11:50:12 -0000 1.37
+++ e/src/bin/e_int_menus.c 17 Feb 2005 17:42:30 -0000
@@ -320,7 +320,7 @@
_e_int_menus_desktops_pre_cb(void *data, E_Menu *m)
{
E_Menu_Item *mi;
- Evas_List *l, *desks = NULL;
+ Evas_List *l;
E_Menu *root;
e_menu_pre_activate_callback_set(m, NULL, NULL);
@@ -329,21 +329,14 @@
/* FIXME: Menu code needs to determine what zone menu was clicked in */
if ((root) && (root->zone))
{
- int i;
- E_Zone *zone;
-
- zone = root->zone;
- for (i = 0; i < zone->desk_x_count * zone->desk_y_count; i++)
- desks = evas_list_append(desks, zone->desks[i]);
-
- for (l = desks; l; l = l->next)
+ for (l = root->zone->desks; l; l = l->next)
{
E_Desk *desk = l->data;
mi = e_menu_item_new(m);
e_menu_item_radio_group_set(mi, 1);
e_menu_item_radio_set(mi, 1);
e_menu_item_label_set(mi, desk->name);
- if (desk == e_desk_current_get(zone))
+ if (desk == e_zone_desk_current_get(root->zone))
e_menu_item_toggle_set(mi, 1);
e_menu_item_callback_set(mi, _e_int_menus_desktops_item_cb, desk);
}
@@ -367,9 +360,6 @@
mi = e_menu_item_new(m);
e_menu_item_label_set(mi, "Remove Column of Desktops");
e_menu_item_callback_set(mi, _e_int_menus_desktops_col_del_cb, NULL);
-
-
- evas_list_free(desks);
}
/* FIXME: Use the zone the menu was clicked in */
@@ -475,18 +465,13 @@
_e_int_menus_clients_free_hook(void *obj)
{
E_Menu *m;
- Evas_List *borders;
+ Evas_List *borders, *l;
m = obj;
borders = e_object_data_get(E_OBJECT(m));
- while (borders)
- {
- E_Border *bd;
-
- bd = borders->data;
- borders = evas_list_remove_list(borders, borders);
- e_object_unref(E_OBJECT(bd));
- }
+ for (l = borders; l; l = l->next)
+ e_object_unref(E_OBJECT(l->data));
+ evas_list_free(borders);
}
Index: e/src/bin/e_manager.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_manager.c,v
retrieving revision 1.13
diff -u -r1.13 e_manager.c
--- e/src/bin/e_manager.c 16 Feb 2005 11:29:31 -0000 1.13
+++ e/src/bin/e_manager.c 17 Feb 2005 17:42:31 -0000
@@ -127,9 +127,9 @@
E_ATOM_DESK,
deskxy, 2);
if (ret == 2)
- desk = e_desk_at_xy_get(zone,
- deskxy[0],
- deskxy[1]);
+ desk = e_zone_desk_at_xy_get(zone,
+ deskxy[0],
+ deskxy[1]);
bd = e_border_new(con, windows[i], 1);
if (bd)
Index: e/src/bin/e_zone.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_zone.c,v
retrieving revision 1.25
diff -u -r1.25 e_zone.c
--- e/src/bin/e_zone.c 15 Feb 2005 16:54:47 -0000 1.25
+++ e/src/bin/e_zone.c 17 Feb 2005 17:42:31 -0000
@@ -92,11 +92,10 @@
zone->desk_x_count = 0;
zone->desk_y_count = 0;
- zone->desk_x_current = 0;
- zone->desk_y_current = 0;
e_zone_desk_count_set(zone,
e_config->zone_desks_x_count,
e_config->zone_desks_y_count);
+ zone->current = zone->desks->data;
return zone;
}
@@ -216,13 +215,50 @@
E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
return zone->clients;
}
+
+void
+e_zone_desk_current_set(E_Zone *zone, E_Desk *desk)
+{
+ zone->current = desk;
+}
+
+E_Desk *
+e_zone_desk_current_get(E_Zone *zone)
+{
+ return zone->current;
+}
+
+E_Desk *
+e_zone_desk_at_xy_get(E_Zone *zone, int x, int y)
+{
+ Evas_List *l;
+ int pos;
+ E_Desk *desk;
+
+ pos = x + (y * zone->desk_x_count);
+ desk = evas_list_nth(zone->desks, pos);
+ if (!(desk) || (desk->x != x) || (desk->y != y))
+ {
+ printf("BUG: Desktop list isn't sorted right!\n");
+ for (l = zone->desks; l; l = l->next)
+ {
+ desk = l->data;
+ if ((desk->x == x) && (desk->y == y))
+ return desk;
+ }
+ }
+ else
+ return desk;
+
+ return NULL;
+}
static void
_e_zone_free(E_Zone *zone)
{
E_Container *con;
- int x, y;
+ Evas_List *l;
con = zone->container;
if (zone->name) free(zone->name);
@@ -231,10 +267,9 @@
evas_object_del(zone->bg_clip_object);
evas_object_del(zone->bg_object);
/* free desks */
- for (x = 0; x < zone->desk_x_count; x++)
- for(y = 0; y < zone->desk_y_count; y++)
- e_object_del(E_OBJECT(zone->desks[x + (y * zone->desk_x_count)]));
- free(zone->desks);
+ for (l = zone->desks; l; l = l->next)
+ e_object_del(E_OBJECT(l->data));
+ evas_list_free(zone->desks);
free(zone);
}
@@ -312,10 +347,9 @@
void
e_zone_desk_count_set(E_Zone *zone, int x_count, int y_count)
{
- E_Desk **new_desks;
E_Desk *desk, *new_desk;
int x, y, xx, yy, moved;
- Evas_List *client;
+ Evas_List *client, *desks;
E_Border *bd;
E_Event_Zone_Desk_Count_Set *ev;
@@ -326,85 +360,70 @@
if (yy < 1)
yy = 1;
- new_desks = malloc(xx * yy * sizeof(E_Desk *));
-
- for (x = 0; x < xx; x++)
- for(y = 0; y < yy; y++)
- {
- if (x < zone->desk_x_count && y < zone->desk_y_count)
- desk = (E_Desk *) zone->desks[x + (y * zone->desk_x_count)];
- else
- desk = e_desk_new(zone, x, y);
- new_desks[x + (y * xx)] = desk;
- }
-
- /* catch windoes that have fallen off the end if we got smaller */
- if (xx < zone->desk_x_count)
- for (y = 0; y < zone->desk_y_count; y++)
- {
- new_desk = (E_Desk *)
- zone->desks[xx - 1 + (y * zone->desk_x_count)];
- for (x = xx; x < zone->desk_x_count; x++)
- {
- desk = (E_Desk *)
- zone->desks[x + (y * zone->desk_x_count)];
-
- for (client = desk->clients; client; client = client->next)
- {
- bd = (E_Border *) client->data;
-
- new_desk->clients = evas_list_append(new_desk->clients, bd);
- e_border_desk_set(bd, new_desk);
- }
- e_object_del(E_OBJECT(desk));
- }
- }
- if (yy < zone->desk_y_count)
- for (x = 0; x < zone->desk_x_count; x++)
- {
- new_desk = (E_Desk *)
- zone->desks[x + ((yy - 1) * zone->desk_x_count)];
- for (y = yy; y < zone->desk_y_count; y++)
- {
- desk = (E_Desk *)
- zone->desks[x + (y * zone->desk_x_count)];
-
- for (client = desk->clients; client; client = client->next)
- {
- bd = (E_Border *) client->data;
-
- new_desk->clients = evas_list_append(new_desk->clients, bd);
- e_border_desk_set(bd, new_desk);
- }
- e_object_del(E_OBJECT(desk));
- }
- }
-
- if (zone->desks) free(zone->desks);
- zone->desks = new_desks;
-
- zone->desk_x_count = xx;
- zone->desk_y_count = yy;
-
- moved = 0;
- if (zone->desk_x_current >= xx)
+ if ((zone->desk_x_count > xx) || (zone->desk_y_count > yy))
{
- zone->desk_x_current = xx - 1;
- moved = 1;
+ for (desks = zone->desks; desks;)
+ {
+ desk = desks->data;
+ if ((desk->x >= xx) || (desk->y >= yy))
+ {
+ /* Remove desk */
+ desks = desks->prev;
+ new_desk = desks->data;
+ /* New current desk */
+ if (desk == zone->current)
+ {
+ zone->current = new_desk;
+ moved = 1;
+ }
+ /* Move clients */
+ for (client = desk->clients; client; client = client->next)
+ {
+ bd = client->data;
+ e_border_desk_set(bd, new_desk);
+ }
+ /* Delete desk */
+ e_object_del(E_OBJECT(desk));
+ zone->desks = evas_list_remove_list(zone->desks, desks->next);
+ }
+ desks = desks->next;
+ }
}
- if (zone->desk_y_current >= yy)
+
+ if ((xx > zone->desk_x_count) || (yy > zone->desk_y_count))
{
- zone->desk_y_current = yy - 1;
- moved = 1;
+ desks = zone->desks;
+ for (y = 0; y < yy; y++)
+ {
+ for (x = 0; x < xx; x++)
+ {
+ if ((x >= zone->desk_x_count) || (y >= zone->desk_y_count))
+ {
+ /* Add desk */
+ new_desk = e_desk_new(zone, x, y);
+ if (desks)
+ {
+ desk = desks->data;
+ zone->desks =
evas_list_prepend_relative(zone->desks, new_desk, desk);
+ desks = desks->prev;
+ }
+ else
+ {
+ zone->desks = evas_list_append(zone->desks,
new_desk);
+ desks = zone->desks->last;
+ }
+ }
+ desks = desks->next;
+ }
+ }
}
+
if (moved)
- e_desk_show(e_desk_at_xy_get(zone, xx - 1, yy - 1));
- else
- {
- desk = e_desk_current_get(zone);
- desk->visible = 0;
- e_desk_show(desk);
- }
+ e_desk_show(zone->current);
+
+ zone->desk_x_count = xx;
+ zone->desk_y_count = yy;
+
e_config->zone_desks_x_count = xx;
e_config->zone_desks_y_count = yy;
e_config_save_queue();
Index: e/src/bin/e_zone.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_zone.h,v
retrieving revision 1.13
diff -u -r1.13 e_zone.h
--- e/src/bin/e_zone.h 13 Feb 2005 12:33:31 -0000 1.13
+++ e/src/bin/e_zone.h 17 Feb 2005 17:42:31 -0000
@@ -30,8 +30,8 @@
Evas_Object *bg_clip_object;
int desk_x_count, desk_y_count;
- int desk_x_current, desk_y_current;
- E_Desk **desks;
+ Evas_List *desks;
+ E_Desk *current;
Evas_List *clients;
};
@@ -50,6 +50,9 @@
EAPI E_Zone *e_zone_current_get(E_Container *con);
EAPI void e_zone_bg_reconfigure(E_Zone *zone);
EAPI Evas_List *e_zone_clients_list_get(E_Zone *zone);
+EAPI void e_zone_desk_current_set(E_Zone *zone, E_Desk *desk);
+EAPI E_Desk *e_zone_desk_current_get(E_Zone *zone);
+EAPI E_Desk *e_zone_desk_at_xy_get(E_Zone *zone, int x, int y);
EAPI void e_zone_desk_count_set(E_Zone *zone, int x_count, int y_count);
EAPI void e_zone_desk_count_get(E_Zone *zone, int *x_count, int
*y_count);
Index: e/src/modules/pager/e_mod_main.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/modules/pager/e_mod_main.c,v
retrieving revision 1.54
diff -u -r1.54 e_mod_main.c
--- e/src/modules/pager/e_mod_main.c 16 Feb 2005 12:24:03 -0000 1.54
+++ e/src/modules/pager/e_mod_main.c 17 Feb 2005 17:42:36 -0000
@@ -523,7 +523,7 @@
face->zone = zone;
e_object_ref(E_OBJECT(zone));
e_zone_desk_count_get(zone, &desks_x, &desks_y);
- current = e_desk_current_get(zone);
+ current = e_zone_desk_current_get(zone);
face->xnum = desks_x;
face->ynum = desks_y;
@@ -533,7 +533,7 @@
Pager_Desk *pd;
E_Desk *desk;
- desk = e_desk_at_xy_get(zone, x, y);
+ desk = e_zone_desk_at_xy_get(zone, x, y);
pd = _pager_desk_new(face, desk, x, y);
if (pd)
face->desks = evas_list_append(face->desks, pd);
@@ -570,7 +570,7 @@
pd->xpos = xpos;
pd->ypos = ypos;
- if (desk == e_desk_current_get(desk->zone))
+ if (desk == e_zone_desk_current_get(desk->zone))
{
pd->current = 1;
evas_object_move(face->screen,
@@ -1234,7 +1234,7 @@
if ((x >= face->xnum) || (y >= face->ynum))
{
/* Add desk */
- desk = e_desk_at_xy_get(ev->zone, x, y);
+ desk = e_zone_desk_at_xy_get(ev->zone, x, y);
pd = _pager_desk_new(face, desk, x, y);
if (pd)
face->desks = evas_list_append(face->desks, pd);
@@ -1250,7 +1250,7 @@
}
if (pd->current)
{
- desk = e_desk_current_get(ev->zone);
+ desk = e_zone_desk_current_get(ev->zone);
new = _pager_desk_find(face, desk);
new->current = 1;
}
@@ -1319,7 +1319,6 @@
{
_pager_face_enable(face);
}
- e_menu_item_toggle_set(mi, face->conf->enabled);
}
static void
@@ -1330,7 +1329,6 @@
face = data;
face->conf->scale = e_menu_item_toggle_get(mi);
- e_menu_item_toggle_set(mi, face->conf->scale);
e_config_save_queue();
}
