From a38a5e1de9e37eb064be8e702a8182d73946a1ca Mon Sep 17 00:00:00 2001 From: handyande Date: Sat, 8 Jan 2005 14:41:21 +0000 Subject: [PATCH] OK, now we have a 2D set of desktops to each zone :) - callbacks not in yet so stuck with 2x2 for now - but wanted to get this in SVN revision: 12828 --- src/bin/e_desk.c | 120 +++++++++++++++++++++++++++--------------- src/bin/e_desk.h | 7 ++- src/bin/e_int_menus.c | 91 +++++++++++++++++++++----------- src/bin/e_zone.c | 16 ++++-- src/bin/e_zone.h | 4 +- 5 files changed, 158 insertions(+), 80 deletions(-) diff --git a/src/bin/e_desk.c b/src/bin/e_desk.c index 95941bcde..364cd8a7c 100644 --- a/src/bin/e_desk.c +++ b/src/bin/e_desk.c @@ -25,7 +25,7 @@ e_desk_shutdown(void) } E_Desk * -e_desk_new(E_Zone *zone) +e_desk_new(E_Zone *zone, int x, int y) { E_Desk *desk; char name[40]; @@ -38,11 +38,11 @@ e_desk_new(E_Zone *zone) desk->clients = NULL; desk->zone = zone; desk->num = ++desk_count; - snprintf(name, sizeof(name), "Desktop %d", desk->num); + snprintf(name, sizeof(name), "Desktop %d, %d", x, y); desk->name = strdup(name); e_object_ref(E_OBJECT(zone)); - zone->desks = evas_list_append(zone->desks, desk); + zone->desks[x + (y * zone->desk_x_count)] = (E_Object *) desk; return desk; } @@ -59,6 +59,7 @@ void e_desk_show(E_Desk *desk) { Evas_List *l; + int x, y; E_OBJECT_CHECK(desk); if (desk->visible) return; @@ -80,14 +81,49 @@ e_desk_show(E_Desk *desk) } } - for (l = desk->zone->desks; l; l = l->next) + for (x = 0; x < desk->zone->desk_x_count; x++) { - E_Desk *d = l->data; - d->visible = 0; + 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->visible = 0; + if (next == desk) + { + desk->zone->desk_x_current = x; + desk->zone->desk_y_current = y; + } + } } desk->visible = 1; } +/* FIXME replace e_desk_remove etc with these row / col operations */ +void +e_desk_row_add(E_Zone *zone) +{ + +} + +void +e_desk_row_remove(E_Zone *zone) +{ + +} + +void +e_desk_col_add(E_Zone *zone) +{ + +} + +void +e_desk_col_remove(E_Zone *zone) +{ + +} +/* void e_desk_remove(E_Desk *desk) { @@ -114,22 +150,15 @@ e_desk_remove(E_Desk *desk) evas_list_free(desk->clients); e_object_del(E_OBJECT(desk)); } - +*/ E_Desk * e_desk_current_get(E_Zone *zone) { Evas_List *l; E_OBJECT_CHECK_RETURN(zone, NULL); - - for (l = zone->desks; l; l = l->next) - { - E_Desk *desk = l->data; - if (desk->visible) - return desk; - } - - return NULL; + + return (E_Desk *)zone->desks[zone->desk_x_current + (zone->desk_y_current * zone->desk_x_count)]; } void @@ -137,23 +166,26 @@ e_desk_next(E_Zone *zone) { Evas_List *l; E_Desk *desk; + int x, y; E_OBJECT_CHECK(zone); - if (evas_list_count(zone->desks) < 2) + if (zone->desk_x_count < 2 && zone->desk_y_count < 2) return; - /* Locate the position of the current desktop in the list */ - desk = e_desk_current_get(zone); - l = evas_list_find_list(zone->desks, desk); - if (!l) return; /* Couldn't help putting this here */ - - l = l->next; - if (!l) l = zone->desks; /* Wraparound */ + x = zone->desk_x_current; + y = zone->desk_y_current; - /* Show the desktop */ - desk = l->data; - e_desk_show(desk); + x++; + if (x == zone->desk_x_count) + { + x = 0; + y++; + if (y == zone->desk_y_count) + y = 0; + } + + e_desk_show((E_Desk *)zone->desks[x + (y * zone->desk_x_count)]); } void @@ -161,23 +193,27 @@ e_desk_prev(E_Zone *zone) { Evas_List *l; E_Desk *desk; + int x, y; E_OBJECT_CHECK(zone); - - if (evas_list_count(zone->desks) < 2) - return; - - /* Locate the position of the current desktop in the list */ - desk = e_desk_current_get(zone); - l = evas_list_find_list(zone->desks, desk); - if (!l) return; /* Couldn't help putting this here */ - - l = l->prev; - if (!l) l = evas_list_last(zone->desks); /* Wraparound */ - /* Show the desktop */ - desk = l->data; - e_desk_show(desk); + 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 *)zone->desks[x + (y * zone->desk_x_count)]); } static void @@ -186,7 +222,7 @@ _e_desk_free(E_Desk *desk) E_Zone *zone = desk->zone; if (desk->name) free(desk->name); - zone->desks = evas_list_remove(zone->desks, desk); +// zone->desks = evas_list_remove(zone->desks, desk); e_object_unref(E_OBJECT(desk->zone)); free(desk); } diff --git a/src/bin/e_desk.h b/src/bin/e_desk.h index 086b49ddf..195116e96 100644 --- a/src/bin/e_desk.h +++ b/src/bin/e_desk.h @@ -19,13 +19,16 @@ struct _E_Desk EAPI int e_desk_init(void); EAPI int e_desk_shutdown(void); -EAPI E_Desk *e_desk_new(E_Zone *zone); +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 void e_desk_next(E_Zone *zone); EAPI void e_desk_prev(E_Zone *zone); -EAPI void e_desk_remove(E_Desk *desk); +EAPI void e_desk_row_add(E_Zone *zone); +EAPI void e_desk_row_remove(E_Zone *zone); +EAPI void e_desk_col_add(E_Zone *zone); +EAPI void e_desk_col_remove(E_Zone *zone); #endif diff --git a/src/bin/e_int_menus.c b/src/bin/e_int_menus.c index f6db9ae19..2b33d55a3 100644 --- a/src/bin/e_int_menus.c +++ b/src/bin/e_int_menus.c @@ -26,8 +26,10 @@ static void _e_int_menus_clients_pre_cb (void *data, E_Menu *m); static void _e_int_menus_clients_item_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_desktops_pre_cb (void *data, E_Menu *m); static void _e_int_menus_desktops_item_cb(void *data, E_Menu *m, E_Menu_Item *mi); -static void _e_int_menus_desktops_add_cb (void *data, E_Menu *m, E_Menu_Item *mi); -static void _e_int_menus_desktops_del_cb (void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_int_menus_desktops_row_add_cb (void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_int_menus_desktops_row_del_cb (void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_int_menus_desktops_col_add_cb (void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_int_menus_desktops_col_del_cb (void *data, E_Menu *m, E_Menu_Item *mi); /* externally accessible functions */ E_Menu * @@ -303,28 +305,17 @@ _e_int_menus_desktops_pre_cb(void *data, E_Menu *m) evas_list_free(m->items); m->items = NULL; - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, "New Desktop"); - e_menu_item_callback_set(mi, _e_int_menus_desktops_add_cb, NULL); - - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, "Remove This Desktop"); - e_menu_item_callback_set(mi, _e_int_menus_desktops_del_cb, NULL); - - mi = e_menu_item_new(m); - e_menu_item_separator_set(mi, 1); - root = e_menu_root_get(m); /* Get the desktop list for this zone */ /* FIXME: Menu code needs to determine what zone menu was clicked in */ if (root && root->con) { + int i; E_Zone *zone = e_zone_current_get(root->con); - for (l = zone->desks; l; l = l->next) + for (i = 0; i < zone->desk_x_count * zone->desk_y_count; i++) { - E_Desk *desk = l->data; - desks = evas_list_append(desks, desk); + desks = evas_list_append(desks, zone->desks[i]); } for (l = desks; l; l = l->next) @@ -340,48 +331,84 @@ _e_int_menus_desktops_pre_cb(void *data, E_Menu *m) } } + mi = e_menu_item_new(m); + e_menu_item_separator_set(mi, 1); + + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, "New Row of Desktops"); + e_menu_item_callback_set(mi, _e_int_menus_desktops_row_add_cb, NULL); + + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, "Remove Row of Desktops"); + e_menu_item_callback_set(mi, _e_int_menus_desktops_row_del_cb, NULL); + + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, "New Column of Desktops"); + e_menu_item_callback_set(mi, _e_int_menus_desktops_col_add_cb, NULL); + + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, "Remove Colum 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 */ static void -_e_int_menus_desktops_add_cb(void *data, E_Menu *m, E_Menu_Item *mi) +_e_int_menus_desktops_row_add_cb(void *data, E_Menu *m, E_Menu_Item *mi) { E_Menu *root = e_menu_root_get(m); if (root && root->con) { - E_Desk *desk; E_Zone *zone = e_zone_current_get(root->con); - desk = e_desk_new(zone); - e_desk_show(desk); + e_desk_row_add(zone); +// e_desk_show(desk); } } static void -_e_int_menus_desktops_del_cb(void *data, E_Menu *m, E_Menu_Item *mi) +_e_int_menus_desktops_row_del_cb(void *data, E_Menu *m, E_Menu_Item *mi) { E_Menu *root = e_menu_root_get(m); if (root && root->con) { E_Zone *zone; - E_Desk *desk; zone = e_zone_current_get(root->con); - desk = e_desk_current_get(zone); - - if (evas_list_count(zone->desks) > 1) - { - e_desk_remove(desk); - } - else - { - e_error_dialog_show("Enlightenment", "You cannot remove the last desktop."); - } + e_desk_row_remove(zone); } } +static void +_e_int_menus_desktops_col_add_cb(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Menu *root = e_menu_root_get(m); + + if (root && root->con) + { + E_Zone *zone = e_zone_current_get(root->con); + e_desk_row_add(zone); + // e_desk_show(desk); + } +} + +static void +_e_int_menus_desktops_col_del_cb(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Menu *root = e_menu_root_get(m); + + if (root && root->con) + { + E_Zone *zone; + + zone = e_zone_current_get(root->con); + e_desk_row_remove(zone); + } +} + static void _e_int_menus_desktops_item_cb(void *data, E_Menu *m, E_Menu_Item *mi) { diff --git a/src/bin/e_zone.c b/src/bin/e_zone.c index ed1d42c17..053d20a6a 100644 --- a/src/bin/e_zone.c +++ b/src/bin/e_zone.c @@ -32,6 +32,7 @@ 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); if (!zone) return NULL; @@ -77,10 +78,19 @@ e_zone_new(E_Container *con, int x, int y, int w, int h) evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _e_zone_cb_bg_mouse_move, zone); } - /* Start off with a single desktop */ - desk = e_desk_new(zone); - e_desk_show(desk); + /* Start off with 4 desktops (2x2) */ + zone->desk_x_count = 2; + zone->desk_y_count = 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; } diff --git a/src/bin/e_zone.h b/src/bin/e_zone.h index 32de5fea7..ccafb943e 100644 --- a/src/bin/e_zone.h +++ b/src/bin/e_zone.h @@ -15,7 +15,9 @@ struct _E_Zone Evas_Object *bg_object; Evas_Object *bg_event_object; - Evas_List *desks; + int desk_x_count, desk_y_count; + int desk_x_current, desk_y_current; + E_Object **desks; /* FIXME: why can this not be E_Desk? */ Evas_List *clients; };