more fixme's added, more fixed up. external callbakcs are now in. calling

application can emit signals now too.


SVN revision: 7051
This commit is contained in:
Carsten Haitzler 2003-06-21 02:51:01 +00:00
parent 4521ca1f87
commit e863599780
4 changed files with 104 additions and 8 deletions

View File

@ -109,6 +109,12 @@ bg_resize(double w, double h)
static Evas_Object *o_edje = NULL;
static void
cb (void *data, Evas_Object *o, const char *sig, const char *src)
{
printf("CALLBACK for %p %p \"%s\" \"%s\"\n", data, o, sig, src);
}
void
test_setup(char *file, char *name)
{
@ -116,6 +122,8 @@ test_setup(char *file, char *name)
o = edje_add(evas);
edje_file_set(o, file, name);
edje_signal_callback_add(o, "do_it", "the_source", cb, NULL);
edje_signal_callback_add(o, "mouse,*", "logo", cb, NULL);
evas_object_move(o, 10, 10);
evas_object_resize(o, 220, 300);
evas_object_show(o);
@ -153,7 +161,7 @@ main(int argc, char **argv)
file = argv[1];
if (argc >= 3) coll = argv[2];
/* FIXME: list collections */
test_setup(argv[1], coll);
test_setup(file, coll);
ecore_main_loop_begin();

View File

@ -16,6 +16,9 @@ extern "C" {
double edje_frametime_get(void);
Evas_Object *edje_add(Evas *evas);
void edje_file_set(Evas_Object *o, const char *file, const char *part);
void edje_signal_callback_add(Evas_Object *o, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source), void *data);
void *edje_signal_callback_del(Evas_Object *o, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source));
void edje_signal_emit(Evas_Object *o, const char *emission, const char *source);
#ifdef __cplusplus
}

View File

@ -1,15 +1,20 @@
#include "Edje.h"
#include "edje_private.h"
/* FIXME: ? somehow handle double click? */
/* FIXME: edje test need to make in-canvas move & resize controls on edjes */
/* FIXME: edje test needs to load multiple edjes */
/* FIXME: sub objects need to be added to smart object */
/* FIXME: add clicked signal for a mouse up thats a real clicked */
/* FIXME: free stuff - no more leaks */
/* FIXME: ? add numeric params to conditions for progs (ranges etc.) */
/* FIXME: dragables havwe to work */
/* FIXME: dragables have to work */
/* FIXME: drag start/top signals etc. */
/* FIXME: app has to be able to have callbacks called on signal emits */
/* FIXME: app has to be able to emit signals */
/* FIXME: named parts need to be able to be "replaced" with new evas objects */
/* FIXME: need to be able to calculate min & max size of a whole edje */
/* FIXME: on load don't segv on errors */
/* FIXME: add code to list collections in an eet */
/* FIXME: ? somehow handle double click? */
/* FIXME: ? add numeric params to conditions for progs (ranges etc.) */
Edje *_edje_fetch(Evas_Object *obj);
Edje *_edje_add(Evas_Object *obj);
@ -134,8 +139,8 @@ edje_file_set(Evas_Object *obj, const char *file, const char *part)
ed = _edje_fetch(obj);
if (!ed) return;
if (!file) return;
if (!part) return;
if (!file) file = "";
if (!part) part = "";
if (((ed->path) && (!strcmp(file, ed->path))) &&
(ed->part) && (!strcmp(part, ed->part)))
return;
@ -214,6 +219,64 @@ edje_file_set(Evas_Object *obj, const char *file, const char *part)
}
}
void
edje_signal_callback_add(Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
{
Edje *ed;
Edje_Signal_Callback *escb;
if ((!emission) || (!source) || (!func)) return;
ed = _edje_fetch(obj);
if (!ed) return;
escb = calloc(1, sizeof(Edje_Signal_Callback));
escb->signal = strdup(emission);
escb->source = strdup(source);
escb->func = func;
escb->data = data;
ed->callbacks = evas_list_append(ed->callbacks, escb);
}
void *
edje_signal_callback_del(Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source))
{
Edje *ed;
Evas_List *l;
if ((!emission) || (!source) || (!func)) return NULL;
ed = _edje_fetch(obj);
if (!ed) return;
for (l = ed->callbacks; l; l = l->next)
{
Edje_Signal_Callback *escb;
escb = l->data;
if ((escb->func == func) &&
(!strcmp(escb->signal, emission)) &&
(!strcmp(escb->source, source)))
{
void *data;
data = escb->data;
free(escb->signal);
free(escb->source);
free(escb);
return data;
}
}
return NULL;
}
void
edje_signal_emit(Evas_Object *obj, const char *emission, const char *source)
{
Edje *ed;
if ((!emission) || (!source)) return;
ed = _edje_fetch(obj);
if (!ed) return;
_edje_emit(ed, emission, source);
}
/*** internal calls ***/
/* utility functions we will use a lot */
@ -254,6 +317,7 @@ _edje_del(Edje *ed)
if (ed->path) free(ed->path);
if (ed->part) free(ed->part);
evas_object_del(ed->clipper);
printf("FIXME: leak: ed->callbacks\n");
free(ed);
}
@ -723,6 +787,15 @@ _edje_emit(Edje *ed, char *sig, char *src)
(_edje_glob_match(ee->source, pr->source)))
_edje_program_run(ed, pr);
}
for (l = ed->callbacks; l; l = l->next)
{
Edje_Signal_Callback *escb;
escb = l->data;
if ((_edje_glob_match(ee->signal, escb->signal)) &&
(_edje_glob_match(ee->source, escb->source)))
escb->func(escb->data, ed->obj, ee->signal, ee->source);
}
free(ee->signal);
free(ee->source);
free(ee);
@ -1555,6 +1628,7 @@ _edje_smart_add(Evas_Object * obj)
ed = _edje_add(obj);
if (!ed) return;
evas_object_smart_data_set(obj, ed);
ed->obj = obj;
}
static void

View File

@ -293,6 +293,7 @@ struct _Edje_Part_Description
typedef struct _Edje Edje;
typedef struct _Edje_Real_Part Edje_Real_Part;
typedef struct _Edje_Running_Program Edje_Running_Program;
typedef struct _Edje_Signal_Callback Edje_Signal_Callback;
typedef struct _Edje_Calc_Params Edje_Calc_Params;
typedef struct _Edje_Emission Edje_Emission;
@ -305,11 +306,13 @@ struct _Edje
double x, y, w, h;
unsigned char dirty : 1;
Evas *evas; /* the evas this edje belongs to */
Evas_Object *obj; /* the smart object */
Evas_Object *clipper; /* a big rect to clip this edje to */
Edje_File *file; /* the file the data comes form */
Edje_Part_Collection *collection; /* the description being used */
Evas_List *parts; /* private list of parts */
Evas_List *actions; /* currently running actions */
Evas_List *callbacks;
};
struct _Edje_Real_Part
@ -345,6 +348,14 @@ struct _Edje_Running_Program
double start_time;
};
struct _Edje_Signal_Callback
{
char *signal;
char *source;
void (*func) (void *data, Evas_Object *o, const char *emission, const char *source);
void *data;
};
struct _Edje_Calc_Params
{
double x, y, w, h;