Hi!
Fixed the pager to be one for each zone. What lacks is that e_zone_desk_count_set() should send a E_EVENT_BORDER_ADD event when a window is moved from one desk to another when a desk is removed.
The second patch is some compile fixes.
Sebastian
Index: e/src/modules/battery/e_mod_main.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/modules/battery/e_mod_main.c,v
retrieving revision 1.12
diff -u -r1.12 e_mod_main.c
--- e/src/modules/battery/e_mod_main.c 25 Jan 2005 14:24:37 -0000 1.12
+++ e/src/modules/battery/e_mod_main.c 1 Feb 2005 11:45:20 -0000
@@ -16,7 +16,6 @@
static void _battery_face_free(Battery_Face *ef);
static void _battery_cb_gmc_change(void *data, E_Gadman_Client *gmc,
E_Gadman_Change change);
static void _battery_cb_face_down(void *data, Evas *e, Evas_Object *obj,
void *event_info);
-static int _battery_cb_event_container_resize(void *data, int type, void
*event);
static int _battery_cb_check(void *data);
static int _battery_linux_acpi_check(Battery_Face *ef);
static int _battery_linux_apm_check(Battery_Face *ef);
@@ -407,7 +406,6 @@
static void
_battery_face_init(Battery_Face *ef)
{
- Evas_Coord ww, hh, bw, bh;
Evas_Object *o;
evas_event_freeze(ef->evas);
@@ -691,7 +689,7 @@
}
if (level_unknown)
{
- edje_object_part_text_set(ef->bat_object, "reading", "BAD
DIRVER");
+ edje_object_part_text_set(ef->bat_object, "reading", "BAD
DRIVER");
edje_object_part_text_set(ef->bat_object, "time", "--:--");
_battery_level_set(ef, 0.0);
}
Index: e/src/bin/e_signals.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_signals.c,v
retrieving revision 1.1
diff -u -r1.1 e_signals.c
--- e/src/bin/e_signals.c 27 Jan 2005 10:14:22 -0000 1.1
+++ e/src/bin/e_signals.c 1 Feb 2005 11:45:20 -0000
@@ -2,6 +2,7 @@
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "e.h"
+#include <execinfo.h>
/* a tricky little devil, requires e and it's libs to be built
* with the -rdynamic flag to GCC for any sort of decent output.
@@ -10,11 +11,9 @@
void *array[255];
size_t size;
- char **strings;
- size_t i;
write(2, "**** SEGMENTATION FAULT ****\n", 29);
write(2, "**** Printing Backtrace... *****\n\n", 34);
- size = backtrace (array, 255);
+ size = backtrace(array, 255);
backtrace_symbols_fd(array, size, 2);
exit(-11);
}
Index: e/src/modules/pager/e_mod_main.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/modules/pager/e_mod_main.c,v
retrieving revision 1.34
diff -u -r1.34 e_mod_main.c
--- e/src/modules/pager/e_mod_main.c 27 Jan 2005 15:17:09 -0000 1.34
+++ e/src/modules/pager/e_mod_main.c 1 Feb 2005 11:45:58 -0000
@@ -7,35 +7,31 @@
/* TODO List:
*
- * should support proper resize and move handles in the edje.
- *
*/
/* module private routines */
-static Pager *_pager_init(E_Module *m);
-static void _pager_shutdown(Pager *e);
-static E_Menu *_pager_config_menu_new(Pager *e);
-static void _pager_config_menu_del(Pager *e, E_Menu *m);
+static Evas_List *_pager_init(E_Module *m);
+static void _pager_shutdown(Evas_List *pagers);
+static E_Menu *_pager_config_menu_new();
+static void _pager_config_menu_del(E_Menu *menu);
+
+static Pager *_pager_new(E_Zone *zone);
+static void _pager_destroy(Pager *pager);
+static void _pager_zone_set(Pager *pager, E_Zone *zone);
+static void _pager_zone_leave(Pager *pager);
-static Pager_Desk *_pager_desk_create(Pager *e, E_Desk *desk);
+static Pager_Desk *_pager_desk_new(Pager *pager, E_Desk *desk);
static void _pager_desk_destroy(Pager_Desk *d);
-static Pager_Win *_pager_window_create(Pager *e, E_Border *border, Pager_Desk
*owner);
-static void _pager_window_destroy(Pager_Win *w);
-static void _pager_window_move(Pager *e, Pager_Win *w);
+static Pager_Win *_pager_window_new(Pager_Desk *owner, E_Border *border);
+static void _pager_window_destroy(Pager_Win *win);
-static void _pager_zone_set(Pager *e, E_Zone *zone);
-static void _pager_zone_leave(Pager *e);
-static void _pager_desk_set(Pager *e, E_Desk *desk);
+static void _pager_draw(Pager *pager);
+static void _pager_window_move(Pager *pager, Pager_Win *win);
-static void _pager_container_set(Pager *e);
-static void _pager_container_leave(Pager *e);
+static Pager_Desk *_pager_desk_find(Pager *pager, E_Desk *desk);
+static Pager_Win *_pager_window_find(Pager *pager, E_Border *border);
-static Pager_Desk *_pager_desk_find(Pager *e, E_Desk *desk);
-static Pager_Win *_pager_window_find(Pager *e, E_Border *border);
-
-static E_Manager *_pager_manager_current_get(Pager *e);
-
-static void _pager_cb_down(void *data, Evas *e, Evas_Object *obj, void
*event_info);
+static void _pager_cb_mouse_down(void *data, Evas *e, Evas_Object *obj,
void *event_info);
static void _pager_cb_gmc_change(void *data, E_Gadman_Client *gmc,
E_Gadman_Change change);
static int _pager_cb_event_border_resize(void *data, int type, void
*event);
static int _pager_cb_event_border_move(void *data, int type, void
*event);
@@ -48,12 +44,13 @@
/* public module routines. all modules must have these */
void *
-init(E_Module *m)
+init(E_Module *module)
{
- Pager *e;
-
+ Evas_List *pagers = NULL, *l;
+ Pager *pager;
+
/* check module api version */
- if (m->api->version < E_MODULE_API_VERSION)
+ if (module->api->version < E_MODULE_API_VERSION)
{
e_error_dialog_show("Module API Error",
"Error initializing Module: Pager\n"
@@ -61,51 +58,57 @@
"The module API advertized by Enlightenment is:
%i.\n"
"Aborting module.",
E_MODULE_API_VERSION,
- m->api->version);
+ module->api->version);
return NULL;
}
/* actually init pager */
- e = _pager_init(m);
- m->config_menu = _pager_config_menu_new(e);
- return e;
+ pagers = _pager_init(module);
+ module->config_menu = _pager_config_menu_new();
+
+ for (l = pagers; l; l = l->next) {
+ pager = l->data;
+ pager->config_menu = module->config_menu;
+ }
+ return pagers;
}
int
-shutdown(E_Module *m)
+shutdown(E_Module *module)
{
- Pager *e;
-
- e = m->data;
- if (e)
+ Evas_List *pagers;
+
+ if (module->config_menu)
{
- if (m->config_menu)
- {
- _pager_config_menu_del(e, m->config_menu);
- m->config_menu = NULL;
- }
- _pager_shutdown(e);
+ _pager_config_menu_del(module->config_menu);
+ module->config_menu = NULL;
+ }
+
+ pagers = module->data;
+ if (pagers)
+ {
+ _pager_shutdown(pagers);
}
return 1;
}
int
-save(E_Module *m)
+save(E_Module *module)
{
- Pager *e;
+ Evas_List *pagers;
- e = m->data;
+ pagers = module->data;
/* e_config_domain_save("module.pager", e->conf_edd, e->conf); */
return 1;
}
int
-info(E_Module *m)
+info(E_Module *module)
{
char buf[4096];
-
- m->label = strdup("Pager");
- snprintf(buf, sizeof(buf), "%s/module_icon.png", e_module_dir_get(m));
- m->icon_file = strdup(buf);
+
+ module->label = strdup("Pager");
+ snprintf(buf, sizeof(buf), "%s/module_icon.png", e_module_dir_get(module));
+ module->icon_file = strdup(buf);
return 1;
}
@@ -118,16 +121,16 @@
}
/* module private routines */
-static Pager *
+static Evas_List *
_pager_init(E_Module *m)
{
- Pager *e;
- Evas_List *managers, *l, *l2;
- Evas_Object *o;
-
- e = calloc(1, sizeof(Pager));
- if (!e) return NULL;
-
+ Evas_List *pagers = NULL;
+ Evas_List *managers, *l, *l2, *l3;
+ E_Manager *man;
+ E_Container *con;
+ E_Zone *zone;
+ Pager *pager;
+
/* e->conf_edd = E_CONFIG_DD_NEW("Pager_Config", Config);
#undef T
#undef D
@@ -141,202 +144,277 @@
} */
managers = e_manager_list();
- e->managers = managers;
for (l = managers; l; l = l->next)
{
- E_Manager *man;
-
man = l->data;
+
for (l2 = man->containers; l2; l2 = l2->next)
{
- E_Container *con;
-
con = l2->data;
- e->evas = con->bg_evas;
- e->con = con;
- }
- }
- o = evas_object_rectangle_add(e->evas);
- e->base = o;
- evas_object_color_set(o, 128, 128, 128, 0);
- evas_object_pass_events_set(o, 0);
- evas_object_repeat_events_set(o, 0);
- evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _pager_cb_down,
e);
- evas_object_show(o);
+ for (l3 = con->zones; l3; l3 = l3->next)
+ {
+ zone = l3->data;
- o = edje_object_add(e->evas);
- e->screen = o;
- edje_object_file_set(o,
- /* FIXME: "default.eet" needs to come from conf */
- e_path_find(path_themes, "default.eet"),
- "modules/pager/screen");
- evas_object_show(o);
-
- e->ev_handler_border_resize =
- ecore_event_handler_add(E_EVENT_BORDER_RESIZE,
- _pager_cb_event_border_resize, e);
- e->ev_handler_border_move =
- ecore_event_handler_add(E_EVENT_BORDER_MOVE,
- _pager_cb_event_border_move, e);
- e->ev_handler_border_add =
- ecore_event_handler_add(E_EVENT_BORDER_ADD,
- _pager_cb_event_border_add, e);
- e->ev_handler_border_remove =
- ecore_event_handler_add(E_EVENT_BORDER_REMOVE,
- _pager_cb_event_border_remove, e);
- e->ev_handler_border_hide =
- ecore_event_handler_add(E_EVENT_BORDER_HIDE,
- _pager_cb_event_border_hide, e);
- e->ev_handler_border_show =
- ecore_event_handler_add(E_EVENT_BORDER_SHOW,
- _pager_cb_event_border_show, e);
- e->ev_handler_border_desk_set =
- ecore_event_handler_add(E_EVENT_BORDER_DESK_SET,
- _pager_cb_event_border_desk_set, e);
- e->ev_handler_zone_desk_count_set =
- ecore_event_handler_add(E_EVENT_ZONE_DESK_COUNT_SET,
- _pager_cb_event_zone_desk_count_set, e);
-
- _pager_container_set(e);
-
- e->gmc = e_gadman_client_new(e->con->gadman);
- e_gadman_client_domain_set(e->gmc, "module.pager", 0);
- e_gadman_client_policy_set(e->gmc,
- E_GADMAN_POLICY_ANYWHERE |
- E_GADMAN_POLICY_HMOVE |
- E_GADMAN_POLICY_VMOVE |
- E_GADMAN_POLICY_HSIZE |
- E_GADMAN_POLICY_VSIZE);
- e_gadman_client_min_size_set(e->gmc, 8, 8);
- e_gadman_client_max_size_set(e->gmc, 256, 256);
- e_gadman_client_auto_size_set(e->gmc, 64, 64);
- e_gadman_client_align_set(e->gmc, 0.0, 1.0);
- e_gadman_client_resize(e->gmc, 80, 60);
- e_gadman_client_change_func_set(e->gmc, _pager_cb_gmc_change, e);
- e_gadman_client_load(e->gmc);
- return e;
+ pager = _pager_new(zone);
+ if (pager)
+ pagers = evas_list_append(pagers, pager);
+ }
+ }
+ }
+ return pagers;
}
static void
-_pager_shutdown(Pager *e)
+_pager_shutdown(Evas_List *pagers)
{
- free(e->conf);
+ Evas_List *list;
+/* free(e->conf); */
/* E_CONFIG_DD_FREE(e->conf_edd);*/
- if (e->base) evas_object_del(e->base);
- if (e->screen) evas_object_del(e->screen);
- e_object_del(E_OBJECT(e->gmc));
-
- _pager_zone_leave(e);
- ecore_event_handler_del(e->ev_handler_border_resize);
- ecore_event_handler_del(e->ev_handler_border_move);
- ecore_event_handler_del(e->ev_handler_border_add);
- ecore_event_handler_del(e->ev_handler_border_remove);
- ecore_event_handler_del(e->ev_handler_border_hide);
- ecore_event_handler_del(e->ev_handler_border_show);
- ecore_event_handler_del(e->ev_handler_border_desk_set);
- ecore_event_handler_del(e->ev_handler_zone_desk_count_set);
-
- free(e);
+ for (list = pagers; list; list = list->next)
+ {
+ _pager_destroy(list->data);
+ }
+ evas_list_free(pagers);
}
static E_Menu *
-_pager_config_menu_new(Pager *e)
+_pager_config_menu_new()
{
E_Menu *mn;
E_Menu_Item *mi;
mn = e_menu_new();
-
+
mi = e_menu_item_new(mn);
e_menu_item_label_set(mi, "(Unused)");
- e->config_menu = mn;
-
+
return mn;
}
static void
-_pager_config_menu_del(Pager *e, E_Menu *m)
+_pager_config_menu_del(E_Menu *menu)
+{
+ e_object_del(E_OBJECT(menu));
+}
+
+static Pager *
+_pager_new(E_Zone *zone)
{
- e_object_del(E_OBJECT(m));
+ Pager *pager;
+ Evas_Object *o;
+
+ pager = E_NEW(Pager, 1);
+ if (!pager) return NULL;
+
+ pager->evas = zone->container->bg_evas;
+
+ o = evas_object_rectangle_add(pager->evas);
+ pager->base = o;
+ evas_object_color_set(o, 128, 128, 128, 0);
+ evas_object_pass_events_set(o, 0);
+ evas_object_repeat_events_set(o, 0);
+ evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
_pager_cb_mouse_down, pager);
+ evas_object_show(o);
+
+ o = edje_object_add(pager->evas);
+ pager->screen = o;
+ edje_object_file_set(o,
+ /* FIXME: "default.eet" needs to come from conf */
+ e_path_find(path_themes, "default.eet"),
+ "modules/pager/screen");
+ evas_object_show(o);
+
+ pager->ev_handler_border_resize =
+ ecore_event_handler_add(E_EVENT_BORDER_RESIZE,
+ _pager_cb_event_border_resize, pager);
+ pager->ev_handler_border_move =
+ ecore_event_handler_add(E_EVENT_BORDER_MOVE,
+ _pager_cb_event_border_move, pager);
+ pager->ev_handler_border_add =
+ ecore_event_handler_add(E_EVENT_BORDER_ADD,
+ _pager_cb_event_border_add, pager);
+ pager->ev_handler_border_remove =
+ ecore_event_handler_add(E_EVENT_BORDER_REMOVE,
+ _pager_cb_event_border_remove, pager);
+ pager->ev_handler_border_hide =
+ ecore_event_handler_add(E_EVENT_BORDER_HIDE,
+ _pager_cb_event_border_hide, pager);
+ pager->ev_handler_border_show =
+ ecore_event_handler_add(E_EVENT_BORDER_SHOW,
+ _pager_cb_event_border_show, pager);
+ pager->ev_handler_border_desk_set =
+ ecore_event_handler_add(E_EVENT_BORDER_DESK_SET,
+ _pager_cb_event_border_desk_set, pager);
+ pager->ev_handler_zone_desk_count_set =
+ ecore_event_handler_add(E_EVENT_ZONE_DESK_COUNT_SET,
+ _pager_cb_event_zone_desk_count_set, pager);
+
+ _pager_zone_set(pager, zone);
+
+ pager->gmc = e_gadman_client_new(pager->zone->container->gadman);
+ e_gadman_client_domain_set(pager->gmc, "module.pager", 0);
+ e_gadman_client_zone_set(pager->gmc, pager->zone);
+ e_gadman_client_policy_set(pager->gmc,
+ E_GADMAN_POLICY_ANYWHERE |
+ E_GADMAN_POLICY_HMOVE |
+ E_GADMAN_POLICY_VMOVE |
+ E_GADMAN_POLICY_HSIZE |
+ E_GADMAN_POLICY_VSIZE);
+ e_gadman_client_min_size_set(pager->gmc, 8, 8);
+ e_gadman_client_max_size_set(pager->gmc, 256, 256);
+ e_gadman_client_auto_size_set(pager->gmc, 64, 64);
+ e_gadman_client_align_set(pager->gmc, 0.0, 1.0);
+ e_gadman_client_resize(pager->gmc, 80, 60);
+ e_gadman_client_change_func_set(pager->gmc, _pager_cb_gmc_change, pager);
+ e_gadman_client_load(pager->gmc);
+
+ return pager;
+}
+
+void
+_pager_destroy(Pager *pager)
+{
+ if (pager->base) evas_object_del(pager->base);
+ if (pager->screen) evas_object_del(pager->screen);
+ e_object_del(E_OBJECT(pager->gmc));
+
+ _pager_zone_leave(pager);
+ ecore_event_handler_del(pager->ev_handler_border_resize);
+ ecore_event_handler_del(pager->ev_handler_border_move);
+ ecore_event_handler_del(pager->ev_handler_border_add);
+ ecore_event_handler_del(pager->ev_handler_border_remove);
+ ecore_event_handler_del(pager->ev_handler_border_hide);
+ ecore_event_handler_del(pager->ev_handler_border_show);
+ ecore_event_handler_del(pager->ev_handler_border_desk_set);
+ ecore_event_handler_del(pager->ev_handler_zone_desk_count_set);
+
+ E_FREE(pager);
+}
+
+static void
+_pager_zone_set(Pager *pager, E_Zone *zone)
+{
+ int desks_x, desks_y, x, y;
+ E_Desk *current;
+
+ pager->zone = zone;
+ e_object_ref(E_OBJECT(zone));
+ e_zone_desk_count_get(zone, &desks_x, &desks_y);
+ current = e_desk_current_get(zone);
+ pager->xnum = desks_x;
+ pager->ynum = desks_y;
+
+ for (x = 0; x < desks_x; x++)
+ for (y = 0; y < desks_y; y++)
+ {
+ Pager_Desk *pd;
+ E_Desk *desk;
+
+ desk = e_desk_at_xy_get(zone, x, y);
+ pd = _pager_desk_new(pager, desk);
+ pager->desks = evas_list_append(pager->desks, pd);
+ }
+ evas_object_resize(pager->base, pager->fw * desks_x, pager->fh * desks_y);
+}
+
+static void
+_pager_zone_leave(Pager *pager)
+{
+ Evas_List *list;
+ e_object_unref(E_OBJECT(pager->zone));
+
+ for (list = pager->desks; list; list = list->next)
+ {
+ _pager_desk_destroy(list->data);
+ }
+ evas_list_free(pager->desks);
}
static Pager_Desk *
-_pager_desk_create(Pager *e, E_Desk *desk)
+_pager_desk_new(Pager *pager, E_Desk *desk)
{
- Pager_Desk *new;
+ Pager_Desk *pd;
+ Pager_Win *pw;
+
+ E_Border *win;
+
Evas_Object *o;
- E_Desk *next;
- int xpos, ypos, xcount, ycount, found;
-
- new = E_NEW(Pager_Desk, 1);
+ Evas_List *wins;
+ int xpos, ypos, xcount, ycount;
+
+ pd = E_NEW(Pager_Desk, 1);
e_zone_desk_count_get(desk->zone, &xcount, &ycount);
for (xpos = 0; xpos < xcount; xpos++)
for (ypos = 0; ypos < ycount; ypos++)
{
- next = e_desk_at_xy_get(desk->zone, xpos, ypos);
- if (next == desk)
+ if (desk == e_desk_at_xy_get(desk->zone, xpos, ypos))
{
- new->xpos = xpos;
- new->ypos = ypos;
+ pd->xpos = xpos;
+ pd->ypos = ypos;
break;
}
}
if (desk == e_desk_current_get(desk->zone))
{
- new->current = 1;
- evas_object_move(e->screen, e->fx, e->fy);
+ pd->current = 1;
+ evas_object_move(pager->screen, pager->fx + (pager->fw * pd->xpos),
+ pager->fy + (pager->fh * pd->ypos));
}
- new->desk = desk;
+ pd->desk = desk;
e_object_ref(E_OBJECT(desk));
+ pd->owner = pager;
- o = edje_object_add(e->evas);
- new->obj = o;
+ o = edje_object_add(pager->evas);
+ pd->obj = o;
edje_object_file_set(o,
/* FIXME: "default.eet" needs to come from conf */
e_path_find(path_themes, "default.eet"),
"modules/pager/desk");
evas_object_pass_events_set(o, 1);
- evas_object_resize(o, e->fw, e->fh);
- evas_object_move(o, e->fx + (new->xpos * e->fw), e->fy + (new->ypos *
e->fh));
+ evas_object_resize(o, pager->fw, pager->fh);
+ evas_object_move(o, pager->fx + (pd->xpos * pager->fw), pager->fy +
(pd->ypos * pager->fh));
evas_object_show(o);
- evas_object_raise(e->screen);
- return new;
-}
-
-static void
-_pager_desk_destroy(Pager_Desk *d)
-{
- if (d->obj) evas_object_del(d->obj);
- e_object_unref(E_OBJECT(d->desk));
+ evas_object_raise(pager->screen);
- while (d->wins)
+ /* Add windows to the desk */
+ wins = desk->clients;
+ while (wins)
{
- _pager_window_destroy((Pager_Win *) d->wins->data);
- d->wins = evas_list_remove_list(d->wins, d->wins);
+ win = wins->data;
+ if (win->new_client)
+ {
+ wins = wins->next;
+ continue;
+ }
+ pw = _pager_window_new(pd, win);
+
+ pd->wins = evas_list_append(pd->wins, pw);
+ wins = wins->next;
}
- E_FREE(d);
+ return pd;
}
static void
-_pager_window_move(Pager *e, Pager_Win *w)
+_pager_desk_destroy(Pager_Desk *desk)
{
- Evas_Coord ww, hh;
- double scalex, scaley;
- evas_output_viewport_get(e->evas, NULL, NULL, &ww, &hh);
- scalex = (double) e->fw / ww;
- scaley = (double) e->fh / hh;
-
- evas_object_resize(w->obj, w->border->w * scalex, w->border->h * scaley);
- evas_object_move(w->obj,
- e->fx + (w->owner->xpos * e->fw) + (w->border->x * scalex),
- e->fy + (w->owner->ypos * e->fh) + (w->border->y * scaley));
+ Evas_List *list;
+
+ if (desk->obj) evas_object_del(desk->obj);
+ e_object_unref(E_OBJECT(desk->desk));
+
+ for (list = desk->wins; list; list = list->next)
+ {
+ _pager_window_destroy(list->data);
+ }
+ evas_list_free(desk->wins);
+ E_FREE(desk);
}
static Pager_Win *
-_pager_window_create(Pager *e, E_Border *border, Pager_Desk *owner)
+_pager_window_new(Pager_Desk *owner, E_Border *border)
{
Pager_Win *new;
Evas_Object *o;
@@ -344,18 +422,18 @@
int visible;
Evas_Coord ww, hh;
double scalex, scaley;
-
- evas_output_viewport_get(e->evas, NULL, NULL, &ww, &hh);
- scalex = e->fw / ww;
- scaley = e->fy / hh;
-
+
+ evas_output_viewport_get(owner->owner->evas, NULL, NULL, &ww, &hh);
+ scalex = owner->owner->fw / ww;
+ scaley = owner->owner->fy / hh;
+
new = E_NEW(Pager_Win, 1);
new->border = border;
e_object_ref(E_OBJECT(border));
visible = !border->iconic;
new->owner = owner;
- o = edje_object_add(e->evas);
+ o = edje_object_add(owner->owner->evas);
new->obj = o;
edje_object_file_set(o,
/* FIXME: "default.eet" needs to come from conf */
@@ -364,12 +442,12 @@
evas_object_pass_events_set(o, 1);
if (visible)
evas_object_show(o);
- evas_object_raise(e->screen);
+ evas_object_raise(owner->owner->screen);
app = e_app_window_name_class_find(border->client.icccm.name,
border->client.icccm.class);
if (app)
{
- o = edje_object_add(e->evas);
+ o = edje_object_add(owner->owner->evas);
new->icon = o;
edje_object_file_set(o, app->path, "icon");
if (visible)
@@ -377,291 +455,151 @@
edje_object_part_swallow(new->obj, "WindowIcon", o);
}
- _pager_window_move(e, new);
+ _pager_window_move(owner->owner, new);
return new;
}
-static void
-_pager_window_destroy(Pager_Win *w)
-{
- if (w->obj) evas_object_del(w->obj);
- if (w->icon) evas_object_del(w->icon);
-
- e_object_unref(E_OBJECT(w->border));
- E_FREE(w);
-}
-
static void
-_pager_container_set(Pager *e)
+_pager_window_destroy(Pager_Win *win)
{
- int desks_x, desks_y, x, y;
- Evas_Object *o;
- E_Desk *current;
- Evas_List *wins;
- E_App *app;
- E_Zone *zone;
- Evas_List *zones;
- E_Container *con;
-
- con = e_container_current_get(_pager_manager_current_get(e));
- for(zones = con->zones; zones; zones = zones->next)
- {
- zone = zones->data;
-
- e_zone_desk_count_get(zone, &desks_x, &desks_y);
-
- for (x = 0; x < desks_x; x++)
- for (y = 0; y < desks_y; y++)
- {
- Pager_Desk *sym;
- E_Desk *desk;
+ if (win->obj) evas_object_del(win->obj);
+ if (win->icon) evas_object_del(win->icon);
- desk = e_desk_at_xy_get(zone, x, y);
- sym = _pager_desk_create(e, desk);
- e->desks = evas_list_append(e->desks, sym);
-
- wins = desk->clients;
- while (wins)
- {
- Pager_Win *win;
- E_Border *bd;
-
- bd = wins->data;
- if (bd->new_client)
- {
- wins = wins->next;
- continue;
- }
- win = _pager_window_create(e, bd, sym);
-
- sym->wins = evas_list_append(sym->wins, win);
- wins = wins->next;
- }
- }
- evas_object_resize(e->base, e->fw * desks_x, e->fh * desks_y);
- }
+ e_object_unref(E_OBJECT(win->border));
+ E_FREE(win);
}
static void
-_pager_zone_set(Pager *e, E_Zone *zone)
+_pager_draw(Pager *pager)
{
- int desks_x, desks_y, x, y;
- Evas_Object *o;
- E_Desk *current;
- Evas_List *wins;
- E_App *app;
-
- e_zone_desk_count_get(zone, &desks_x, &desks_y);
- current = e_desk_current_get(zone);
-
- for (x = 0; x < desks_x; x++)
- for (y = 0; y < desks_y; y++)
- {
- Pager_Desk *sym;
- E_Desk *desk;
-
- desk = e_desk_at_xy_get(zone, x, y);
- sym = _pager_desk_create(e, desk);
- e->desks = evas_list_append(e->desks, sym);
-
- wins = desk->clients;
- while (wins)
- {
- Pager_Win *win;
- E_Border *bd;
-
- bd = wins->data;
- if (bd->new_client)
- {
- wins = wins->next;
- continue;
- }
- win = _pager_window_create(e, bd, sym);
+ Evas_List *desks;
+ Pager_Desk *desk;
+ Evas_List *wins;
+ Pager_Win *win;
- sym->wins = evas_list_append(sym->wins, win);
- wins = wins->next;
- }
- }
- evas_object_resize(e->base, e->fw * desks_x, e->fh * desks_y);
-}
+ evas_object_move(pager->base, pager->fx, pager->fy);
+ evas_object_resize(pager->base, pager->fw * pager->xnum, pager->fh *
pager->ynum);
+ evas_object_resize(pager->screen, pager->fw, pager->fh);
-static void
-_pager_zone_leave(Pager *e)
-{
- while (e->desks)
+ desks = pager->desks;
+ while (desks)
{
- _pager_desk_destroy((Pager_Desk *) e->desks->data);
- e->desks = evas_list_remove_list(e->desks, e->desks);
- }
-}
+ desk = desks->data;
+ evas_object_resize(desk->obj, pager->fw, pager->fh);
+ evas_object_move(desk->obj, pager->fx + (pager->fw * desk->xpos),
+ pager->fy + (pager->fh * desk->ypos));
+ if (desk->current)
+ evas_object_move(pager->screen, pager->fx + (pager->fw * desk->xpos),
+ pager->fy + (pager->fh * desk->ypos));
-static void
-_pager_container_leave(Pager *e)
-{
- while (e->desks)
- {
- _pager_desk_destroy((Pager_Desk *) e->desks->data);
- e->desks = evas_list_remove_list(e->desks, e->desks);
+ wins = desk->wins;
+ while (wins)
+ {
+ win = wins->data;
+ _pager_window_move(pager, win);
+
+ wins = wins->next;
+ }
+ desks = desks->next;
}
}
static void
-_pager_desk_set(Pager *p, E_Desk *desk)
+_pager_window_move(Pager *pager, Pager_Win *win)
{
- Evas_List *desks;
- int x, y, desks_x, desks_y;
-
- e_zone_desk_count_get(desk->zone, &desks_x, &desks_y);
- desks = p->desks;
- for (x = 0; x < desks_x; x++)
- for (y = 0; y < desks_y; y++)
- {
- Pager_Desk *pd;
- int left, right, top, bottom;
-
- pd = desks->data;
- left = p->fx + x * p->fw;
- top = p->fy + y * p->fh;
-
- if (pd->desk == desk)
- {
- pd->current = 1;
- evas_object_move(p->screen, left, top);
- }
- else
- pd->current = 0;
- desks = desks->next;
- }
+ Evas_Coord ww, hh;
+ double scalex, scaley;
+ evas_output_viewport_get(pager->evas, NULL, NULL, &ww, &hh);
+ scalex = (double) pager->fw / ww;
+ scaley = (double) pager->fh / hh;
+
+ evas_object_resize(win->obj, win->border->w * scalex, win->border->h *
scaley);
+ evas_object_move(win->obj,
+ pager->fx + (win->owner->xpos * pager->fw) +
(win->border->x * scalex),
+ pager->fy + (win->owner->ypos * pager->fh) +
(win->border->y * scaley));
}
static void
-_pager_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_pager_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Evas_Event_Mouse_Down *ev;
- Pager *p;
- E_Container *con = NULL;
+ Pager *pager;
ev = event_info;
- p = data;
- con = e_container_current_get(_pager_manager_current_get(p));
+ pager = data;
if (ev->button == 3)
{
- e_menu_activate_mouse(p->config_menu, e_zone_current_get(con),
+ e_menu_activate_mouse(pager->config_menu, pager->zone,
ev->output.x, ev->output.y, 1, 1,
E_MENU_POP_DIRECTION_DOWN);
- e_util_container_fake_mouse_up_all_later(con);
+ e_util_container_fake_mouse_up_all_later(pager->zone->container);
}
else if (ev->button == 1)
{
- int xcount, ycount;
- Evas_Coord xx, yy, x, y;
- E_Zone *zone;
- E_Desk *desk;
- E_Container *con;
-
- con = e_container_current_get(_pager_manager_current_get(p));
- zone = e_zone_current_get(con);
- e_zone_desk_count_get(zone, &xcount, &ycount);
- evas_pointer_canvas_xy_get(p->evas, &xx, &yy);
+ Evas_Coord x, y;
+ int xpos, ypos;
+ Evas_List *list;
+ Pager_Desk *desk;
- for (x = 0; x < xcount; x++)
- for (y = 0; y < ycount; y++)
- {
- int left, right, top, bottom;
- left = p->fx + x * p->fw;
- right = left + p->fw;
- top = p->fy + y * p->fh;
- bottom = top + p->fh;
+ evas_pointer_canvas_xy_get(pager->evas, &x, &y);
- if (left <= xx && xx < right && top <= yy && yy < bottom)
- {
- desk = e_desk_at_xy_get(zone, x, y);
- if (desk)
- {
- e_desk_show(desk);
- _pager_desk_set(p, desk);
- }
- else
- {
- printf("PAGER ERROR - %d, %d seems to be out of
bounds\n", x, y);
- }
- }
- }
+ xpos = (x - pager->fx) / pager->fw;
+ ypos = (y - pager->fy) / pager->fh;
+
+ for (list = pager->desks; list; list = list->next)
+ {
+ desk = list->data;
+ if ((desk->xpos == xpos) && (desk->ypos == ypos))
+ {
+ desk->current = 1;
+ e_desk_show(desk->desk);
+ evas_object_move(pager->screen,
+ pager->fx + xpos * pager->fw,
+ pager->fy + ypos * pager->fh);
+ }
+ else
+ {
+ desk->current = 0;
+ }
+ }
}
}
static Pager_Desk *
-_pager_desk_find(Pager *e, E_Desk *desk)
+_pager_desk_find(Pager *pager, E_Desk *desk)
{
Pager_Desk *pd;
Evas_List *desks;
- desks = e->desks;
+ desks = pager->desks;
while (desks)
{
pd = desks->data;
-#if 0
- printf("Desk Find: (search,current)%p:%p\n", desk, pd->desk);
-#endif
if (pd->desk == desk)
return pd;
-#if 0
- printf("Zone Find: (search,current)%p:%p\n", desk->zone,
pd->desk->zone);
-#endif
desks = desks->next;
}
return NULL;
}
-static Pager_Desk *
-_pager_border_find(Pager *e, E_Border *border)
-{
- int x, y;
- int desks_x, desks_y;
- E_Desk *desk = NULL;
- Pager_Desk *result = NULL;
- E_Zone *zone = NULL;
-
- if(border)
- {
- zone = border->zone;
- e_zone_desk_count_get(zone, &desks_x, &desks_y);
- printf("Desks_X, Desks_Y, DeskFind -> %i,%i:%p\n", desks_x, desks_y,
border->desk);
- for (x = 0; x < desks_x; x++)
- for (y = 0; y < desks_y; y++)
- {
- desk = e_desk_at_xy_get(zone, x, y);
- printf("Desk %i,%i:%p\n", x, y, desk);
- if(desk == border->desk)
- {
- if((result = _pager_desk_find(e, desk)))
- return(result);
- }
- }
- }
- return NULL;
-}
-
-static Pager_Win *
-_pager_window_find(Pager *e, E_Border *border)
+static Pager_Win *
+_pager_window_find(Pager *pager, E_Border *border)
{
Evas_List *desks, *wins;
+ Pager_Desk *pd;
+ Pager_Win *win;
- desks = e->desks;
+ desks = pager->desks;
while (desks)
{
- Pager_Desk *next;
-
- next = desks->data;
- wins = next->wins;
+ pd = desks->data;
+ wins = pd->wins;
while (wins)
{
- Pager_Win *next2;
-
- next2 = wins->data;
- if (next2->border == border)
- return next2;
+ win = wins->data;
+ if (win->border == border)
+ return win;
wins = wins->next;
}
desks = desks->next;
@@ -671,68 +609,40 @@
static void
_pager_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change)
-{
- Pager *p;
+{
+ Pager *pager;
Evas_Coord x, y, w, h;
- Evas_Coord xx, yy, ww, hh, deskw, deskh;
- E_Zone *zone;
+ Evas_Coord deskw, deskh;
int xcount, ycount;
Evas_List *desks, *wins;
Pager_Desk *desk;
Pager_Win *win;
- E_Container *con;
- p = data;
- con = e_container_current_get(_pager_manager_current_get(p));
- zone = e_zone_current_get(con);
- e_zone_desk_count_get(zone, &xcount, &ycount);
+ pager = data;
+ e_zone_desk_count_get(pager->zone, &xcount, &ycount);
- e_gadman_client_geometry_get(p->gmc, &x, &y, &w, &h);
+ e_gadman_client_geometry_get(pager->gmc, &x, &y, &w, &h);
deskw = w / xcount;
deskh = h / ycount;
- p->fx = x;
- p->fy = y;
- p->fw = deskw;
- p->fh = deskh;
+ pager->fx = x;
+ pager->fy = y;
+ pager->fw = deskw;
+ pager->fh = deskh;
if (change == E_GADMAN_CHANGE_MOVE_RESIZE)
{
- evas_object_move(p->base, x, y);
- evas_object_resize(p->base, w, h);
- evas_object_resize(p->screen, deskw, deskh);
-
- desks = p->desks;
- while (desks)
- {
- desk = desks->data;
- evas_object_resize(desk->obj, deskw, deskh);
- evas_object_move(desk->obj, x + (deskw * desk->xpos),
- y + (deskh * desk->ypos));
- if (desk->current)
- evas_object_move(p->screen, x + (deskw * desk->xpos),
- y + (deskh * desk->ypos));
-
- wins = desk->wins;
- while (wins)
- {
- win = wins->data;
- _pager_window_move(p, win);
-
- wins = wins->next;
- }
- desks = desks->next;
- }
+ _pager_draw(pager);
}
else if (change == E_GADMAN_CHANGE_RAISE)
{
- evas_object_raise(p->base);
-
- desks = p->desks;
+ evas_object_raise(pager->base);
+
+ desks = pager->desks;
while (desks)
{
desk = desks->data;
evas_object_raise(desk->obj);
-
+
wins = desk->wins;
while (wins)
{
@@ -744,42 +654,42 @@
desks = desks->next;
}
- evas_object_raise(p->screen);
+ evas_object_raise(pager->screen);
}
-}
+}
-static int
+static int
_pager_cb_event_border_resize(void *data, int type, void *event)
{
- Pager *e;
+ Pager *pager;
Pager_Win *win;
E_Event_Border_Resize *ev;
-
- e = data;
+
+ pager = data;
ev = event;
- if((win = _pager_window_find(e, ev->border)))
+ if ((win = _pager_window_find(pager, ev->border)))
{
- _pager_window_move(e, win);
+ _pager_window_move(pager, win);
}
else
{
- printf("ERROR: event_border_resize %p:%p\n",event, ev->border);
+ printf("ERROR: event_border_resize %p:%p\n", event, ev->border);
}
return 1;
}
-static int
+static int
_pager_cb_event_border_move(void *data, int type, void *event)
{
- Pager *e;
+ Pager *pager;
Pager_Win *win;
E_Event_Border_Resize *ev;
- e = data;
+ pager = data;
ev = event;
- if((win = _pager_window_find(e, ev->border)))
+ if((win = _pager_window_find(pager, ev->border)))
{
- _pager_window_move(e, win);
+ _pager_window_move(pager, win);
}
else
{
@@ -788,43 +698,29 @@
return 1;
}
-static int
+static int
_pager_cb_event_border_add(void *data, int type, void *event)
{
- Pager *e;
+ Pager *pager;
E_Event_Border_Add *ev;
- Pager_Win *new;
+ E_Border *border;
+ Pager_Win *win;
Pager_Desk *desk;
-
- e = data;
+
+ pager = data;
ev = event;
- if (_pager_window_find(e, ev->border))
+ border = ev->border;
+ if (_pager_window_find(pager, border))
{
+ /* FIXME; may have switched desk! */
printf("event_border_add, window found :'(\n");
return 1;
}
- if ((desk = _pager_desk_find(e, ((E_Border *) ev->border)->desk)))
+ if ((desk = _pager_desk_find(pager, border->desk)))
{
- new = _pager_window_create(data, ev->border, desk);
- desk->wins = evas_list_append(desk->wins, new);
-#if 0
- printf("event_border_add, window created :) :) :)\n");
-#endif
- }
-/*
- * Correct me if I am wrong, but will the desk not previously been found above,
- * as _pager_desk find iterates all available, so if it has not matched we are
- * "out of zone" - if I am right we can remove _pager_border_find
- *
- * FIXME decide
- else if ((desk = _pager_border_find(e, ((E_Border *) ev->border))))
- {
- new = _pager_window_create(data, ev->border, desk);
- desk->wins = evas_list_append(desk->wins, new);
-#if 0
- printf("event_border_add, window created from zone :) :) :)\n");
-#endif
- }*/
+ win = _pager_window_new(desk, border);
+ desk->wins = evas_list_append(desk->wins, win);
+ }
else
{
printf("event_border_add, desk not found :'(\n");
@@ -832,18 +728,21 @@
return 1;
}
-static int
+static int
_pager_cb_event_border_remove(void *data, int type, void *event)
{
- Pager *e;
+ Pager *pager;
E_Event_Border_Remove *ev;
+ E_Border *border;
Pager_Win *old;
Pager_Desk *desk;
- e = data;
+ pager = data;
ev = event;
- old = _pager_window_find(e, ev->border);
- desk = _pager_desk_find(e, ((E_Border *) ev->border)->desk);
+ border = ev->border;
+
+ old = _pager_window_find(pager, border);
+ desk = _pager_desk_find(pager, border->desk);
if (old && desk)
{
desk->wins = evas_list_remove(desk->wins, old);
@@ -852,7 +751,7 @@
return 1;
}
-static int
+static int
_pager_cb_event_border_hide(void *data, int type, void *event)
{
Pager_Win *win;
@@ -870,7 +769,7 @@
return 1;
}
-static int
+static int
_pager_cb_event_border_show(void *data, int type, void *event)
{
Pager_Win *win;
@@ -890,22 +789,22 @@
return 1;
}
-static int
+static int
_pager_cb_event_border_desk_set(void *data, int type, void *event)
{
- Pager *e;
+ Pager *pager;
Pager_Win *win;
Pager_Desk *desk;
E_Event_Border_Desk_Set *ev;
- e = data;
+ pager = data;
ev = event;
- win = _pager_window_find(e, ev->border);
- desk = _pager_desk_find(e, ev->border->desk);
+ win = _pager_window_find(pager, ev->border);
+ desk = _pager_desk_find(pager, ev->border->desk);
if (win && desk)
{
win->owner = desk;
- _pager_window_move(e, win);
+ _pager_window_move(pager, win);
}
return 1;
}
@@ -913,24 +812,64 @@
static int
_pager_cb_event_zone_desk_count_set(void *data, int type, void *event)
{
- Pager *e;
+ Pager *pager;
+ Pager_Desk *pd, *new;
+
E_Event_Zone_Desk_Count_Set *ev;
+ E_Desk *desk;
- e = data;
- // FIXME need to update display with sizes etc
- return 1;
-}
+ Evas_List *desks;
-static E_Manager*
-_pager_manager_current_get(Pager *e)
-{
- Evas_List *l;
- E_Manager *result;
- for(l = e->managers; l; l = l->next)
+ int desks_x, desks_y;
+ int max_x, max_y;
+ int x, y;
+
+ pager = data;
+ ev = event;
+ e_zone_desk_count_get(ev->zone, &desks_x, &desks_y);
+
+ max_x = MAX(pager->xnum, desks_x);
+ max_y = MAX(pager->ynum, desks_y);
+
+ if ((pager->xnum == desks_x) && (pager->ynum == desks_y))
+ return 1;
+
+ pager->fw = (pager->fw * pager->xnum) / desks_x;
+ pager->fh = (pager->fh * pager->ynum) / desks_y;
+ for (x = 0; x < max_x; x++)
{
- result = l->data;
- if(result->visible)
- return(result);
+ for (y = 0; y < max_y; y++)
+ {
+ if ((x >= pager->xnum) || (y >= pager->ynum))
+ {
+ /* Add desk */
+ desk = e_desk_at_xy_get(ev->zone, x, y);
+ pd = _pager_desk_new(pager, desk);
+ pager->desks = evas_list_append(pager->desks, pd);
+ }
+ else if ((x >= desks_x) || (y >= desks_y))
+ {
+ /* Remove desk */
+ for (desks = pager->desks; desks; desks = desks->next)
+ {
+ pd = desks->data;
+ if ((pd->xpos == x) && (pd->ypos == y))
+ break;
+ }
+ if (pd->current)
+ {
+ desk = e_desk_current_get(ev->zone);
+ new = _pager_desk_find(pager, desk);
+ new->current = 1;
+ }
+ pager->desks = evas_list_remove(pager->desks, pd);
+ _pager_desk_destroy(pd);
+ }
+ }
}
- return(NULL);
+ pager->xnum = desks_x;
+ pager->ynum = desks_y;
+
+ _pager_draw(pager);
+ return 1;
}
Index: e/src/modules/pager/e_mod_main.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/modules/pager/e_mod_main.h,v
retrieving revision 1.9
diff -u -r1.9 e_mod_main.h
--- e/src/modules/pager/e_mod_main.h 22 Jan 2005 01:06:22 -0000 1.9
+++ e/src/modules/pager/e_mod_main.h 1 Feb 2005 11:45:58 -0000
@@ -13,18 +13,21 @@
struct _Pager
{
- Evas_List *managers;
+ E_Zone *zone;
+ Evas_List *desks;
+
E_Menu *config_menu;
- E_Container *con;
Evas *evas;
Evas_Object *base, *screen;
- Evas_List *desks;
-
+
/* E_Config_DD *conf_edd;*/
Config *conf;
Evas_Coord fx, fy, fw, fh;
E_Gadman_Client *gmc;
+
+ /* Current nr. of desktops */
+ int xnum, ynum;
Ecore_Event_Handler *ev_handler_border_resize;
Ecore_Event_Handler *ev_handler_border_move;
@@ -38,27 +41,29 @@
struct _Pager_Desk
{
+ E_Desk *desk;
+ Pager *owner;
Evas_List *wins;
+
Evas_Object *obj;
int xpos, ypos;
- E_Desk *desk;
- int current:1;
+ int current : 1;
};
struct _Pager_Win
{
+ E_Border *border;
+ Pager_Desk *owner;
+
Evas_Object *obj;
Evas_Object *icon;
-
- Pager_Desk *owner;
- E_Border *border;
};
-EAPI void *init (E_Module *m);
-EAPI int shutdown (E_Module *m);
-EAPI int save (E_Module *m);
-EAPI int info (E_Module *m);
-EAPI int about (E_Module *m);
+EAPI void *init (E_Module *module);
+EAPI int shutdown (E_Module *module);
+EAPI int save (E_Module *module);
+EAPI int info (E_Module *module);
+EAPI int about (E_Module *module);
#endif
