2005-01-03 01:26:13 -08:00
|
|
|
/*
|
|
|
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
|
|
|
*/
|
|
|
|
#include "e.h"
|
|
|
|
|
|
|
|
/* E_Zone is a child object of E_Container. There is one zone per screen
|
|
|
|
* in a xinerama setup. Each zone has one or more desktops.
|
|
|
|
*/
|
|
|
|
|
|
|
|
static void _e_zone_free(E_Zone *zone);
|
|
|
|
static void _e_zone_cb_bg_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info);
|
|
|
|
static void _e_zone_cb_bg_mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event_info);
|
|
|
|
static void _e_zone_cb_bg_mouse_move(void *data, Evas *evas, Evas_Object *obj, void *event_info);
|
2005-01-15 00:31:39 -08:00
|
|
|
static void _e_zone_event_zone_desk_count_set_free(void *data, void *ev);
|
2005-04-22 01:19:39 -07:00
|
|
|
static int _e_zone_cb_mouse_in(void *data, int type, void *event);
|
|
|
|
static int _e_zone_cb_mouse_out(void *data, int type, void *event);
|
|
|
|
static int _e_zone_cb_timer(void *data);
|
2005-05-08 09:21:27 -07:00
|
|
|
static int _e_zone_cb_desk_show(void *data, int type, void *event);
|
2005-04-22 01:19:39 -07:00
|
|
|
static void _e_zone_update_flip(E_Zone *zone);
|
2005-01-03 01:26:13 -08:00
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI int E_EVENT_ZONE_DESK_COUNT_SET = 0;
|
|
|
|
EAPI int E_EVENT_POINTER_WARP = 0;
|
2005-01-15 00:31:39 -08:00
|
|
|
|
2005-04-24 09:04:20 -07:00
|
|
|
#define E_ZONE_FLIP_UP(zone) ((zone)->desk_y_current > 0)
|
|
|
|
#define E_ZONE_FLIP_RIGHT(zone) (((zone)->desk_x_current + 1) < (zone)->desk_x_count)
|
|
|
|
#define E_ZONE_FLIP_DOWN(zone) (((zone)->desk_y_current + 1) < (zone)->desk_y_count)
|
|
|
|
#define E_ZONE_FLIP_LEFT(zone) ((zone)->desk_x_current > 0)
|
|
|
|
|
2005-09-29 08:43:37 -07:00
|
|
|
static int startup_id = 0;
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI int
|
2005-01-05 02:37:53 -08:00
|
|
|
e_zone_init(void)
|
|
|
|
{
|
2005-01-15 00:31:39 -08:00
|
|
|
E_EVENT_ZONE_DESK_COUNT_SET = ecore_event_type_new();
|
2005-07-01 01:20:05 -07:00
|
|
|
E_EVENT_POINTER_WARP = ecore_event_type_new();
|
2005-05-08 09:21:27 -07:00
|
|
|
|
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_zone_shutdown(void)
|
|
|
|
{
|
2005-09-29 08:43:37 -07:00
|
|
|
char buf[256];
|
|
|
|
snprintf(buf, sizeof(buf), "%i", startup_id);
|
|
|
|
e_util_env_set("E_STARTUP_ID", buf);
|
2005-01-05 02:37:53 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI E_Zone *
|
2005-02-13 04:33:31 -08:00
|
|
|
e_zone_new(E_Container *con, int num, int x, int y, int w, int h)
|
2005-01-03 01:26:13 -08:00
|
|
|
{
|
2005-02-07 03:27:08 -08:00
|
|
|
E_Zone *zone;
|
|
|
|
char name[40];
|
2005-06-29 07:28:47 -07:00
|
|
|
Evas_Object *o;
|
2005-01-03 01:26:13 -08:00
|
|
|
|
2005-01-21 22:58:34 -08:00
|
|
|
zone = E_OBJECT_ALLOC(E_Zone, E_ZONE_TYPE, _e_zone_free);
|
2005-01-03 01:26:13 -08:00
|
|
|
if (!zone) return NULL;
|
|
|
|
|
|
|
|
zone->container = con;
|
|
|
|
|
|
|
|
zone->x = x;
|
|
|
|
zone->y = y;
|
|
|
|
zone->w = w;
|
|
|
|
zone->h = h;
|
2005-02-13 04:33:31 -08:00
|
|
|
zone->num = num;
|
2005-01-03 01:26:13 -08:00
|
|
|
|
2005-05-11 23:53:16 -07:00
|
|
|
zone->flip.left = ecore_x_window_input_new(con->win, zone->x, zone->y, 1, zone->h);
|
|
|
|
zone->flip.right = ecore_x_window_input_new(con->win, zone->x + zone->w - 1, zone->y, 1, zone->h);
|
|
|
|
zone->flip.top = ecore_x_window_input_new(con->win, zone->x + 1, zone->y, zone->w - 2, 1);
|
|
|
|
zone->flip.bottom = ecore_x_window_input_new(con->win, zone->x + 1, zone->y + zone->h - 1, zone->w - 2, 1);
|
2005-04-22 01:19:39 -07:00
|
|
|
|
2005-05-09 14:06:01 -07:00
|
|
|
zone->handlers = evas_list_append(zone->handlers,
|
|
|
|
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN,
|
|
|
|
_e_zone_cb_mouse_in, zone));
|
|
|
|
zone->handlers = evas_list_append(zone->handlers,
|
|
|
|
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT,
|
|
|
|
_e_zone_cb_mouse_out, zone));
|
|
|
|
zone->handlers = evas_list_append(zone->handlers,
|
|
|
|
ecore_event_handler_add(E_EVENT_DESK_SHOW,
|
|
|
|
_e_zone_cb_desk_show, zone));
|
|
|
|
|
2005-04-22 01:19:39 -07:00
|
|
|
|
2005-02-07 03:27:08 -08:00
|
|
|
snprintf(name, sizeof(name), "Zone %d", zone->num);
|
2005-12-04 04:03:59 -08:00
|
|
|
zone->name = evas_stringshare_add(name);
|
2005-02-07 03:27:08 -08:00
|
|
|
|
2005-01-03 01:26:13 -08:00
|
|
|
con->zones = evas_list_append(con->zones, zone);
|
|
|
|
|
2005-06-29 07:28:47 -07:00
|
|
|
o = evas_object_rectangle_add(con->bg_evas);
|
|
|
|
zone->bg_clip_object = o;
|
|
|
|
evas_object_move(o, x, y);
|
|
|
|
evas_object_resize(o, w, h);
|
|
|
|
evas_object_color_set(o, 255, 255, 255, 255);
|
|
|
|
evas_object_show(o);
|
|
|
|
|
|
|
|
o = evas_object_rectangle_add(con->bg_evas);
|
|
|
|
zone->bg_event_object = o;
|
|
|
|
evas_object_clip_set(o, zone->bg_clip_object);
|
|
|
|
evas_object_move(o, x, y);
|
|
|
|
evas_object_resize(o, w, h);
|
|
|
|
evas_object_color_set(o, 255, 255, 255, 0);
|
2005-07-30 23:22:31 -07:00
|
|
|
evas_object_repeat_events_set(o, 1);
|
2005-06-29 07:28:47 -07:00
|
|
|
evas_object_show(o);
|
|
|
|
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_zone_cb_bg_mouse_down, zone);
|
|
|
|
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _e_zone_cb_bg_mouse_up, zone);
|
|
|
|
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _e_zone_cb_bg_mouse_move, zone);
|
2005-01-03 01:26:13 -08:00
|
|
|
|
2005-07-20 06:07:58 -07:00
|
|
|
/* TODO: config the ecore_evas type. */
|
2005-10-03 00:36:23 -07:00
|
|
|
zone->black_ecore_evas = e_canvas_new(e_config->evas_engine_zone, zone->container->win,
|
|
|
|
0, 0, zone->w, zone->h, 1, 1,
|
|
|
|
&(zone->black_win), NULL);
|
|
|
|
e_canvas_add(zone->black_ecore_evas);
|
2005-07-20 06:07:58 -07:00
|
|
|
ecore_evas_layer_set(zone->black_ecore_evas, 6);
|
|
|
|
zone->black_evas = ecore_evas_get(zone->black_ecore_evas);
|
|
|
|
|
|
|
|
o = evas_object_rectangle_add(zone->black_evas);
|
|
|
|
evas_object_move(o, 0, 0);
|
|
|
|
evas_object_resize(o, zone->w, zone->h);
|
|
|
|
evas_object_color_set(o, 0, 0, 0, 255);
|
2005-10-05 09:43:29 -07:00
|
|
|
evas_object_show(o);
|
|
|
|
|
2005-07-20 06:07:58 -07:00
|
|
|
ecore_evas_name_class_set(zone->black_ecore_evas, "E", "Black_Window");
|
|
|
|
snprintf(name, sizeof(name), "Enlightenment Black Zone (%d)", zone->num);
|
|
|
|
ecore_evas_title_set(zone->black_ecore_evas, name);
|
|
|
|
|
2005-01-08 09:32:08 -08:00
|
|
|
zone->desk_x_count = 0;
|
|
|
|
zone->desk_y_count = 0;
|
|
|
|
zone->desk_x_current = 0;
|
|
|
|
zone->desk_y_current = 0;
|
2005-01-10 06:07:42 -08:00
|
|
|
e_zone_desk_count_set(zone,
|
|
|
|
e_config->zone_desks_x_count,
|
|
|
|
e_config->zone_desks_y_count);
|
2005-04-22 01:19:39 -07:00
|
|
|
|
|
|
|
_e_zone_update_flip(zone);
|
|
|
|
|
2005-01-03 01:26:13 -08:00
|
|
|
return zone;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-03 01:26:13 -08:00
|
|
|
e_zone_name_set(E_Zone *zone, const char *name)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(zone);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
2005-12-04 04:03:59 -08:00
|
|
|
if (zone->name) evas_stringshare_del(zone->name);
|
|
|
|
zone->name = evas_stringshare_add(name);
|
2005-01-03 01:26:13 -08:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-03 01:26:13 -08:00
|
|
|
e_zone_move(E_Zone *zone, int x, int y)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(zone);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
2005-01-03 01:26:13 -08:00
|
|
|
|
|
|
|
if ((x == zone->x) && (y == zone->y)) return;
|
|
|
|
zone->x = x;
|
|
|
|
zone->y = y;
|
|
|
|
evas_object_move(zone->bg_object, x, y);
|
|
|
|
evas_object_move(zone->bg_event_object, x, y);
|
2005-01-20 05:42:51 -08:00
|
|
|
evas_object_move(zone->bg_clip_object, x, y);
|
2005-05-11 23:53:16 -07:00
|
|
|
ecore_x_window_move_resize(zone->flip.left, zone->x, zone->y, 1, zone->h);
|
|
|
|
ecore_x_window_move_resize(zone->flip.right, zone->x + zone->w - 1, zone->y, 1, zone->h);
|
|
|
|
ecore_x_window_move_resize(zone->flip.top, zone->x + 1, zone->y, zone->w - 2, 1);
|
|
|
|
ecore_x_window_move_resize(zone->flip.bottom, zone->x + 1, zone->y + zone->h - 1, zone->w - 2, 1);
|
2005-01-03 01:26:13 -08:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-03 01:26:13 -08:00
|
|
|
e_zone_resize(E_Zone *zone, int w, int h)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(zone);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
2005-01-03 01:26:13 -08:00
|
|
|
|
|
|
|
if ((w == zone->w) && (h == zone->h)) return;
|
|
|
|
zone->w = w;
|
|
|
|
zone->h = h;
|
|
|
|
evas_object_resize(zone->bg_object, w, h);
|
|
|
|
evas_object_resize(zone->bg_event_object, w, h);
|
2005-01-20 05:42:51 -08:00
|
|
|
evas_object_resize(zone->bg_clip_object, w, h);
|
2005-04-22 02:38:59 -07:00
|
|
|
|
2005-05-11 23:53:16 -07:00
|
|
|
ecore_x_window_move_resize(zone->flip.left, zone->x, zone->y, 1, zone->h);
|
|
|
|
ecore_x_window_move_resize(zone->flip.right, zone->x + zone->w - 1, zone->y, 1, zone->h);
|
|
|
|
ecore_x_window_move_resize(zone->flip.top, zone->x + 1, zone->y, zone->w - 2, 1);
|
|
|
|
ecore_x_window_move_resize(zone->flip.bottom, zone->x + 1, zone->y + zone->h - 1, zone->w - 2, 1);
|
2005-01-03 01:26:13 -08:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-03 01:26:13 -08:00
|
|
|
e_zone_move_resize(E_Zone *zone, int x, int y, int w, int h)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(zone);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
2005-01-03 01:26:13 -08:00
|
|
|
|
|
|
|
if ((x == zone->x) && (y == zone->y) && (w == zone->w) && (h == zone->h))
|
|
|
|
return;
|
|
|
|
|
|
|
|
zone->x = x;
|
|
|
|
zone->y = y;
|
|
|
|
zone->w = w;
|
|
|
|
zone->h = h;
|
|
|
|
|
|
|
|
evas_object_move(zone->bg_object, x, y);
|
|
|
|
evas_object_move(zone->bg_event_object, x, y);
|
2005-01-20 05:42:51 -08:00
|
|
|
evas_object_move(zone->bg_clip_object, x, y);
|
2005-01-03 01:26:13 -08:00
|
|
|
evas_object_resize(zone->bg_object, w, h);
|
|
|
|
evas_object_resize(zone->bg_event_object, w, h);
|
2005-01-20 05:42:51 -08:00
|
|
|
evas_object_resize(zone->bg_clip_object, w, h);
|
2005-01-03 01:26:13 -08:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-07-20 06:07:58 -07:00
|
|
|
e_zone_fullscreen_set(E_Zone *zone, int on)
|
|
|
|
{
|
2005-10-19 02:31:35 -07:00
|
|
|
E_OBJECT_CHECK(zone);
|
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
|
|
|
|
2005-07-20 06:07:58 -07:00
|
|
|
if ((!zone->fullscreen) && (on))
|
|
|
|
{
|
|
|
|
ecore_evas_show(zone->black_ecore_evas);
|
|
|
|
e_container_window_raise(zone->container, zone->black_win, 150);
|
|
|
|
zone->fullscreen = 1;
|
|
|
|
}
|
|
|
|
else if ((zone->fullscreen) && (!on))
|
|
|
|
{
|
|
|
|
ecore_evas_hide(zone->black_ecore_evas);
|
|
|
|
zone->fullscreen = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI E_Zone *
|
2005-01-03 01:26:13 -08:00
|
|
|
e_zone_current_get(E_Container *con)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
2005-09-22 13:20:34 -07:00
|
|
|
|
2005-01-03 14:04:04 -08:00
|
|
|
E_OBJECT_CHECK_RETURN(con, NULL);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(con, E_CONTAINER_TYPE, NULL);
|
2005-10-19 02:31:35 -07:00
|
|
|
if (!starting)
|
2005-01-11 05:11:12 -08:00
|
|
|
{
|
|
|
|
int x, y;
|
2005-04-30 00:03:35 -07:00
|
|
|
|
|
|
|
ecore_x_pointer_xy_get(con->win, &x, &y);
|
2005-01-11 05:11:12 -08:00
|
|
|
for (l = con->zones; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Zone *zone;
|
|
|
|
|
|
|
|
zone = l->data;
|
|
|
|
if (E_INTERSECTS(x, y, 1, 1,
|
|
|
|
zone->x, zone->y, zone->w, zone->h))
|
|
|
|
return zone;
|
|
|
|
}
|
|
|
|
}
|
2005-03-22 01:09:12 -08:00
|
|
|
if (!con->zones)
|
|
|
|
return NULL;
|
2005-01-03 01:26:13 -08:00
|
|
|
l = con->zones;
|
|
|
|
return (E_Zone *)l->data;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-03 01:26:13 -08:00
|
|
|
e_zone_bg_reconfigure(E_Zone *zone)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(zone);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
2005-06-29 07:28:47 -07:00
|
|
|
e_bg_zone_update(zone, E_BG_TRANSITION_CHANGE);
|
2005-01-03 01:26:13 -08:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-04-22 02:38:59 -07:00
|
|
|
e_zone_flip_coords_handle(E_Zone *zone, int x, int y)
|
|
|
|
{
|
2005-10-19 02:31:35 -07:00
|
|
|
E_OBJECT_CHECK(zone);
|
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
|
|
|
|
2005-04-24 09:04:20 -07:00
|
|
|
if ((y == 0) && E_ZONE_FLIP_UP(zone))
|
2005-04-22 07:33:35 -07:00
|
|
|
{
|
|
|
|
/* top */
|
2005-07-26 21:51:42 -07:00
|
|
|
if (!zone->flip.timer)
|
|
|
|
zone->flip.timer = ecore_timer_add(e_config->edge_flip_timeout, _e_zone_cb_timer, zone);
|
2005-04-22 07:33:35 -07:00
|
|
|
zone->flip.direction = E_DIRECTION_UP;
|
|
|
|
}
|
2005-04-24 09:04:20 -07:00
|
|
|
else if ((x == (zone->w - 1)) && E_ZONE_FLIP_RIGHT(zone))
|
2005-04-22 07:33:35 -07:00
|
|
|
{
|
|
|
|
/* right */
|
2005-07-26 21:51:42 -07:00
|
|
|
if (!zone->flip.timer)
|
|
|
|
zone->flip.timer = ecore_timer_add(e_config->edge_flip_timeout, _e_zone_cb_timer, zone);
|
2005-04-22 07:33:35 -07:00
|
|
|
zone->flip.direction = E_DIRECTION_RIGHT;
|
|
|
|
}
|
2005-04-24 09:04:20 -07:00
|
|
|
else if ((y == (zone->h - 1)) && E_ZONE_FLIP_DOWN(zone))
|
2005-04-22 07:33:35 -07:00
|
|
|
{
|
|
|
|
/* bottom */
|
2005-07-26 21:51:42 -07:00
|
|
|
if (!zone->flip.timer)
|
|
|
|
zone->flip.timer = ecore_timer_add(e_config->edge_flip_timeout, _e_zone_cb_timer, zone);
|
2005-04-22 07:33:35 -07:00
|
|
|
zone->flip.direction = E_DIRECTION_DOWN;
|
|
|
|
}
|
2005-04-24 09:04:20 -07:00
|
|
|
else if ((x == 0) && E_ZONE_FLIP_LEFT(zone))
|
2005-04-22 07:33:35 -07:00
|
|
|
{
|
|
|
|
/* left */
|
2005-07-26 21:51:42 -07:00
|
|
|
if (!zone->flip.timer)
|
|
|
|
zone->flip.timer = ecore_timer_add(e_config->edge_flip_timeout, _e_zone_cb_timer, zone);
|
2005-04-22 07:33:35 -07:00
|
|
|
zone->flip.direction = E_DIRECTION_LEFT;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* in zone */
|
|
|
|
if (zone->flip.timer)
|
|
|
|
ecore_timer_del(zone->flip.timer);
|
|
|
|
zone->flip.timer = NULL;
|
|
|
|
}
|
2005-04-22 02:38:59 -07:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-08 09:32:08 -08:00
|
|
|
e_zone_desk_count_set(E_Zone *zone, int x_count, int y_count)
|
|
|
|
{
|
2005-01-12 08:03:09 -08:00
|
|
|
E_Desk **new_desks;
|
2005-01-08 13:21:56 -08:00
|
|
|
E_Desk *desk, *new_desk;
|
|
|
|
int x, y, xx, yy, moved;
|
|
|
|
E_Border *bd;
|
2005-01-15 00:31:39 -08:00
|
|
|
E_Event_Zone_Desk_Count_Set *ev;
|
2005-05-13 03:09:55 -07:00
|
|
|
E_Border_List *bl;
|
2005-01-08 09:32:08 -08:00
|
|
|
|
2005-10-19 02:31:35 -07:00
|
|
|
E_OBJECT_CHECK(zone);
|
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
|
|
|
|
2005-01-08 13:21:56 -08:00
|
|
|
xx = x_count;
|
2005-04-08 17:13:09 -07:00
|
|
|
if (xx < 1) xx = 1;
|
2005-01-08 13:21:56 -08:00
|
|
|
yy = y_count;
|
2005-04-08 17:13:09 -07:00
|
|
|
if (yy < 1) yy = 1;
|
2005-01-08 09:32:08 -08:00
|
|
|
|
2005-01-08 13:21:56 -08:00
|
|
|
new_desks = malloc(xx * yy * sizeof(E_Desk *));
|
|
|
|
for (x = 0; x < xx; x++)
|
2005-04-08 17:13:09 -07:00
|
|
|
{
|
|
|
|
for (y = 0; y < yy; y++)
|
|
|
|
{
|
|
|
|
if ((x < zone->desk_x_count) && (y < zone->desk_y_count))
|
|
|
|
desk = zone->desks[x + (y * zone->desk_x_count)];
|
|
|
|
else
|
|
|
|
desk = e_desk_new(zone, x, y);
|
|
|
|
new_desks[x + (y * xx)] = desk;
|
|
|
|
}
|
|
|
|
}
|
2005-01-08 09:32:08 -08:00
|
|
|
|
2005-01-08 13:21:56 -08:00
|
|
|
/* catch windoes that have fallen off the end if we got smaller */
|
|
|
|
if (xx < zone->desk_x_count)
|
2005-04-08 17:13:09 -07:00
|
|
|
{
|
|
|
|
for (y = 0; y < zone->desk_y_count; y++)
|
|
|
|
{
|
|
|
|
new_desk = zone->desks[xx - 1 + (y * zone->desk_x_count)];
|
|
|
|
for (x = xx; x < zone->desk_x_count; x++)
|
|
|
|
{
|
|
|
|
desk = zone->desks[x + (y * zone->desk_x_count)];
|
|
|
|
|
2005-05-13 03:09:55 -07:00
|
|
|
bl = e_container_border_list_first(zone->container);
|
|
|
|
while ((bd = e_container_border_list_next(bl)))
|
2005-04-08 17:13:09 -07:00
|
|
|
{
|
|
|
|
if (bd->desk == desk)
|
|
|
|
e_border_desk_set(bd, new_desk);
|
|
|
|
}
|
2005-05-13 03:09:55 -07:00
|
|
|
e_container_border_list_free(bl);
|
2005-04-08 17:13:09 -07:00
|
|
|
e_object_del(E_OBJECT(desk));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2005-01-08 13:21:56 -08:00
|
|
|
if (yy < zone->desk_y_count)
|
2005-04-08 17:13:09 -07:00
|
|
|
{
|
|
|
|
for (x = 0; x < zone->desk_x_count; x++)
|
|
|
|
{
|
|
|
|
new_desk = zone->desks[x + ((yy - 1) * zone->desk_x_count)];
|
|
|
|
for (y = yy; y < zone->desk_y_count; y++)
|
|
|
|
{
|
|
|
|
desk = zone->desks[x + (y * zone->desk_x_count)];
|
|
|
|
|
2005-05-13 03:09:55 -07:00
|
|
|
bl = e_container_border_list_first(zone->container);
|
|
|
|
while ((bd = e_container_border_list_next(bl)))
|
2005-04-08 17:13:09 -07:00
|
|
|
{
|
|
|
|
if (bd->desk == desk)
|
|
|
|
e_border_desk_set(bd, new_desk);
|
|
|
|
}
|
2005-05-13 03:09:55 -07:00
|
|
|
e_container_border_list_free(bl);
|
2005-04-08 17:13:09 -07:00
|
|
|
e_object_del(E_OBJECT(desk));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2005-01-12 08:03:09 -08:00
|
|
|
if (zone->desks) free(zone->desks);
|
2005-01-08 09:32:08 -08:00
|
|
|
zone->desks = new_desks;
|
|
|
|
|
2005-01-08 13:21:56 -08:00
|
|
|
zone->desk_x_count = xx;
|
|
|
|
zone->desk_y_count = yy;
|
2005-01-08 09:32:08 -08:00
|
|
|
|
2005-01-08 13:21:56 -08:00
|
|
|
moved = 0;
|
|
|
|
if (zone->desk_x_current >= xx)
|
|
|
|
{
|
|
|
|
moved = 1;
|
|
|
|
}
|
|
|
|
if (zone->desk_y_current >= yy)
|
2005-01-08 09:32:08 -08:00
|
|
|
{
|
2005-01-08 13:21:56 -08:00
|
|
|
moved = 1;
|
2005-01-08 09:32:08 -08:00
|
|
|
}
|
2005-01-08 13:21:56 -08:00
|
|
|
if (moved)
|
|
|
|
e_desk_show(e_desk_at_xy_get(zone, xx - 1, yy - 1));
|
|
|
|
else
|
2005-01-08 09:32:08 -08:00
|
|
|
{
|
2005-01-08 13:21:56 -08:00
|
|
|
desk = e_desk_current_get(zone);
|
|
|
|
desk->visible = 0;
|
|
|
|
e_desk_show(desk);
|
2005-01-08 09:32:08 -08:00
|
|
|
}
|
2005-01-08 14:09:16 -08:00
|
|
|
e_config->zone_desks_x_count = xx;
|
|
|
|
e_config->zone_desks_y_count = yy;
|
|
|
|
e_config_save_queue();
|
2005-01-15 00:31:39 -08:00
|
|
|
|
|
|
|
ev = E_NEW(E_Event_Zone_Desk_Count_Set, 1);
|
|
|
|
if (!ev) return;
|
|
|
|
ev->zone = zone;
|
|
|
|
e_object_ref(E_OBJECT(zone));
|
|
|
|
ecore_event_add(E_EVENT_ZONE_DESK_COUNT_SET, ev, _e_zone_event_zone_desk_count_set_free, NULL);
|
2005-01-08 09:32:08 -08:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-09 10:58:13 -08:00
|
|
|
e_zone_desk_count_get(E_Zone *zone, int *x_count, int *y_count)
|
|
|
|
{
|
2005-10-19 02:31:35 -07:00
|
|
|
E_OBJECT_CHECK(zone);
|
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
|
|
|
|
2005-01-09 10:58:13 -08:00
|
|
|
*x_count = zone->desk_x_count;
|
|
|
|
*y_count = zone->desk_y_count;
|
|
|
|
}
|
2005-01-15 00:31:39 -08:00
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-04-29 12:42:19 -07:00
|
|
|
e_zone_update_flip(E_Zone *zone)
|
|
|
|
{
|
2005-10-19 02:31:35 -07:00
|
|
|
E_OBJECT_CHECK(zone);
|
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
|
|
|
|
2005-04-29 12:42:19 -07:00
|
|
|
_e_zone_update_flip(zone);
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-07-11 20:53:56 -07:00
|
|
|
e_zone_update_flip_all(void)
|
|
|
|
{
|
|
|
|
Evas_List *l, *ll;
|
|
|
|
E_Manager *man;
|
|
|
|
E_Container *con;
|
|
|
|
E_Zone *zone;
|
|
|
|
|
|
|
|
for (l = e_manager_list(); l; l = l->next)
|
|
|
|
{
|
|
|
|
man = l->data;
|
|
|
|
for (ll = man->containers; ll; ll = ll->next)
|
|
|
|
{
|
|
|
|
con = ll->data;
|
|
|
|
zone = e_zone_current_get(con);
|
|
|
|
e_zone_update_flip(zone);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-04-29 21:21:55 -07:00
|
|
|
e_zone_desk_flip_by(E_Zone *zone, int dx, int dy)
|
|
|
|
{
|
2005-10-19 02:31:35 -07:00
|
|
|
E_OBJECT_CHECK(zone);
|
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
|
|
|
|
2005-04-29 21:21:55 -07:00
|
|
|
dx = zone->desk_x_current + dx;
|
2005-04-29 22:07:28 -07:00
|
|
|
dy = zone->desk_y_current + dy;
|
2005-04-29 21:21:55 -07:00
|
|
|
e_zone_desk_flip_to(zone, dx, dy);
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-04-29 21:21:55 -07:00
|
|
|
e_zone_desk_flip_to(E_Zone *zone, int x, int y)
|
|
|
|
{
|
|
|
|
E_Desk *desk;
|
|
|
|
|
2005-10-19 02:31:35 -07:00
|
|
|
E_OBJECT_CHECK(zone);
|
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
|
|
|
|
2005-04-29 21:21:55 -07:00
|
|
|
if (x < 0) x = 0;
|
2005-05-03 06:44:43 -07:00
|
|
|
else if (x >= zone->desk_x_count) x = zone->desk_x_count - 1;
|
2005-04-29 21:21:55 -07:00
|
|
|
if (y < 0) y = 0;
|
2005-05-03 06:44:43 -07:00
|
|
|
else if (y >= zone->desk_y_count) y = zone->desk_y_count - 1;
|
2005-04-29 21:21:55 -07:00
|
|
|
desk = e_desk_at_xy_get(zone, x, y);
|
2005-05-08 09:21:27 -07:00
|
|
|
if (desk) e_desk_show(desk);
|
2005-04-29 21:21:55 -07:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-04-29 21:21:55 -07:00
|
|
|
e_zone_desk_linear_flip_by(E_Zone *zone, int dx)
|
|
|
|
{
|
2005-10-19 02:31:35 -07:00
|
|
|
E_OBJECT_CHECK(zone);
|
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
|
|
|
|
2005-04-29 21:21:55 -07:00
|
|
|
dx = zone->desk_x_current +
|
|
|
|
(zone->desk_y_current * zone->desk_x_count) + dx;
|
2005-05-12 00:29:17 -07:00
|
|
|
dx = dx % (zone->desk_x_count * zone->desk_y_count);
|
|
|
|
while (dx < 0)
|
|
|
|
dx += (zone->desk_x_count * zone->desk_y_count);
|
2005-04-29 21:21:55 -07:00
|
|
|
e_zone_desk_linear_flip_to(zone, dx);
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-04-29 21:21:55 -07:00
|
|
|
e_zone_desk_linear_flip_to(E_Zone *zone, int x)
|
|
|
|
{
|
|
|
|
int y;
|
2005-05-12 00:29:17 -07:00
|
|
|
|
2005-10-19 02:31:35 -07:00
|
|
|
E_OBJECT_CHECK(zone);
|
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
|
|
|
|
2005-05-12 00:29:17 -07:00
|
|
|
if (x < 0) return;
|
2005-04-29 21:21:55 -07:00
|
|
|
y = x / zone->desk_x_count;
|
|
|
|
x = x - (y * zone->desk_x_count);
|
2005-05-12 00:29:17 -07:00
|
|
|
if (y >= zone->desk_y_count) return;
|
2005-04-29 21:21:55 -07:00
|
|
|
e_zone_desk_flip_to(zone, x, y);
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-07-26 21:51:42 -07:00
|
|
|
e_zone_flip_win_disable(void)
|
|
|
|
{
|
|
|
|
Evas_List *l, *ll, *lll;
|
|
|
|
E_Manager *man;
|
|
|
|
E_Container *con;
|
|
|
|
|
|
|
|
for (l = e_manager_list(); l; l = l->next)
|
|
|
|
{
|
|
|
|
man = l->data;
|
|
|
|
for (ll = man->containers; ll; ll = ll->next)
|
|
|
|
{
|
|
|
|
con = ll->data;
|
|
|
|
for (lll = con->zones; lll; lll = lll->next)
|
|
|
|
{
|
|
|
|
E_Zone *zone;
|
|
|
|
|
|
|
|
zone = lll->data;
|
|
|
|
ecore_x_window_hide(zone->flip.left);
|
|
|
|
ecore_x_window_hide(zone->flip.right);
|
|
|
|
ecore_x_window_hide(zone->flip.top);
|
|
|
|
ecore_x_window_hide(zone->flip.bottom);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-07-26 21:51:42 -07:00
|
|
|
e_zone_flip_win_restore(void)
|
|
|
|
{
|
|
|
|
Evas_List *l, *ll, *lll;
|
|
|
|
E_Manager *man;
|
|
|
|
E_Container *con;
|
|
|
|
|
|
|
|
for (l = e_manager_list(); l; l = l->next)
|
|
|
|
{
|
|
|
|
man = l->data;
|
|
|
|
for (ll = man->containers; ll; ll = ll->next)
|
|
|
|
{
|
|
|
|
con = ll->data;
|
|
|
|
for (lll = con->zones; lll; lll = lll->next)
|
|
|
|
{
|
|
|
|
E_Zone *zone;
|
|
|
|
|
|
|
|
zone = lll->data;
|
|
|
|
_e_zone_update_flip(zone);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI int
|
2005-12-07 05:24:58 -08:00
|
|
|
e_zone_exec(E_Zone *zone, char *exe)
|
2005-06-02 02:49:07 -07:00
|
|
|
{
|
2005-12-07 05:24:58 -08:00
|
|
|
int ret = 0;
|
2005-06-02 07:56:07 -07:00
|
|
|
char *p1, *p2;
|
|
|
|
char *penv_display;
|
2005-06-02 02:49:07 -07:00
|
|
|
char buf[4096], buf2[32];
|
2005-12-07 05:24:58 -08:00
|
|
|
Ecore_Exe *ex;
|
2005-06-02 02:49:07 -07:00
|
|
|
|
2005-10-19 02:31:35 -07:00
|
|
|
E_OBJECT_CHECK_RETURN(zone, 0);
|
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, 0);
|
|
|
|
|
2005-10-05 03:38:59 -07:00
|
|
|
if (startup_id == 0)
|
2005-09-29 08:43:37 -07:00
|
|
|
{
|
|
|
|
p1 = getenv("E_STARTUP_ID");
|
2005-10-05 01:47:29 -07:00
|
|
|
if (p1) startup_id = atoi(p1);
|
2005-09-29 08:43:37 -07:00
|
|
|
}
|
2005-10-05 09:27:52 -07:00
|
|
|
if (++startup_id < 1) startup_id = 1;
|
2005-06-02 02:49:07 -07:00
|
|
|
/* save previous env vars we need to save */
|
|
|
|
penv_display = getenv("DISPLAY");
|
|
|
|
if (penv_display) penv_display = strdup(penv_display);
|
|
|
|
|
|
|
|
/* set env vars */
|
|
|
|
p1 = strrchr(penv_display, ':');
|
|
|
|
p2 = strrchr(penv_display, '.');
|
|
|
|
if ((p1) && (p2) && (p2 > p1)) /* "blah:x.y" */
|
|
|
|
{
|
|
|
|
/* yes it could overflow... but who will voerflow DISPLAY eh? why? to
|
|
|
|
* "exploit" your own applications running as you?
|
|
|
|
*/
|
|
|
|
strcpy(buf, penv_display);
|
|
|
|
buf[p2 - penv_display + 1] = 0;
|
|
|
|
snprintf(buf2, sizeof(buf2), "%i", zone->container->manager->num);
|
|
|
|
strcat(buf, buf2);
|
|
|
|
}
|
|
|
|
else if (p1) /* "blah:x */
|
|
|
|
{
|
|
|
|
strcpy(buf, penv_display);
|
|
|
|
snprintf(buf2, sizeof(buf2), ".%i", zone->container->manager->num);
|
|
|
|
strcat(buf, buf2);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
strcpy(buf, penv_display);
|
|
|
|
e_util_env_set("DISPLAY", buf);
|
2005-09-29 08:43:37 -07:00
|
|
|
snprintf(buf, sizeof(buf), "E_START|%i", startup_id);
|
2005-09-13 23:39:59 -07:00
|
|
|
e_util_env_set("DESKTOP_STARTUP_ID", buf);
|
2005-06-02 02:49:07 -07:00
|
|
|
/* execute */
|
2005-12-07 05:24:58 -08:00
|
|
|
ex = ecore_exe_run(exe, NULL);
|
|
|
|
if (!ex)
|
|
|
|
{
|
|
|
|
e_error_dialog_show(_("Run Error"),
|
2006-01-10 00:32:28 -08:00
|
|
|
_("Enlightenment was unable to fork a child process:\n"
|
2005-12-07 05:24:58 -08:00
|
|
|
"\n"
|
|
|
|
"%s\n"
|
|
|
|
"\n"),
|
|
|
|
exe);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ecore_exe_free(ex);
|
|
|
|
ret = 1;
|
|
|
|
}
|
2005-06-02 02:49:07 -07:00
|
|
|
/* reset env vars */
|
|
|
|
if (penv_display)
|
|
|
|
{
|
|
|
|
e_util_env_set("DISPLAY", penv_display);
|
|
|
|
free(penv_display);
|
|
|
|
}
|
2005-12-07 05:24:58 -08:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI int
|
2005-12-07 05:24:58 -08:00
|
|
|
e_zone_app_exec(E_Zone *zone, E_App *a)
|
|
|
|
{
|
|
|
|
int ret;
|
|
|
|
char *p1, *p2;
|
|
|
|
char *penv_display;
|
|
|
|
char buf[4096], buf2[32];
|
|
|
|
|
|
|
|
E_OBJECT_CHECK_RETURN(zone, 0);
|
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, 0);
|
|
|
|
|
|
|
|
if (!a) return 0;
|
|
|
|
if (startup_id == 0)
|
|
|
|
{
|
|
|
|
p1 = getenv("E_STARTUP_ID");
|
|
|
|
if (p1) startup_id = atoi(p1);
|
|
|
|
}
|
|
|
|
if (++startup_id < 1) startup_id = 1;
|
|
|
|
/* save previous env vars we need to save */
|
|
|
|
penv_display = getenv("DISPLAY");
|
|
|
|
if (penv_display) penv_display = strdup(penv_display);
|
|
|
|
|
|
|
|
/* set env vars */
|
|
|
|
p1 = strrchr(penv_display, ':');
|
|
|
|
p2 = strrchr(penv_display, '.');
|
|
|
|
if ((p1) && (p2) && (p2 > p1)) /* "blah:x.y" */
|
|
|
|
{
|
|
|
|
/* yes it could overflow... but who will overflow DISPLAY eh? why? to
|
|
|
|
* "exploit" your own applications running as you?
|
|
|
|
*/
|
|
|
|
strcpy(buf, penv_display);
|
|
|
|
buf[p2 - penv_display + 1] = 0;
|
|
|
|
snprintf(buf2, sizeof(buf2), "%i", zone->container->manager->num);
|
|
|
|
strcat(buf, buf2);
|
|
|
|
}
|
|
|
|
else if (p1) /* "blah:x */
|
2005-06-02 07:56:07 -07:00
|
|
|
{
|
2005-12-07 05:24:58 -08:00
|
|
|
strcpy(buf, penv_display);
|
|
|
|
snprintf(buf2, sizeof(buf2), ".%i", zone->container->manager->num);
|
|
|
|
strcat(buf, buf2);
|
2005-06-02 07:56:07 -07:00
|
|
|
}
|
2005-12-07 05:24:58 -08:00
|
|
|
else
|
|
|
|
strcpy(buf, penv_display);
|
|
|
|
e_util_env_set("DISPLAY", buf);
|
|
|
|
snprintf(buf, sizeof(buf), "E_START|%i", startup_id);
|
|
|
|
e_util_env_set("DESKTOP_STARTUP_ID", buf);
|
|
|
|
/* execute */
|
|
|
|
ret = e_app_exec(a, startup_id);
|
|
|
|
|
|
|
|
/* reset env vars */
|
|
|
|
if (penv_display)
|
2005-06-02 07:56:07 -07:00
|
|
|
{
|
2005-12-07 05:24:58 -08:00
|
|
|
e_util_env_set("DISPLAY", penv_display);
|
|
|
|
free(penv_display);
|
2005-06-02 07:56:07 -07:00
|
|
|
}
|
2005-09-29 08:01:04 -07:00
|
|
|
return ret;
|
2005-06-02 02:49:07 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/* local subsystem functions */
|
|
|
|
static void
|
|
|
|
_e_zone_free(E_Zone *zone)
|
|
|
|
{
|
|
|
|
E_Container *con;
|
|
|
|
Evas_List *l;
|
|
|
|
int x, y;
|
|
|
|
|
2005-10-03 00:36:23 -07:00
|
|
|
if (zone->black_ecore_evas)
|
|
|
|
{
|
|
|
|
e_canvas_del(zone->black_ecore_evas);
|
|
|
|
ecore_evas_free(zone->black_ecore_evas);
|
|
|
|
}
|
2005-06-27 21:00:17 -07:00
|
|
|
if (zone->cur_mouse_action)
|
|
|
|
{
|
|
|
|
e_object_unref(E_OBJECT(zone->cur_mouse_action));
|
|
|
|
zone->cur_mouse_action = NULL;
|
|
|
|
}
|
|
|
|
|
2005-06-02 02:49:07 -07:00
|
|
|
/* remove handlers */
|
|
|
|
for (l = zone->handlers; l; l = l->next)
|
|
|
|
{
|
|
|
|
Ecore_Event_Handler *h;
|
|
|
|
|
|
|
|
h = l->data;
|
|
|
|
ecore_event_handler_del(h);
|
|
|
|
}
|
|
|
|
evas_list_free(zone->handlers);
|
|
|
|
zone->handlers = NULL;
|
|
|
|
|
|
|
|
con = zone->container;
|
2005-12-04 04:03:59 -08:00
|
|
|
if (zone->name) evas_stringshare_del(zone->name);
|
2005-06-02 02:49:07 -07:00
|
|
|
con->zones = evas_list_remove(con->zones, zone);
|
|
|
|
evas_object_del(zone->bg_event_object);
|
|
|
|
evas_object_del(zone->bg_clip_object);
|
|
|
|
evas_object_del(zone->bg_object);
|
2005-06-29 07:28:47 -07:00
|
|
|
if (zone->prev_bg_object) evas_object_del(zone->prev_bg_object);
|
2005-06-30 07:07:28 -07:00
|
|
|
if (zone->transition_object) evas_object_del(zone->transition_object);
|
|
|
|
|
2005-06-02 02:49:07 -07:00
|
|
|
/* free desks */
|
|
|
|
for (x = 0; x < zone->desk_x_count; x++)
|
2005-06-27 21:00:17 -07:00
|
|
|
{
|
|
|
|
for(y = 0; y < zone->desk_y_count; y++)
|
|
|
|
e_object_del(E_OBJECT(zone->desks[x + (y * zone->desk_x_count)]));
|
|
|
|
}
|
2005-06-02 02:49:07 -07:00
|
|
|
free(zone->desks);
|
|
|
|
free(zone);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_zone_cb_bg_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info)
|
|
|
|
{
|
|
|
|
E_Zone *zone;
|
|
|
|
Evas_Event_Mouse_Down *ev;
|
|
|
|
|
|
|
|
ev = (Evas_Event_Mouse_Down *)event_info;
|
|
|
|
zone = data;
|
|
|
|
if (e_menu_grab_window_get()) return;
|
|
|
|
|
|
|
|
if (!zone->cur_mouse_action)
|
|
|
|
{
|
|
|
|
if (ecore_event_current_type_get() == ECORE_X_EVENT_MOUSE_BUTTON_DOWN)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Button_Down *ev2;
|
|
|
|
|
|
|
|
ev2 = ecore_event_current_event_get();
|
|
|
|
zone->cur_mouse_action =
|
|
|
|
e_bindings_mouse_down_event_handle(E_BINDING_CONTEXT_ZONE,
|
|
|
|
E_OBJECT(zone), ev2);
|
2005-06-27 21:00:17 -07:00
|
|
|
if (zone->cur_mouse_action)
|
2005-07-01 06:21:41 -07:00
|
|
|
{
|
|
|
|
if ((!zone->cur_mouse_action->func.end_mouse) &&
|
|
|
|
(!zone->cur_mouse_action->func.end))
|
|
|
|
zone->cur_mouse_action = NULL;
|
|
|
|
if (zone->cur_mouse_action)
|
|
|
|
e_object_ref(E_OBJECT(zone->cur_mouse_action));
|
|
|
|
}
|
2005-06-02 02:49:07 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_zone_cb_bg_mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event_info)
|
|
|
|
{
|
|
|
|
E_Zone *zone;
|
|
|
|
Evas_Event_Mouse_Up *ev;
|
|
|
|
|
|
|
|
ev = (Evas_Event_Mouse_Up *)event_info;
|
|
|
|
zone = data;
|
|
|
|
if (zone->cur_mouse_action)
|
|
|
|
{
|
|
|
|
if (ecore_event_current_type_get() == ECORE_X_EVENT_MOUSE_BUTTON_UP)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Button_Up *ev2;
|
|
|
|
|
|
|
|
ev2 = ecore_event_current_event_get();
|
|
|
|
if (zone->cur_mouse_action->func.end_mouse)
|
|
|
|
zone->cur_mouse_action->func.end_mouse(E_OBJECT(zone), "", ev2);
|
|
|
|
else if (zone->cur_mouse_action->func.end)
|
|
|
|
zone->cur_mouse_action->func.end(E_OBJECT(zone), "");
|
|
|
|
}
|
2005-06-27 21:00:17 -07:00
|
|
|
e_object_unref(E_OBJECT(zone->cur_mouse_action));
|
2005-06-02 02:49:07 -07:00
|
|
|
zone->cur_mouse_action = NULL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (ecore_event_current_type_get() == ECORE_X_EVENT_MOUSE_BUTTON_UP)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Button_Up *ev2;
|
|
|
|
|
|
|
|
ev2 = ecore_event_current_event_get();
|
|
|
|
e_bindings_mouse_up_event_handle(E_BINDING_CONTEXT_ZONE,
|
|
|
|
E_OBJECT(zone), ev2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_zone_cb_bg_mouse_move(void *data, Evas *evas, Evas_Object *obj, void *event_info)
|
|
|
|
{
|
|
|
|
E_Zone *zone;
|
|
|
|
Evas_Event_Mouse_Move *ev;
|
|
|
|
|
|
|
|
ev = (Evas_Event_Mouse_Move *)event_info;
|
|
|
|
zone = data;
|
|
|
|
}
|
|
|
|
|
2005-01-15 00:31:39 -08:00
|
|
|
static void
|
|
|
|
_e_zone_event_zone_desk_count_set_free(void *data, void *ev)
|
|
|
|
{
|
|
|
|
E_Event_Zone_Desk_Count_Set *e;
|
|
|
|
|
|
|
|
e = ev;
|
|
|
|
e_object_unref(E_OBJECT(e->zone));
|
|
|
|
free(e);
|
|
|
|
}
|
|
|
|
|
2005-04-22 01:19:39 -07:00
|
|
|
static int
|
|
|
|
_e_zone_cb_mouse_in(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_In *ev;
|
|
|
|
E_Zone *zone;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
zone = data;
|
|
|
|
|
|
|
|
if (ev->win == zone->flip.top)
|
|
|
|
{
|
2005-07-26 21:51:42 -07:00
|
|
|
if (!zone->flip.timer)
|
|
|
|
zone->flip.timer = ecore_timer_add(e_config->edge_flip_timeout, _e_zone_cb_timer, zone);
|
2005-04-22 02:23:00 -07:00
|
|
|
zone->flip.direction = E_DIRECTION_UP;
|
2005-04-22 01:19:39 -07:00
|
|
|
}
|
|
|
|
else if (ev->win == zone->flip.right)
|
|
|
|
{
|
2005-07-26 21:51:42 -07:00
|
|
|
if (!zone->flip.timer)
|
|
|
|
zone->flip.timer = ecore_timer_add(e_config->edge_flip_timeout, _e_zone_cb_timer, zone);
|
2005-04-22 02:23:00 -07:00
|
|
|
zone->flip.direction = E_DIRECTION_RIGHT;
|
2005-04-22 01:19:39 -07:00
|
|
|
}
|
|
|
|
else if (ev->win == zone->flip.bottom)
|
|
|
|
{
|
2005-07-26 21:51:42 -07:00
|
|
|
if (!zone->flip.timer)
|
|
|
|
zone->flip.timer = ecore_timer_add(e_config->edge_flip_timeout, _e_zone_cb_timer, zone);
|
2005-04-22 02:23:00 -07:00
|
|
|
zone->flip.direction = E_DIRECTION_DOWN;
|
2005-04-22 01:19:39 -07:00
|
|
|
}
|
|
|
|
else if (ev->win == zone->flip.left)
|
|
|
|
{
|
2005-07-26 21:51:42 -07:00
|
|
|
if (!zone->flip.timer)
|
|
|
|
zone->flip.timer = ecore_timer_add(e_config->edge_flip_timeout, _e_zone_cb_timer, zone);
|
2005-04-22 02:23:00 -07:00
|
|
|
zone->flip.direction = E_DIRECTION_LEFT;
|
2005-04-22 01:19:39 -07:00
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_zone_cb_mouse_out(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Out *ev;
|
|
|
|
E_Zone *zone;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
zone = data;
|
|
|
|
|
2005-07-26 21:51:42 -07:00
|
|
|
if ((ev->win == zone->flip.top) ||
|
|
|
|
(ev->win == zone->flip.bottom) ||
|
|
|
|
(ev->win == zone->flip.left) ||
|
|
|
|
(ev->win == zone->flip.right))
|
|
|
|
{
|
|
|
|
if (zone->flip.timer)
|
|
|
|
ecore_timer_del(zone->flip.timer);
|
|
|
|
zone->flip.timer = NULL;
|
|
|
|
}
|
2005-04-22 01:19:39 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_zone_cb_timer(void *data)
|
|
|
|
{
|
|
|
|
E_Zone *zone;
|
2005-06-08 07:06:28 -07:00
|
|
|
E_Desk *prev = NULL, *current = NULL;
|
2005-07-01 01:20:05 -07:00
|
|
|
E_Event_Pointer_Warp *ev;
|
2005-04-22 07:33:35 -07:00
|
|
|
int x, y;
|
2005-04-22 01:19:39 -07:00
|
|
|
|
2005-07-01 01:20:05 -07:00
|
|
|
ev = E_NEW(E_Event_Pointer_Warp, 1);
|
|
|
|
if (!ev) return 0;
|
|
|
|
|
2005-04-22 01:19:39 -07:00
|
|
|
zone = data;
|
2005-04-22 02:23:00 -07:00
|
|
|
|
2005-04-30 00:03:35 -07:00
|
|
|
ecore_x_pointer_xy_get(zone->container->win, &x, &y);
|
2005-07-01 01:20:05 -07:00
|
|
|
ev->prev.x = x;
|
|
|
|
ev->prev.y = y;
|
2005-06-08 07:06:28 -07:00
|
|
|
prev = e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current);
|
2005-04-22 02:23:00 -07:00
|
|
|
|
2005-04-22 07:33:35 -07:00
|
|
|
switch (zone->flip.direction)
|
|
|
|
{
|
|
|
|
case E_DIRECTION_UP:
|
2005-07-26 21:51:42 -07:00
|
|
|
if (E_ZONE_FLIP_UP(zone))
|
2005-04-22 07:33:35 -07:00
|
|
|
{
|
2005-06-08 07:06:28 -07:00
|
|
|
current = e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current - 1);
|
|
|
|
if (current)
|
2005-04-22 07:33:35 -07:00
|
|
|
{
|
2005-06-08 07:06:28 -07:00
|
|
|
e_desk_show(current);
|
2005-04-27 00:30:37 -07:00
|
|
|
ecore_x_pointer_warp(zone->container->win, x, zone->h - 2);
|
2005-07-01 01:20:05 -07:00
|
|
|
ev->curr.x = x;
|
|
|
|
ev->curr.y = zone->h - 2;
|
2005-04-22 07:33:35 -07:00
|
|
|
}
|
|
|
|
}
|
2005-07-26 21:51:42 -07:00
|
|
|
break;
|
2005-04-22 07:33:35 -07:00
|
|
|
case E_DIRECTION_RIGHT:
|
2005-07-26 21:51:42 -07:00
|
|
|
if (E_ZONE_FLIP_RIGHT(zone))
|
|
|
|
{
|
|
|
|
current = e_desk_at_xy_get(zone, zone->desk_x_current + 1, zone->desk_y_current);
|
|
|
|
if (current)
|
|
|
|
{
|
|
|
|
e_desk_show(current);
|
|
|
|
ecore_x_pointer_warp(zone->container->win, 2, y);
|
|
|
|
ev->curr.y = y;
|
|
|
|
ev->curr.x = 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2005-04-22 07:33:35 -07:00
|
|
|
case E_DIRECTION_DOWN:
|
2005-07-26 21:51:42 -07:00
|
|
|
if (E_ZONE_FLIP_DOWN(zone))
|
|
|
|
{
|
|
|
|
current = e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current + 1);
|
|
|
|
if (current)
|
|
|
|
{
|
|
|
|
e_desk_show(current);
|
|
|
|
ecore_x_pointer_warp(zone->container->win, x, 2);
|
|
|
|
ev->curr.x = x;
|
|
|
|
ev->curr.y = 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2005-04-22 07:33:35 -07:00
|
|
|
case E_DIRECTION_LEFT:
|
2005-07-26 21:51:42 -07:00
|
|
|
if (E_ZONE_FLIP_LEFT(zone))
|
|
|
|
{
|
|
|
|
current = e_desk_at_xy_get(zone, zone->desk_x_current - 1, zone->desk_y_current);
|
|
|
|
if (current)
|
|
|
|
{
|
|
|
|
e_desk_show(current);
|
|
|
|
ecore_x_pointer_warp(zone->container->win, zone->w - 2, y);
|
|
|
|
ev->curr.y = y;
|
|
|
|
ev->curr.x = zone->w - 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2005-04-22 02:23:00 -07:00
|
|
|
}
|
2005-07-26 21:51:42 -07:00
|
|
|
|
2005-04-22 01:19:39 -07:00
|
|
|
zone->flip.timer = NULL;
|
2005-07-26 21:51:42 -07:00
|
|
|
|
2005-06-08 07:06:28 -07:00
|
|
|
if (current)
|
2005-07-01 01:20:05 -07:00
|
|
|
ecore_event_add(E_EVENT_POINTER_WARP, ev, NULL, NULL);
|
|
|
|
else
|
|
|
|
free(ev);
|
2005-07-26 21:51:42 -07:00
|
|
|
|
2005-04-22 01:19:39 -07:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-05-08 09:21:27 -07:00
|
|
|
static int
|
|
|
|
_e_zone_cb_desk_show(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
E_Event_Desk_Show *ev;
|
2005-05-09 14:06:01 -07:00
|
|
|
E_Zone *zone;
|
2005-05-08 09:21:27 -07:00
|
|
|
|
|
|
|
ev = event;
|
2005-05-09 14:06:01 -07:00
|
|
|
zone = data;
|
|
|
|
if (ev->desk->zone != zone) return 1;
|
|
|
|
|
|
|
|
_e_zone_update_flip(zone);
|
2005-05-08 09:21:27 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2005-04-22 01:19:39 -07:00
|
|
|
static void
|
|
|
|
_e_zone_update_flip(E_Zone *zone)
|
|
|
|
{
|
2005-05-11 23:53:16 -07:00
|
|
|
|
|
|
|
if ((e_config->use_edge_flip) &&
|
|
|
|
/* if we have more than 1 zone - disable */
|
|
|
|
(evas_list_count(zone->container->zones) == 1))
|
2005-05-01 23:10:11 -07:00
|
|
|
{
|
2005-05-11 23:53:16 -07:00
|
|
|
if (E_ZONE_FLIP_LEFT(zone))
|
|
|
|
{
|
|
|
|
ecore_x_window_show(zone->flip.left);
|
|
|
|
e_container_window_raise(zone->container, zone->flip.left, 999);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ecore_x_window_hide(zone->flip.left);
|
|
|
|
|
|
|
|
if (E_ZONE_FLIP_RIGHT(zone))
|
|
|
|
{
|
|
|
|
ecore_x_window_show(zone->flip.right);
|
|
|
|
e_container_window_raise(zone->container, zone->flip.right, 999);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ecore_x_window_hide(zone->flip.right);
|
|
|
|
|
|
|
|
if (E_ZONE_FLIP_UP(zone))
|
|
|
|
{
|
|
|
|
ecore_x_window_show(zone->flip.top);
|
|
|
|
e_container_window_raise(zone->container, zone->flip.top, 999);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ecore_x_window_hide(zone->flip.top);
|
|
|
|
|
|
|
|
if (E_ZONE_FLIP_DOWN(zone))
|
|
|
|
{
|
|
|
|
ecore_x_window_show(zone->flip.bottom);
|
|
|
|
e_container_window_raise(zone->container, zone->flip.bottom, 999);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ecore_x_window_hide(zone->flip.bottom);
|
|
|
|
|
2005-05-01 23:10:11 -07:00
|
|
|
}
|
2005-04-22 01:19:39 -07:00
|
|
|
else
|
2005-05-01 23:10:11 -07:00
|
|
|
{
|
2005-05-11 23:53:16 -07:00
|
|
|
ecore_x_window_hide(zone->flip.left);
|
|
|
|
ecore_x_window_hide(zone->flip.right);
|
|
|
|
ecore_x_window_hide(zone->flip.top);
|
|
|
|
ecore_x_window_hide(zone->flip.bottom);
|
2005-05-01 23:10:11 -07:00
|
|
|
}
|
2005-04-22 01:19:39 -07:00
|
|
|
}
|