Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/edje

Dir     : e17/libs/edje/src/lib


Modified Files:
        Edje.h edje_message_queue.c edje_private.h edje_program.c 


Log Message:


werd up to ma homies yo... err - i mean - message queue now uses more
standard structs for messages, and i allow the message queue to fee itsel for
up to 8 iterations before forcing us to rever to normal loop processing
again. this shoudl cover most soignal emit/respond cases in normal usage
without forcing more loop to run and possibly a render.

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/Edje.h,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -3 -r1.31 -r1.32
--- Edje.h      1 Jul 2004 06:38:36 -0000       1.31
+++ Edje.h      2 Jul 2004 03:24:56 -0000       1.32
@@ -32,19 +32,102 @@
      EDJE_MESSAGE_STRING_FLOAT_SET = 11
 } Edje_Message_Type;
 
-#define EDJE_DRAG_DIR_NONE 0
-#define EDJE_DRAG_DIR_X    1
-#define EDJE_DRAG_DIR_Y    2
-#define EDJE_DRAG_DIR_XY   3
-
-#define EDJE_LOAD_ERROR_NONE                       0
-#define EDJE_LOAD_ERROR_GENERIC                    1
-#define EDJE_LOAD_ERROR_DOES_NOT_EXIST             2
-#define EDJE_LOAD_ERROR_PERMISSION_DENIED          3
-#define EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED 4
-#define EDJE_LOAD_ERROR_CORRUPT_FILE               5
-#define EDJE_LOAD_ERROR_UNKNOWN_FORMAT             6
-#define EDJE_LOAD_ERROR_INCOMPATIBLE_FILE          7
+typedef struct _Edje_Message_Signal           Edje_Message_Signal;
+typedef struct _Edje_Message_String           Edje_Message_String;
+typedef struct _Edje_Message_Int              Edje_Message_Int;
+typedef struct _Edje_Message_Float            Edje_Message_Float;
+typedef struct _Edje_Message_String_Set       Edje_Message_String_Set;
+typedef struct _Edje_Message_Int_Set          Edje_Message_Int_Set;
+typedef struct _Edje_Message_Float_Set        Edje_Message_Float_Set;
+typedef struct _Edje_Message_String_Int       Edje_Message_String_Int;
+typedef struct _Edje_Message_String_Float     Edje_Message_String_Float;
+typedef struct _Edje_Message_String_Int_Set   Edje_Message_String_Int_Set;
+typedef struct _Edje_Message_String_Float_Set Edje_Message_String_Float_Set;
+
+struct _Edje_Message_Signal
+{
+   char *sig;
+   char *src;
+};
+
+struct _Edje_Message_String
+{
+   char *str;
+};
+
+struct _Edje_Message_Int
+{
+   int val;
+};
+
+struct _Edje_Message_Float
+{
+   double val;
+};
+
+struct _Edje_Message_String_Set
+{
+   int count;
+   char *str[1];
+};
+
+struct _Edje_Message_Int_Set
+{
+   int count;
+   int val[1];
+};
+
+struct _Edje_Message_Float_Set
+{
+   int count;
+   double val[1];
+};
+
+struct _Edje_Message_String_Int
+{
+   char *str;
+   int val;
+};
+
+struct _Edje_Message_String_Float
+{
+   char *str;
+   double val;
+};
+
+struct _Edje_Message_String_Int_Set
+{
+   char *str;
+   int count;
+   int val[1];
+};
+
+struct _Edje_Message_String_Float_Set
+{
+   char *str;
+   int count;
+   double val[1];
+};
+
+enum
+{
+   EDJE_DRAG_DIR_NONE = 0,
+     EDJE_DRAG_DIR_X = 1,
+     EDJE_DRAG_DIR_Y = 2,
+     EDJE_DRAG_DIR_XY = 3
+};
+
+enum
+{
+   EDJE_LOAD_ERROR_NONE = 0,
+     EDJE_LOAD_ERROR_GENERIC = 1,
+     EDJE_LOAD_ERROR_DOES_NOT_EXIST = 2,
+     EDJE_LOAD_ERROR_PERMISSION_DENIED = 3,
+     EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED = 4,
+     EDJE_LOAD_ERROR_CORRUPT_FILE = 5,
+     EDJE_LOAD_ERROR_UNKNOWN_FORMAT = 6,
+     EDJE_LOAD_ERROR_INCOMPATIBLE_FILE = 7
+};
 
 #ifdef __cplusplus
 extern "C" {
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_message_queue.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- edje_message_queue.c        1 Jul 2004 06:38:36 -0000       1.3
+++ edje_message_queue.c        2 Jul 2004 03:24:56 -0000       1.4
@@ -21,6 +21,7 @@
 static int
 _edje_dummy_timer(void *data)
 {
+   printf("DUMMY\n");
    return 0;
 }
 
@@ -71,35 +72,94 @@
        switch (em->type)
          {
           case EDJE_MESSAGE_STRING:
+              {
+                 Edje_Message_String *emsg;
+                 
+                 emsg = (Edje_Message_String *)em->msg;
+                 free(emsg->str);
+                 free(emsg);
+              }
           case EDJE_MESSAGE_INT:
+              {
+                 Edje_Message_Int *emsg;
+                 
+                 emsg = (Edje_Message_Int *)em->msg;
+                 free(emsg);
+              }
           case EDJE_MESSAGE_FLOAT:
+              {
+                 Edje_Message_Float *emsg;
+                 
+                 emsg = (Edje_Message_Float *)em->msg;
+                 free(emsg);
+              }
           case EDJE_MESSAGE_INT_SET:
+              {
+                 Edje_Message_Int_Set *emsg;
+                 
+                 emsg = (Edje_Message_Int_Set *)em->msg;
+                 free(emsg);
+              }
+            break;
           case EDJE_MESSAGE_FLOAT_SET:
-            free(em->msg);
+              {
+                 Edje_Message_Float_Set *emsg;
+                 
+                 emsg = (Edje_Message_Float_Set *)em->msg;
+                 free(emsg);
+              }
             break;
           case EDJE_MESSAGE_STRING_FLOAT:
+              {
+                 Edje_Message_String_Float *emsg;
+                 
+                 emsg = (Edje_Message_String_Float *)em->msg;
+                 free(emsg->str);
+                 free(emsg);
+              }
           case EDJE_MESSAGE_STRING_INT:
+              {
+                 Edje_Message_String_Int *emsg;
+                 
+                 emsg = (Edje_Message_String_Int *)em->msg;
+                 free(emsg->str);
+                 free(emsg);
+              }
           case EDJE_MESSAGE_STRING_FLOAT_SET:
+              {
+                 Edje_Message_String_Float_Set *emsg;
+                 
+                 emsg = (Edje_Message_String_Float_Set *)em->msg;
+                 free(emsg->str);
+                 free(emsg);
+              }
           case EDJE_MESSAGE_STRING_INT_SET:
-            memcpy(&ptr, em->msg, sizeof(char *));
-            free(ptr);
-            free(em->msg);
-            break;
+              {
+                 Edje_Message_String_Int_Set *emsg;
+                 
+                 emsg = (Edje_Message_String_Int_Set *)em->msg;
+                 free(emsg->str);
+                 free(emsg);
+              }
           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);
+              {
+                 Edje_Message_Signal *emsg;
+                 
+                 emsg = (Edje_Message_Signal *)em->msg;
+                 free(emsg->sig);
+                 free(emsg->src);
+                 free(emsg);
+              }
             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);
+                 Edje_Message_String_Set *emsg;
+                 
+                 emsg = (Edje_Message_String_Set *)em->msg;
+                 for (i = 0; i < emsg->count; i++)
+                   free(emsg->str[i]);
+                 free(emsg);
               }
-            free(em->msg);
             break;
           case EDJE_MESSAGE_NONE:
           default:
@@ -111,121 +171,142 @@
 }
 
 void
-_edje_message_send(Edje *ed, Edje_Queue queue, Edje_Message_Type type, int id, ...)
+_edje_message_send(Edje *ed, Edje_Queue queue, Edje_Message_Type type, int id, void 
*emsg)
 {
-   /* FIXME: check all malloc fails and gracefully unroll and exit */
+   /* FIXME: check all malloc & strdup 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;
+   int i;
    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 *));
+         {
+            Edje_Message_Signal *emsg2, *emsg3;
+            
+            emsg2 = (Edje_Message_Signal *)emsg;
+            emsg3 = malloc(sizeof(Edje_Message_Signal));
+            emsg3->sig = strdup(emsg2->sig);
+            emsg3->src = strdup(emsg2->src);
+            msg = (unsigned char *)emsg3;
+         }
        break;
       case EDJE_MESSAGE_STRING:
-       str = va_arg(args, char *);
-       msg = strdup(str);
+         {
+            Edje_Message_String *emsg2, *emsg3;
+            
+            emsg2 = (Edje_Message_String *)emsg;
+            emsg3 = malloc(sizeof(Edje_Message_String));
+            emsg3->str = strdup(emsg2->str);
+            msg = (unsigned char *)emsg3;
+         }
        break;
       case EDJE_MESSAGE_INT:
-       num = va_arg(args, int);
-       msg = malloc(sizeof(int));
-       memcpy(msg, &num, sizeof(int));
+         {
+            Edje_Message_Int *emsg2, *emsg3;
+            
+            emsg2 = (Edje_Message_Int *)emsg;
+            emsg3 = malloc(sizeof(Edje_Message_Int));
+            emsg3->val = emsg2->val;
+            msg = (unsigned char *)emsg3;
+         }
        break;
       case EDJE_MESSAGE_FLOAT:
-       flt = va_arg(args, double);
-       msg = malloc(sizeof(double));
-       memcpy(msg, &flt, sizeof(double));
+         {
+            Edje_Message_Float *emsg2, *emsg3;
+            
+            emsg2 = (Edje_Message_Float *)emsg;
+            emsg3 = malloc(sizeof(Edje_Message_Float));
+            emsg3->val = emsg2->val;
+            msg = (unsigned char *)emsg3;
+         }
        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 *));
+         {
+            Edje_Message_String_Set *emsg2, *emsg3;
+            
+            emsg2 = (Edje_Message_String_Set *)emsg;
+            emsg3 = malloc(sizeof(Edje_Message_String_Set) + ((emsg2->count - 1) * 
sizeof(char *)));
+            emsg3->count = emsg2->count;
+            for (i = 0; i < emsg3->count; i++)
+              emsg3->str[i] = strdup(emsg2->str[i]);
+            msg = (unsigned char *)emsg3;
          }
        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));
+            Edje_Message_Int_Set *emsg2, *emsg3;
+            
+            emsg2 = (Edje_Message_Int_Set *)emsg;
+            emsg3 = malloc(sizeof(Edje_Message_Int_Set) + ((emsg2->count - 1) * 
sizeof(int)));
+            emsg3->count = emsg2->count;
+            for (i = 0; i < emsg3->count; i++)
+              emsg3->val[i] = emsg2->val[i];
+            msg = (unsigned char *)emsg3;
          }
        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));
+            Edje_Message_Float_Set *emsg2, *emsg3;
+            
+            emsg2 = (Edje_Message_Float_Set *)emsg;
+            emsg3 = malloc(sizeof(Edje_Message_Float_Set) + ((emsg2->count - 1) * 
sizeof(double)));
+            emsg3->count = emsg2->count;
+            for (i = 0; i < emsg3->count; i++)
+              emsg3->val[i] = emsg2->val[i];
+            msg = (unsigned char *)emsg3;
          }
        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));
+         {
+            Edje_Message_String_Int *emsg2, *emsg3;
+            
+            emsg2 = (Edje_Message_String_Int *)emsg;
+            emsg3 = malloc(sizeof(Edje_Message_String_Int));
+            emsg3->str = strdup(emsg2->str);
+            emsg3->val = emsg2->val;
+            msg = (unsigned char *)emsg3;
+         }
        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));
+         {
+            Edje_Message_String_Float *emsg2, *emsg3;
+            
+            emsg2 = (Edje_Message_String_Float *)emsg;
+            emsg3 = malloc(sizeof(Edje_Message_String_Float));
+            emsg3->str = strdup(emsg2->str);
+            emsg3->val = emsg2->val;
+            msg = (unsigned char *)emsg3;
+         }
        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));
+            Edje_Message_String_Int_Set *emsg2, *emsg3;
+            
+            emsg2 = (Edje_Message_String_Int_Set *)emsg;
+            emsg3 = malloc(sizeof(Edje_Message_String_Int_Set) + ((emsg2->count - 1) 
* sizeof(int)));
+            emsg3->str = strdup(emsg2->str);
+            emsg3->count = emsg2->count;
+            for (i = 0; i < emsg3->count; i++)
+              emsg3->val[i] = emsg2->val[i];
+            msg = (unsigned char *)emsg3;
          }
        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));
+            Edje_Message_String_Float_Set *emsg2, *emsg3;
+            
+            emsg2 = (Edje_Message_String_Float_Set *)emsg;
+            emsg3 = malloc(sizeof(Edje_Message_String_Float_Set) + ((emsg2->count - 
1) * sizeof(double)));
+            emsg3->str = strdup(emsg2->str);
+            emsg3->count = emsg2->count;
+            for (i = 0; i < emsg3->count; i++)
+              emsg3->val[i] = emsg2->val[i];
+            msg = (unsigned char *)emsg3;
          }
        break;
       default:
@@ -234,8 +315,6 @@
    
    em->msg = msg;
    msgq = evas_list_append(msgq, em);
-   
-   va_end(args);
 }
 
 void
@@ -261,11 +340,10 @@
                       void *pdata;
                       Embryo_Cell cell;
                       
-//                    embryo_parameter_string_push(em->edje->collection->script, sig);
                       /* first param is the message type - always */
                       cell = em->type;
                       embryo_parameter_cell_push(em->edje->collection->script, cell);
-                      /* first param is the integer of the event id - always there */
+                      /* 2nd 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);
@@ -274,7 +352,6 @@
                       embryo_program_data_set(em->edje->collection->script, pdata);
                    }
               }
-            /* call script fn */
             break;
           default:
             break;
@@ -287,11 +364,45 @@
             
             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:
+       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, 
"message");
+                 if (fn != EMBRYO_FUNCTION_NONE)
+                   {
+                      void *pdata;
+                      Embryo_Cell cell;
+                      
+                      /* first param is the message type - always */
+                      cell = em->type;
+                      embryo_parameter_cell_push(em->edje->collection->script, cell);
+                      /* 2nd param is the integer of the event id - always there */
+                      cell = em->id;
+                      embryo_parameter_cell_push(em->edje->collection->script, cell);
+                      /* 3rd param is the string */
+                      embryo_parameter_string_push(em->edje->collection->script, 
em->msg);
+                      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);
+                   }
+              }
+            break;
+          default:
+            break;
+         }
        break;
       case EDJE_MESSAGE_INT:
        break;
@@ -319,23 +430,29 @@
 void
 _edje_message_queue_process(void)
 {
+   int i;
+   
    if (msgq == NULL) return;
 
-//   printf("PROCESS\n");
-   /* a temporary message queue */
-   tmp_msgq = msgq;
-   msgq = NULL;
-   
-   while (tmp_msgq)
+   /* allow the message queue to feed itself up to 8 times before forcing */
+   /* us to go back to normal processing and let a 0 timeout deal with it */
+   for (i = 0; (i < 8) && (msgq); i++)
      {
-       Edje_Message *em;
+       /* a temporary message queue */
+       tmp_msgq = msgq;
+       msgq = NULL;
        
-       em = tmp_msgq->data;
-       tmp_msgq = evas_list_remove_list(tmp_msgq, tmp_msgq);
-       _edje_message_process(em);
-       _edje_message_free(em);
+       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)
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_private.h,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -3 -r1.66 -r1.67
--- edje_private.h      1 Jul 2004 03:46:05 -0000       1.66
+++ edje_private.h      2 Jul 2004 03:24:56 -0000       1.67
@@ -15,7 +15,6 @@
 
 #include <math.h>
 #include <fnmatch.h>
-#include <stdarg.h>
 
 #ifdef HAVE_ALLOCA_H
 #include <alloca.h>
@@ -131,7 +130,7 @@
 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_send(Edje *ed, Edje_Queue queue, Edje_Message_Type type, int id, 
void *emsg);
 void _edje_message_process(Edje_Message *em);
 void _edje_message_queue_process(void);
 void _edje_message_queue_clear(void);
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_program.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -3 -r1.36 -r1.37
--- edje_program.c      1 Jul 2004 03:46:05 -0000       1.36
+++ edje_program.c      2 Jul 2004 03:24:56 -0000       1.37
@@ -727,8 +727,12 @@
 void
 _edje_emit(Edje *ed, char *sig, char *src)
 {
+   Edje_Message_Signal emsg;
+   
    if (ed->delete_me) return;
-   _edje_message_send(ed, EDJE_QUEUE_APP, EDJE_MESSAGE_SIGNAL, 0, sig, src);
+   emsg.sig = sig;
+   emsg.src = src;
+   _edje_message_send(ed, EDJE_QUEUE_APP, EDJE_MESSAGE_SIGNAL, 0, &emsg);
 }
 
 /* FIXME: what if we delete the evas object??? */




-------------------------------------------------------
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

Reply via email to