Enlightenment CVS committal
Author : raster
Project : e17
Module : libs/edje
Dir : e17/libs/edje/src/lib
Modified Files:
Edje.h Edje_Edit.h edje_edit.c edje_embryo.c edje_load.c
edje_main.c edje_message_queue.c edje_private.h edje_program.c
edje_util.c
Log Message:
1. fix a leak. i was naughty. spank spank
2. message queue is in - i am currently not surer if i shoudl go with this
varags api internally ot move to a more manual "build a list" thing... but the
message queue does work - i've moved signals to use it.
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/Edje.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -3 -r1.29 -r1.30
--- Edje.h 6 Jun 2004 04:42:17 -0000 1.29
+++ Edje.h 1 Jul 2004 03:46:05 -0000 1.30
@@ -5,6 +5,33 @@
/* FIXDOC: Define these? */
+typedef enum _Edje_Queue
+{
+ EDJE_QUEUE_APP,
+ EDJE_QUEUE_SCRIPT
+} Edje_Queue;
+
+typedef enum _Edje_Message_Type
+{
+ EDJE_MESSAGE_NONE,
+
+ EDJE_MESSAGE_SIGNAL,
+
+ EDJE_MESSAGE_STRING,
+ EDJE_MESSAGE_INT,
+ EDJE_MESSAGE_FLOAT,
+
+ EDJE_MESSAGE_STRING_SET,
+ EDJE_MESSAGE_INT_SET,
+ EDJE_MESSAGE_FLOAT_SET,
+
+ EDJE_MESSAGE_STRING_INT,
+ EDJE_MESSAGE_STRING_FLOAT,
+
+ EDJE_MESSAGE_STRING_INT_SET,
+ EDJE_MESSAGE_STRING_FLOAT_SET
+} Edje_Message_Type;
+
#define EDJE_DRAG_DIR_NONE 0
#define EDJE_DRAG_DIR_X 1
#define EDJE_DRAG_DIR_Y 2
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/Edje_Edit.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- Edje_Edit.h 3 Jun 2004 09:14:55 -0000 1.11
+++ Edje_Edit.h 1 Jul 2004 03:46:05 -0000 1.12
@@ -380,7 +380,6 @@
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;
typedef struct _Edje_Pending_Program Edje_Pending_Program;
typedef struct _Edje_Text_Style Edje_Text_Style;
typedef struct _Edje_Color_Class Edje_Color_Class;
@@ -417,7 +416,6 @@
unsigned short walking_actions : 1;
unsigned short block_break : 1;
unsigned short delete_me : 1;
- unsigned short dont_clear_signals : 1;
double paused_at;
Evas *evas; /* the evas this edje belongs to */
Evas_Object *obj; /* the smart object */
@@ -432,7 +430,6 @@
Evas_List *text_classes;
int references;
int block;
- Evas_List *emissions;
int load_error;
int freeze;
/* variable pool for edje embryo scripts */
@@ -447,6 +444,8 @@
void (*func) (void *data, Evas_Object *obj, const char *part);
void *data;
} text_change;
+
+ int message_num;
};
struct _Edje_Real_Part
@@ -558,12 +557,6 @@
} text;
};
-struct _Edje_Emission
-{
- char *signal;
- char *source;
-};
-
struct _Edje_Pending_Program
{
Edje *edje;
@@ -693,6 +686,8 @@
Edje *_edje_add(Evas_Object *obj);
void _edje_del(Edje *ed);
+void _edje_ref(Edje *ed);
+void _edje_unref(Edje *ed);
void _edje_clean_objects(Edje *ed);
void _edje_ref(Edje *ed);
void _edje_unref(Edje *ed);
@@ -701,6 +696,7 @@
void _edje_program_end(Edje *ed, Edje_Running_Program *runp);
void _edje_program_run(Edje *ed, Edje_Program *pr, int force, char *ssig, char
*ssrc);
void _edje_emit(Edje *ed, char *sig, char *src);
+void _edje_emit_handle(Edje *ed, char *sig, char *src);
void _edje_text_init(void);
void _edje_text_part_on_add(Edje *ed, Edje_Real_Part *ep);
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_edit.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- edje_edit.c 21 Feb 2004 05:24:10 -0000 1.1
+++ edje_edit.c 1 Jul 2004 03:46:05 -0000 1.2
@@ -1,3 +1,4 @@
+#include "Edje.h"
#include "edje_private.h"
int edje_edit_init()
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_embryo.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -3 -r1.16 -r1.17
--- edje_embryo.c 3 Jun 2004 09:14:55 -0000 1.16
+++ edje_embryo.c 1 Jul 2004 03:46:05 -0000 1.17
@@ -78,9 +78,29 @@
* get_strlen(id)
* get_str(id, dst[], maxlen)
* set_str(id, str[])
- * ** lists/arrays for stored variables
- * ** dynamic allocation (just use cell as index to dynamic block)
- * timer(Float:in, fname[], val);
+ * ######## lists/arrays for stored variables (to be implemented)
+ * # count(id)
+ * # remove(id, n)
+ * #
+ * # append_int(id, v)
+ * # prepend_int(id, v)
+ * # insert_int(id, v, n)
+ * # replace_int(id, v, n)
+ * # fetch_int(id, n)
+ * #
+ * # append_float(id, Float:v)
+ * # prepend_float(id, Float:v)
+ * # insert_float(id, Float:v, n)
+ * # replace_float(id, Float:v, n)
+ * # Float:fetch_float(id, n)
+ * #
+ * # append_str(id, str[])
+ * # prepend_str(id, str[])
+ * # insert_str(id, str[], n)
+ * # replace_str(id, str[], n)
+ * # fetch_str(id, n, dst[], maxlen)
+ * #
+ * timer(Float:in, fname[], val)
* cancel_timer(id)
* anim(Float:len, fname[], val)
* cancel_anim(id)
@@ -111,6 +131,12 @@
*
* still need to implement this:
*
+ * ##### post messages to the app via _edje_message_send();
+ * # message(id, type, ...);
+ * #
+ * ##### what about posting messages to OTHER edje objects (swallowed?)
+ * # ????
+ *
* ** part_id and program_id need to be able to be "found" from strings
*
* get_drag_count(part_id, &Float:dx, &Float:&dy)
@@ -964,17 +990,15 @@
fn = embryo_program_function_find(ed->collection->script, fname);
if (fn != EMBRYO_FUNCTION_NONE)
{
+ void *pdata;
+
printf("EDJE DEBUG: About to run script from program.\n");
embryo_parameter_string_push(ed->collection->script, sig);
embryo_parameter_string_push(ed->collection->script, src);
- {
- void *pdata;
-
- pdata = embryo_program_data_get(ed->collection->script);
- embryo_program_data_set(ed->collection->script, ed);
- embryo_program_run(ed->collection->script, fn);
- embryo_program_data_set(ed->collection->script, pdata);
- }
+ pdata = embryo_program_data_get(ed->collection->script);
+ embryo_program_data_set(ed->collection->script, ed);
+ embryo_program_run(ed->collection->script, fn);
+ embryo_program_data_set(ed->collection->script, pdata);
printf("EDJE DEBUG: Done.\n");
}
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_load.c,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -3 -r1.43 -r1.44
--- edje_load.c 6 Jun 2004 04:42:17 -0000 1.43
+++ edje_load.c 1 Jul 2004 03:46:05 -0000 1.44
@@ -526,8 +526,7 @@
void
_edje_file_del(Edje *ed)
{
- _edje_emit(ed, NULL, NULL); /* clear out signal emissions */
- ed->dont_clear_signals = 1;
+ _edje_message_del(ed);
_edje_block_violate(ed);
_edje_var_shutdown(ed);
if (ed->collection)
@@ -663,6 +662,19 @@
}
free(edf->collection_dir);
}
+ if (edf->data)
+ {
+ while (edf->data)
+ {
+ Edje_Data *edt;
+
+ edt = edf->data->data;
+ edf->data = evas_list_remove(edf->data, edt);
+ if (edt->key) free(edt->key);
+ if (edt->value) free(edt->value);
+ free(edt);
+ }
+ }
if (edf->collection_hash) evas_hash_free(edf->collection_hash);
free(edf);
}
@@ -723,6 +735,19 @@
}
free(ep);
}
+ if (ec->data)
+ {
+ while (ec->data)
+ {
+ Edje_Data *edt;
+
+ edt = ec->data->data;
+ ec->data = evas_list_remove(ec->data, edt);
+ if (edt->key) free(edt->key);
+ if (edt->value) free(edt->value);
+ free(edt);
+ }
+ }
#ifdef EDJE_PROGRAM_CACHE
if (ec->prog_cache.no_matches) evas_hash_free(ec->prog_cache.no_matches);
if (ec->prog_cache.matches)
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_main.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -3 -r1.37 -r1.38
--- edje_main.c 6 Jun 2004 04:42:17 -0000 1.37
+++ edje_main.c 1 Jul 2004 03:46:05 -0000 1.38
@@ -19,6 +19,7 @@
_edje_text_init();
embryo_init();
}
+ _edje_message_init();
return initted;
}
@@ -32,6 +33,7 @@
initted--;
if (initted > 0) return initted;
+ _edje_message_shutdown();
_edje_edd_free();
_edje_color_class_members_free();
_edje_text_class_members_free();
@@ -140,6 +142,5 @@
_edje_unref(Edje *ed)
{
ed->references--;
- if (ed->references <= 0)
- _edje_del(ed);
+ if (ed->references <= 0) _edje_del(ed);
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_message_queue.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- edje_message_queue.c 29 Jun 2004 07:23:17 -0000 1.1
+++ edje_message_queue.c 1 Jul 2004 03:46:05 -0000 1.2
@@ -1,2 +1,393 @@
#include "Edje.h"
#include "edje_private.h"
+
+/* NB: global message que to be processed on idle enterer */
+
+/* NB: on deletion of an edje, remvoe all pending msg que items for it */
+
+/* NB: each edje needs a messagequeue cointer to knwo how many messages on the
+ * queue for that edje */
+
+/* NB: need to temporarly remove queue so messages added while processing the
+ * the queue so messages added as a result of processing dont loop. if the
+ * queue is not empty after processing scheduly 0.0 timeout to induce a
+ * new processing of the queue
+ */
+
+static Evas_List *msgq = NULL;
+static Evas_List *tmp_msgq = NULL;
+static Ecore_Idle_Enterer *idler = NULL;
+
+static int
+_edje_dummy_timer(void *data)
+{
+ return 0;
+}
+
+static int
+_edje_idler(void *data)
+{
+ _edje_message_queue_process();
+ return 1;
+}
+
+void
+_edje_message_init(void)
+{
+ idler = ecore_idle_enterer_add(_edje_idler, NULL);
+}
+
+void
+_edje_message_shutdown(void)
+{
+ _edje_message_queue_clear();
+ ecore_idle_enterer_del(idler);
+ idler = NULL;
+}
+
+Edje_Message *
+_edje_message_new(Edje *ed, Edje_Queue queue, Edje_Message_Type type, int id)
+{
+ Edje_Message *em;
+
+ em = calloc(1, sizeof(Edje_Message));
+ if (!em) return NULL;
+ em->edje = ed;
+ em->queue = queue;
+ em->type = type;
+ em->id = id;
+ em->edje->message_num++;
+ return em;
+}
+
+void
+_edje_message_free(Edje_Message *em)
+{
+ if (em->msg)
+ {
+ char *ptr;
+ int i, count;
+
+ switch (em->type)
+ {
+ case EDJE_MESSAGE_STRING:
+ case EDJE_MESSAGE_INT:
+ case EDJE_MESSAGE_FLOAT:
+ case EDJE_MESSAGE_INT_SET:
+ case EDJE_MESSAGE_FLOAT_SET:
+ free(em->msg);
+ break;
+ case EDJE_MESSAGE_STRING_FLOAT:
+ case EDJE_MESSAGE_STRING_INT:
+ case EDJE_MESSAGE_STRING_FLOAT_SET:
+ case EDJE_MESSAGE_STRING_INT_SET:
+ memcpy(&ptr, em->msg, sizeof(char *));
+ free(ptr);
+ free(em->msg);
+ break;
+ case EDJE_MESSAGE_SIGNAL:
+ memcpy(&ptr, em->msg, sizeof(char *));
+ free(ptr);
+ memcpy(&ptr, em->msg + sizeof(char *), sizeof(char *));
+ free(ptr);
+ free(em->msg);
+ break;
+ case EDJE_MESSAGE_STRING_SET:
+ memcpy(&count, em->msg, sizeof(int));
+ for (i = 0; i < count; i++)
+ {
+ memcpy(&ptr, em->msg + sizeof(int) + (i * sizeof(char *)),
sizeof(char *));
+ free(ptr);
+ }
+ free(em->msg);
+ break;
+ case EDJE_MESSAGE_NONE:
+ default:
+ break;
+ }
+ }
+ em->edje->message_num--;
+ free(em);
+}
+
+void
+_edje_message_send(Edje *ed, Edje_Queue queue, Edje_Message_Type type, int id, ...)
+{
+ /* FIXME: check all malloc fails and gracefully unroll and exit */
+ Edje_Message *em;
+ va_list args;
+ int count = 0, i;
+ char *str = NULL, *str2 = NULL, *s;
+ int num = 0;
+ double flt = 0.0;
+ unsigned char *msg = NULL;
+
+ em = _edje_message_new(ed, queue, type, id);
+ if (!em) return;
+ va_start(args, id);
+
+ /* this is evil code - but all we do is pack pointers, ints and doubles */
+ /* into the msg generic pointer one after the other */
+ switch (em->type)
+ {
+ case EDJE_MESSAGE_NONE:
+ break;
+ case EDJE_MESSAGE_SIGNAL:
+ str = va_arg(args, char *);
+ str2 = va_arg(args, char *);
+ msg = malloc(sizeof(char *) * 2);
+ s = strdup(str);
+ memcpy(msg + (0 * sizeof(char *)), &s, sizeof(char *));
+ s = strdup(str2);
+ memcpy(msg + (1 * sizeof(char *)), &s, sizeof(char *));
+ break;
+ case EDJE_MESSAGE_STRING:
+ str = va_arg(args, char *);
+ msg = strdup(str);
+ break;
+ case EDJE_MESSAGE_INT:
+ num = va_arg(args, int);
+ msg = malloc(sizeof(int));
+ memcpy(msg, &num, sizeof(int));
+ break;
+ case EDJE_MESSAGE_FLOAT:
+ flt = va_arg(args, double);
+ msg = malloc(sizeof(double));
+ memcpy(msg, &flt, sizeof(double));
+ break;
+ case EDJE_MESSAGE_STRING_SET:
+ count = va_arg(args, int);
+ msg = malloc(sizeof(int) + (count * sizeof(char *)));
+ memcpy(msg, &count, sizeof(int));
+ for (i = 0; i < count; i++)
+ {
+ str = va_arg(args, char *);
+ s = strdup(str);
+ memcpy(msg + sizeof(int) + (i * sizeof(char *)), &s, sizeof(char *));
+ }
+ break;
+ case EDJE_MESSAGE_INT_SET:
+ count = va_arg(args, int);
+ msg = malloc(sizeof(int) + (count * sizeof(int)));
+ memcpy(msg, &count, sizeof(int));
+ for (i = 0; i < count; i++)
+ {
+ num = va_arg(args, int);
+ memcpy(msg + sizeof(int) + (i * sizeof(int)), &num, sizeof(int));
+ }
+ break;
+ case EDJE_MESSAGE_FLOAT_SET:
+ count = va_arg(args, int);
+ msg = malloc(sizeof(int) + (count * sizeof(double)));
+ memcpy(msg, &count, sizeof(int));
+ for (i = 0; i < count; i++)
+ {
+ flt = va_arg(args, double);
+ memcpy(msg + sizeof(int) + (i * sizeof(double)), &flt, sizeof(double));
+ }
+ break;
+ case EDJE_MESSAGE_STRING_INT:
+ str = va_arg(args, char *);
+ num = va_arg(args, int);
+ msg = malloc(sizeof(char *) + sizeof(int));
+ s = strdup(str);
+ memcpy(msg, &s, sizeof(char *));
+ memcpy(msg + sizeof(char *), &num, sizeof(int));
+ break;
+ case EDJE_MESSAGE_STRING_FLOAT:
+ str = va_arg(args, char *);
+ flt = va_arg(args, double);
+ msg = malloc(sizeof(char *) + sizeof(double));
+ s = strdup(str);
+ memcpy(msg, &s, sizeof(char *));
+ memcpy(msg + sizeof(char *), &flt, sizeof(double));
+ break;
+ case EDJE_MESSAGE_STRING_INT_SET:
+ str = va_arg(args, char *);
+ count = va_arg(args, int);
+ msg = malloc(sizeof (char *) + sizeof(int) + (count * sizeof(int)));
+ s = strdup(str);
+ memcpy(msg, &s, sizeof(char *));
+ memcpy(msg + sizeof(char *), &count, sizeof(int));
+ for (i = 0; i < count; i++)
+ {
+ num = va_arg(args, int);
+ memcpy(msg + sizeof(char *) + sizeof(int) + (i * sizeof(int)), &num,
sizeof(int));
+ }
+ break;
+ case EDJE_MESSAGE_STRING_FLOAT_SET:
+ str = va_arg(args, char *);
+ count = va_arg(args, int);
+ msg = malloc(sizeof (char *) + sizeof(int) + (count * sizeof(double)));
+ s = strdup(str);
+ memcpy(msg, &s, sizeof(char *));
+ memcpy(msg + sizeof(char *), &count, sizeof(int));
+ for (i = 0; i < count; i++)
+ {
+ flt = va_arg(args, double);
+ memcpy(msg + sizeof(char *) + sizeof(int) + (i * sizeof(double)), &flt,
sizeof(double));
+ }
+ break;
+ default:
+ break;
+ }
+
+ em->msg = msg;
+ msgq = evas_list_append(msgq, em);
+
+ va_end(args);
+}
+
+void
+_edje_message_process(Edje_Message *em)
+{
+ switch (em->type)
+ {
+ case EDJE_MESSAGE_NONE:
+ switch (em->queue)
+ {
+ case EDJE_QUEUE_APP:
+ /* simply call app callback */
+ break;
+ case EDJE_QUEUE_SCRIPT:
+ if ((em->edje->collection) && (em->edje->collection->script))
+ {
+ Embryo_Function fn;
+
+ _edje_embryo_script_reset(em->edje);
+ fn = embryo_program_function_find(em->edje->collection->script,
"_msg");
+ if (fn != EMBRYO_FUNCTION_NONE)
+ {
+ void *pdata;
+ Embryo_Cell cell;
+
+// embryo_parameter_string_push(em->edje->collection->script, sig);
+ /* first param is the integer of the event id - always there */
+ cell = em->id;
+ embryo_parameter_cell_push(em->edje->collection->script, cell);
+ pdata = embryo_program_data_get(em->edje->collection->script);
+ embryo_program_data_set(em->edje->collection->script, em->edje);
+ embryo_program_run(em->edje->collection->script, fn);
+ embryo_program_data_set(em->edje->collection->script, pdata);
+ }
+ }
+ /* call script fn */
+ break;
+ default:
+ break;
+ }
+ break;
+ case EDJE_MESSAGE_SIGNAL:
+ {
+ char *str1;
+ char *str2;
+
+ memcpy(&str1, em->msg, sizeof(char *));
+ memcpy(&str2, em->msg + sizeof(char *), sizeof(char *));
+// printf("HANDLE SIG!\n");
+ _edje_emit_handle(em->edje, str1, str2);
+ }
+ break;
+ case EDJE_MESSAGE_STRING:
+ break;
+ case EDJE_MESSAGE_INT:
+ break;
+ case EDJE_MESSAGE_FLOAT:
+ break;
+ case EDJE_MESSAGE_STRING_SET:
+ break;
+ case EDJE_MESSAGE_INT_SET:
+ break;
+ case EDJE_MESSAGE_FLOAT_SET:
+ break;
+ case EDJE_MESSAGE_STRING_INT:
+ break;
+ case EDJE_MESSAGE_STRING_FLOAT:
+ break;
+ case EDJE_MESSAGE_STRING_INT_SET:
+ break;
+ case EDJE_MESSAGE_STRING_FLOAT_SET:
+ break;
+ default:
+ break;
+ }
+}
+
+void
+_edje_message_queue_process(void)
+{
+ if (msgq == NULL) return;
+
+// printf("PROCESS\n");
+ /* a temporary message queue */
+ tmp_msgq = msgq;
+ msgq = NULL;
+
+ while (tmp_msgq)
+ {
+ Edje_Message *em;
+
+ em = tmp_msgq->data;
+ tmp_msgq = evas_list_remove_list(tmp_msgq, tmp_msgq);
+ _edje_message_process(em);
+ _edje_message_free(em);
+ }
+
+ /* if the message queue filled again set a timer to expire in 0.0 sec */
+ /* to get the dle enterer to be run again */
+ if (msgq)
+ ecore_timer_add(0.0, _edje_dummy_timer, NULL);
+}
+
+void
+_edje_message_queue_clear(void)
+{
+ while (msgq)
+ {
+ Edje_Message *em;
+
+ em = msgq->data;
+ msgq = evas_list_remove_list(msgq, msgq);
+ _edje_message_free(em);
+ }
+}
+
+void
+_edje_message_del(Edje *ed)
+{
+ Evas_List *l;
+
+ if (ed->message_num <= 0) return;
+ /* delete any messages on the main queue for this edje object */
+ for (l = msgq; ; )
+ {
+ Edje_Message *em;
+ Evas_List *lp;
+
+ em = l->data;
+ lp = l;
+ l = l->next;
+ if (em->edje == ed)
+ {
+ msgq = evas_list_remove_list(msgq, lp);
+ _edje_message_free(em);
+ }
+ if (ed->message_num <= 0) return;
+ }
+ /* delete any on the processing queue */
+ for (l = tmp_msgq; ; )
+ {
+ Edje_Message *em;
+ Evas_List *lp;
+
+ em = l->data;
+ lp = l;
+ l = l->next;
+ if (em->edje == ed)
+ {
+ msgq = evas_list_remove_list(msgq, lp);
+ _edje_message_free(em);
+ }
+ if (ed->message_num <= 0) return;
+ }
+}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_private.h,v
retrieving revision 1.65
retrieving revision 1.66
diff -u -3 -r1.65 -r1.66
--- edje_private.h 3 Jun 2004 09:14:55 -0000 1.65
+++ edje_private.h 1 Jul 2004 03:46:05 -0000 1.66
@@ -15,6 +15,7 @@
#include <math.h>
#include <fnmatch.h>
+#include <stdarg.h>
#ifdef HAVE_ALLOCA_H
#include <alloca.h>
@@ -40,6 +41,16 @@
* ? all unsafe calls that may result in callbacks must be marked and dealt with
*/
+typedef struct _Edje_Message Edje_Message;
+
+struct _Edje_Message
+{
+ Edje *edje;
+ Edje_Queue queue;
+ Edje_Message_Type type;
+ int id;
+ unsigned char *msg;
+};
extern Eet_Data_Descriptor *_edje_edd_edje_file;
extern Eet_Data_Descriptor *_edje_edd_edje_data;
@@ -116,5 +127,14 @@
void _edje_var_anim_del (Edje *ed, int id);
void _edje_var_anim_frametime_reset(void);
-
+void _edje_message_init(void);
+void _edje_message_shutdown(void);
+Edje_Message *_edje_message_new(Edje *ed, Edje_Queue queue, Edje_Message_Type type,
int id);
+void _edje_message_free(Edje_Message *em);
+void _edje_message_send(Edje *ed, Edje_Queue queue, Edje_Message_Type type, int id,
...);
+void _edje_message_process(Edje_Message *em);
+void _edje_message_queue_process(void);
+void _edje_message_queue_clear(void);
+void _edje_message_del(Edje *ed);
+
#endif
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_program.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -3 -r1.35 -r1.36
--- edje_program.c 19 Jun 2004 16:24:20 -0000 1.35
+++ edje_program.c 1 Jul 2004 03:46:05 -0000 1.36
@@ -724,209 +724,141 @@
_edje_unblock(ed);
}
-static void _edje_emission_free(Edje_Emission *ee)
+void
+_edje_emit(Edje *ed, char *sig, char *src)
{
- if (!ee)
- return;
-
- if (ee->signal)
- free(ee->signal);
-
- if (ee->source)
- free(ee->source);
-
- free(ee);
+ if (ed->delete_me) return;
+ _edje_message_send(ed, EDJE_QUEUE_APP, EDJE_MESSAGE_SIGNAL, 0, sig, src);
}
+/* FIXME: what if we delete the evas object??? */
void
-_edje_emit(Edje *ed, char *sig, char *src)
+_edje_emit_handle(Edje *ed, char *sig, char *src)
{
Evas_List *l;
- Edje_Emission *ee = NULL;
- /* limit self-feeding loops in callbacks to 64 levels */
- static int recursions = 0;
- static int recursion_limit = 0;
-
- if ((!sig) && (!src))
- {
- while (ed->emissions)
- {
- ee = ed->emissions->data;
- ed->emissions = evas_list_remove(ed->emissions, ee);
- _edje_emission_free(ee);
- }
- return;
- }
if (ed->delete_me) return;
- if ((recursions >= 64) || (recursion_limit))
- {
- recursion_limit = 1;
- return;
- }
- recursions++;
// printf("EDJE EMIT: signal: \"%s\" source: \"%s\"\n", sig, src);
- if ((sig) && (src))
- {
- ee = calloc(1, sizeof(Edje_Emission));
- if (!ee)
- {
- recursions--;
- if (recursions == 0) recursion_limit = 0;
- return;
- }
- ee->signal = strdup(sig);
- ee->source = strdup(src);
- if ((ed->emissions) || (_edje_block_break(ed)))
- {
- ed->emissions = evas_list_append(ed->emissions, ee);
- recursions--;
- if (recursions == 0) recursion_limit = 0;
- return;
- }
- else
- ed->emissions = evas_list_append(ed->emissions, ee);
- }
- if (!ed->emissions) return;
_edje_block(ed);
_edje_ref(ed);
_edje_freeze(ed);
- while (ed->emissions)
+ if (ed->collection)
{
- ee = ed->emissions->data;
- ed->emissions = evas_list_remove(ed->emissions, ee);
- if (ed->collection)
- {
- Edje_Part_Collection *ec;
+ Edje_Part_Collection *ec;
#ifdef EDJE_PROGRAM_CACHE
- char *tmps;
+ char *tmps;
+ int l1, l2;
#endif
- int l1, l2;
- int done;
-
- ec = ed->collection;
+ int done;
+
+ ec = ed->collection;
+#ifdef EDJE_PROGRAM_CACHE
+ l1 = strlen(sig);
+ l2 = strlen(src);
+ tmps = malloc(l1 + l2 + 2);
+
+ if (tmps)
+ {
+ strcpy(tmps, sig);
+ tmps[l1] = '\377';
+ strcpy(&(tmps[l1 + 1]), src);
+ }
+#endif
+ done = 0;
+
#ifdef EDJE_PROGRAM_CACHE
- l1 = strlen(ee->signal);
- l2 = strlen(ee->source);
- tmps = malloc(l1 + l2 + 2);
+ if (tmps)
+ {
+ Evas_List *matches;
- if (tmps)
+ if (evas_hash_find(ec->prog_cache.no_matches, tmps))
{
- strcpy(tmps, ee->signal);
- tmps[l1] = '\377';
- strcpy(&(tmps[l1 + 1]), ee->source);
+ done = 1;
}
-#endif
- done = 0;
-
-#ifdef EDJE_PROGRAM_CACHE
- if (tmps)
+ else if ((matches = evas_hash_find(ec->prog_cache.matches, tmps)))
{
- Evas_List *matches;
-
- if (evas_hash_find(ec->prog_cache.no_matches, tmps))
+ for (l = matches; l; l = l->next)
{
- done = 1;
- }
- else if ((matches = evas_hash_find(ec->prog_cache.matches, tmps)))
- {
- for (l = matches; l; l = l->next)
+ Edje_Program *pr;
+
+ pr = l->data;
+ _edje_program_run(ed, pr, 0, sig, src);
+ if (_edje_block_break(ed))
{
- Edje_Program *pr;
-
- pr = l->data;
- _edje_program_run(ed, pr, 0, sig, src);
- if (_edje_block_break(ed))
- {
- if (tmps) free(tmps);
- if (!ed->dont_clear_signals)
- _edje_emit(ed, NULL, NULL);
- goto break_prog;
- }
+ if (tmps) free(tmps);
+ goto break_prog;
}
- done = 1;
}
+ done = 1;
}
+ }
#endif
- if (!done)
- {
+ if (!done)
+ {
#ifdef EDJE_PROGRAM_CACHE
- int matched = 0;
- Evas_List *matches = NULL;
+ int matched = 0;
+ Evas_List *matches = NULL;
#endif
+
+ for (l = ed->collection->programs; l; l = l->next)
+ {
+ Edje_Program *pr;
- for (l = ed->collection->programs; l; l = l->next)
+ pr = l->data;
+ if ((pr->signal) &&
+ (pr->source) &&
+ (_edje_glob_match(sig, pr->signal)) &&
+ (_edje_glob_match(src, pr->source)))
{
- Edje_Program *pr;
-
- pr = l->data;
- if ((pr->signal) &&
- (pr->source) &&
- (_edje_glob_match(ee->signal, pr->signal)) &&
- (_edje_glob_match(ee->source, pr->source)))
- {
#ifdef EDJE_PROGRAM_CACHE
- matched++;
+ matched++;
#endif
- _edje_program_run(ed, pr, 0, ee->signal, ee->source);
- if (_edje_block_break(ed))
- {
+ _edje_program_run(ed, pr, 0, sig, src);
+ if (_edje_block_break(ed))
+ {
#ifdef EDJE_PROGRAM_CACHE
- if (tmps) free(tmps);
- evas_list_free(matches);
+ if (tmps) free(tmps);
+ evas_list_free(matches);
#endif
- if (!ed->dont_clear_signals)
- _edje_emit(ed, NULL, NULL);
- goto break_prog;
- }
-#ifdef EDJE_PROGRAM_CACHE
- matches = evas_list_append(matches, pr);
-#endif
+ goto break_prog;
}
- }
#ifdef EDJE_PROGRAM_CACHE
- if (tmps)
- {
- if (matched == 0)
- ec->prog_cache.no_matches =
- evas_hash_add(ec->prog_cache.no_matches, tmps, ed);
- else
- ec->prog_cache.matches =
- evas_hash_add(ec->prog_cache.matches, tmps, matches);
+ matches = evas_list_append(matches, pr);
+#endif
}
-#endif
}
- _edje_emit_cb(ed, ee->signal, ee->source);
- if (_edje_block_break(ed))
- {
#ifdef EDJE_PROGRAM_CACHE
- if (tmps) free(tmps);
-#endif
- if (!ed->dont_clear_signals)
- _edje_emit(ed, NULL, NULL);
- goto break_prog;
+ if (tmps)
+ {
+ if (matched == 0)
+ ec->prog_cache.no_matches =
+ evas_hash_add(ec->prog_cache.no_matches, tmps, ed);
+ else
+ ec->prog_cache.matches =
+ evas_hash_add(ec->prog_cache.matches, tmps, matches);
}
+#endif
+ }
+ _edje_emit_cb(ed, sig, src);
+ if (_edje_block_break(ed))
+ {
#ifdef EDJE_PROGRAM_CACHE
if (tmps) free(tmps);
- tmps = NULL;
-#endif
+#endif
+ goto break_prog;
}
-
- _edje_emission_free(ee);
- ee = NULL;
+#ifdef EDJE_PROGRAM_CACHE
+ if (tmps) free(tmps);
+ tmps = NULL;
+#endif
}
break_prog:
-
- if (ee)
- _edje_emission_free(ee);
-
- recursions--;
- if (recursions == 0) recursion_limit = 0;
_edje_thaw(ed);
_edje_unref(ed);
_edje_unblock(ed);
}
+/* FIXME: what if we delete the evas object??? */
static void
_edje_emit_cb(Edje *ed, char *sig, char *src)
{
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_util.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -3 -r1.38 -r1.39
--- edje_util.c 6 Jun 2004 04:42:17 -0000 1.38
+++ edje_util.c 1 Jul 2004 03:46:05 -0000 1.39
@@ -1480,8 +1480,6 @@
if (ed->block == 0)
{
ed->block_break = 0;
- ed->dont_clear_signals = 0;
- if (ed->emissions) _edje_emit(ed, "", NULL);
}
return ed->block;
}
-------------------------------------------------------
This SF.Net email sponsored by Black Hat Briefings & Training.
Attend Black Hat Briefings & Training, Las Vegas July 24-29 -
digital self defense, top technical experts, no vendor pitches,
unmatched networking opportunities. Visit www.blackhat.com
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs