forked from enlightenment/enlightenment
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:
parent
59813a3895
commit
a38a5e1de9
120
src/bin/e_desk.c
120
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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue