From d086fe5e5da5a8a910c71140287470ec2cb73bf4 Mon Sep 17 00:00:00 2001 From: handyande Date: Sun, 9 Jan 2005 19:02:18 +0000 Subject: [PATCH] Added start of pager module need to add windows to the desk previews will not update properly all the time, need to add events etc please someone theme this to fit in with default theme better - thanks :) SVN revision: 12844 --- configure.in | 1 + data/themes/default.edc | 91 ++++++- src/modules/Makefile.am | 1 + src/modules/pager/Makefile.am | 26 ++ src/modules/pager/e_mod_main.c | 405 ++++++++++++++++++++++++++++++ src/modules/pager/e_mod_main.h | 35 +++ src/modules/pager/module_icon.png | Bin 0 -> 1496 bytes 7 files changed, 558 insertions(+), 1 deletion(-) create mode 100644 src/modules/pager/Makefile.am create mode 100644 src/modules/pager/e_mod_main.c create mode 100644 src/modules/pager/e_mod_main.h create mode 100644 src/modules/pager/module_icon.png diff --git a/configure.in b/configure.in index 60d30ab09..13d2ea9e2 100644 --- a/configure.in +++ b/configure.in @@ -188,6 +188,7 @@ src/modules/test/Makefile src/modules/ibar/Makefile src/modules/dropshadow/Makefile src/modules/clock/Makefile +src/modules/pager/Makefile src/modules/flame/Makefile src/modules/snow/Makefile src/modules/battery/Makefile diff --git a/data/themes/default.edc b/data/themes/default.edc index b443e7f39..7b1998ba4 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -273,7 +273,9 @@ images { image: "e17_temperature_base.png" COMP; image: "e17_temperature_mid.png" COMP; image: "e17_temperature_overlay.png" COMP; - + + image: "e17_pager_screen.png" COMP; + image: "e17_pager_desk.png" COMP; } collections { @@ -5611,4 +5613,91 @@ collections { } } } + + group { + name: "modules/pager/screen"; + parts { + part { + name: "background"; + mouse_events: 0; + type: RECT; + description { + state: "default" 0.0; + visible: 0; + min: 18 18; + max: 18 18; + rel1 { + relative: 0.0 0.0; + offset: 0 0; + } + rel2 { + relative: 1.0 1.0; + offset: -1 -1; + } + color: 0 0 0 0; + } + } + part { + name: "overlay"; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.0; + offset: 0 0; + } + rel2 { + relative: 1.0 1.0; + offset: -1 -1; + } + image { + normal: "e17_pager_screen.png"; + border: 7 7 7 7; + } + } + } + } + } + group { + name: "modules/pager/desk"; + parts { + part { + name: "background"; + mouse_events: 0; + type: RECT; + description { + state: "default" 0.0; + visible: 0; + rel1 { + relative: 0.0 0.0; + offset: 0 0; + } + rel2 { + relative: 1.0 1.0; + offset: -1 -1; + } + color: 0 0 0 0; + } + } + part { + name: "overlay"; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.0; + offset: 0 0; + } + rel2 { + relative: 1.0 1.0; + offset: -1 -1; + } + image { + normal: "e17_pager_desk.png"; + border: 2 2 2 2; + } + } + } + } + } } diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am index ed5b4719b..47f2d447a 100644 --- a/src/modules/Makefile.am +++ b/src/modules/Makefile.am @@ -4,6 +4,7 @@ test \ ibar \ dropshadow \ clock \ +pager \ flame \ snow \ battery \ diff --git a/src/modules/pager/Makefile.am b/src/modules/pager/Makefile.am new file mode 100644 index 000000000..8128e73b1 --- /dev/null +++ b/src/modules/pager/Makefile.am @@ -0,0 +1,26 @@ +MAINTAINERCLEANFILES = Makefile.in +MODULE = pager + +# data files for the module +filesdir = $(libdir)/enlightenment/modules/$(MODULE) +files_DATA = \ +module_icon.png + +EXTRA_DIST = $(files_DATA) + +# the module .so file +INCLUDES = -I. \ + -I$(top_srcdir) \ + -I$(includedir) \ + -I$(top_srcdir)$(MODULE) \ + -I$(top_srcdir)/src/bin \ + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/modules \ + @e_cflags@ +pkgdir = $(libdir)/enlightenment/modules/$(MODULE) +pkg_LTLIBRARIES = module.la +module_la_SOURCES = e_mod_main.c \ + e_mod_main.h +module_la_LIBADD = @e_libs@ @dlopen_libs@ +module_la_LDFLAGS = -module -avoid-version +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c new file mode 100644 index 000000000..ffa188b63 --- /dev/null +++ b/src/modules/pager/e_mod_main.c @@ -0,0 +1,405 @@ +#include "e.h" +#include "e_mod_main.h" + +/* 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 void _pager_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _pager_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _pager_cb_move(void *data, Evas *e, Evas_Object *obj, void *event_info); +static int _pager_cb_event_container_resize(void *data, int type, void *event); + +static void _pager_reconfigure(Pager *e); +static void _pager_refresh(Pager *e); + +#define PAGER_MIN_W 10 +#define PAGER_MIN_H 7 + + +Evas_List *_pager_desks; + +/* public module routines. all modules must have these */ +void * +init(E_Module *m) +{ + Pager *e; + + /* check module api version */ + if (m->api->version < E_MODULE_API_VERSION) + { + e_error_dialog_show("Module API Error", + "Error initializing Module: Pager\n" + "It requires a minimum module API version of: %i.\n" + "The module API advertized by Enlightenment is: %i.\n" + "Aborting module.", + E_MODULE_API_VERSION, + m->api->version); + return NULL; + } + /* actually init pager */ + e = _pager_init(m); + m->config_menu = _pager_config_menu_new(e); + return e; +} + +int +shutdown(E_Module *m) +{ + Pager *e; + + e = m->data; + if (e) + { + if (m->config_menu) + { + _pager_config_menu_del(e, m->config_menu); + m->config_menu = NULL; + } + _pager_shutdown(e); + } + return 1; +} + +int +save(E_Module *m) +{ + Pager *e; + + e = m->data; + e_config_domain_save("module.pager", e->conf_edd, e->conf); + return 1; +} + +int +info(E_Module *m) +{ + 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); + return 1; +} + +int +about(E_Module *m) +{ + e_error_dialog_show("Enlightenment Pager Module", + "A pager module to navigate E17 desktops."); + return 1; +} + +/* module private routines */ +static Pager * +_pager_init(E_Module *m) +{ + Pager *e; + Evas_List *managers, *l, *l2; + Evas_Object *o; + + e = calloc(1, sizeof(Pager)); + if (!e) return NULL; + + e->conf_edd = E_CONFIG_DD_NEW("Pager_Config", Config); +#undef T +#undef D +#define T Config +#define D e->conf_edd + E_CONFIG_VAL(D, T, width, INT); + E_CONFIG_VAL(D, T, height, INT); + E_CONFIG_VAL(D, T, x, DOUBLE); + E_CONFIG_VAL(D, T, y, DOUBLE); + + e->conf = e_config_domain_load("module.pager", e->conf_edd); + if (!e->conf) + { + e->conf = E_NEW(Config, 1); + e->conf->width = 50; + e->conf->height = 30; + e->conf->x = 0.0; + e->conf->y = 0.0; + } + E_CONFIG_LIMIT(e->conf->x, 0.0, 1.0); + E_CONFIG_LIMIT(e->conf->y, 0.0, 1.0); + E_CONFIG_LIMIT(e->conf->width, PAGER_MIN_W, 1000); + E_CONFIG_LIMIT(e->conf->height, PAGER_MIN_H, 1000); + + managers = e_manager_list(); + 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->con = con; + e->evas = con->bg_evas; + } + } + + 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_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _pager_cb_up, e); + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _pager_cb_move, e); + evas_object_show(o); + + 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_container_resize = + ecore_event_handler_add(E_EVENT_CONTAINER_RESIZE, + _pager_cb_event_container_resize, e); + + _pager_reconfigure(e); + return e; +} + +static void +_pager_shutdown(Pager *e) +{ + free(e->conf); + E_CONFIG_DD_FREE(e->conf_edd); + + ecore_event_handler_del(e->ev_handler_container_resize); + free(e); +} + +static E_Menu * +_pager_config_menu_new(Pager *e) +{ + 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_menu_item_callback_set(mi, _pager_cb_scale, e);*/ + e->config_menu = mn; + + return mn; +} + +static void +_pager_config_menu_del(Pager *e, E_Menu *m) +{ + e_object_del(E_OBJECT(m)); +} + +static void +_pager_reconfigure(Pager *e) +{ + Evas_Coord ww, hh; + + evas_output_viewport_get(e->evas, NULL, NULL, &ww, &hh); + e->fx = e->conf->x * (ww - e->conf->width); + e->fy = e->conf->y * (hh - e->conf->height); + e->fw = e->conf->width; + e->fh = e->conf->height; + + _pager_refresh(e); +} + +static void +_pager_refresh(Pager *e) +{ + E_Zone *zone; + E_Desk *desk, *current; + Evas_Object *desk_obj; + int desks_x, desks_y, x, y; + Evas_Coord px, py, pw, ph; + + evas_object_resize(e->base, e->fw, e->fh); + evas_object_move(e->base, e->fx, e->fy); + + zone = e_zone_current_get(e->con); + e_zone_desk_count_get(zone, &desks_x, &desks_y); + pw = e->fw / (double) desks_x; + ph = e->fh / (double) desks_y; + + evas_object_resize(e->screen, pw, ph); + + while(_pager_desks) + { + evas_object_hide(_pager_desks->data); + evas_object_free(_pager_desks->data); + _pager_desks = evas_list_remove_list(_pager_desks, _pager_desks); + } + + current = e_desk_current_get(zone); + for (x = 0; x < desks_x; x++) + for (y = 0; y < desks_y; y++) + { + desk = e_desk_at_xy_get(zone, x, y); + if (desk == current) + evas_object_move(e->screen, e->fx + (x * pw), e->fy + (y * ph)); + desk_obj = edje_object_add(e->evas); + edje_object_file_set(desk_obj, + /* FIXME: "default.eet" needs to come from conf */ + e_path_find(path_themes, "default.eet"), + "modules/pager/desk"); + evas_object_pass_events_set(desk_obj, 1); + evas_object_resize(desk_obj, pw, ph); + evas_object_move(desk_obj, e->fx + (x * pw), e->fy + (y * ph)); + + evas_object_show(desk_obj); + _pager_desks = evas_list_append(_pager_desks, desk_obj); + } +} + +static void +_pager_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down *ev; + Pager *p; + + ev = event_info; + p = data; + if (ev->button == 3) + { + e_menu_activate_mouse(p->config_menu, p->con, + ev->output.x, ev->output.y, 1, 1, + E_MENU_POP_DIRECTION_DOWN); + e_util_container_fake_mouse_up_all_later(p->con); + } + else if (ev->button == 2) + { + p->resize = 1; + } + else if (ev->button == 1) + { + p->move = 1; + } + evas_pointer_canvas_xy_get(p->evas, &p->xx, &p->yy); +} + +static void +_pager_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up *ev; + Pager *p; + Evas_Coord ww, hh; + double newx, newy; + + ev = event_info; + p = data; + + /* if we clicked, not moved - FIXME, this is a hack */ + newx = (double)p->fx / (double)(ww - p->fw); + newy = (double)p->fy / (double)(hh - p->fy); + if (p->move && (p->conf->x == newx) && (p->conf->y == newy)) + { +printf("clicked\n"); + int x, y, w, h, xcount, ycount, cx, cy; + E_Zone *zone; + E_Desk *desk; + + zone = e_zone_current_get(p->con); + e_zone_desk_count_get(zone, &xcount, &ycount); + evas_pointer_canvas_xy_get(e, &cx, &cy); + + w = p->fw / xcount; + h = p->fh / ycount; + for (x = 0; x < xcount; x++) + for (y = 0; y < ycount; y++) + { +printf("test %d, %d\n", x, y); + int left, right, top, bottom; + left = p->fx + x * w; + right = left + w; + top = p->fy + y * h; + bottom = top + h; +printf("l %d r %d t %d b %d = %d, %d\n", left, right, top, bottom, cx, cy); + if (left <= cx && cx < right && top <= cy && cy < bottom) + { +printf("matched %d, %d\n", x, y); + desk = e_desk_at_xy_get(zone, x, y); + e_desk_show(desk); + evas_object_move(p->screen, left, top); + } + } + } + p->move = 0; + p->resize = 0; + + evas_output_viewport_get(p->evas, NULL, NULL, &ww, &hh); + p->conf->width = p->fw; + p->conf->height = p->fh; + p->conf->x = newx; + p->conf->y = newy; + e_config_save_queue(); + +} + +static void +_pager_cb_move(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move *ev; + Pager *p; + Evas_Coord cx, cy, sw, sh; + + evas_pointer_canvas_xy_get(e, &cx, &cy); + evas_output_viewport_get(e, NULL, NULL, &sw, &sh); + + ev = event_info; + p = data; + if (p->move) + { + p->fx += cx - p->xx; + p->fy += cy - p->yy; + if (p->fx < 0) p->fx = 0; + if (p->fy < 0) p->fy = 0; + if (p->fx + p->fw > sw) p->fx = sw - p->fw; + if (p->fy + p->fh > sh) p->fy = sh - p->fh; + _pager_refresh(p); + } + else if (p->resize) + { + Evas_Coord dx, dy; + + dx = cx - p->xx; + dy = cy - p->yy; + + p->fw += dx; + p->fh += dy; + if (p->fw < PAGER_MIN_W) p->fw = PAGER_MIN_W; + if (p->fh < PAGER_MIN_H) p->fh = PAGER_MIN_H; +// if (p->fw < p->minsize) p->fw = p->minsize; +// if (p->fw > p->maxsize) p->fw = p->maxsize; + if (p->fx + p->fw > sw) p->fw = sw - p->fx; + if (p->fy + p->fh > sh) p->fh = sh - p->fy; + _pager_refresh(p); + } + p->xx = ev->cur.canvas.x; + p->yy = ev->cur.canvas.y; +} + +static int +_pager_cb_event_container_resize(void *data, int type, void *event) +{ + Pager *e; + + e = data; + _pager_reconfigure(e); + return 1; +} diff --git a/src/modules/pager/e_mod_main.h b/src/modules/pager/e_mod_main.h new file mode 100644 index 000000000..d7107f9ab --- /dev/null +++ b/src/modules/pager/e_mod_main.h @@ -0,0 +1,35 @@ +#ifndef E_MOD_MAIN_H +#define E_MOD_MAIN_H + +typedef struct _Config Config; +typedef struct _Pager Pager; + +struct _Config +{ + int width, height; + double x, y; +}; + +struct _Pager +{ + E_Menu *config_menu; + Evas *evas; + Evas_Object *base, *screen; + + E_Container *con; + E_Config_DD *conf_edd; + Config *conf; + unsigned char move : 1; + unsigned char resize : 1; + Ecore_Event_Handler *ev_handler_container_resize; + Evas_Coord fx, fy, fw, fh; + Evas_Coord xx, yy; +}; + +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); + +#endif diff --git a/src/modules/pager/module_icon.png b/src/modules/pager/module_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c166c34e49f30f43bb5ab27e6882fb8f966b6f66 GIT binary patch literal 1496 zcmV;}1tr~F000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGfi2wi#i2*ms%dG$a00(qQO+^RP3>XIh6O`96vj6}99dt!l zbVF}#ZDnqB07G(RVRU6=Aa`kWXdqN*WgtgMO;GP-C2jx!1wBbbK~#9!?VCYQ<3<$6 ze|GHPY*taCB`BBXoMWR3$K5ZncUp-kIdJF~;0EG`dJb|A{T^JZ9=OB@q#g=fXw}0~ z7J+E8ED-D-JmZ)oBr({I+x18zhsiLW_n$ZK{pY<2eC0(6x!-e&lLP>i33X8bI1_55 z04RV8Xn-!B>WI*B0pI{OFaYkw(~c4ZDQp&a1?0suI|4!+07&8QfX_f*Jny0eK@;^A z@CH~B&(}g5)EEJ<#j5v!3*hgO_Q(Lx#mcV$zb42)zXQGiw_+<0hX&v{&cY>E6a_J# zPr$X%#7MS*-v+!MHd|n|#YYQT4whv-`z4lT(Q36Ojyt&u#C)>8Z5WvbC_qMR1u>Df zI~g&jx1zbxXwd0&9tzNIx4pJ@+ZANAj|bkQaYdWbhHh*4E+M>JAazbV6j(#l5mz{~ zNFn8Ow0%}TrR~qKm}L^s=&9vPmbfjo`PTF-*z1K_V!-1 z3Ob$6#BnFJ2^;VO@Eh=#@C@^Kg20@@4?rC-6J!LpfZu_Sf)fk^05CVF(56gaA;q@< zRq-qfclZzhfVnw^_S8t-ZZ~$}8;yql&+p>k6eZ+}_?|+cu8l1g@gI z5nN~NoTDWbfYZ}c48!2^@{)W$kEUrTiV`}fNGt%`+uH!_?(Sk32ANF81K=5)LKp6E z?5LmEE#NO38yhd>6zUUkj^t{<`}glzUS8(#@R0TOb)V{c^pb9CjC0d%K@hrnnBx*oYEXt+Vb&$!Xkg+_$^rC2OJiUdV9FHNX^A2)RTj`8%k zBKjHPyKjK+P1A&5nwFT;}NLh^?(H zw+~RO)#h@0s;Z*vI)-6*Rcb&SHo(S>n_n}2JH($oE(27nRm$b^)WNG&H@8u#ROa^m zs;ZL7WIQ9Ns%jVjIJ3Nf%$N)q4<1SY5L@L7K%r0o;NalE(|~@z&)L}-$H&L)?Cf}b z^7(uq!Xx*5)E>Ye5t?=zO9CPRdH~RM-E&vcYsgj8GWZ728wP^`wrz)|5!>6_9>)NF2L2R6 z-UwBf)ZU*S?=#_&MW_Hs3IJGITB2Aia({pCWp=|Xl4A(r;Nt2=C_@Vue5AUZwfRx5{%}kqOlZN)V(rOcFdSFeJwiyreHy|9V8tXI{Jx zJu@_myo3dSbhTo?%T>N7;I-P=Q)6Ly2H!X@x>lct#8LoK08#)_0Ky6`ET}lC2E+tF zA`>Xnf*oNJA^C#DB~YdXJHlpyiAjPI)JUvaYN%t{C(jC y!(WxyQQ3f536!`1aOMhjgsB0t@Bi*M#{UA8rcrZ(^XmHm0000