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);
|
2006-07-22 15:25:04 -07:00
|
|
|
static void _e_border_event_desk_deskshow_free(void *data, void *ev);
|
2005-09-05 16:14:58 -07:00
|
|
|
static void _e_border_event_desk_name_change_free(void *data, void *ev);
|
2005-02-15 04:11:31 -08:00
|
|
|
|
2006-09-01 08:37:23 -07:00
|
|
|
static void _e_desk_show_begin(E_Desk *desk, int mode, int dx, int dy);
|
|
|
|
static void _e_desk_show_end(E_Desk *desk);
|
|
|
|
static int _e_desk_show_animator(void *data);
|
|
|
|
static void _e_desk_hide_begin(E_Desk *desk, int mode, int dx, int dy);
|
|
|
|
static void _e_desk_hide_end(E_Desk *desk);
|
|
|
|
static int _e_desk_hide_animator(void *data);
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI int E_EVENT_DESK_SHOW = 0;
|
2006-07-22 15:25:04 -07:00
|
|
|
EAPI int E_EVENT_DESK_DESKSHOW = 0;
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI int E_EVENT_DESK_NAME_CHANGE = 0;
|
2005-02-15 04:11:31 -08:00
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI int
|
2005-01-05 02:37:53 -08:00
|
|
|
e_desk_init(void)
|
|
|
|
{
|
2005-02-15 04:11:31 -08:00
|
|
|
E_EVENT_DESK_SHOW = ecore_event_type_new();
|
2006-07-22 15:25:04 -07:00
|
|
|
E_EVENT_DESK_DESKSHOW = ecore_event_type_new();
|
2005-09-05 16:14:58 -07:00
|
|
|
E_EVENT_DESK_NAME_CHANGE = ecore_event_type_new();
|
2005-01-05 02:37:53 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI int
|
2005-01-05 02:37:53 -08:00
|
|
|
e_desk_shutdown(void)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
2005-01-03 01:34:24 -08:00
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI 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-08-05 21:00:03 -07:00
|
|
|
int ok;
|
|
|
|
Evas_List *l;
|
2005-01-03 01:34:24 -08:00
|
|
|
|
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-06-19 12:00:04 -07:00
|
|
|
|
2005-08-05 21:00:03 -07:00
|
|
|
/* Get current desktop's name */
|
|
|
|
ok = 0;
|
|
|
|
|
|
|
|
for (l = e_config->desktop_names; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Config_Desktop_Name *cfname;
|
|
|
|
|
|
|
|
cfname = l->data;
|
|
|
|
if ((cfname->container >= 0) &&
|
|
|
|
(zone->container->num != cfname->container)) continue;
|
|
|
|
if ((cfname->zone >= 0) &&
|
|
|
|
(zone->num != cfname->zone)) continue;
|
|
|
|
if ((cfname->desk_x != desk->x) || (cfname->desk_y != desk->y)) continue;
|
2005-12-03 07:39:25 -08:00
|
|
|
desk->name = evas_stringshare_add(cfname->name);
|
2005-08-05 21:00:03 -07:00
|
|
|
ok = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!ok)
|
|
|
|
{
|
|
|
|
snprintf(name, sizeof(name), _(e_config->desktop_default_name), x, y);
|
2005-12-03 07:39:25 -08:00
|
|
|
desk->name = evas_stringshare_add(name);
|
2005-08-05 21:00:03 -07:00
|
|
|
}
|
|
|
|
|
2005-01-03 01:34:24 -08:00
|
|
|
return desk;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-03 01:34:24 -08:00
|
|
|
e_desk_name_set(E_Desk *desk, const char *name)
|
|
|
|
{
|
2005-09-05 16:14:58 -07:00
|
|
|
E_Event_Desk_Name_Change *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-12-03 07:39:25 -08:00
|
|
|
if (desk->name) evas_stringshare_del(desk->name);
|
|
|
|
desk->name = evas_stringshare_add(name);
|
2005-09-05 16:14:58 -07:00
|
|
|
|
|
|
|
ev = E_NEW(E_Event_Desk_Name_Change, 1);
|
|
|
|
ev->desk = desk;
|
|
|
|
e_object_ref(E_OBJECT(desk));
|
|
|
|
ecore_event_add(E_EVENT_DESK_NAME_CHANGE, ev, _e_border_event_desk_name_change_free, NULL);
|
2005-01-03 01:34:24 -08:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2006-03-02 04:03:48 -08:00
|
|
|
e_desk_name_add(int container, int zone, int desk_x, int desk_y, const char *name)
|
2005-08-05 21:00:03 -07:00
|
|
|
{
|
|
|
|
E_Config_Desktop_Name *cfname;
|
|
|
|
|
|
|
|
e_desk_name_del(container, zone, desk_x, desk_y);
|
|
|
|
cfname = E_NEW(E_Config_Desktop_Name, 1);
|
|
|
|
cfname->container = container;
|
|
|
|
cfname->zone = zone;
|
|
|
|
cfname->desk_x = desk_x;
|
|
|
|
cfname->desk_y = desk_y;
|
2006-01-06 07:24:29 -08:00
|
|
|
if (name) cfname->name = evas_stringshare_add(name);
|
2005-08-05 21:00:03 -07:00
|
|
|
e_config->desktop_names = evas_list_append(e_config->desktop_names, cfname);
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-08-05 21:00:03 -07:00
|
|
|
e_desk_name_del(int container, int zone, int desk_x, int desk_y)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
|
|
|
|
|
|
|
for (l = e_config->desktop_names; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Config_Desktop_Name *cfname;
|
|
|
|
|
|
|
|
cfname = l->data;
|
|
|
|
if ((cfname->container == container) && (cfname->zone == zone) &&
|
|
|
|
(cfname->desk_x == desk_x) && (cfname->desk_y == desk_y))
|
|
|
|
{
|
|
|
|
e_config->desktop_names = evas_list_remove_list(e_config->desktop_names, l);
|
2005-12-04 04:03:59 -08:00
|
|
|
if (cfname->name) evas_stringshare_del(cfname->name);
|
2005-08-05 21:00:03 -07:00
|
|
|
free(cfname);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-08-05 21:00:03 -07:00
|
|
|
e_desk_name_update(void)
|
|
|
|
{
|
2005-08-14 10:09:00 -07:00
|
|
|
Evas_List *m, *c, *z, *l;
|
2005-08-05 21:00:03 -07:00
|
|
|
E_Manager *man;
|
|
|
|
E_Container *con;
|
|
|
|
E_Zone *zone;
|
|
|
|
E_Desk *desk;
|
|
|
|
int d_x, d_y, ok;
|
|
|
|
char name[40];
|
|
|
|
|
|
|
|
for (m = e_manager_list(); m; m = m->next)
|
|
|
|
{
|
|
|
|
man = m->data;
|
|
|
|
for (c = man->containers; c; c = c->next)
|
|
|
|
{
|
|
|
|
con = c->data;
|
|
|
|
for (z = con->zones; z; z = z->next)
|
|
|
|
{
|
|
|
|
zone = z->data;
|
|
|
|
for (d_x = 0; d_x < zone->desk_x_count; d_x++)
|
|
|
|
{
|
|
|
|
for (d_y = 0; d_y < zone->desk_y_count; d_y++)
|
|
|
|
{
|
|
|
|
desk = zone->desks[d_x + zone->desk_x_count * d_y];
|
|
|
|
ok = 0;
|
|
|
|
|
|
|
|
for (l = e_config->desktop_names; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Config_Desktop_Name *cfname;
|
|
|
|
|
|
|
|
cfname = l->data;
|
|
|
|
if ((cfname->container >= 0) &&
|
|
|
|
(con->num != cfname->container)) continue;
|
|
|
|
if ((cfname->zone >= 0) &&
|
|
|
|
(zone->num != cfname->zone)) continue;
|
|
|
|
if ((cfname->desk_x != d_x) || (cfname->desk_y != d_y)) continue;
|
|
|
|
e_desk_name_set(desk,cfname->name);
|
|
|
|
ok = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!ok)
|
|
|
|
{
|
|
|
|
snprintf(name, sizeof(name), _(e_config->desktop_default_name), d_x, d_y);
|
|
|
|
e_desk_name_set(desk,name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-03 01:34:24 -08:00
|
|
|
e_desk_show(E_Desk *desk)
|
|
|
|
{
|
2005-05-13 03:09:55 -07:00
|
|
|
E_Border_List *bl;
|
2005-07-01 04:05:48 -07:00
|
|
|
E_Border *bd;
|
|
|
|
int was_zone = 0;
|
2006-09-01 08:37:23 -07:00
|
|
|
int x, y, dx = 0, dy = 0;
|
2005-02-15 04:11:31 -08:00
|
|
|
E_Event_Desk_Show *ev;
|
2005-05-13 03:09:55 -07:00
|
|
|
|
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-07-01 04:05:48 -07:00
|
|
|
|
|
|
|
for (x = 0; x < desk->zone->desk_x_count; x++)
|
|
|
|
{
|
|
|
|
for (y = 0; y < desk->zone->desk_y_count; y++)
|
|
|
|
{
|
|
|
|
E_Desk *desk2;
|
|
|
|
|
2006-09-01 08:37:23 -07:00
|
|
|
desk2 = e_desk_at_xy_get(desk->zone, x, y);
|
|
|
|
if (desk2->visible)
|
|
|
|
{
|
|
|
|
desk2->visible = 0;
|
|
|
|
dx = desk->x - desk2->x;
|
|
|
|
dy = desk->y - desk2->y;
|
|
|
|
if (e_config->desk_flip_animate_mode > 0)
|
|
|
|
_e_desk_hide_begin(desk2, e_config->desk_flip_animate_mode, dx, dy);
|
|
|
|
break;
|
|
|
|
}
|
2005-07-01 04:05:48 -07:00
|
|
|
}
|
|
|
|
}
|
2006-09-01 08:37:23 -07:00
|
|
|
|
2005-09-02 00:38:40 -07:00
|
|
|
desk->zone->desk_x_current = desk->x;
|
|
|
|
desk->zone->desk_y_current = desk->y;
|
|
|
|
desk->visible = 1;
|
|
|
|
|
2005-06-29 07:28:47 -07:00
|
|
|
if (desk->zone->bg_object) was_zone = 1;
|
2006-09-01 08:37:23 -07:00
|
|
|
if (e_config->desk_flip_animate_mode == 0)
|
2005-01-03 01:34:24 -08:00
|
|
|
{
|
2006-09-01 08:37:23 -07:00
|
|
|
bl = e_container_border_list_first(desk->zone->container);
|
|
|
|
while ((bd = e_container_border_list_next(bl)))
|
2005-01-05 01:31:56 -08:00
|
|
|
{
|
2006-09-01 08:37:23 -07:00
|
|
|
if ((bd->desk->zone == desk->zone) && (!bd->iconic))
|
2005-07-21 04:15:43 -07:00
|
|
|
{
|
2006-09-01 08:37:23 -07:00
|
|
|
if ((bd->desk == desk) || (bd->sticky))
|
2005-07-21 04:15:43 -07:00
|
|
|
{
|
2006-09-01 08:37:23 -07:00
|
|
|
e_border_show(bd);
|
|
|
|
if (bd->want_fullscreen)
|
|
|
|
{
|
|
|
|
e_border_fullscreen(bd, e_config->fullscreen_policy);
|
|
|
|
bd->want_fullscreen = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (bd->moving)
|
|
|
|
e_border_desk_set(bd, desk);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (bd->fullscreen)
|
|
|
|
bd->want_fullscreen = 1;
|
|
|
|
e_border_hide(bd, 2);
|
2005-07-21 04:15:43 -07:00
|
|
|
}
|
|
|
|
}
|
2005-01-05 01:31:56 -08:00
|
|
|
}
|
2006-09-01 08:37:23 -07:00
|
|
|
e_container_border_list_free(bl);
|
2005-01-03 01:34:24 -08:00
|
|
|
}
|
2005-07-12 04:07:57 -07:00
|
|
|
|
2006-09-01 08:37:23 -07:00
|
|
|
if (e_config->desk_flip_animate_mode > 0)
|
|
|
|
_e_desk_show_begin(desk, e_config->desk_flip_animate_mode, dx, dy);
|
|
|
|
|
2005-07-12 04:07:57 -07:00
|
|
|
if (e_config->focus_last_focused_per_desktop)
|
|
|
|
e_desk_last_focused_focus(desk);
|
|
|
|
|
2005-06-29 07:28:47 -07:00
|
|
|
if (was_zone)
|
2005-06-30 03:54:24 -07:00
|
|
|
e_bg_zone_update(desk->zone, E_BG_TRANSITION_DESK);
|
2005-06-29 07:28:47 -07:00
|
|
|
else
|
|
|
|
e_bg_zone_update(desk->zone, E_BG_TRANSITION_START);
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
2006-07-22 15:25:04 -07:00
|
|
|
EAPI void
|
|
|
|
e_desk_deskshow(E_Zone *zone)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
E_Border_List *bl;
|
|
|
|
E_Desk *desk;
|
|
|
|
E_Event_Desk_Show *ev;
|
|
|
|
|
|
|
|
E_OBJECT_CHECK(zone);
|
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
|
|
|
|
|
|
|
desk = e_desk_current_get(zone);
|
|
|
|
bl = e_container_border_list_first(zone->container);
|
|
|
|
while ((bd = e_container_border_list_next(bl)))
|
|
|
|
{
|
|
|
|
if (bd->desk == desk)
|
|
|
|
{
|
|
|
|
if (desk->deskshow_toggle)
|
|
|
|
{
|
|
|
|
if (bd->deskshow) e_border_uniconify(bd);
|
|
|
|
bd->deskshow = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (bd->iconic) continue;
|
|
|
|
if (bd->client.netwm.state.skip_taskbar) continue;
|
|
|
|
if (bd->user_skip_winlist) continue;
|
|
|
|
e_border_iconify(bd);
|
|
|
|
bd->deskshow = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
desk->deskshow_toggle = desk->deskshow_toggle ? 0 : 1;
|
|
|
|
e_container_border_list_free(bl);
|
|
|
|
ev = E_NEW(E_Event_Desk_Show, 1);
|
|
|
|
ev->desk = desk;
|
|
|
|
e_object_ref(E_OBJECT(desk));
|
|
|
|
ecore_event_add(E_EVENT_DESK_DESKSHOW, ev,
|
|
|
|
_e_border_event_desk_deskshow_free, NULL);
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-07-12 04:07:57 -07:00
|
|
|
e_desk_last_focused_focus(E_Desk *desk)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
for (l = e_border_focus_stack_get(); l; l = l->next)
|
|
|
|
{
|
|
|
|
bd = l->data;
|
|
|
|
if ((!bd->iconic) && (bd->visible) &&
|
2006-06-07 16:30:15 -07:00
|
|
|
(((bd->desk == desk)
|
|
|
|
// Don't focus sticky windows as last focused win
|
|
|
|
// || ((bd->sticky) && (bd->zone == desk->zone))
|
|
|
|
)))
|
2005-07-12 04:07:57 -07:00
|
|
|
{
|
|
|
|
/* this was the window last focused in this desktop */
|
|
|
|
e_border_focus_set(bd, 1, 1);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-08 06:41:21 -08:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-08 06:41:21 -08:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-08 06:41:21 -08:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-08 06:41:21 -08:00
|
|
|
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
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI E_Desk *
|
2005-01-03 01:34:24 -08:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI E_Desk *
|
2005-01-08 09:32:08 -08:00
|
|
|
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-12-03 19:25:34 -08:00
|
|
|
else if ((x < 0) || (y < 0))
|
|
|
|
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
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI E_Desk *
|
2005-05-17 05:33:12 -07:00
|
|
|
e_desk_at_pos_get(E_Zone *zone, int pos)
|
|
|
|
{
|
|
|
|
int x, y;
|
|
|
|
|
|
|
|
E_OBJECT_CHECK_RETURN(zone, NULL);
|
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, NULL);
|
|
|
|
|
|
|
|
y = pos / zone->desk_x_count;
|
|
|
|
x = pos - (y * zone->desk_x_count);
|
|
|
|
|
|
|
|
if ((x >= zone->desk_x_count) || (y >= zone->desk_y_count))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
return zone->desks[x + (y * zone->desk_x_count)];
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI 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
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI 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
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-03 01:34:24 -08:00
|
|
|
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-12-03 07:39:25 -08:00
|
|
|
if (desk->name) evas_stringshare_del(desk->name);
|
2006-09-01 08:37:23 -07:00
|
|
|
if (desk->animator) ecore_animator_del(desk->animator);
|
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);
|
|
|
|
}
|
|
|
|
|
2006-07-22 15:25:04 -07:00
|
|
|
static void
|
|
|
|
_e_border_event_desk_deskshow_free(void *data, void *event)
|
|
|
|
{
|
|
|
|
E_Event_Desk_Show *ev;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
e_object_unref(E_OBJECT(ev->desk));
|
|
|
|
free(ev);
|
|
|
|
}
|
|
|
|
|
2005-09-05 16:14:58 -07:00
|
|
|
static void
|
|
|
|
_e_border_event_desk_name_change_free(void *data, void *event)
|
|
|
|
{
|
|
|
|
E_Event_Desk_Name_Change *ev;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
e_object_unref(E_OBJECT(ev->desk));
|
|
|
|
free(ev);
|
|
|
|
}
|
2006-09-01 08:37:23 -07:00
|
|
|
|
|
|
|
static void
|
|
|
|
_e_desk_show_begin(E_Desk *desk, int mode, int dx, int dy)
|
|
|
|
{
|
|
|
|
E_Border_List *bl;
|
|
|
|
E_Border *bd;
|
|
|
|
double t;
|
|
|
|
|
|
|
|
t = ecore_time_get();
|
|
|
|
bl = e_container_border_list_first(desk->zone->container);
|
|
|
|
while ((bd = e_container_border_list_next(bl)))
|
|
|
|
{
|
|
|
|
if ((bd->desk->zone == desk->zone) && (!bd->iconic))
|
|
|
|
{
|
|
|
|
if (bd->moving)
|
|
|
|
{
|
|
|
|
bd->fx.start.t = t;
|
|
|
|
bd->fx.start.x = 0;
|
|
|
|
bd->fx.start.y = 0;
|
|
|
|
e_border_desk_set(bd, desk);
|
|
|
|
e_border_show(bd);
|
|
|
|
}
|
|
|
|
else if ((bd->desk == desk) && (!bd->sticky))
|
|
|
|
{
|
|
|
|
bd->fx.start.t = t;
|
|
|
|
if (mode == 1)
|
|
|
|
{
|
|
|
|
bd->fx.start.x = bd->zone->w * dx;
|
|
|
|
bd->fx.start.y = bd->zone->h * dy;
|
|
|
|
}
|
|
|
|
else if (mode == 2)
|
|
|
|
{
|
|
|
|
int mx, my, bx, by;
|
|
|
|
double fx, fy, ang, rad, len, lmax;
|
|
|
|
|
|
|
|
mx = bd->zone->x + (bd->zone->w / 2);
|
|
|
|
my = bd->zone->y + (bd->zone->h / 2);
|
|
|
|
|
|
|
|
bx = bd->x + (bd->w / 2) - mx;
|
|
|
|
by = bd->y + (bd->h / 2) - my;
|
|
|
|
if (bx == 0) bx = 1;
|
|
|
|
if (by == 0) by = 1;
|
|
|
|
fx = (double)bx / (double)(bd->zone->w / 2);
|
|
|
|
fy = (double)by / (double)(bd->zone->h / 2);
|
|
|
|
ang = atan(fy / fx);
|
|
|
|
if (fx < 0.0)
|
|
|
|
ang = M_PI + ang;
|
|
|
|
len = sqrt((bx * bx) + (by * by));
|
|
|
|
lmax = sqrt(((bd->zone->w / 2) * (bd->zone->w / 2)) +
|
|
|
|
((bd->zone->h / 2) * (bd->zone->h / 2)));
|
|
|
|
rad = sqrt((bd->w * bd->w) + (bd->h * bd->h)) / 2.0;
|
|
|
|
bx = cos(ang) * (lmax - len + rad);
|
|
|
|
by = sin(ang) * (lmax - len + rad);
|
|
|
|
bd->fx.start.x = bx;
|
|
|
|
bd->fx.start.y = by;
|
|
|
|
}
|
2006-09-04 06:38:35 -07:00
|
|
|
if (bd->fx.start.x < 0)
|
|
|
|
bd->fx.start.x -= bd->zone->x;
|
|
|
|
else
|
|
|
|
bd->fx.start.x += bd->zone->container->w - (bd->zone->x + bd->zone->w);
|
|
|
|
if (bd->fx.start.y < 0)
|
|
|
|
bd->fx.start.y -= bd->zone->y;
|
|
|
|
else
|
|
|
|
bd->fx.start.y += bd->zone->container->h - (bd->zone->y + bd->zone->h);
|
2006-09-01 08:37:23 -07:00
|
|
|
e_border_fx_offset(bd, bd->fx.start.x, bd->fx.start.y);
|
|
|
|
e_border_show(bd);
|
|
|
|
if (bd->want_fullscreen)
|
|
|
|
{
|
|
|
|
e_border_fullscreen(bd, e_config->fullscreen_policy);
|
|
|
|
bd->want_fullscreen = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
e_container_border_list_free(bl);
|
|
|
|
if (desk->animator) ecore_animator_del(desk->animator);
|
|
|
|
desk->animator = ecore_animator_add(_e_desk_show_animator, desk);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_desk_show_end(E_Desk *desk)
|
|
|
|
{
|
|
|
|
E_Border_List *bl;
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bl = e_container_border_list_first(desk->zone->container);
|
|
|
|
while ((bd = e_container_border_list_next(bl)))
|
|
|
|
{
|
|
|
|
if ((bd->desk->zone == desk->zone) && (!bd->iconic))
|
|
|
|
{
|
|
|
|
if (bd->moving)
|
|
|
|
{
|
|
|
|
e_border_fx_offset(bd, 0, 0);
|
|
|
|
}
|
|
|
|
else if ((bd->desk == desk) && (!bd->sticky))
|
|
|
|
{
|
|
|
|
e_border_fx_offset(bd, 0, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
e_container_border_list_free(bl);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_desk_show_animator(void *data)
|
|
|
|
{
|
|
|
|
E_Desk *desk;
|
|
|
|
E_Border_List *bl;
|
|
|
|
E_Border *bd;
|
|
|
|
double t, dt, spd;
|
|
|
|
|
|
|
|
desk = data;
|
|
|
|
t = ecore_time_get();
|
|
|
|
dt = -1.0;
|
|
|
|
spd = e_config->desk_flip_animate_time;
|
|
|
|
bl = e_container_border_list_first(desk->zone->container);
|
|
|
|
while ((bd = e_container_border_list_next(bl)))
|
|
|
|
{
|
|
|
|
if ((bd->desk->zone == desk->zone) && (!bd->iconic))
|
|
|
|
{
|
|
|
|
if (bd->moving)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
else if ((bd->desk == desk) && (!bd->sticky))
|
|
|
|
{
|
|
|
|
dt = (t - bd->fx.start.t) / spd;
|
|
|
|
if (dt > 1.0) dt = 1.0;
|
|
|
|
dt = 1.0 - dt;
|
|
|
|
dt *= dt; // decelerate - could be a better hack
|
|
|
|
e_border_fx_offset(bd,
|
|
|
|
((double)bd->fx.start.x * dt),
|
|
|
|
((double)bd->fx.start.y * dt));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
e_container_border_list_free(bl);
|
|
|
|
if (dt <= 0.0)
|
|
|
|
{
|
|
|
|
_e_desk_show_end(desk);
|
|
|
|
desk->animator = NULL;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_desk_hide_begin(E_Desk *desk, int mode, int dx, int dy)
|
|
|
|
{
|
|
|
|
E_Border_List *bl;
|
|
|
|
E_Border *bd;
|
|
|
|
double t;
|
|
|
|
|
|
|
|
t = ecore_time_get();
|
|
|
|
bl = e_container_border_list_first(desk->zone->container);
|
|
|
|
while ((bd = e_container_border_list_next(bl)))
|
|
|
|
{
|
|
|
|
if ((bd->desk->zone == desk->zone) && (!bd->iconic))
|
|
|
|
{
|
|
|
|
if (bd->moving)
|
|
|
|
{
|
|
|
|
bd->fx.start.t = t;
|
|
|
|
bd->fx.start.x = 0;
|
|
|
|
bd->fx.start.y = 0;
|
|
|
|
}
|
|
|
|
else if ((bd->desk == desk) && (!bd->sticky))
|
|
|
|
{
|
|
|
|
bd->fx.start.t = t;
|
|
|
|
if (mode == 1)
|
|
|
|
{
|
|
|
|
bd->fx.start.x = bd->zone->w * -dx;
|
|
|
|
bd->fx.start.y = bd->zone->h * -dy;
|
|
|
|
}
|
|
|
|
else if (mode == 2)
|
|
|
|
{
|
|
|
|
int mx, my, bx, by;
|
|
|
|
double fx, fy, ang, rad, len, lmax;
|
|
|
|
|
|
|
|
mx = bd->zone->x + (bd->zone->w / 2);
|
|
|
|
my = bd->zone->y + (bd->zone->h / 2);
|
|
|
|
|
|
|
|
bx = bd->x + (bd->w / 2) - mx;
|
|
|
|
by = bd->y + (bd->h / 2) - my;
|
|
|
|
if (bx == 0) bx = 1;
|
|
|
|
if (by == 0) by = 1;
|
|
|
|
fx = (double)bx / (double)(bd->zone->w / 2);
|
|
|
|
fy = (double)by / (double)(bd->zone->h / 2);
|
|
|
|
ang = atan(fy / fx);
|
|
|
|
if (fx < 0.0)
|
|
|
|
ang = M_PI + ang;
|
|
|
|
len = sqrt((bx * bx) + (by * by));
|
|
|
|
lmax = sqrt(((bd->zone->w / 2) * (bd->zone->w / 2)) +
|
|
|
|
((bd->zone->h / 2) * (bd->zone->h / 2)));
|
|
|
|
rad = sqrt((bd->w * bd->w) + (bd->h * bd->h)) / 2.0;
|
|
|
|
bx = cos(ang) * (lmax - len + rad);
|
|
|
|
by = sin(ang) * (lmax - len + rad);
|
|
|
|
bd->fx.start.x = bx;
|
|
|
|
bd->fx.start.y = by;
|
|
|
|
}
|
2006-09-04 06:38:35 -07:00
|
|
|
if (bd->fx.start.x < 0)
|
|
|
|
bd->fx.start.x -= bd->zone->x;
|
|
|
|
else
|
|
|
|
bd->fx.start.x += bd->zone->container->w - (bd->zone->x + bd->zone->w);
|
|
|
|
if (bd->fx.start.y < 0)
|
|
|
|
bd->fx.start.y -= bd->zone->y;
|
|
|
|
else
|
|
|
|
bd->fx.start.y += bd->zone->container->h - (bd->zone->y + bd->zone->h);
|
2006-09-01 08:37:23 -07:00
|
|
|
e_border_fx_offset(bd, 0, 0);
|
|
|
|
if (bd->want_fullscreen)
|
|
|
|
{
|
|
|
|
e_border_fullscreen(bd, e_config->fullscreen_policy);
|
|
|
|
bd->want_fullscreen = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
e_container_border_list_free(bl);
|
|
|
|
if (desk->animator) ecore_animator_del(desk->animator);
|
|
|
|
desk->animator = ecore_animator_add(_e_desk_hide_animator, desk);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_desk_hide_end(E_Desk *desk)
|
|
|
|
{
|
|
|
|
E_Border_List *bl;
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bl = e_container_border_list_first(desk->zone->container);
|
|
|
|
while ((bd = e_container_border_list_next(bl)))
|
|
|
|
{
|
|
|
|
if ((bd->desk->zone == desk->zone) && (!bd->iconic))
|
|
|
|
{
|
|
|
|
if (bd->moving)
|
|
|
|
{
|
|
|
|
e_border_fx_offset(bd, 0, 0);
|
|
|
|
}
|
|
|
|
else if ((bd->desk == desk) && (!bd->sticky))
|
|
|
|
{
|
|
|
|
e_border_fx_offset(bd, 0, 0);
|
|
|
|
if (bd->fullscreen)
|
|
|
|
bd->want_fullscreen = 1;
|
|
|
|
e_border_hide(bd, 2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
e_container_border_list_free(bl);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_desk_hide_animator(void *data)
|
|
|
|
{
|
|
|
|
E_Desk *desk;
|
|
|
|
E_Border_List *bl;
|
|
|
|
E_Border *bd;
|
|
|
|
double t, dt, spd;
|
|
|
|
|
|
|
|
desk = data;
|
|
|
|
t = ecore_time_get();
|
|
|
|
dt = -1.0;
|
|
|
|
spd = e_config->desk_flip_animate_time;
|
|
|
|
bl = e_container_border_list_first(desk->zone->container);
|
|
|
|
while ((bd = e_container_border_list_next(bl)))
|
|
|
|
{
|
|
|
|
if ((bd->desk->zone == desk->zone) && (!bd->iconic))
|
|
|
|
{
|
|
|
|
if (bd->moving)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
else if ((bd->desk == desk) && (!bd->sticky))
|
|
|
|
{
|
|
|
|
dt = (t - bd->fx.start.t) / spd;
|
|
|
|
if (dt > 1.0) dt = 1.0;
|
|
|
|
// dt = 1.0 - dt;
|
|
|
|
dt *= dt; // decelerate - could be a better hack
|
|
|
|
// dt = 1.0 - dt;
|
|
|
|
e_border_fx_offset(bd,
|
|
|
|
((double)bd->fx.start.x * dt),
|
|
|
|
((double)bd->fx.start.y * dt));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
e_container_border_list_free(bl);
|
|
|
|
if ((dt < 0.0) || (dt >= 1.0))
|
|
|
|
{
|
|
|
|
_e_desk_hide_end(desk);
|
|
|
|
desk->animator = NULL;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|