From 38ac2443ca5bbe93421b514b18f410a631114bbb Mon Sep 17 00:00:00 2001 From: rephorm Date: Wed, 30 Jan 2002 03:16:33 +0000 Subject: [PATCH] Epplets run from ~/.e/desktop/default/.e_epplets/eppletName/eppletName.fe (copy em manually for now) Get epplets to keep track of the ebits / evas objects they create, so they can be cleaned up later. Also, some small epplet API changes. When creating Ebits / EvasObjects, pass a path relative to the .fe file rather than the full path. Usually, you just need a file name, which should be in the same dir as the epplet. if a file named layout.bits.db exists in an epplet's dir, it is used for the default layout (location) of that epplet rather than whatever is in ~/.e/desktop/default/.e_epplets.bits.db. Only use this if a specific size/location of the epplet is necessary. (just create one dummy image in the bits with the name of the epplet, and its location/size relative to the entire view) Note, try to not use this, as user customizability is important... I will eventually make it so that if a ui.bits.db exists, it will automatically be loaded as the main bits file, and set as epplet.bits in the script. (Can't get object creation from within a .fec to work correctly yet...) This would remove the need for the setBits() call. SVN revision: 5881 --- src/e_ferite.fec | 212 ++++++++++++++++++++++++++++------------------- src/epplet.c | 88 +++++++++++++++++++- src/epplet.h | 80 +++++++++++------- src/menu.c | 3 - 4 files changed, 263 insertions(+), 120 deletions(-) diff --git a/src/e_ferite.fec b/src/e_ferite.fec index 31127e9b4..739ed060b 100644 --- a/src/e_ferite.fec +++ b/src/e_ferite.fec @@ -2,6 +2,7 @@ header %{ #include "Ecore.h" #include "Ebits.h" + #include "ferite.h" #include "desktops.h" #include "border.h" @@ -9,11 +10,13 @@ header %{ #include "debug.h" #include "globals.h" #include "observer.h" + #include "file.h" #define BorderObj ((E_Border *)(self->odata)) #define BitsObj ((Ebits_Object)self->odata) #define EppObj ((E_Epplet *)(self->odata)) #define EvasObj ((Evas_Object_Wrapper *)(self->odata)) + %} class Border { @@ -148,6 +151,11 @@ namespace e { ecore_event_loop_quit(); %} + function restart() + %{ + e_exec_restart(); + %} + function dataCopy(object from, object to) %{ to->odata = from->odata; @@ -172,18 +180,27 @@ class EvasObject EvasObj = NEW(Evas_Object_Wrapper, 1); ZERO(EvasObj, Evas_Object_Wrapper, 1); - EvasObj->evas = ((E_Epplet *)(epp->odata))->view->evas; + EvasObj->epp = (E_Epplet *)(epp->odata); + EvasObj->evas = EvasObj->epp->view->evas; + + EvasObj->epp->evas_objects = evas_list_append(EvasObj->epp->evas_objects, EvasObj); + %} function Destructor() %{ %} - function addImage(string path) + function addImage(string file) %{ - if (EvasObj->evas) - EvasObj->obj = evas_add_image_from_file(EvasObj->evas, path); - ffree(path); + char buf[PATH_MAX]; + + if (EvasObj->evas && EvasObj->epp) + { + snprintf(buf, PATH_MAX, "%s%s", EvasObj->epp->view->dir, file); + EvasObj->obj = evas_add_image_from_file(EvasObj->evas, file); + } + ffree(file); %} function addRectangle() @@ -255,10 +272,8 @@ class EvasObject function setColor(number r, number g, number b, number a) %{ - D("in setColor\n"); if (EvasObj->evas && EvasObj->obj) evas_set_color(EvasObj->evas, EvasObj->obj, (long)r, (long)g, (long)b, (long)a); - D("leaving setColor\n"); %} @@ -351,18 +366,23 @@ class EvasObject class Ebits { - function Ebits(string path) + function Ebits(string file, object epp) %{ - D("in Ebits constructor\n"); - D("loading bits\n"); + char buf[PATH_MAX]; + + snprintf(buf, PATH_MAX, "%s/.e_epplets/%s/%s", ((E_Epplet *)(epp->odata))->view->dir, ((E_Epplet *)(epp->odata))->name, file); + D("adding ebits: %s\n", buf); BitsObj = NULL; - BitsObj = ebits_load(path); - if (BitsObj) - printf("bits loaded\n"); - else - printf("ERROR: bits not found\n"); + BitsObj = ebits_load(buf); - ffree(path); + ((E_Epplet *)(epp->odata))->ebits = evas_list_append(((E_Epplet *)(epp->odata))->ebits, BitsObj); +/* + if (BitsObj) + D("bits loaded\n"); + else + D("ERROR: bits not found\n"); +*/ + ffree(file); %} function Destructor() @@ -377,51 +397,60 @@ class Ebits function free() %{ - ebits_free(BitsObj); + if(BitsObj) + ebits_free(BitsObj); %} function show() %{ + if(BitsObj) ebits_show(BitsObj); %} function hide() %{ + if(BitsObj) ebits_hide(BitsObj); %} function raise() %{ + if(BitsObj) ebits_raise(BitsObj); %} function lower() %{ + if(BitsObj) ebits_lower(BitsObj); %} function move(number x, number y) %{ + if(BitsObj) ebits_move(BitsObj, x, y); %} function resize(number w, number h) %{ + if(BitsObj) ebits_resize(BitsObj, w, h); %} function setLayer(number l) %{ + if(BitsObj) ebits_set_layer(BitsObj, l); %} function setState(string bitName, string state) %{ - ebits_set_named_bit_state(BitsObj, bitName, state); + if(BitsObj) + ebits_set_named_bit_state(BitsObj, bitName, state); ffree(bitName); ffree(state); %} - +/* function getNamedBitGeometry(string bitName, number x, number y, number w, number h) %{ double xx, yy, ww, hh; @@ -432,12 +461,13 @@ class Ebits w = ww; h = hh; %} +*/ function getNamedBitGeometryX(string bitName) %{ double x; - ebits_get_named_bit_geometry(BitsObj, bitName, &x, NULL, NULL, NULL); - D("%s.x: %i\n", bitName, x); + if(BitsObj) + ebits_get_named_bit_geometry(BitsObj, bitName, &x, NULL, NULL, NULL); ffree(bitName); FE_RETURN_DOUBLE(x); %} @@ -445,7 +475,8 @@ class Ebits function getNamedBitGeometryY(string bitName) %{ double y; - ebits_get_named_bit_geometry(BitsObj, bitName, NULL, &y, NULL, NULL); + if(BitsObj) + ebits_get_named_bit_geometry(BitsObj, bitName, NULL, &y, NULL, NULL); ffree(bitName); FE_RETURN_DOUBLE(y); %} @@ -453,7 +484,8 @@ class Ebits function getNamedBitGeometryW(string bitName) %{ double w; - ebits_get_named_bit_geometry(BitsObj, bitName, NULL, NULL, &w, NULL); + if(BitsObj) + ebits_get_named_bit_geometry(BitsObj, bitName, NULL, NULL, &w, NULL); ffree(bitName); FE_RETURN_DOUBLE(w); %} @@ -461,7 +493,8 @@ class Ebits function getNamedBitGeometryH(string bitName) %{ double h; - ebits_get_named_bit_geometry(BitsObj, bitName, NULL, NULL, NULL, &h); + if(BitsObj) + ebits_get_named_bit_geometry(BitsObj, bitName, NULL, NULL, NULL, &h); ffree(bitName); FE_RETURN_DOUBLE(h); %} @@ -472,7 +505,9 @@ class Ebits cb = e_epplet_cb_new(script, func, data, NULL); - ebits_set_classed_bit_callback(BitsObj, bitClass, CALLBACK_MOUSE_DOWN, e_epplet_bits_cb, cb); + if(BitsObj) + ebits_set_classed_bit_callback(BitsObj, bitClass, CALLBACK_MOUSE_DOWN, + e_epplet_bits_cb, cb); ffree(bitClass); ffree(func); @@ -482,33 +517,62 @@ class Ebits class Epplet { - object bits; + object ui; function Epplet() %{ - EppObj = malloc(sizeof(E_Epplet)); - memset(EppObj, 0, sizeof(E_Epplet)); + char buf[PATH_MAX]; +/* FeriteVariable *ui; + FeriteVariable **params;*/ - EppObj->context = e_epplet_get_context_from_script(script); - EppObj->view = EppObj->context->view; - EppObj->name = strdup(EppObj->context->name); - EppObj->current.x = EppObj->context->geom.x; - EppObj->current.y = EppObj->context->geom.y; - EppObj->current.w = EppObj->context->geom.w; - EppObj->current.h = EppObj->context->geom.h; + EppObj = e_epplet_new(script); +#if 0 +/* FIXME: this is not complete, object creation doesn't work for some reason??? */ + D("epplet created\n"); + /* if ui.bits.db exists, make it the ui */ + snprintf(buf, PATH_MAX, "%sui.bits.db", EppObj->dir); + if (e_file_exists(buf)) + { + EppObj->ui = ebits_load(buf); + ebits_add_to_evas(EppObj->ui, EppObj->view->evas); + +/* ui = __ferite_get_variable_from_hash(script, self->variables, "ui");*/ + params = __ferite_create_parameter_list_from_data(script, "so", "ui.bits.db", self); + ui = __ferite_new_object( script, __ferite_find_class(script, script->mainns, "Ebits"), params ); + __ferite_delete_parameter_list(script, params); + D("object created, name: %s\n", ui->name); - if (!EppObj->view) { D("Error: no view found for script\n"); } - else { D("got view: %s\n", EppObj->view->dir); } +/*FIXME: how do i set an object's data?*/ + } +#endif + + /* if layout.bits.db exists, make it the layout */ + snprintf(buf, PATH_MAX, "%slayout.bits.db", EppObj->dir); + if (e_file_exists(buf)) + { + double x, y, w, h; + + EppObj->layout = ebits_load(buf); + ebits_add_to_evas(EppObj->layout, EppObj->view->evas); + ebits_move(EppObj->layout, 0, 0); + ebits_resize(EppObj->layout, EppObj->view->size.w, EppObj->view->size.h); + ebits_get_named_bit_geometry(EppObj->layout, EppObj->name, + &x, &y, &w, &h); + + EppObj->current.x = x; + EppObj->current.y = y; + EppObj->current.w = w; + EppObj->current.h = h; + } %} function setBits(object ebits) %{ - EppObj->bits = ((Ebits_Object)ebits->odata); - EppObj->fbits = ebits; + EppObj->ui = ((Ebits_Object)ebits->odata); - if(EppObj->bits && EppObj->view) + if(EppObj->ui && EppObj->view) { - ebits_add_to_evas(EppObj->bits, EppObj->view->evas); + ebits_add_to_evas(EppObj->ui, EppObj->view->evas); e_epplet_set_common_callbacks(EppObj); D("bits added to view\n"); D("view dir: %s\n", EppObj->view->dir); @@ -528,16 +592,16 @@ class Epplet D("moving epplet: %f, %f\n", x, y); - if (EppObj->bits) - ebits_move(EppObj->bits, EppObj->current.x, EppObj->current.y); + if (EppObj->ui) + ebits_move(EppObj->ui, EppObj->current.x, EppObj->current.y); %} function resize(number w, number h) %{ EppObj->current.w = w; EppObj->current.h = h; - if (EppObj->bits) - ebits_resize(EppObj->bits, EppObj->current.w, EppObj->current.h); + if (EppObj->ui) + ebits_resize(EppObj->ui, EppObj->current.w, EppObj->current.h); %} function getX() @@ -563,54 +627,36 @@ class Epplet function display() %{ int mw, mh; - - if(EppObj->view && EppObj->bits) + D("in display()\n"); + if(EppObj->view && EppObj->ui) { - D("adding bits for epplet `%s'\n", EppObj->context->name); - D("x: %f, y: %f, w: %f, h: %f\n", EppObj->context->geom.x, EppObj->context->geom.y, EppObj->context->geom.w, EppObj->context->geom.h); - ebits_show(EppObj->bits); + ebits_show(EppObj->ui); - if ((EppObj->context->geom.w) && (EppObj->context->geom.h)) - { - EppObj->current.w = EppObj->context->geom.w; - EppObj->current.h = EppObj->context->geom.h; + ebits_get_min_size(EppObj->ui, &mw, &mh); + if ( EppObj->current.w < mw ) EppObj->current.w = mw; + if ( EppObj->current.h < mh ) EppObj->current.h = mh; - ebits_get_min_size(EppObj->bits, &mw, &mh); - if ( EppObj->current.w < mw ) EppObj->current.w = mw; - if ( EppObj->current.h < mh ) EppObj->current.h = mh; - } + ebits_get_max_size(EppObj->ui, &mw, &mh); + if ( EppObj->current.w > mw ) EppObj->current.w = mw; + if ( EppObj->current.h > mh ) EppObj->current.h = mh; + + if (EppObj->current.x > (EppObj->view->size.w - EppObj->current.w)) + EppObj->current.x = EppObj->view->size.w - EppObj->current.w; + if (EppObj->current.y > (EppObj->view->size.h - EppObj->current.h)) + EppObj->current.y = EppObj->view->size.h - EppObj->current.h; - else - { - ebits_get_min_size(EppObj->bits, &mw, &mh); - if (mw == 0 || mh == 0) - { - mw = mh = 50; - } - EppObj->current.w = mw; - EppObj->current.h = mh; - } - - EppObj->current.x = EppObj->context->geom.x; - EppObj->current.y = EppObj->context->geom.y; - - ebits_get_min_size(EppObj->bits, &mw, &mh); - - if (EppObj->current.x > (EppObj->view->size.w - mw)) - EppObj->current.x = EppObj->view->size.w - mw; - if (EppObj->current.y > (EppObj->view->size.h - mh)) - EppObj->current.y = EppObj->view->size.h - mh; - - ebits_set_layer(EppObj->bits, 12000); - ebits_resize(EppObj->bits, EppObj->current.w, EppObj->current.h); - ebits_move(EppObj->bits, EppObj->current.x, EppObj->current.y); + ebits_set_layer(EppObj->ui, 12000); + ebits_resize(EppObj->ui, EppObj->current.w, EppObj->current.h); + ebits_move(EppObj->ui, EppObj->current.x, EppObj->current.y); } %} +/* function getBits() %{ FE_RETURN_VAR(EppObj->fbits); %} +*/ function getViewW() %{ @@ -627,7 +673,7 @@ class Epplet char buf[PATH_MAX], *retval; printf("getting dir:\n"); - snprintf(buf, PATH_MAX, "%s%s/", e_config_get("epplets"), EppObj->name); + snprintf(buf, PATH_MAX, "%s/.e_epplets/%s/", EppObj->view->dir, EppObj->name); printf("%s\n", buf); retval = (char *)buf; FE_RETURN_STR(retval, 0); diff --git a/src/epplet.c b/src/epplet.c index bf8c16b00..5270a81c2 100644 --- a/src/epplet.c +++ b/src/epplet.c @@ -7,6 +7,7 @@ #include "e_ferite.h" +static void e_epplet_cleanup(E_Epplet *epp); static void e_epplet_mouse_down_cb (void *_data, Ebits_Object _o, char *_c, int _b, int _x, int _y, int _ox, int _oy, int _ow, int _oh); @@ -21,6 +22,83 @@ static void e_epplet_mouse_move_cb (void *_data, Ebits_Object _o, static void e_epplet_observer_cleanup(E_Object *o); +E_Epplet * +e_epplet_new(void *scr) +{ +#ifdef USE_FERITE + E_Epplet *epp; + FeriteScript *script; + char buf[PATH_MAX]; + + D_ENTER; + + script = (FeriteScript *)scr; + + epp = NEW(E_Epplet, 1); + ZERO(epp, E_Epplet, 1); + + e_object_init(E_OBJECT(epp), (E_Cleanup_Func) e_epplet_cleanup); + + epp->context = e_epplet_get_context_from_script(script); + if (!(epp->context)) + { + D("Error: epplet context not found\n"); + D_RETURN_(NULL); + } + + epp->view = epp->context->view; + epp->name = strdup(epp->context->name); + epp->current.x = epp->context->geom.x; + epp->current.y = epp->context->geom.y; + epp->current.w = epp->context->geom.w; + epp->current.h = epp->context->geom.h; + epp->context->epp = epp; + + snprintf(buf, PATH_MAX, "%s/.e_epplets/%s/", epp->view->dir, epp->name); + epp->dir = strdup(buf); + + if (!(epp->view)) + { + D("Error: no view found for epplet: %s\n", epp->name); + e_object_unref(E_OBJECT(epp)); + D_RETURN_(NULL); + } + else + { + D_RETURN_(epp); + } +#endif + +} + +static void +e_epplet_cleanup(E_Epplet *epp) +{ + Evas_List l; + + D_ENTER; + +#ifdef USE_FERITE + for (l = epp->ebits; l; l = l->next) + { + Ebits_Object o = l->data; + ebits_free(o); + } + + for (l = epp->evas_objects; l; l = l->next) + { + Evas_Object_Wrapper *o = l->data; + evas_del_object(o->evas, o->obj); + + free(o); + } + + if (epp->layout) ebits_free(epp->layout); + if (epp->ui) ebits_free(epp->ui); +#endif + D_RETURN; +} + void e_epplet_load_from_layout (E_View * v) { @@ -63,7 +141,7 @@ e_epplet_load_from_layout (E_View * v) v->epplet_contexts = evas_list_append (v->epplet_contexts, context); - snprintf (buf, PATH_MAX, "%s%s/%s.fe", e_config_get ("epplets"), context->name, + snprintf (buf, PATH_MAX, "%s/.e_epplets/%s/%s.fe", v->dir, context->name, context->name); if (e_file_exists (buf)) e_epplet_script_load (context, buf); @@ -141,9 +219,11 @@ e_epplet_script_load (E_Epplet_Context * context, char *path) D_RETURN; } + void e_epplet_set_common_callbacks (E_Epplet * epp) { +/* D ("setting callbacks\n"); #ifdef USE_FERITE @@ -193,6 +273,7 @@ e_epplet_set_common_callbacks (E_Epplet * epp) #endif D ("callbacks set\n"); +*/ } static void @@ -312,7 +393,7 @@ e_epplet_mouse_move_cb (void *_data, Ebits_Object _o, D_ENTER; #ifdef USE_FERITE - epp = _data; +/* epp = _data; if (epp->state.moving) { @@ -329,7 +410,7 @@ e_epplet_mouse_move_cb (void *_data, Ebits_Object _o, epp->current.x = x; epp->current.y = y; - ebits_move (epp->bits, epp->current.x, epp->current.y); + ebits_move (epp->ui, epp->current.x, epp->current.y); } if (epp->state.resizing.left || epp->state.resizing.right @@ -404,6 +485,7 @@ e_epplet_mouse_move_cb (void *_data, Ebits_Object _o, ebits_move (epp->bits, epp->current.x, epp->current.y); } +*/ #endif D_RETURN; diff --git a/src/epplet.h b/src/epplet.h index d1ce0fe38..f2750f195 100644 --- a/src/epplet.h +++ b/src/epplet.h @@ -35,6 +35,8 @@ struct _E_Epplet_Context E_View *view; FeriteScript *script; + E_Epplet *epp; + struct { double x, y; double w, h; @@ -44,55 +46,71 @@ struct _E_Epplet_Context struct _E_Epplet { - E_Object o; + E_Object o; - E_Epplet_Context *context; + E_Epplet_Context *context; - char *name; - E_View *view; - Ebits_Object bits; + char *name; + E_View *view; + char *dir; + Ebits_Object layout; + Ebits_Object ui; - FeriteVariable *fbits; - struct { - double x, y; - double w, h; - } current, requested, offset; + struct { + double x, y; + double w, h; + } current, requested, offset; - struct { - int changed; - int moving; - struct { - int up, down, left, right; - }resizing; - } state; - - void *data; + struct { + int changed; + int moving; + struct { + int up, down, left, right; + }resizing; + } state; + Evas_List evas_objects; + Evas_List ebits; }; struct _Evas_Object_Wrapper { Evas evas; Evas_Object obj; + E_Epplet *epp; }; -void e_epplet_load_from_layout(E_View *v); +/* epplet loading / cleanup */ +E_Epplet *e_epplet_new(); +void e_epplet_load_from_layout(E_View *v); +void e_epplet_script_load(E_Epplet_Context *v, char *script_path); E_Epplet_Context *e_epplet_get_context_from_script(FeriteScript *script); -void e_epplet_script_load(E_Epplet_Context *v, char *script_path); + +/* probably won't use this... */ void e_epplet_set_common_callbacks(E_Epplet *epp); + + +/* callbacks */ E_Epplet_CB_Info *e_epplet_cb_new( FeriteScript *script, char *func_name, - FeriteObject *data, FeriteObject *data2 ); -void e_epplet_cb_cleanup( E_Epplet_CB_Info *cb); -void e_epplet_bits_cb (void *_data, Ebits_Object _o, char *_c, - int _b, int _x, int _y, int _ox, int _oy, int _ow, int _oh); -void e_epplet_evas_cb (void *_data, Evas _e, Evas_Object _o, - int _b, int _x, int _y); -void e_epplet_timer_func(int val, void *data); + FeriteObject *data, FeriteObject *data2 ); +void e_epplet_cb_cleanup( E_Epplet_CB_Info *cb); +void e_epplet_bits_cb (void *_data, Ebits_Object _o, char *_c, + int _b, int _x, int _y, int _ox, int _oy, + int _ow, int _oh); +void e_epplet_evas_cb (void *_data, Evas _e, Evas_Object _o, + int _b, int _x, int _y); +/* timers */ +void e_epplet_timer_func(int val, void *data); + +/* Observers */ E_Epplet_Observer *e_epplet_observer_new( FeriteScript *script, - char *func_name, FeriteObject *data, char *event_type); -void e_epplet_observer_register_desktops(E_Epplet_Observer *obs); -void e_epplet_desktop_observer_func(E_Observer *observer, E_Observee *observee, E_Event_Type event); + char *func_name, FeriteObject *data, + char *event_type); +void e_epplet_observer_register_desktops(E_Epplet_Observer *obs); +void e_epplet_desktop_observer_func(E_Observer *observer, + E_Observee *observee, + E_Event_Type event); /*void e_epplet_border_observer_func(E_Observer *observer, E_Observee *observee);*/ #endif diff --git a/src/menu.c b/src/menu.c index 5ac3ae50c..0b0cb5b22 100644 --- a/src/menu.c +++ b/src/menu.c @@ -564,12 +564,9 @@ static void e_menu_item_unselect (E_Menu_Item *mi) { D_ENTER; - D("mi unselect\n"); if ((mi) && (mi->menu->selected == mi)) { - D("mi && mi->menu->selected == mi\n"); mi->menu->selected = curr_selected_item = NULL; - D("after setting it NULL\n"); mi->selected = 0; mi->menu->redo_sel = 1;