raster pushed a commit to branch master.

commit 377511d7f80bbe4bbd27a438864fa53e1a82ccfd
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Mon Apr 22 00:37:11 2013 +0900

    more work on inlined edje objects - allow multiple chid's to be active
    to feed back multiple signals/events from differentinline objects.
---
 src/bin/termio.c | 121 +++++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 99 insertions(+), 22 deletions(-)

diff --git a/src/bin/termio.c b/src/bin/termio.c
index caa67fe..aefe9ff 100644
--- a/src/bin/termio.c
+++ b/src/bin/termio.c
@@ -76,7 +76,7 @@ struct _Termio
    Config *config;
    Ecore_IMF_Context *imf;
    const char *sel_str;
-   const char *cur_chid;
+   Eina_List *cur_chids;
    Ecore_Job *sel_reset_job;
    double set_sel_at;
    Elm_Sel_Type sel_type;
@@ -623,16 +623,22 @@ _smart_media_del(void *data, Evas *e __UNUSED__, 
Evas_Object *obj, void *info __
 }
 
 static void
-_block_edje_signal_cb(void *data, Evas_Object *obj, const char *sig, const 
char *src)
+_block_edje_signal_cb(void *data, Evas_Object *obj __UNUSED__, const char 
*sig, const char *src)
 {
    Termblock *blk = data;
    Termio *sd = evas_object_smart_data_get(blk->pty->obj);
-   char *buf = NULL;
+   char *buf = NULL, *chid = NULL;
    int buflen = 0;
+   Eina_List *l;
    
    if (!sd) return;
-   if ((!blk->chid) || (!sd->cur_chid)) return;
-   if (!(!strcmp(blk->chid, sd->cur_chid))) return;
+   if ((!blk->chid) || (!sd->cur_chids)) return;
+   EINA_LIST_FOREACH(sd->cur_chids, l, chid)
+     {
+        if (!(!strcmp(blk->chid, chid))) break;
+        chid = NULL;
+     }
+   if (!chid) return;
    if ((!strcmp(sig, "drag")) ||
        (!strcmp(sig, "drag,start")) ||
        (!strcmp(sig, "drag,stop")) ||
@@ -645,28 +651,36 @@ _block_edje_signal_cb(void *data, Evas_Object *obj, const 
char *sig, const char
         edje_object_part_drag_value_get(blk->obj, src, &f1, &f2);
         v1 = (int)(f1 * 1000.0);
         v2 = (int)(f2 * 1000.0);
-        buf = alloca(strlen(src) + 256);
-        buflen = sprintf(buf, "%c}%s;%s\n%i\n%i", 0x1b, sig, src, v1, v2);
+        buf = alloca(strlen(src) + strlen(blk->chid) + 256);
+        buflen = sprintf(buf, "%c}%s;%s\n%s\n%i\n%i", 0x1b,
+                         sig, blk->chid, src, v1, v2);
         termpty_write(sd->pty, buf, buflen + 1);
      }
    else
      {
-        buf = alloca(strlen(sig) + strlen(src) + 128);
-        buflen = sprintf(buf, "%c}signal;%s\n%s", 0x1b, sig, src);
+        buf = alloca(strlen(sig) + strlen(src) + strlen(blk->chid) + 128);
+        buflen = sprintf(buf, "%c}signal;%s\n%s\n%s", 0x1b,
+                         blk->chid, sig, src);
         termpty_write(sd->pty, buf, buflen + 1);
      }
 }
 
 static void
-_block_edje_message_cb(void *data, Evas_Object *obj, Edje_Message_Type type, 
int id, void *msg)
+_block_edje_message_cb(void *data, Evas_Object *obj __UNUSED__, 
Edje_Message_Type type, int id, void *msg)
 {
    Termblock *blk = data;
    Termio *sd = evas_object_smart_data_get(blk->pty->obj);
+   char *chid = NULL;
+   Eina_List *l;
    
    if (!sd) return;
-   if ((!blk->chid) || (!sd->cur_chid)) return;
-   if (!(!strcmp(blk->chid, sd->cur_chid))) return;
-
+   if ((!blk->chid) || (!sd->cur_chids)) return;
+   EINA_LIST_FOREACH(sd->cur_chids, l, chid)
+     {
+        if (!(!strcmp(blk->chid, chid))) break;
+        chid = NULL;
+     }
+   if (!chid) return;
    switch (type)
      {
         // XXX: handle
@@ -3245,6 +3259,7 @@ _smart_del(Evas_Object *obj)
 {
    Evas_Object *o;
    Termio *sd = evas_object_smart_data_get(obj);
+   char *chid;
    
    if (!sd) return;
    terms = eina_list_remove(terms, obj);
@@ -3286,8 +3301,7 @@ _smart_del(Evas_Object *obj)
    _compose_seq_reset(sd);
    if (sd->sel_str) eina_stringshare_del(sd->sel_str);
    if (sd->sel_reset_job) ecore_job_del(sd->sel_reset_job);
-   if (sd->cur_chid) eina_stringshare_del(sd->cur_chid);
-   sd->cur_chid = NULL;
+   EINA_LIST_FREE(sd->cur_chids, chid) eina_stringshare_del(chid);
    sd->sel_str = NULL;
    sd->sel_reset_job = NULL;
    sd->link.down.dndobj = NULL;
@@ -3606,6 +3620,51 @@ _smart_pty_command(void *data)
                }
              return;
           }
+        else if (sd->pty->cur_cmd[1] == 'C')
+          {
+             Termblock *blk = NULL;
+             const char *p, *p0, *p1;
+             char *pp;
+             Eina_List *strs = NULL;
+             
+             p = &(sd->pty->cur_cmd[2]);
+             // parse from p until end of string - one newline
+             // per list item in strs
+             p0 = p1 = p;
+             for (;;)
+               {
+                  // end of str param
+                  if ((*p1 == '\n') || (*p1 == '\r') || (!*p1))
+                    {
+                       // if string is non-empty...
+                       if ((p1 - p0) >= 1)
+                         {
+                            // allocate, fill and add to list
+                            pp = malloc(p1 - p0 + 1);
+                            if (pp)
+                              {
+                                 strncpy(pp, p0, p1 - p0);
+                                 pp[p1 - p0] = 0;
+                                 strs = eina_list_append(strs, pp);
+                              }
+                         }
+                       // end of string buffer
+                       if (!*p1) break;
+                       p1++; // skip \n or \r
+                       p0 = p1;
+                    }
+                  else
+                    p1++;
+               }
+             if (strs)
+               {
+                  char *chid = strs->data;
+                  blk = termpty_block_chid_get(sd->pty, chid);
+                  if (blk)
+                    _block_edje_cmds(sd->pty, blk, strs->next, EINA_FALSE);
+               }
+             EINA_LIST_FREE(strs, pp) free(pp);
+          }
         else if (sd->pty->cur_cmd[1] == 'b')
           {
              sd->pty->block.on = EINA_TRUE;
@@ -3628,18 +3687,36 @@ _smart_pty_command(void *data)
           }
         else if (sd->pty->cur_cmd[1] == 'j')
           {
+             const char *chid = &(sd->pty->cur_cmd[3]);
+                  
              if (sd->pty->cur_cmd[2])
                {
-                  if (sd->cur_chid) eina_stringshare_del(sd->cur_chid);
-                  sd->cur_chid = eina_stringshare_add(&(sd->pty->cur_cmd[2]));
+                  if (sd->pty->cur_cmd[2] == '+')
+                    {
+                       sd->cur_chids = eina_list_append
+                         (sd->cur_chids, eina_stringshare_add(chid));
+                    }
+                  else if (sd->pty->cur_cmd[2] == '-')
+                    {
+                       Eina_List *l;
+                       char *chid2;
+                       
+                       EINA_LIST_FOREACH(sd->cur_chids, l, chid2)
+                         {
+                            if (!(!strcmp(chid, chid2)))
+                              {
+                                 sd->cur_chids =
+                                   eina_list_remove_list(sd->cur_chids, l);
+                                 eina_stringshare_del(chid2);
+                                 break;
+                              }
+                         }
+                    }
                }
              else
                {
-                  if (sd->cur_chid)
-                    {
-                       eina_stringshare_del(sd->cur_chid);
-                       sd->cur_chid = NULL;
-                    }
+                  EINA_LIST_FREE(sd->cur_chids, chid)
+                    eina_stringshare_del(chid);
                }
              return;
           }

-- 

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter

Reply via email to