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
This commit is contained in:
handyande 2005-01-08 14:41:21 +00:00 committed by handyande
parent 59813a3895
commit a38a5e1de9
5 changed files with 158 additions and 80 deletions

View File

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

View File

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

View File

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

View File

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

View File

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