diff --git a/src/bin/e_desk.c b/src/bin/e_desk.c index 364cd8a7c..29dd5b8f7 100644 --- a/src/bin/e_desk.c +++ b/src/bin/e_desk.c @@ -42,7 +42,6 @@ e_desk_new(E_Zone *zone, int x, int y) desk->name = strdup(name); e_object_ref(E_OBJECT(zone)); - zone->desks[x + (y * zone->desk_x_count)] = (E_Object *) desk; return desk; } @@ -86,8 +85,7 @@ e_desk_show(E_Desk *desk) for (y = 0; y < desk->zone->desk_y_count; y++) { E_Desk *next; - next = - (E_Desk *)desk->zone->desks[x + (y * desk->zone->desk_x_count)]; + next = e_desk_at_xy_get(desk->zone,x, y); next->visible = 0; if (next == desk) { @@ -103,62 +101,45 @@ e_desk_show(E_Desk *desk) void e_desk_row_add(E_Zone *zone) { - + e_zone_desk_count_set(zone, zone->desk_x_count, zone->desk_y_count + 1); } void e_desk_row_remove(E_Zone *zone) { - + if (zone->desk_y_count < 2) + return; + e_zone_desk_count_set(zone, zone->desk_x_count, zone->desk_y_count - 1); } void e_desk_col_add(E_Zone *zone) { - + e_zone_desk_count_set(zone, zone->desk_x_count + 1, zone->desk_y_count); } void e_desk_col_remove(E_Zone *zone) { - -} -/* -void -e_desk_remove(E_Desk *desk) -{ - Evas_List *l; - E_Desk *previous; - - E_OBJECT_CHECK(desk); - if (evas_list_count(desk->zone->desks) < 2) + if (zone->desk_x_count < 2) return; - l = evas_list_find_list(desk->zone->desks, desk); - l = l->prev; - if (!l) l = evas_list_last(desk->zone->desks); - previous = l->data; - - for (l = desk->clients; l; l = l->next) - { - E_Border *bd = l->data; - e_border_desk_set(bd, previous); - } - desk->zone->desks = evas_list_remove(desk->zone->desks, desk); - if (desk->visible) - e_desk_show(previous); - - evas_list_free(desk->clients); - e_object_del(E_OBJECT(desk)); + e_zone_desk_count_set(zone, zone->desk_x_count - 1, zone->desk_y_count); } -*/ + E_Desk * e_desk_current_get(E_Zone *zone) { - Evas_List *l; - E_OBJECT_CHECK_RETURN(zone, NULL); - return (E_Desk *)zone->desks[zone->desk_x_current + (zone->desk_y_current * zone->desk_x_count)]; + 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); + + return (E_Desk *) zone->desks[x + (y * zone->desk_x_count)]; } void @@ -185,7 +166,7 @@ e_desk_next(E_Zone *zone) y = 0; } - e_desk_show((E_Desk *)zone->desks[x + (y * zone->desk_x_count)]); + e_desk_show(e_desk_at_xy_get(zone, x, y)); } void @@ -213,7 +194,7 @@ e_desk_prev(E_Zone *zone) } - e_desk_show((E_Desk *)zone->desks[x + (y * zone->desk_x_count)]); + e_desk_show(e_desk_at_xy_get(zone, x, y)); } static void diff --git a/src/bin/e_desk.h b/src/bin/e_desk.h index 195116e96..3d8ac4281 100644 --- a/src/bin/e_desk.h +++ b/src/bin/e_desk.h @@ -23,6 +23,7 @@ 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_next(E_Zone *zone); EAPI void e_desk_prev(E_Zone *zone); EAPI void e_desk_row_add(E_Zone *zone); diff --git a/src/bin/e_int_menus.c b/src/bin/e_int_menus.c index 2b33d55a3..c113f7276 100644 --- a/src/bin/e_int_menus.c +++ b/src/bin/e_int_menus.c @@ -390,8 +390,8 @@ _e_int_menus_desktops_col_add_cb(void *data, E_Menu *m, E_Menu_Item *mi) if (root && root->con) { E_Zone *zone = e_zone_current_get(root->con); - e_desk_row_add(zone); - // e_desk_show(desk); + e_desk_col_add(zone); +// e_desk_show(desk); } } @@ -405,7 +405,7 @@ _e_int_menus_desktops_col_del_cb(void *data, E_Menu *m, E_Menu_Item *mi) E_Zone *zone; zone = e_zone_current_get(root->con); - e_desk_row_remove(zone); + e_desk_col_remove(zone); } } diff --git a/src/bin/e_zone.c b/src/bin/e_zone.c index 053d20a6a..40fdc23d1 100644 --- a/src/bin/e_zone.c +++ b/src/bin/e_zone.c @@ -31,7 +31,6 @@ E_Zone * e_zone_new(E_Container *con, int x, int y, int w, int h) { E_Zone *zone; - E_Desk *desk; int i; zone = E_OBJECT_ALLOC(E_Zone, _e_zone_free); @@ -79,18 +78,12 @@ e_zone_new(E_Container *con, int x, int y, int w, int h) } /* Start off with 4 desktops (2x2) */ - zone->desk_x_count = 2; - zone->desk_y_count = 2; + 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, 2, 2); - zone->desks = - malloc(zone->desk_x_count * zone->desk_y_count * sizeof(E_Desk *)); - - int xx, yy; - for (xx = 1; xx >= 0; xx--) - for(yy = 1; yy >= 0; yy--) - desk = e_desk_new(zone, xx, yy); - - e_desk_show(desk); return zone; } @@ -252,3 +245,47 @@ _e_zone_cb_bg_mouse_move(void *data, Evas *evas, Evas_Object *obj, void *event_i zone = data; } +void +e_zone_desk_count_set(E_Zone *zone, int x_count, int y_count) +{ + E_Object **new_desks; /* match the bug in e_zone.h */ + E_Desk *desk; + int x, y, reshow; + + new_desks = + malloc(x_count * y_count * sizeof(E_Desk *)); + + for (x = 0; x < x_count; x++) + for(y = 0; y < y_count; 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 * x_count)] = (E_Object *) desk; + } + +/* FIXME catch thigns that have fallen off the end if we got smaller */ + + if (zone->desks) + free(zone->desks); + zone->desks = new_desks; + + zone->desk_x_count = x_count; + zone->desk_y_count = y_count; + + reshow = 0; + if (zone->desk_x_current >= x_count) + { + zone->desk_x_current = x_count - 1; + reshow = 1; + } + if (zone->desk_y_current >= y_count) + { + zone->desk_y_current = y_count - 1; + reshow = 1; + } + if (reshow) + e_desk_show(e_desk_at_xy_get(zone, x_count - 1, y_count - 1)); +} + diff --git a/src/bin/e_zone.h b/src/bin/e_zone.h index ccafb943e..e3ed5fd79 100644 --- a/src/bin/e_zone.h +++ b/src/bin/e_zone.h @@ -31,6 +31,7 @@ EAPI void e_zone_move_resize(E_Zone *zone, int x, int y, int w, int h); 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_desks_set(E_Zone *zone, int x_count, int y_count); #endif