2005-01-03 01:34:24 -08:00
|
|
|
/*
|
|
|
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
|
|
|
*/
|
2004-11-24 19:37:45 -08:00
|
|
|
#include "e.h"
|
2005-01-03 01:34:24 -08:00
|
|
|
|
|
|
|
/* E_Desk is a child object of E_Zone. A desk is essentially a background
|
|
|
|
* and an associated set of client windows. Each zone can have an arbitrary
|
|
|
|
* number of desktops.
|
|
|
|
*/
|
|
|
|
|
|
|
|
static void _e_desk_free(E_Desk *desk);
|
2005-01-05 02:37:53 -08:00
|
|
|
static int desk_count;
|
|
|
|
|
|
|
|
int
|
|
|
|
e_desk_init(void)
|
|
|
|
{
|
|
|
|
desk_count = 0;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
e_desk_shutdown(void)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
2005-01-03 01:34:24 -08:00
|
|
|
|
|
|
|
E_Desk *
|
2005-01-08 06:41:21 -08:00
|
|
|
e_desk_new(E_Zone *zone, int x, int y)
|
2005-01-03 01:34:24 -08:00
|
|
|
{
|
|
|
|
E_Desk *desk;
|
|
|
|
char name[40];
|
|
|
|
|
2005-01-05 00:39:25 -08:00
|
|
|
E_OBJECT_CHECK_RETURN(zone, NULL);
|
|
|
|
|
2005-01-03 01:34:24 -08:00
|
|
|
desk = E_OBJECT_ALLOC(E_Desk, _e_desk_free);
|
|
|
|
if (!desk) return NULL;
|
|
|
|
|
2005-01-03 17:32:23 -08:00
|
|
|
desk->clients = NULL;
|
2005-01-03 01:34:24 -08:00
|
|
|
desk->zone = zone;
|
2005-01-05 02:37:53 -08:00
|
|
|
desk->num = ++desk_count;
|
2005-01-08 06:41:21 -08:00
|
|
|
snprintf(name, sizeof(name), "Desktop %d, %d", x, y);
|
2005-01-03 01:34:24 -08:00
|
|
|
desk->name = strdup(name);
|
|
|
|
e_object_ref(E_OBJECT(zone));
|
|
|
|
|
2005-01-08 06:41:21 -08:00
|
|
|
zone->desks[x + (y * zone->desk_x_count)] = (E_Object *) desk;
|
2005-01-03 01:34:24 -08:00
|
|
|
return desk;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_desk_name_set(E_Desk *desk, const char *name)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(desk);
|
|
|
|
if (desk->name)
|
|
|
|
free(desk->name);
|
|
|
|
desk->name = strdup(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_desk_show(E_Desk *desk)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
2005-01-08 06:41:21 -08:00
|
|
|
int x, y;
|
2005-01-03 01:34:24 -08:00
|
|
|
|
|
|
|
E_OBJECT_CHECK(desk);
|
2005-01-03 17:32:23 -08:00
|
|
|
if (desk->visible) return;
|
|
|
|
|
2005-01-05 01:31:56 -08:00
|
|
|
for (l = desk->zone->container->clients; l; l = l->next)
|
2005-01-03 01:34:24 -08:00
|
|
|
{
|
|
|
|
E_Border *bd = l->data;
|
|
|
|
|
2005-01-05 02:37:53 -08:00
|
|
|
if (bd->desk->zone == desk->zone && !bd->iconic)
|
2005-01-05 01:31:56 -08:00
|
|
|
{
|
2005-01-07 23:10:13 -08:00
|
|
|
if (bd->desk == desk || bd->sticky)
|
2005-01-05 01:31:56 -08:00
|
|
|
{
|
|
|
|
e_border_show(bd);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
e_border_hide(bd);
|
|
|
|
}
|
|
|
|
}
|
2005-01-03 01:34:24 -08:00
|
|
|
}
|
|
|
|
|
2005-01-08 06:41:21 -08:00
|
|
|
for (x = 0; x < desk->zone->desk_x_count; x++)
|
2005-01-03 01:34:24 -08:00
|
|
|
{
|
2005-01-08 06:41:21 -08:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
2005-01-03 01:34:24 -08:00
|
|
|
}
|
|
|
|
desk->visible = 1;
|
|
|
|
}
|
|
|
|
|
2005-01-08 06:41:21 -08:00
|
|
|
/* 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)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
/*
|
2005-01-03 01:34:24 -08:00
|
|
|
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)
|
|
|
|
return;
|
2005-01-05 02:37:53 -08:00
|
|
|
l = evas_list_find_list(desk->zone->desks, desk);
|
2005-01-03 01:34:24 -08:00
|
|
|
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;
|
2005-01-05 02:37:53 -08:00
|
|
|
e_border_desk_set(bd, previous);
|
2005-01-03 01:34:24 -08:00
|
|
|
}
|
|
|
|
desk->zone->desks = evas_list_remove(desk->zone->desks, desk);
|
2005-01-05 02:37:53 -08:00
|
|
|
if (desk->visible)
|
|
|
|
e_desk_show(previous);
|
2005-01-03 01:34:24 -08:00
|
|
|
|
|
|
|
evas_list_free(desk->clients);
|
|
|
|
e_object_del(E_OBJECT(desk));
|
|
|
|
}
|
2005-01-08 06:41:21 -08:00
|
|
|
*/
|
2005-01-03 01:34:24 -08:00
|
|
|
E_Desk *
|
|
|
|
e_desk_current_get(E_Zone *zone)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
|
|
|
|
2005-01-03 14:04:04 -08:00
|
|
|
E_OBJECT_CHECK_RETURN(zone, NULL);
|
2005-01-08 06:41:21 -08:00
|
|
|
|
|
|
|
return (E_Desk *)zone->desks[zone->desk_x_current + (zone->desk_y_current * zone->desk_x_count)];
|
2005-01-03 01:34:24 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_desk_next(E_Zone *zone)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
|
|
|
E_Desk *desk;
|
2005-01-08 06:41:21 -08:00
|
|
|
int x, y;
|
2005-01-03 01:34:24 -08:00
|
|
|
|
|
|
|
E_OBJECT_CHECK(zone);
|
|
|
|
|
2005-01-08 06:41:21 -08:00
|
|
|
if (zone->desk_x_count < 2 && zone->desk_y_count < 2)
|
2005-01-03 01:34:24 -08:00
|
|
|
return;
|
|
|
|
|
2005-01-08 06:41:21 -08:00
|
|
|
x = zone->desk_x_current;
|
|
|
|
y = zone->desk_y_current;
|
2005-01-03 01:34:24 -08:00
|
|
|
|
2005-01-08 06:41:21 -08:00
|
|
|
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)]);
|
2005-01-03 01:34:24 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_desk_prev(E_Zone *zone)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
|
|
|
E_Desk *desk;
|
2005-01-08 06:41:21 -08:00
|
|
|
int x, y;
|
2005-01-03 01:34:24 -08:00
|
|
|
|
|
|
|
E_OBJECT_CHECK(zone);
|
|
|
|
|
2005-01-08 06:41:21 -08:00
|
|
|
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)]);
|
2005-01-03 01:34:24 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_desk_free(E_Desk *desk)
|
|
|
|
{
|
|
|
|
E_Zone *zone = desk->zone;
|
|
|
|
if (desk->name)
|
|
|
|
free(desk->name);
|
2005-01-08 06:41:21 -08:00
|
|
|
// zone->desks = evas_list_remove(zone->desks, desk);
|
2005-01-03 01:34:24 -08:00
|
|
|
e_object_unref(E_OBJECT(desk->zone));
|
|
|
|
free(desk);
|
|
|
|
}
|
|
|
|
|