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-02-15 04:11:31 -08:00
|
|
|
static void _e_border_event_desk_show_free(void *data, void *ev);
|
|
|
|
|
|
|
|
int E_EVENT_DESK_SHOW = 0;
|
|
|
|
|
2005-01-05 02:37:53 -08:00
|
|
|
int
|
|
|
|
e_desk_init(void)
|
|
|
|
{
|
2005-02-15 04:11:31 -08:00
|
|
|
E_EVENT_DESK_SHOW = ecore_event_type_new();
|
2005-01-05 02:37:53 -08:00
|
|
|
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-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
|
2005-01-05 00:39:25 -08:00
|
|
|
|
2005-01-21 22:58:34 -08:00
|
|
|
desk = E_OBJECT_ALLOC(E_Desk, E_DESK_TYPE, _e_desk_free);
|
2005-01-03 01:34:24 -08:00
|
|
|
if (!desk) return NULL;
|
|
|
|
|
|
|
|
desk->zone = zone;
|
2005-04-08 17:13:09 -07:00
|
|
|
desk->x = x;
|
|
|
|
desk->y = y;
|
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);
|
|
|
|
return desk;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_desk_name_set(E_Desk *desk, const char *name)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(desk);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
|
2005-02-18 02:29:18 -08:00
|
|
|
E_FREE(desk->name);
|
2005-01-03 01:34:24 -08:00
|
|
|
desk->name = strdup(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_desk_show(E_Desk *desk)
|
|
|
|
{
|
2005-04-08 17:13:09 -07:00
|
|
|
Evas_List *l;
|
|
|
|
int x, y;
|
2005-02-15 04:11:31 -08:00
|
|
|
E_Event_Desk_Show *ev;
|
2005-01-03 01:34:24 -08:00
|
|
|
|
|
|
|
E_OBJECT_CHECK(desk);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
|
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-05-11 20:32:48 -07:00
|
|
|
if ((bd->desk->zone == desk->zone) && (!bd->iconic) &&
|
|
|
|
(!bd->hidden))
|
2005-01-05 01:31:56 -08:00
|
|
|
{
|
2005-04-08 17:13:09 -07:00
|
|
|
if ((bd->desk == desk) || (bd->sticky))
|
|
|
|
e_border_show(bd);
|
2005-01-05 01:31:56 -08:00
|
|
|
else
|
2005-04-08 17:13:09 -07:00
|
|
|
e_border_hide(bd, 1);
|
2005-01-05 01:31:56 -08:00
|
|
|
}
|
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++)
|
|
|
|
{
|
2005-04-08 17:13:09 -07:00
|
|
|
E_Desk *desk2;
|
|
|
|
|
|
|
|
desk2 = e_desk_at_xy_get(desk->zone,x, y);
|
|
|
|
desk2->visible = 0;
|
|
|
|
if (desk2 == desk)
|
2005-01-08 06:41:21 -08:00
|
|
|
{
|
|
|
|
desk->zone->desk_x_current = x;
|
|
|
|
desk->zone->desk_y_current = y;
|
|
|
|
}
|
|
|
|
}
|
2005-01-03 01:34:24 -08:00
|
|
|
}
|
|
|
|
desk->visible = 1;
|
2005-02-15 04:11:31 -08:00
|
|
|
|
|
|
|
ev = E_NEW(E_Event_Desk_Show, 1);
|
|
|
|
ev->desk = desk;
|
|
|
|
e_object_ref(E_OBJECT(desk));
|
|
|
|
ecore_event_add(E_EVENT_DESK_SHOW, ev, _e_border_event_desk_show_free, NULL);
|
2005-01-03 01:34:24 -08:00
|
|
|
}
|
|
|
|
|
2005-01-08 06:41:21 -08:00
|
|
|
void
|
|
|
|
e_desk_row_add(E_Zone *zone)
|
|
|
|
{
|
2005-01-08 09:32:08 -08:00
|
|
|
e_zone_desk_count_set(zone, zone->desk_x_count, zone->desk_y_count + 1);
|
2005-01-08 06:41:21 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_desk_row_remove(E_Zone *zone)
|
|
|
|
{
|
2005-01-08 09:32:08 -08:00
|
|
|
e_zone_desk_count_set(zone, zone->desk_x_count, zone->desk_y_count - 1);
|
2005-01-08 06:41:21 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_desk_col_add(E_Zone *zone)
|
|
|
|
{
|
2005-01-08 09:32:08 -08:00
|
|
|
e_zone_desk_count_set(zone, zone->desk_x_count + 1, zone->desk_y_count);
|
2005-01-08 06:41:21 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_desk_col_remove(E_Zone *zone)
|
|
|
|
{
|
2005-01-08 09:32:08 -08:00
|
|
|
e_zone_desk_count_set(zone, zone->desk_x_count - 1, zone->desk_y_count);
|
2005-01-03 01:34:24 -08:00
|
|
|
}
|
2005-01-08 09:32:08 -08:00
|
|
|
|
2005-01-03 01:34:24 -08:00
|
|
|
E_Desk *
|
|
|
|
e_desk_current_get(E_Zone *zone)
|
|
|
|
{
|
2005-01-03 14:04:04 -08:00
|
|
|
E_OBJECT_CHECK_RETURN(zone, NULL);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
|
2005-01-08 09:32:08 -08:00
|
|
|
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);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
|
2005-01-08 09:32:08 -08:00
|
|
|
|
2005-03-22 10:51:35 -08:00
|
|
|
if ((x >= zone->desk_x_count) || (y >= zone->desk_y_count))
|
2005-01-20 02:42:09 -08:00
|
|
|
return NULL;
|
|
|
|
|
2005-04-22 00:54:08 -07:00
|
|
|
return zone->desks[x + (y * zone->desk_x_count)];
|
2005-01-03 01:34:24 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2005-01-20 06:01:31 -08:00
|
|
|
e_desk_xy_get(E_Desk *desk, int *x, int *y)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(desk);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(desk, E_DESK_TYPE);
|
2005-01-20 06:01:31 -08:00
|
|
|
|
2005-04-08 17:13:09 -07:00
|
|
|
if (x) *x = desk->x;
|
|
|
|
if (y) *y = desk->y;
|
2005-01-20 06:01:31 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2005-01-03 01:34:24 -08:00
|
|
|
e_desk_next(E_Zone *zone)
|
|
|
|
{
|
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-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
2005-01-03 01:34:24 -08:00
|
|
|
|
2005-04-08 17:13:09 -07:00
|
|
|
if ((zone->desk_x_count < 2) &&
|
|
|
|
(zone->desk_y_count < 2))
|
|
|
|
return;
|
2005-01-03 01:34:24 -08:00
|
|
|
|
2005-01-08 06:41:21 -08:00
|
|
|
x = zone->desk_x_current;
|
|
|
|
y = zone->desk_y_current;
|
2005-04-08 17:13:09 -07:00
|
|
|
|
2005-01-08 06:41:21 -08:00
|
|
|
x++;
|
2005-03-22 10:51:35 -08:00
|
|
|
if (x >= zone->desk_x_count)
|
2005-01-08 06:41:21 -08:00
|
|
|
{
|
|
|
|
x = 0;
|
|
|
|
y++;
|
2005-04-08 17:13:09 -07:00
|
|
|
if (y >= zone->desk_y_count) y = 0;
|
2005-01-08 06:41:21 -08:00
|
|
|
}
|
|
|
|
|
2005-01-08 09:32:08 -08:00
|
|
|
e_desk_show(e_desk_at_xy_get(zone, x, y));
|
2005-01-03 01:34:24 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_desk_prev(E_Zone *zone)
|
|
|
|
{
|
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-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
2005-01-03 01:34:24 -08:00
|
|
|
|
2005-04-08 17:13:09 -07:00
|
|
|
if ((zone->desk_x_count < 2) &&
|
|
|
|
(zone->desk_y_count < 2))
|
2005-01-08 06:41:21 -08:00
|
|
|
return;
|
|
|
|
|
|
|
|
x = zone->desk_x_current;
|
|
|
|
y = zone->desk_y_current;
|
|
|
|
|
|
|
|
x--;
|
|
|
|
if (x < 0)
|
|
|
|
{
|
|
|
|
x = zone->desk_x_count - 1;
|
|
|
|
y--;
|
2005-04-08 17:13:09 -07:00
|
|
|
if (y < 0) y = zone->desk_y_count - 1;
|
2005-01-08 06:41:21 -08:00
|
|
|
}
|
2005-01-08 09:32:08 -08:00
|
|
|
e_desk_show(e_desk_at_xy_get(zone, x, y));
|
2005-01-03 01:34:24 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_desk_free(E_Desk *desk)
|
|
|
|
{
|
2005-02-15 08:54:47 -08:00
|
|
|
E_FREE(desk->name);
|
2005-01-03 01:34:24 -08:00
|
|
|
free(desk);
|
|
|
|
}
|
|
|
|
|
2005-02-15 04:11:31 -08:00
|
|
|
static void
|
|
|
|
_e_border_event_desk_show_free(void *data, void *event)
|
|
|
|
{
|
|
|
|
E_Event_Desk_Show *ev;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
e_object_unref(E_OBJECT(ev->desk));
|
|
|
|
free(ev);
|
|
|
|
}
|
|
|
|
|