2005-01-05 00:30:25 -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"
|
|
|
|
|
|
|
|
/* TODO List:
|
|
|
|
*
|
|
|
|
* * fix shape callbacks to be able to be safely deleted
|
2005-05-13 06:34:21 -07:00
|
|
|
* * remove duplicate bd->layer -> layers code
|
|
|
|
*
|
2004-11-24 19:37:45 -08:00
|
|
|
*/
|
|
|
|
|
|
|
|
/* local subsystem functions */
|
|
|
|
static void _e_container_free(E_Container *con);
|
|
|
|
|
2005-07-30 23:22:31 -07:00
|
|
|
static E_Container *_e_container_find_by_event_window(Ecore_X_Window win);
|
|
|
|
|
|
|
|
static int _e_container_cb_mouse_in(void *data, int type, void *event);
|
|
|
|
static int _e_container_cb_mouse_out(void *data, int type, void *event);
|
|
|
|
static int _e_container_cb_mouse_down(void *data, int type, void *event);
|
|
|
|
static int _e_container_cb_mouse_up(void *data, int type, void *event);
|
|
|
|
static int _e_container_cb_mouse_move(void *data, int type, void *event);
|
|
|
|
static int _e_container_cb_mouse_wheel(void *data, int type, void *event);
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
static void _e_container_shape_del(E_Container_Shape *es);
|
|
|
|
static void _e_container_shape_free(E_Container_Shape *es);
|
|
|
|
static void _e_container_shape_change_call(E_Container_Shape *es, E_Container_Shape_Change ch);
|
2004-12-25 07:33:48 -08:00
|
|
|
static void _e_container_resize_handle(E_Container *con);
|
|
|
|
static void _e_container_event_container_resize_free(void *data, void *ev);
|
|
|
|
|
|
|
|
int E_EVENT_CONTAINER_RESIZE = 0;
|
2005-01-05 02:37:53 -08:00
|
|
|
static int container_count;
|
2005-07-30 23:22:31 -07:00
|
|
|
static Evas_List *handlers = NULL;
|
2004-11-24 19:37:45 -08:00
|
|
|
|
|
|
|
/* externally accessible functions */
|
|
|
|
int
|
|
|
|
e_container_init(void)
|
|
|
|
{
|
2004-12-25 07:33:48 -08:00
|
|
|
E_EVENT_CONTAINER_RESIZE = ecore_event_type_new();
|
2005-01-05 02:37:53 -08:00
|
|
|
container_count = 0;
|
2005-07-30 23:22:31 -07:00
|
|
|
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN, _e_container_cb_mouse_in, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT, _e_container_cb_mouse_out, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN, _e_container_cb_mouse_down, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, _e_container_cb_mouse_up, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, _e_container_cb_mouse_move, NULL));
|
|
|
|
handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_WHEEL, _e_container_cb_mouse_wheel, NULL));
|
2004-11-24 19:37:45 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
e_container_shutdown(void)
|
|
|
|
{
|
2005-07-30 23:22:31 -07:00
|
|
|
while (handlers)
|
|
|
|
{
|
|
|
|
ecore_event_handler_del(handlers->data);
|
|
|
|
handlers = evas_list_remove_list(handlers, handlers);
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
E_Container *
|
|
|
|
e_container_new(E_Manager *man)
|
|
|
|
{
|
|
|
|
E_Container *con;
|
2005-01-03 01:34:24 -08:00
|
|
|
E_Zone *zone;
|
2005-01-03 17:32:23 -08:00
|
|
|
Evas_Object *o;
|
2005-01-05 00:30:25 -08:00
|
|
|
char name[40];
|
2005-03-07 01:56:49 -08:00
|
|
|
Evas_List *l, *screens;
|
2005-04-28 02:55:41 -07:00
|
|
|
int i;
|
2005-05-03 23:39:37 -07:00
|
|
|
Ecore_X_Window mwin;
|
2005-07-01 22:22:58 -07:00
|
|
|
static int container_num = 0;
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2005-01-21 22:58:34 -08:00
|
|
|
con = E_OBJECT_ALLOC(E_Container, E_CONTAINER_TYPE, _e_container_free);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (!con) return NULL;
|
|
|
|
con->manager = man;
|
|
|
|
con->manager->containers = evas_list_append(con->manager->containers, con);
|
|
|
|
con->w = con->manager->w;
|
|
|
|
con->h = con->manager->h;
|
2005-03-11 05:09:06 -08:00
|
|
|
if (e_config->use_virtual_roots)
|
|
|
|
{
|
|
|
|
con->win = ecore_x_window_override_new(con->manager->win, con->x, con->y, con->w, con->h);
|
|
|
|
ecore_x_icccm_title_set(con->win, "Enlightenment Container");
|
2005-05-29 04:37:18 -07:00
|
|
|
ecore_x_netwm_name_set(con->win, "Enlightenment Container");
|
2005-05-17 04:57:22 -07:00
|
|
|
ecore_x_window_raise(con->win);
|
2005-03-11 05:09:06 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
con->win = con->manager->win;
|
|
|
|
}
|
2005-05-07 06:50:38 -07:00
|
|
|
if (e_canvas_engine_decide(e_config->evas_engine_container) ==
|
|
|
|
E_EVAS_ENGINE_GL_X11)
|
|
|
|
{
|
|
|
|
con->bg_ecore_evas = ecore_evas_gl_x11_new(NULL, con->win, 0, 0, con->w, con->h);
|
|
|
|
ecore_evas_gl_x11_direct_resize_set(con->bg_ecore_evas, 1);
|
|
|
|
ecore_evas_override_set(con->bg_ecore_evas, 1);
|
|
|
|
con->bg_win = ecore_evas_gl_x11_window_get(con->bg_ecore_evas);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
con->bg_ecore_evas = ecore_evas_software_x11_new(NULL, con->win, 0, 0, con->w, con->h);
|
|
|
|
ecore_evas_software_x11_direct_resize_set(con->bg_ecore_evas, 1);
|
|
|
|
ecore_evas_override_set(con->bg_ecore_evas, 1);
|
|
|
|
con->bg_win = ecore_evas_software_x11_window_get(con->bg_ecore_evas);
|
|
|
|
}
|
2005-07-30 23:22:31 -07:00
|
|
|
con->event_win = ecore_x_window_input_new(con->bg_win, 0, 0, con->w, con->h);
|
|
|
|
ecore_x_window_show(con->event_win);
|
2004-11-24 19:37:45 -08:00
|
|
|
e_canvas_add(con->bg_ecore_evas);
|
|
|
|
con->bg_evas = ecore_evas_get(con->bg_ecore_evas);
|
|
|
|
ecore_evas_name_class_set(con->bg_ecore_evas, "E", "Background_Window");
|
|
|
|
ecore_evas_title_set(con->bg_ecore_evas, "Enlightenment Background");
|
|
|
|
ecore_evas_avoid_damage_set(con->bg_ecore_evas, 1);
|
2005-03-11 05:09:06 -08:00
|
|
|
ecore_x_window_lower(con->bg_win);
|
2005-01-03 12:40:26 -08:00
|
|
|
|
2005-01-10 06:07:42 -08:00
|
|
|
o = evas_object_rectangle_add(con->bg_evas);
|
|
|
|
con->bg_blank_object = o;
|
|
|
|
evas_object_layer_set(o, -100);
|
|
|
|
evas_object_move(o, 0, 0);
|
|
|
|
evas_object_resize(o, con->w, con->h);
|
|
|
|
evas_object_color_set(o, 255, 255, 255, 255);
|
2005-01-03 17:32:23 -08:00
|
|
|
evas_object_name_set(o, "desktop/background");
|
|
|
|
evas_object_data_set(o, "e_container", con);
|
2005-01-10 06:07:42 -08:00
|
|
|
evas_object_show(o);
|
2005-01-03 17:32:23 -08:00
|
|
|
|
2005-08-16 18:35:48 -07:00
|
|
|
con->pointer.root = e_pointer_window_set(con->manager->root);
|
2005-01-03 01:34:24 -08:00
|
|
|
|
2005-07-01 22:22:58 -07:00
|
|
|
con->num = container_num;
|
|
|
|
container_num++;
|
2005-05-22 16:43:26 -07:00
|
|
|
snprintf(name, sizeof(name), _("Container %d"), con->num);
|
2005-01-05 00:30:25 -08:00
|
|
|
con->name = strdup(name);
|
|
|
|
|
2005-04-28 02:55:41 -07:00
|
|
|
/* init layers */
|
|
|
|
for (i = 0; i < 7; i++)
|
|
|
|
{
|
2005-05-13 00:20:09 -07:00
|
|
|
con->layers[i].win = ecore_x_window_input_new(con->win, 0, 0, 1, 1);
|
2005-04-28 02:55:41 -07:00
|
|
|
|
|
|
|
if (i > 0)
|
2005-05-13 00:20:09 -07:00
|
|
|
ecore_x_window_configure(con->layers[i].win,
|
2005-04-28 02:55:41 -07:00
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
|
|
|
0, 0, 0, 0, 0,
|
2005-05-13 00:20:09 -07:00
|
|
|
con->layers[i - 1].win, ECORE_X_WINDOW_STACK_ABOVE);
|
2005-05-17 04:57:22 -07:00
|
|
|
else
|
|
|
|
ecore_x_window_raise(con->layers[i].win);
|
2005-04-28 02:55:41 -07:00
|
|
|
}
|
|
|
|
|
2005-05-17 04:57:22 -07:00
|
|
|
/* Put init win on top */
|
2005-05-03 23:39:37 -07:00
|
|
|
mwin = e_init_window_get();
|
|
|
|
if (mwin)
|
|
|
|
ecore_x_window_configure(mwin,
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
|
|
|
0, 0, 0, 0, 0,
|
2005-05-13 00:20:09 -07:00
|
|
|
con->layers[6].win, ECORE_X_WINDOW_STACK_ABOVE);
|
2005-05-03 23:39:37 -07:00
|
|
|
|
|
|
|
|
2005-05-17 04:57:22 -07:00
|
|
|
/* Put menu win on top */
|
2005-05-03 23:41:40 -07:00
|
|
|
mwin = e_menu_grab_window_get();
|
|
|
|
if (mwin)
|
|
|
|
ecore_x_window_configure(mwin,
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
|
|
|
0, 0, 0, 0, 0,
|
2005-05-13 00:20:09 -07:00
|
|
|
con->layers[6].win, ECORE_X_WINDOW_STACK_ABOVE);
|
2005-05-03 23:41:40 -07:00
|
|
|
|
2005-05-17 04:57:22 -07:00
|
|
|
/* Put background win at the bottom */
|
|
|
|
ecore_x_window_configure(con->bg_win,
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
|
|
|
0, 0, 0, 0, 0,
|
|
|
|
con->layers[0].win, ECORE_X_WINDOW_STACK_BELOW);
|
2005-05-03 23:41:40 -07:00
|
|
|
|
2005-03-07 01:56:49 -08:00
|
|
|
screens = (Evas_List *)e_xinerama_screens_get();
|
2005-04-25 01:29:53 -07:00
|
|
|
if (screens)
|
2005-01-10 06:07:42 -08:00
|
|
|
{
|
2005-04-25 01:29:53 -07:00
|
|
|
for (l = screens; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Screen *scr;
|
|
|
|
|
|
|
|
scr = l->data;
|
|
|
|
zone = e_zone_new(con, scr->screen, scr->x, scr->y, scr->w, scr->h);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
zone = e_zone_new(con, 0, 0, 0, con->w, con->h);
|
2005-01-10 06:07:42 -08:00
|
|
|
}
|
2005-01-15 01:50:26 -08:00
|
|
|
con->gadman = e_gadman_new(con);
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
return con;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_show(E_Container *con)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(con);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(con, E_CONTAINER_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (con->visible) return;
|
2005-03-11 05:09:06 -08:00
|
|
|
ecore_evas_show(con->bg_ecore_evas);
|
2005-05-17 04:57:22 -07:00
|
|
|
ecore_x_window_configure(con->bg_win,
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
|
|
|
0, 0, 0, 0, 0,
|
|
|
|
con->layers[0].win, ECORE_X_WINDOW_STACK_BELOW);
|
2005-03-11 05:09:06 -08:00
|
|
|
if (con->win != con->manager->win)
|
|
|
|
ecore_x_window_show(con->win);
|
2005-04-29 04:21:14 -07:00
|
|
|
ecore_x_icccm_state_set(con->bg_win, ECORE_X_WINDOW_STATE_HINT_NORMAL);
|
2004-11-24 19:37:45 -08:00
|
|
|
con->visible = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_hide(E_Container *con)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(con);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(con, E_CONTAINER_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (!con->visible) return;
|
2005-03-11 05:09:06 -08:00
|
|
|
ecore_evas_hide(con->bg_ecore_evas);
|
|
|
|
if (con->win != con->manager->win)
|
|
|
|
ecore_x_window_hide(con->win);
|
2004-11-24 19:37:45 -08:00
|
|
|
con->visible = 0;
|
|
|
|
}
|
|
|
|
|
2005-01-05 00:30:25 -08:00
|
|
|
E_Container *
|
|
|
|
e_container_current_get(E_Manager *man)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
|
|
|
E_OBJECT_CHECK_RETURN(man, NULL);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
|
2005-01-05 00:30:25 -08:00
|
|
|
|
|
|
|
for (l = man->containers; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Container *con = l->data;
|
|
|
|
if (con->visible)
|
|
|
|
return con;
|
|
|
|
}
|
2005-06-03 00:02:50 -07:00
|
|
|
/* If noone is available, return the first */
|
2005-06-03 04:41:20 -07:00
|
|
|
if (!man->containers)
|
|
|
|
return NULL;
|
|
|
|
l = man->containers;
|
|
|
|
return (E_Container *)l->data;
|
2005-01-05 00:30:25 -08:00
|
|
|
}
|
|
|
|
|
2005-08-25 06:41:26 -07:00
|
|
|
E_Container *
|
|
|
|
e_container_number_get(E_Manager *man, int num)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
|
|
|
|
|
|
|
E_OBJECT_CHECK_RETURN(man, NULL);
|
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
|
|
|
|
for (l = man->containers; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Container *con;
|
|
|
|
|
|
|
|
con = l->data;
|
|
|
|
if (con->num == num)
|
|
|
|
return con;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
void
|
|
|
|
e_container_move(E_Container *con, int x, int y)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(con);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(con, E_CONTAINER_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if ((x == con->x) && (y == con->y)) return;
|
|
|
|
con->x = x;
|
|
|
|
con->y = y;
|
2005-03-11 05:09:06 -08:00
|
|
|
if (con->win != con->manager->win)
|
|
|
|
ecore_x_window_move(con->win, con->x, con->y);
|
2005-01-03 17:32:23 -08:00
|
|
|
evas_object_move(con->bg_blank_object, con->x, con->y);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_resize(E_Container *con, int w, int h)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(con);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(con, E_CONTAINER_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if ((w == con->w) && (h == con->h)) return;
|
|
|
|
con->w = w;
|
|
|
|
con->h = h;
|
2005-03-11 05:09:06 -08:00
|
|
|
if (con->win != con->manager->win)
|
|
|
|
ecore_x_window_resize(con->win, con->w, con->h);
|
2004-11-24 19:37:45 -08:00
|
|
|
ecore_evas_resize(con->bg_ecore_evas, con->w, con->h);
|
2005-01-03 17:32:23 -08:00
|
|
|
evas_object_resize(con->bg_blank_object, con->w, con->h);
|
2005-03-31 08:52:12 -08:00
|
|
|
_e_container_resize_handle(con);
|
2004-12-25 07:33:48 -08:00
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
|
|
|
|
void
|
|
|
|
e_container_move_resize(E_Container *con, int x, int y, int w, int h)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(con);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(con, E_CONTAINER_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if ((x == con->x) && (y == con->y) && (w == con->w) && (h == con->h)) return;
|
|
|
|
con->x = x;
|
|
|
|
con->y = y;
|
|
|
|
con->w = w;
|
|
|
|
con->h = h;
|
2005-03-11 05:09:06 -08:00
|
|
|
if (con->win != con->manager->win)
|
|
|
|
ecore_x_window_move_resize(con->win, con->x, con->y, con->w, con->h);
|
2004-11-24 19:37:45 -08:00
|
|
|
ecore_evas_resize(con->bg_ecore_evas, con->w, con->h);
|
2005-01-03 17:32:23 -08:00
|
|
|
evas_object_move(con->bg_blank_object, con->x, con->y);
|
|
|
|
evas_object_resize(con->bg_blank_object, con->w, con->h);
|
2005-03-31 08:52:12 -08:00
|
|
|
_e_container_resize_handle(con);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_raise(E_Container *con)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(con);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(con, E_CONTAINER_TYPE);
|
2005-05-17 04:57:22 -07:00
|
|
|
#if 0
|
2005-03-11 05:09:06 -08:00
|
|
|
if (con->win != con->manager->win)
|
|
|
|
{
|
|
|
|
ecore_x_window_raise(con->win);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ecore_x_window_lower(con->bg_win);
|
|
|
|
}
|
2005-05-17 04:57:22 -07:00
|
|
|
#endif
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_lower(E_Container *con)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(con);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(con, E_CONTAINER_TYPE);
|
2005-05-17 04:57:22 -07:00
|
|
|
#if 0
|
2005-03-11 05:09:06 -08:00
|
|
|
if (con->win != con->manager->win)
|
|
|
|
ecore_x_window_lower(con->win);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ecore_x_window_lower(con->bg_win);
|
|
|
|
}
|
2005-05-17 04:57:22 -07:00
|
|
|
#endif
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2005-01-19 07:39:36 -08:00
|
|
|
E_Zone *
|
|
|
|
e_container_zone_at_point_get(E_Container *con, int x, int y)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
|
|
|
|
|
|
|
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-01-19 07:39:36 -08:00
|
|
|
for (l = con->zones; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Zone *zone;
|
|
|
|
|
|
|
|
zone = l->data;
|
|
|
|
if ((E_SPANS_COMMON(zone->x, zone->w, x, 1)) &&
|
|
|
|
(E_SPANS_COMMON(zone->y, zone->h, y, 1)))
|
|
|
|
return zone;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2005-01-21 07:45:56 -08:00
|
|
|
E_Zone *
|
|
|
|
e_container_zone_number_get(E_Container *con, int num)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
|
|
|
|
|
|
|
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-01-21 07:45:56 -08:00
|
|
|
for (l = con->zones; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Zone *zone;
|
|
|
|
|
|
|
|
zone = l->data;
|
|
|
|
if (zone->num == num)
|
|
|
|
return zone;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
E_Container_Shape *
|
|
|
|
e_container_shape_add(E_Container *con)
|
|
|
|
{
|
|
|
|
E_Container_Shape *es;
|
|
|
|
|
|
|
|
E_OBJECT_CHECK_RETURN(con, NULL);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(con, E_CONTAINER_TYPE, 0);
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2005-01-21 22:58:34 -08:00
|
|
|
es = E_OBJECT_ALLOC(E_Container_Shape, E_CONTAINER_SHAPE_TYPE, _e_container_shape_free);
|
2004-11-24 19:37:45 -08:00
|
|
|
E_OBJECT_DEL_SET(es, _e_container_shape_del);
|
|
|
|
es->con = con;
|
|
|
|
con->shapes = evas_list_append(con->shapes, es);
|
|
|
|
_e_container_shape_change_call(es, E_CONTAINER_SHAPE_ADD);
|
|
|
|
return es;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_shape_show(E_Container_Shape *es)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(es);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(es, E_CONTAINER_SHAPE_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (es->visible) return;
|
|
|
|
es->visible = 1;
|
|
|
|
_e_container_shape_change_call(es, E_CONTAINER_SHAPE_SHOW);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_shape_hide(E_Container_Shape *es)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(es);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(es, E_CONTAINER_SHAPE_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (!es->visible) return;
|
|
|
|
es->visible = 0;
|
|
|
|
_e_container_shape_change_call(es, E_CONTAINER_SHAPE_HIDE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_shape_move(E_Container_Shape *es, int x, int y)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(es);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(es, E_CONTAINER_SHAPE_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if ((es->x == x) && (es->y == y)) return;
|
|
|
|
es->x = x;
|
|
|
|
es->y = y;
|
|
|
|
_e_container_shape_change_call(es, E_CONTAINER_SHAPE_MOVE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_shape_resize(E_Container_Shape *es, int w, int h)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(es);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(es, E_CONTAINER_SHAPE_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (w < 1) w = 1;
|
|
|
|
if (h < 1) h = 1;
|
|
|
|
if ((es->w == w) && (es->h == h)) return;
|
|
|
|
es->w = w;
|
|
|
|
es->h = h;
|
|
|
|
_e_container_shape_change_call(es, E_CONTAINER_SHAPE_RESIZE);
|
|
|
|
}
|
|
|
|
|
|
|
|
Evas_List *
|
|
|
|
e_container_shape_list_get(E_Container *con)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK_RETURN(con, NULL);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(con, E_CONTAINER_TYPE, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
return con->shapes;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_shape_geometry_get(E_Container_Shape *es, int *x, int *y, int *w, int *h)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(es);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(es, E_CONTAINER_SHAPE_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (x) *x = es->x;
|
|
|
|
if (y) *y = es->y;
|
|
|
|
if (w) *w = es->w;
|
|
|
|
if (h) *h = es->h;
|
|
|
|
}
|
|
|
|
|
|
|
|
E_Container *
|
|
|
|
e_container_shape_container_get(E_Container_Shape *es)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK_RETURN(es, NULL);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(es, E_CONTAINER_SHAPE_TYPE, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
return es->con;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_shape_change_callback_add(E_Container *con, void (*func) (void *data, E_Container_Shape *es, E_Container_Shape_Change ch), void *data)
|
|
|
|
{
|
|
|
|
E_Container_Shape_Callback *cb;
|
|
|
|
|
|
|
|
E_OBJECT_CHECK(con);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(con, E_CONTAINER_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
cb = calloc(1, sizeof(E_Container_Shape_Callback));
|
|
|
|
if (!cb) return;
|
|
|
|
cb->func = func;
|
|
|
|
cb->data = data;
|
|
|
|
con->shape_change_cb = evas_list_append(con->shape_change_cb, cb);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_shape_change_callback_del(E_Container *con, void (*func) (void *data, E_Container_Shape *es, E_Container_Shape_Change ch), void *data)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
|
|
|
|
|
|
|
/* FIXME: if we call this from within a callback we are in trouble */
|
|
|
|
E_OBJECT_CHECK(con);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(con, E_CONTAINER_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
for (l = con->shape_change_cb; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Container_Shape_Callback *cb;
|
|
|
|
|
|
|
|
cb = l->data;
|
|
|
|
if ((cb->func == func) && (cb->data == data))
|
|
|
|
{
|
|
|
|
con->shape_change_cb = evas_list_remove_list(con->shape_change_cb, l);
|
|
|
|
free(cb);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Evas_List *
|
|
|
|
e_container_shape_rects_get(E_Container_Shape *es)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK_RETURN(es, NULL);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(es, E_CONTAINER_SHAPE_TYPE, NULL);
|
2004-11-24 19:37:45 -08:00
|
|
|
return es->shape;
|
|
|
|
}
|
|
|
|
|
2005-04-13 08:52:34 -07:00
|
|
|
void
|
|
|
|
e_container_shape_rects_set(E_Container_Shape *es, Ecore_X_Rectangle *rects, int num)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
|
|
|
int i;
|
2005-06-27 00:57:40 -07:00
|
|
|
E_Rect *r;
|
2005-04-13 08:52:34 -07:00
|
|
|
|
|
|
|
E_OBJECT_CHECK(es);
|
|
|
|
E_OBJECT_TYPE_CHECK(es, E_CONTAINER_SHAPE_TYPE);
|
|
|
|
if (es->shape)
|
|
|
|
{
|
|
|
|
for (l = es->shape; l; l = l->next)
|
|
|
|
free(l->data);
|
|
|
|
evas_list_free(es->shape);
|
|
|
|
es->shape = NULL;
|
|
|
|
}
|
|
|
|
if (rects)
|
|
|
|
{
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
{
|
|
|
|
r = malloc(sizeof(E_Rect));
|
|
|
|
if (r)
|
|
|
|
{
|
|
|
|
r->x = rects[i].x;
|
|
|
|
r->y = rects[i].y;
|
|
|
|
r->w = rects[i].width;
|
|
|
|
r->h = rects[i].height;
|
|
|
|
es->shape = evas_list_append(es->shape, r);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
_e_container_shape_change_call(es, E_CONTAINER_SHAPE_RECTS);
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2005-04-13 08:52:34 -07:00
|
|
|
void
|
|
|
|
e_container_shape_solid_rect_set(E_Container_Shape *es, int x, int y, int w, int h)
|
|
|
|
{
|
|
|
|
es->solid_rect.x = x;
|
|
|
|
es->solid_rect.y = y;
|
|
|
|
es->solid_rect.w = w;
|
|
|
|
es->solid_rect.h = h;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2005-04-13 08:52:34 -07:00
|
|
|
void
|
|
|
|
e_container_shape_solid_rect_get(E_Container_Shape *es, int *x, int *y, int *w, int *h)
|
|
|
|
{
|
|
|
|
if (x) *x = es->solid_rect.x;
|
|
|
|
if (y) *y = es->solid_rect.y;
|
|
|
|
if (w) *w = es->solid_rect.w;
|
|
|
|
if (h) *h = es->solid_rect.h;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2005-04-28 02:55:41 -07:00
|
|
|
/* layers
|
|
|
|
* 0 = desktop
|
|
|
|
* 50 = below
|
|
|
|
* 100 = normal
|
|
|
|
* 150 = above
|
|
|
|
* 200 = fullscreen
|
|
|
|
* 999 = internal on top windows for E
|
|
|
|
*/
|
2005-05-13 06:34:21 -07:00
|
|
|
int
|
|
|
|
e_container_borders_count(E_Container *con)
|
|
|
|
{
|
|
|
|
/* FIXME: This could be stored and not calculated */
|
|
|
|
int num, i;
|
|
|
|
|
|
|
|
num = 0;
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
num += evas_list_count(con->layers[i].clients);
|
|
|
|
|
|
|
|
return num;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_border_add(E_Border *bd)
|
|
|
|
{
|
|
|
|
int pos;
|
|
|
|
|
|
|
|
if (bd->layer == 0) pos = 0;
|
|
|
|
else if ((bd->layer > 0) && (bd->layer <= 50)) pos = 1;
|
|
|
|
else if ((bd->layer > 50) && (bd->layer <= 100)) pos = 2;
|
|
|
|
else if ((bd->layer > 100) && (bd->layer <= 150)) pos = 3;
|
|
|
|
else if ((bd->layer > 150) && (bd->layer <= 200)) pos = 4;
|
|
|
|
else pos = 5;
|
|
|
|
|
|
|
|
bd->zone->container->layers[pos].clients =
|
|
|
|
evas_list_append(bd->zone->container->layers[pos].clients, bd);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_border_remove(E_Border *bd)
|
|
|
|
{
|
2005-05-18 21:38:32 -07:00
|
|
|
int i;
|
2005-05-13 06:34:21 -07:00
|
|
|
|
2005-05-18 21:57:59 -07:00
|
|
|
/* FIXME: Could revert to old behaviour, ->layer is consistent
|
|
|
|
* with pos now. */
|
2005-05-18 21:38:32 -07:00
|
|
|
for (i = 0; i < 7; i++)
|
|
|
|
{
|
|
|
|
bd->zone->container->layers[i].clients =
|
|
|
|
evas_list_remove(bd->zone->container->layers[i].clients, bd);
|
|
|
|
}
|
2005-05-13 06:34:21 -07:00
|
|
|
}
|
|
|
|
|
2005-04-28 02:55:41 -07:00
|
|
|
void
|
|
|
|
e_container_window_raise(E_Container *con, Ecore_X_Window win, int layer)
|
|
|
|
{
|
2005-05-13 02:23:51 -07:00
|
|
|
int pos;
|
|
|
|
|
2005-04-28 03:42:04 -07:00
|
|
|
if (layer == 0) pos = 1;
|
|
|
|
else if ((layer > 0) && (layer <= 50)) pos = 2;
|
|
|
|
else if ((layer > 50) && (layer <= 100)) pos = 3;
|
|
|
|
else if ((layer > 100) && (layer <= 150)) pos = 4;
|
|
|
|
else if ((layer > 150) && (layer <= 200)) pos = 5;
|
|
|
|
else pos = 6;
|
|
|
|
|
|
|
|
ecore_x_window_configure(win,
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
|
|
|
0, 0, 0, 0, 0,
|
2005-05-13 00:20:09 -07:00
|
|
|
con->layers[pos].win, ECORE_X_WINDOW_STACK_BELOW);
|
2005-04-28 03:42:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_window_lower(E_Container *con, Ecore_X_Window win, int layer)
|
|
|
|
{
|
2005-05-13 02:23:51 -07:00
|
|
|
int pos;
|
|
|
|
|
2005-04-28 02:55:41 -07:00
|
|
|
if (layer == 0) pos = 0;
|
|
|
|
else if ((layer > 0) && (layer <= 50)) pos = 1;
|
|
|
|
else if ((layer > 50) && (layer <= 100)) pos = 2;
|
|
|
|
else if ((layer > 100) && (layer <= 150)) pos = 3;
|
|
|
|
else if ((layer > 150) && (layer <= 200)) pos = 4;
|
|
|
|
else pos = 5;
|
|
|
|
|
|
|
|
ecore_x_window_configure(win,
|
2005-04-28 03:42:04 -07:00
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
|
|
|
0, 0, 0, 0, 0,
|
2005-05-13 00:20:09 -07:00
|
|
|
con->layers[pos].win, ECORE_X_WINDOW_STACK_ABOVE);
|
2005-05-13 02:23:51 -07:00
|
|
|
}
|
2005-05-16 08:43:15 -07:00
|
|
|
|
2005-05-13 02:23:51 -07:00
|
|
|
void
|
|
|
|
e_container_border_raise(E_Border *bd)
|
|
|
|
{
|
|
|
|
int pos, i;
|
2005-05-13 00:20:09 -07:00
|
|
|
|
2005-05-13 02:23:51 -07:00
|
|
|
/* Remove from old layer */
|
2005-05-13 00:20:09 -07:00
|
|
|
for (i = 0; i < 7; i++)
|
2005-05-13 02:23:51 -07:00
|
|
|
{
|
|
|
|
bd->zone->container->layers[i].clients =
|
|
|
|
evas_list_remove(bd->zone->container->layers[i].clients, bd);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Add to new layer */
|
|
|
|
if (bd->layer == 0) pos = 1;
|
|
|
|
else if ((bd->layer > 0) && (bd->layer <= 50)) pos = 2;
|
|
|
|
else if ((bd->layer > 50) && (bd->layer <= 100)) pos = 3;
|
|
|
|
else if ((bd->layer > 100) && (bd->layer <= 150)) pos = 4;
|
|
|
|
else if ((bd->layer > 150) && (bd->layer <= 200)) pos = 5;
|
|
|
|
else pos = 6;
|
|
|
|
|
|
|
|
ecore_x_window_configure(bd->win,
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
|
|
|
0, 0, 0, 0, 0,
|
2005-05-13 11:56:03 -07:00
|
|
|
bd->zone->container->layers[pos].win, ECORE_X_WINDOW_STACK_BELOW);
|
2005-05-13 02:23:51 -07:00
|
|
|
|
|
|
|
bd->zone->container->layers[pos - 1].clients =
|
|
|
|
evas_list_append(bd->zone->container->layers[pos - 1].clients, bd);
|
2005-05-16 08:43:15 -07:00
|
|
|
|
|
|
|
e_hints_client_stacking_set();
|
2005-05-13 02:23:51 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_border_lower(E_Border *bd)
|
|
|
|
{
|
|
|
|
int pos, i;
|
|
|
|
|
|
|
|
/* Remove from old layer */
|
|
|
|
for (i = 0; i < 7; i++)
|
|
|
|
{
|
|
|
|
bd->zone->container->layers[i].clients =
|
|
|
|
evas_list_remove(bd->zone->container->layers[i].clients, bd);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Add to new layer */
|
|
|
|
if (bd->layer == 0) pos = 0;
|
|
|
|
else if ((bd->layer > 0) && (bd->layer <= 50)) pos = 1;
|
|
|
|
else if ((bd->layer > 50) && (bd->layer <= 100)) pos = 2;
|
|
|
|
else if ((bd->layer > 100) && (bd->layer <= 150)) pos = 3;
|
|
|
|
else if ((bd->layer > 150) && (bd->layer <= 200)) pos = 4;
|
|
|
|
else pos = 5;
|
|
|
|
|
|
|
|
ecore_x_window_configure(bd->win,
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
|
|
|
0, 0, 0, 0, 0,
|
|
|
|
bd->zone->container->layers[pos].win, ECORE_X_WINDOW_STACK_ABOVE);
|
|
|
|
|
|
|
|
bd->zone->container->layers[pos].clients =
|
|
|
|
evas_list_prepend(bd->zone->container->layers[pos].clients, bd);
|
2005-05-16 08:43:15 -07:00
|
|
|
|
|
|
|
e_hints_client_stacking_set();
|
2005-04-28 02:55:41 -07:00
|
|
|
}
|
|
|
|
|
2005-05-13 06:34:21 -07:00
|
|
|
void
|
|
|
|
e_container_border_stack_above(E_Border *bd, E_Border *above)
|
|
|
|
{
|
|
|
|
int pos;
|
|
|
|
|
|
|
|
/* Remove from old layer */
|
|
|
|
if (bd->layer == 0) pos = 0;
|
|
|
|
else if ((bd->layer > 0) && (bd->layer <= 50)) pos = 1;
|
|
|
|
else if ((bd->layer > 50) && (bd->layer <= 100)) pos = 2;
|
|
|
|
else if ((bd->layer > 100) && (bd->layer <= 150)) pos = 3;
|
|
|
|
else if ((bd->layer > 150) && (bd->layer <= 200)) pos = 4;
|
|
|
|
else pos = 5;
|
|
|
|
|
|
|
|
bd->zone->container->layers[pos].clients =
|
|
|
|
evas_list_remove(bd->zone->container->layers[pos].clients, bd);
|
|
|
|
|
|
|
|
/* Add to new layer */
|
|
|
|
bd->layer = above->layer;
|
|
|
|
|
|
|
|
if (bd->layer == 0) pos = 0;
|
|
|
|
else if ((bd->layer > 0) && (bd->layer <= 50)) pos = 1;
|
|
|
|
else if ((bd->layer > 50) && (bd->layer <= 100)) pos = 2;
|
|
|
|
else if ((bd->layer > 100) && (bd->layer <= 150)) pos = 3;
|
|
|
|
else if ((bd->layer > 150) && (bd->layer <= 200)) pos = 4;
|
|
|
|
else pos = 5;
|
|
|
|
|
|
|
|
ecore_x_window_configure(bd->win,
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
|
|
|
0, 0, 0, 0, 0,
|
|
|
|
above->win, ECORE_X_WINDOW_STACK_ABOVE);
|
|
|
|
|
|
|
|
bd->zone->container->layers[pos].clients =
|
|
|
|
evas_list_append_relative(bd->zone->container->layers[pos].clients, bd, above);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_border_stack_below(E_Border *bd, E_Border *below)
|
|
|
|
{
|
|
|
|
int pos;
|
|
|
|
|
|
|
|
/* Remove from old layer */
|
|
|
|
if (bd->layer == 0) pos = 0;
|
|
|
|
else if ((bd->layer > 0) && (bd->layer <= 50)) pos = 1;
|
|
|
|
else if ((bd->layer > 50) && (bd->layer <= 100)) pos = 2;
|
|
|
|
else if ((bd->layer > 100) && (bd->layer <= 150)) pos = 3;
|
|
|
|
else if ((bd->layer > 150) && (bd->layer <= 200)) pos = 4;
|
|
|
|
else pos = 5;
|
|
|
|
|
|
|
|
bd->zone->container->layers[pos].clients =
|
|
|
|
evas_list_remove(bd->zone->container->layers[pos].clients, bd);
|
|
|
|
|
|
|
|
/* Add to new layer */
|
|
|
|
bd->layer = below->layer;
|
|
|
|
|
|
|
|
if (bd->layer == 0) pos = 0;
|
|
|
|
else if ((bd->layer > 0) && (bd->layer <= 50)) pos = 1;
|
|
|
|
else if ((bd->layer > 50) && (bd->layer <= 100)) pos = 2;
|
|
|
|
else if ((bd->layer > 100) && (bd->layer <= 150)) pos = 3;
|
|
|
|
else if ((bd->layer > 150) && (bd->layer <= 200)) pos = 4;
|
|
|
|
else pos = 5;
|
|
|
|
|
|
|
|
ecore_x_window_configure(bd->win,
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
|
|
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
|
|
|
0, 0, 0, 0, 0,
|
|
|
|
below->win, ECORE_X_WINDOW_STACK_BELOW);
|
|
|
|
|
|
|
|
bd->zone->container->layers[pos].clients =
|
|
|
|
evas_list_prepend_relative(bd->zone->container->layers[pos].clients, bd, below);
|
|
|
|
}
|
|
|
|
|
2005-05-13 03:09:55 -07:00
|
|
|
E_Border_List *
|
|
|
|
e_container_border_list_first(E_Container *con)
|
|
|
|
{
|
|
|
|
E_Border_List *list;
|
|
|
|
list = E_NEW(E_Border_List, 1);
|
|
|
|
if (!list) return NULL;
|
|
|
|
list->container = con;
|
|
|
|
e_object_ref(E_OBJECT(con));
|
|
|
|
list->layer = 0;
|
|
|
|
list->clients = list->container->layers[list->layer].clients;
|
|
|
|
while ((list->layer < 6) && (!list->clients))
|
|
|
|
list->clients = list->container->layers[++list->layer].clients;
|
|
|
|
return list;
|
|
|
|
}
|
|
|
|
|
|
|
|
E_Border_List *
|
|
|
|
e_container_border_list_last(E_Container *con)
|
|
|
|
{
|
|
|
|
E_Border_List *list;
|
|
|
|
list = E_NEW(E_Border_List, 1);
|
|
|
|
if (!list) return NULL;
|
|
|
|
list->container = con;
|
|
|
|
e_object_ref(E_OBJECT(con));
|
|
|
|
list->layer = 6;
|
2005-05-13 11:55:05 -07:00
|
|
|
if (list->container->layers[list->layer].clients)
|
2005-07-22 03:28:11 -07:00
|
|
|
list->clients = evas_list_last(list->container->layers[list->layer].clients);
|
2005-05-13 03:09:55 -07:00
|
|
|
while ((list->layer > 0) && (!list->clients))
|
|
|
|
{
|
|
|
|
list->layer--;
|
|
|
|
if (list->container->layers[list->layer].clients)
|
2005-07-22 03:28:11 -07:00
|
|
|
list->clients = evas_list_last(list->container->layers[list->layer].clients);
|
2005-05-13 03:09:55 -07:00
|
|
|
}
|
|
|
|
return list;
|
|
|
|
}
|
|
|
|
|
|
|
|
E_Border *
|
|
|
|
e_container_border_list_next(E_Border_List *list)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
if (!list->clients) return NULL;
|
|
|
|
|
|
|
|
bd = list->clients->data;
|
|
|
|
|
|
|
|
list->clients = list->clients->next;
|
|
|
|
while ((list->layer < 6) && (!list->clients))
|
|
|
|
list->clients = list->container->layers[++list->layer].clients;
|
|
|
|
return bd;
|
|
|
|
}
|
|
|
|
|
|
|
|
E_Border *
|
|
|
|
e_container_border_list_prev(E_Border_List *list)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
if (!list->clients) return NULL;
|
|
|
|
|
|
|
|
bd = list->clients->data;
|
|
|
|
|
|
|
|
list->clients = list->clients->prev;
|
|
|
|
while ((list->layer > 0) && (!list->clients))
|
2005-05-17 04:57:22 -07:00
|
|
|
{
|
|
|
|
list->layer--;
|
|
|
|
if (list->container->layers[list->layer].clients)
|
2005-07-22 03:28:11 -07:00
|
|
|
list->clients = evas_list_last(list->container->layers[list->layer].clients);
|
2005-05-17 04:57:22 -07:00
|
|
|
}
|
2005-05-13 03:09:55 -07:00
|
|
|
return bd;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_border_list_free(E_Border_List *list)
|
|
|
|
{
|
|
|
|
e_object_unref(E_OBJECT(list->container));
|
|
|
|
free(list);
|
|
|
|
}
|
|
|
|
|
2005-05-26 08:30:10 -07:00
|
|
|
void
|
|
|
|
e_container_all_freeze(void)
|
|
|
|
{
|
|
|
|
Evas_List *managers, *l;
|
|
|
|
|
|
|
|
managers = e_manager_list();
|
|
|
|
for (l = managers; l; l = l->next)
|
|
|
|
{
|
|
|
|
Evas_List *ll;
|
|
|
|
E_Manager *man;
|
|
|
|
|
|
|
|
man = l->data;
|
|
|
|
for (ll = man->containers; ll; ll = ll->next)
|
|
|
|
{
|
|
|
|
E_Container *con;
|
|
|
|
|
|
|
|
con = ll->data;
|
|
|
|
evas_event_freeze(con->bg_evas);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
e_container_all_thaw(void)
|
|
|
|
{
|
|
|
|
Evas_List *managers, *l;
|
|
|
|
|
|
|
|
managers = e_manager_list();
|
|
|
|
for (l = managers; l; l = l->next)
|
|
|
|
{
|
|
|
|
Evas_List *ll;
|
|
|
|
E_Manager *man;
|
|
|
|
|
|
|
|
man = l->data;
|
|
|
|
for (ll = man->containers; ll; ll = ll->next)
|
|
|
|
{
|
|
|
|
E_Container *con;
|
|
|
|
|
|
|
|
con = ll->data;
|
|
|
|
evas_event_thaw(con->bg_evas);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
/* local subsystem functions */
|
|
|
|
static void
|
|
|
|
_e_container_free(E_Container *con)
|
|
|
|
{
|
2005-02-16 03:23:56 -08:00
|
|
|
Evas_List *l, *tmp;
|
2005-05-13 03:09:55 -07:00
|
|
|
int i;
|
|
|
|
|
2005-08-16 18:35:48 -07:00
|
|
|
if (con->pointer.root) e_object_del(E_OBJECT(con->pointer.root));
|
|
|
|
|
2005-07-30 23:22:31 -07:00
|
|
|
ecore_x_window_del(con->event_win);
|
2005-01-15 01:50:26 -08:00
|
|
|
if (con->gadman) e_object_del(E_OBJECT(con->gadman));
|
2005-02-15 04:11:31 -08:00
|
|
|
/* We can't use e_object_del here, because border adds a ref to itself
|
|
|
|
* when it is removed, and the ref is never unref'ed */
|
2005-05-13 03:09:55 -07:00
|
|
|
for (i = 0; i < 7; i++)
|
2005-02-16 03:23:56 -08:00
|
|
|
{
|
2005-05-13 03:09:55 -07:00
|
|
|
for (l = con->layers[i].clients; l;)
|
|
|
|
{
|
|
|
|
tmp = l;
|
|
|
|
l = l->next;
|
|
|
|
e_object_free(E_OBJECT(tmp->data));
|
|
|
|
}
|
2005-02-16 03:23:56 -08:00
|
|
|
}
|
|
|
|
for (l = con->zones; l;)
|
|
|
|
{
|
|
|
|
tmp = l;
|
|
|
|
l = l->next;
|
|
|
|
e_object_del(E_OBJECT(tmp->data));
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
con->manager->containers = evas_list_remove(con->manager->containers, con);
|
|
|
|
e_canvas_del(con->bg_ecore_evas);
|
|
|
|
ecore_evas_free(con->bg_ecore_evas);
|
2005-03-11 05:09:06 -08:00
|
|
|
if (con->manager->win != con->win)
|
|
|
|
{
|
|
|
|
ecore_x_window_del(con->win);
|
|
|
|
}
|
2005-03-22 01:20:12 -08:00
|
|
|
if (con->name)
|
|
|
|
free(con->name);
|
2004-11-24 19:37:45 -08:00
|
|
|
free(con);
|
|
|
|
}
|
2005-07-30 23:22:31 -07:00
|
|
|
|
|
|
|
static E_Container *
|
|
|
|
_e_container_find_by_event_window(Ecore_X_Window win)
|
|
|
|
{
|
|
|
|
Evas_List *managers, *l;
|
|
|
|
|
|
|
|
managers = e_manager_list();
|
|
|
|
for (l = managers; l; l = l->next)
|
|
|
|
{
|
|
|
|
Evas_List *ll;
|
|
|
|
E_Manager *man;
|
|
|
|
|
|
|
|
man = l->data;
|
|
|
|
for (ll = man->containers; ll; ll = ll->next)
|
|
|
|
{
|
|
|
|
E_Container *con;
|
|
|
|
|
|
|
|
con = ll->data;
|
|
|
|
if (con->event_win == win) return con;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_container_cb_mouse_in(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_In *ev;
|
|
|
|
E_Border *bd;
|
|
|
|
E_Container *con;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
con = _e_container_find_by_event_window(ev->event_win);
|
|
|
|
if (con)
|
|
|
|
{
|
|
|
|
bd = e_border_focused_get();
|
|
|
|
if (bd) e_focus_event_mouse_out(bd);
|
|
|
|
evas_event_feed_mouse_move(con->bg_evas, ev->x, ev->y, ev->time, NULL);
|
|
|
|
evas_event_feed_mouse_in(con->bg_evas, ev->time, NULL);
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_container_cb_mouse_out(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Out *ev;
|
|
|
|
E_Container *con;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
con = _e_container_find_by_event_window(ev->event_win);
|
|
|
|
if (con)
|
|
|
|
{
|
|
|
|
evas_event_feed_mouse_move(con->bg_evas, ev->x, ev->y, ev->time, NULL);
|
|
|
|
evas_event_feed_mouse_out(con->bg_evas, ev->time, NULL);
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_container_cb_mouse_down(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Button_Down *ev;
|
|
|
|
E_Container *con;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
con = _e_container_find_by_event_window(ev->event_win);
|
|
|
|
if (con)
|
|
|
|
{
|
|
|
|
Evas_Button_Flags flags = EVAS_BUTTON_NONE;
|
|
|
|
|
|
|
|
e_bindings_mouse_down_event_handle(E_BINDING_CONTEXT_CONTAINER,
|
|
|
|
E_OBJECT(con), ev);
|
|
|
|
if (ev->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
|
|
|
|
if (ev->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
|
|
|
|
evas_event_feed_mouse_move(con->bg_evas, ev->x, ev->y, ev->time, NULL);
|
|
|
|
evas_event_feed_mouse_down(con->bg_evas, ev->button, flags, ev->time, NULL);
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_container_cb_mouse_up(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Button_Up *ev;
|
|
|
|
E_Container *con;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
con = _e_container_find_by_event_window(ev->event_win);
|
|
|
|
if (con)
|
|
|
|
{
|
|
|
|
evas_event_feed_mouse_move(con->bg_evas, ev->x, ev->y, ev->time, NULL);
|
|
|
|
evas_event_feed_mouse_up(con->bg_evas, ev->button, EVAS_BUTTON_NONE, ev->time, NULL);
|
|
|
|
e_bindings_mouse_up_event_handle(E_BINDING_CONTEXT_CONTAINER,
|
|
|
|
E_OBJECT(con), ev);
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_container_cb_mouse_move(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Move *ev;
|
|
|
|
E_Container *con;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
con = _e_container_find_by_event_window(ev->event_win);
|
|
|
|
if (con)
|
|
|
|
{
|
|
|
|
evas_event_feed_mouse_move(con->bg_evas, ev->x, ev->y, ev->time, NULL);
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_container_cb_mouse_wheel(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_X_Event_Mouse_Wheel *ev;
|
|
|
|
E_Container *con;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
con = _e_container_find_by_event_window(ev->event_win);
|
|
|
|
if (con)
|
|
|
|
{
|
|
|
|
evas_event_feed_mouse_wheel(con->bg_evas, ev->direction, ev->z, ev->time, NULL);
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
|
|
|
|
static void
|
|
|
|
_e_container_shape_del(E_Container_Shape *es)
|
|
|
|
{
|
|
|
|
_e_container_shape_change_call(es, E_CONTAINER_SHAPE_DEL);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_container_shape_free(E_Container_Shape *es)
|
|
|
|
{
|
2005-02-16 03:23:56 -08:00
|
|
|
Evas_List *l;
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
es->con->shapes = evas_list_remove(es->con->shapes, es);
|
2005-02-16 03:23:56 -08:00
|
|
|
for (l = es->shape; l; l = l->next)
|
|
|
|
free(l->data);
|
|
|
|
evas_list_free(es->shape);
|
2004-11-24 19:37:45 -08:00
|
|
|
free(es);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_container_shape_change_call(E_Container_Shape *es, E_Container_Shape_Change ch)
|
|
|
|
{
|
|
|
|
Evas_List *l;
|
|
|
|
|
|
|
|
for (l = es->con->shape_change_cb; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Container_Shape_Callback *cb;
|
|
|
|
|
|
|
|
cb = l->data;
|
|
|
|
cb->func(cb->data, es, ch);
|
|
|
|
}
|
|
|
|
}
|
2004-12-25 07:33:48 -08:00
|
|
|
|
|
|
|
static void
|
|
|
|
_e_container_resize_handle(E_Container *con)
|
|
|
|
{
|
|
|
|
E_Event_Container_Resize *ev;
|
2005-03-07 01:56:49 -08:00
|
|
|
Evas_List *l, *screens;
|
2005-08-14 10:08:38 -07:00
|
|
|
#if 0
|
2005-05-13 03:09:55 -07:00
|
|
|
int i;
|
2005-08-14 10:08:38 -07:00
|
|
|
#endif
|
2004-12-25 07:33:48 -08:00
|
|
|
|
|
|
|
ev = calloc(1, sizeof(E_Event_Container_Resize));
|
|
|
|
ev->container = con;
|
2005-08-25 00:42:44 -07:00
|
|
|
|
|
|
|
e_gadman_all_save(con->gadman);
|
2005-03-07 01:56:49 -08:00
|
|
|
|
|
|
|
e_xinerama_update();
|
|
|
|
|
|
|
|
screens = (Evas_List *)e_xinerama_screens_get();
|
2005-04-25 01:29:53 -07:00
|
|
|
if (screens)
|
2005-01-21 21:21:48 -08:00
|
|
|
{
|
2005-04-25 01:29:53 -07:00
|
|
|
for (l = screens; l; l = l->next)
|
2005-01-21 21:21:48 -08:00
|
|
|
{
|
2005-04-25 01:29:53 -07:00
|
|
|
E_Screen *scr;
|
|
|
|
E_Zone *zone;
|
|
|
|
|
|
|
|
scr = l->data;
|
|
|
|
zone = e_container_zone_number_get(con, scr->screen);
|
|
|
|
if (zone)
|
|
|
|
{
|
|
|
|
e_zone_move(zone, scr->x, scr->y);
|
|
|
|
e_zone_resize(zone, scr->w, scr->h);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
zone = e_zone_new(con, scr->screen, scr->x, scr->y, scr->w, scr->h);
|
|
|
|
}
|
|
|
|
/* FIXME: what if a zone exists for a screen that doesn't exist?
|
|
|
|
* not sure this will ever happen...
|
|
|
|
*/
|
2005-01-21 21:21:48 -08:00
|
|
|
}
|
2005-04-25 01:29:53 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
E_Zone *zone;
|
|
|
|
|
|
|
|
zone = e_container_zone_number_get(con, 0);
|
|
|
|
e_zone_move(zone, 0, 0);
|
|
|
|
e_zone_resize(zone, con->w, con->h);
|
2005-01-21 21:21:48 -08:00
|
|
|
}
|
2005-03-07 01:56:49 -08:00
|
|
|
|
2005-01-21 21:21:48 -08:00
|
|
|
e_gadman_container_resize(con->gadman);
|
2004-12-25 07:33:48 -08:00
|
|
|
e_object_ref(E_OBJECT(con));
|
|
|
|
ecore_event_add(E_EVENT_CONTAINER_RESIZE, ev, _e_container_event_container_resize_free, NULL);
|
2005-06-19 10:13:37 -07:00
|
|
|
#if 0
|
|
|
|
/* FIXME: This is wrong, we should only move/resize to save things from
|
|
|
|
* disappearing!
|
|
|
|
*/
|
2005-05-13 03:09:55 -07:00
|
|
|
for (i = 0; i < 7; i++)
|
2004-12-25 07:33:48 -08:00
|
|
|
{
|
2005-05-13 03:09:55 -07:00
|
|
|
for (l = con->layers[i].clients; l; l = l->next)
|
|
|
|
{
|
|
|
|
E_Border *bd;
|
|
|
|
|
|
|
|
bd = l->data;
|
|
|
|
|
|
|
|
if (bd->w > bd->zone->w)
|
|
|
|
e_border_resize(bd, bd->zone->w, bd->h);
|
|
|
|
if ((bd->x + bd->w) > (bd->zone->x + bd->zone->w))
|
|
|
|
e_border_move(bd, bd->zone->x + bd->zone->w - bd->w, bd->y);
|
|
|
|
|
|
|
|
if (bd->h > bd->zone->h)
|
|
|
|
e_border_resize(bd, bd->w, bd->zone->h);
|
|
|
|
if ((bd->y + bd->h) > (bd->zone->y + bd->zone->h))
|
|
|
|
e_border_move(bd, bd->x, bd->zone->y + bd->zone->h - bd->h);
|
|
|
|
}
|
2004-12-25 07:33:48 -08:00
|
|
|
}
|
2005-06-19 10:13:37 -07:00
|
|
|
#endif
|
2004-12-25 07:33:48 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2005-01-11 05:11:12 -08:00
|
|
|
_e_container_event_container_resize_free(void *data, void *ev)
|
2004-12-25 07:33:48 -08:00
|
|
|
{
|
|
|
|
E_Event_Container_Resize *e;
|
|
|
|
|
|
|
|
e = ev;
|
|
|
|
e_object_unref(E_OBJECT(e->container));
|
|
|
|
free(e);
|
|
|
|
}
|