raster pushed a commit to branch master.

commit f5b84edbfd9a1f44e44429b1025e49fb3ea352f4
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Sat Apr 20 16:54:11 2013 +0900

    more work ok direct edje inline content. u can send messages toit now
    on init... and get signals... and drag events... but cant get messages
    yet.
---
 src/bin/termio.c  | 257 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 src/bin/termpty.c |  19 ++++
 src/bin/termpty.h |  11 ++-
 3 files changed, 273 insertions(+), 14 deletions(-)

diff --git a/src/bin/termio.c b/src/bin/termio.c
index d50ca23..c3a1532 100644
--- a/src/bin/termio.c
+++ b/src/bin/termio.c
@@ -76,6 +76,7 @@ struct _Termio
    Config *config;
    Ecore_IMF_Context *imf;
    const char *sel_str;
+   const char *cur_chid;
    Ecore_Job *sel_reset_job;
    double set_sel_at;
    Elm_Sel_Type sel_type;
@@ -622,15 +623,118 @@ _smart_media_del(void *data, Evas *e __UNUSED__, 
Evas_Object *obj, void *info __
 }
 
 static void
-_block_edje_cmds(Termblock *blk, Eina_List *cmds)
+_block_edje_signal_cb(void *data, Evas_Object *obj, const char *sig, const 
char *src)
+{
+   Termblock *blk = data;
+   Termio *sd = evas_object_smart_data_get(blk->pty->obj);
+   char *buf = NULL;
+   int buflen = 0;
+   
+   if (!sd) return;
+   if ((!blk->chid) || (!sd->cur_chid)) return;
+   if (!(!strcmp(blk->chid, sd->cur_chid))) return;
+   if ((!strcmp(sig, "drag")) ||
+       (!strcmp(sig, "drag,start")) ||
+       (!strcmp(sig, "drag,stop")) ||
+       (!strcmp(sig, "drag,step")) ||
+       (!strcmp(sig, "drag,set")))
+     {
+        int v1, v2;
+        double f1 = 0.0, f2 = 0.0;
+        
+        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);
+        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);
+        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)
+{
+   Termblock *blk = data;
+   Termio *sd = evas_object_smart_data_get(blk->pty->obj);
+   
+   if (!sd) return;
+   if ((!blk->chid) || (!sd->cur_chid)) return;
+   if (!(!strcmp(blk->chid, sd->cur_chid))) return;
+
+   switch (type)
+     {
+        // XXX: handle
+      case EDJE_MESSAGE_STRING:
+          {
+             Edje_Message_String *m = msg;
+          }
+        break;
+      case EDJE_MESSAGE_INT:
+          {
+             Edje_Message_Int *m = msg;
+          }
+        break;
+      case EDJE_MESSAGE_FLOAT:
+          {
+             Edje_Message_Float *m = msg;
+          }
+        break;
+      case EDJE_MESSAGE_STRING_SET:
+          {
+             Edje_Message_String_Set *m = msg;
+          }
+        break;
+      case EDJE_MESSAGE_INT_SET:
+          {
+             Edje_Message_Int_Set *m = msg;
+          }
+        break;
+      case EDJE_MESSAGE_FLOAT_SET:
+          {
+             Edje_Message_Float_Set *m = msg;
+          }
+        break;
+      case EDJE_MESSAGE_STRING_INT:
+          {
+             Edje_Message_String_Int *m = msg;
+          }
+        break;
+      case EDJE_MESSAGE_STRING_FLOAT:
+          {
+             Edje_Message_String_Float *m = msg;
+          }
+        break;
+      case EDJE_MESSAGE_STRING_INT_SET:
+          {
+             Edje_Message_String_Int_Set *m = msg;
+          }
+        break;
+      case EDJE_MESSAGE_STRING_FLOAT_SET:
+          {
+             Edje_Message_String_Float_Set *m = msg;
+          }
+        break;
+      default:
+        break;
+     }
+}
+
+static void
+_block_edje_cmds(Termpty *ty, Termblock *blk, Eina_List *cmds, Eina_Bool 
created)
 {
    Eina_List *l;
    char *s;
         
 #define ISCMD(cmd) !strcmp(s, cmd)
-#define GETS(var) l = l->next; if (!l) break; var = l->data
-#define GETI(var) l = l->next; if (!l) break; var = atoi(l->data)
-#define GETF(var) l = l->next; if (!l) break; var = (double)atoi(l->data) / 
1000.0
+#define GETS(var) l = l->next; if (!l) return; var = l->data
+#define GETI(var) l = l->next; if (!l) return; var = atoi(l->data)
+#define GETF(var) l = l->next; if (!l) return; var = (double)atoi(l->data) / 
1000.0
    l = cmds;
    while (l)
      {
@@ -676,39 +780,144 @@ _block_edje_cmds(Termblock *blk, Eina_List *cmds)
         /////////////////////////////////////////////////////////////////////
         else if (ISCMD("message")) // send message
           {
+             int id;
              char *typ;
              
+             GETI(id);
              GETS(typ);
-             // XXX: handle
              if (!strcmp(typ, "string"))
                {
+                  Edje_Message_String *m;
+                  
+                  m = alloca(sizeof(Edje_Message_String));
+                  GETS(m->str);
+                  edje_object_message_send(blk->obj, EDJE_MESSAGE_STRING,
+                                           id, m);
                }
              else if (!strcmp(typ, "int"))
                {
+                  Edje_Message_Int *m;
+                  
+                  m = alloca(sizeof(Edje_Message_Int));
+                  GETI(m->val);
+                  edje_object_message_send(blk->obj, EDJE_MESSAGE_INT,
+                                           id, m);
                }
              else if (!strcmp(typ, "float"))
                {
+                  Edje_Message_Float *m;
+                  
+                  m = alloca(sizeof(Edje_Message_Float));
+                  GETF(m->val);
+                  edje_object_message_send(blk->obj, EDJE_MESSAGE_FLOAT,
+                                           id, m);
                }
              else if (!strcmp(typ, "string_set"))
                {
+                  Edje_Message_String_Set *m;
+                  int i, count;
+                  
+                  GETI(count);
+                  m = alloca(sizeof(Edje_Message_String_Set) + 
+                             ((count - 1) * sizeof(char *)));
+                  m->count = count;
+                  for (i = 0; i < m->count; i++)
+                    {
+                       GETS(m->str[i]);
+                    }
+                  edje_object_message_send(blk->obj,
+                                           EDJE_MESSAGE_STRING_SET,
+                                           id, m);
                }
              else if (!strcmp(typ, "int_set"))
                {
+                  Edje_Message_Int_Set *m;
+                  int i, count;
+                  
+                  GETI(count);
+                  m = alloca(sizeof(Edje_Message_Int_Set) + 
+                             ((count - 1) * sizeof(int)));
+                  m->count = count;
+                  for (i = 0; i < m->count; i++)
+                    {
+                       GETI(m->val[i]);
+                    }
+                  edje_object_message_send(blk->obj,
+                                           EDJE_MESSAGE_INT_SET,
+                                           id, m);
                }
              else if (!strcmp(typ, "float_set"))
                {
+                  Edje_Message_Float_Set *m;
+                  int i, count;
+                  
+                  GETI(count);
+                  m = alloca(sizeof(Edje_Message_Float_Set) +
+                             ((count - 1) * sizeof(double)));
+                  m->count = count;
+                  for (i = 0; i < m->count; i++)
+                    {
+                       GETF(m->val[i]);
+                    }
+                  edje_object_message_send(blk->obj,
+                                           EDJE_MESSAGE_FLOAT_SET,
+                                           id, m);
                }
              else if (!strcmp(typ, "string_int"))
                {
+                  Edje_Message_String_Int *m;
+                  
+                  m = alloca(sizeof(Edje_Message_String_Int));
+                  GETS(m->str);
+                  GETI(m->val);
+                  edje_object_message_send(blk->obj, EDJE_MESSAGE_STRING_INT,
+                                           id, m);
                }
              else if (!strcmp(typ, "string_float"))
                {
+                  Edje_Message_String_Float *m;
+                  
+                  m = alloca(sizeof(Edje_Message_String_Float));
+                  GETS(m->str);
+                  GETF(m->val);
+                  edje_object_message_send(blk->obj, EDJE_MESSAGE_STRING_FLOAT,
+                                           id, m);
                }
              else if (!strcmp(typ, "string_int_set"))
                {
+                  Edje_Message_String_Int_Set *m;
+                  int i, count;
+                  
+                  GETI(count);
+                  m = alloca(sizeof(Edje_Message_String_Int_Set) + 
+                             ((count - 1) * sizeof(int)));
+                  GETS(m->str);
+                  m->count = count;
+                  for (i = 0; i < m->count; i++)
+                    {
+                       GETI(m->val[i]);
+                    }
+                  edje_object_message_send(blk->obj,
+                                           EDJE_MESSAGE_STRING_INT_SET,
+                                           id, m);
                }
              else if (!strcmp(typ, "string_float_set"))
                {
+                  Edje_Message_String_Float_Set *m;
+                  int i, count;
+                  
+                  GETI(count);
+                  m = alloca(sizeof(Edje_Message_String_Float_Set) + 
+                             ((count - 1) * sizeof(double)));
+                  GETS(m->str);
+                  m->count = count;
+                  for (i = 0; i < m->count; i++)
+                    {
+                       GETF(m->val[i]);
+                    }
+                  edje_object_message_send(blk->obj,
+                                           EDJE_MESSAGE_STRING_FLOAT_SET,
+                                           id, m);
                }
           }
         /////////////////////////////////////////////////////////////////////
@@ -720,10 +929,16 @@ _block_edje_cmds(Termblock *blk, Eina_List *cmds)
              if (!blk->chid)
                {
                   blk->chid = eina_stringshare_add(chid);
-                  // XXX: add to a hash by chid
-                  // XXX: all signal callbacks, messages and dragable signals
-                  // are routed to the named callback channel IF it is active
-                  // at the time
+                  termpty_block_chid_update(ty, blk);
+               }
+             if (created)
+               {
+                  edje_object_signal_callback_add(blk->obj, "*", "*",
+                                                  _block_edje_signal_cb,
+                                                  blk);
+                  edje_object_message_handler_set(blk->obj,
+                                                  _block_edje_message_cb,
+                                                  blk);
                }
           }
         
@@ -765,11 +980,11 @@ _block_edje_activate(Evas_Object *obj, Termblock *blk)
           }
      }
    evas_object_smart_member_add(blk->obj, obj);
-   evas_object_stack_above(blk->obj, sd->grid.obj);
+   evas_object_stack_above(blk->obj, sd->event);
    evas_object_show(blk->obj);
    evas_object_data_set(blk->obj, "blk", blk);
 
-   if (ok) _block_edje_cmds(blk, blk->cmds);
+   if (ok) _block_edje_cmds(sd->pty, blk, blk->cmds, EINA_TRUE);
 }
 
 static void
@@ -3072,6 +3287,8 @@ _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;
    sd->sel_str = NULL;
    sd->sel_reset_job = NULL;
    sd->link.down.dndobj = NULL;
@@ -3410,6 +3627,23 @@ _smart_pty_command(void *data)
              termpty_write(sd->pty, buf, strlen(buf));
              return;
           }
+        else if (sd->pty->cur_cmd[1] == 'j')
+          {
+             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]));
+               }
+             else
+               {
+                  if (sd->cur_chid)
+                    {
+                       eina_stringshare_del(sd->cur_chid);
+                       sd->cur_chid = NULL;
+                    }
+               }
+             return;
+          }
      }
    evas_object_smart_callback_call(obj, "command", (void *)sd->pty->cur_cmd);
 }
@@ -3536,6 +3770,7 @@ termio_add(Evas_Object *parent, Config *config, const 
char *cmd, Eina_Bool login
 #endif
    
    sd->pty = termpty_new(cmd, login_shell, cd, w, h, config->scrollback);
+   sd->pty->obj = obj;
    sd->pty->cb.change.func = _smart_pty_change;
    sd->pty->cb.change.data = obj;
    sd->pty->cb.scroll.func = _smart_pty_scroll;
diff --git a/src/bin/termpty.c b/src/bin/termpty.c
index 1e93d52..4081b53 100644
--- a/src/bin/termpty.c
+++ b/src/bin/termpty.c
@@ -384,6 +384,7 @@ termpty_free(Termpty *ty)
    
    EINA_LIST_FREE(ty->block.expecting, ex) free(ex);
    if (ty->block.blocks) eina_hash_free(ty->block.blocks);
+   if (ty->block.chid_map) eina_hash_free(ty->block.chid_map);
    if (ty->block.active) eina_list_free(ty->block.active);
    if (ty->fd >= 0) close(ty->fd);
    if (ty->slavefd >= 0) close(ty->slavefd);
@@ -1293,6 +1294,7 @@ termpty_block_new(Termpty *ty, int w, int h, const char 
*path, const char *link)
      }
    tb = calloc(1, sizeof(Termblock));
    if (!tb) return NULL;
+   tb->pty = ty;
    tb->id = id;
    tb->w = w;
    tb->h = h;
@@ -1346,7 +1348,24 @@ termpty_block_get(Termpty *ty, int id)
    return eina_hash_find(ty->block.blocks, &id);
 }
 
+void
+termpty_block_chid_update(Termpty *ty, Termblock *blk)
+{
+   if (!blk->chid) return;
+   if (!ty->block.chid_map)
+     ty->block.chid_map = eina_hash_string_superfast_new(NULL);
+   if (!ty->block.chid_map) return;
+   eina_hash_add(ty->block.chid_map, blk->chid, blk);
+}
 
+Termblock *
+termpty_block_chid_get(Termpty *ty, const char *chid)
+{
+   Termblock *tb;
+   
+   tb = eina_hash_find(ty->block.chid_map, chid);
+   return tb;
+}
 
 
 
diff --git a/src/bin/termpty.h b/src/bin/termpty.h
index 8392fca..0fd678c 100644
--- a/src/bin/termpty.h
+++ b/src/bin/termpty.h
@@ -89,6 +89,7 @@ struct _Termstate
 
 struct _Termpty
 {
+   Evas_Object *obj;
    Ecore_Event_Handler *hand_exe_exit;
    Ecore_Fd_Handler *hand_fd;
    struct {
@@ -113,6 +114,7 @@ struct _Termpty
    struct {
       int curid;
       Eina_Hash *blocks;
+      Eina_Hash *chid_map;
       Eina_List *active;
       Eina_List *expecting;
       Eina_Bool on : 1;
@@ -139,14 +141,15 @@ struct _Termsave
 
 struct _Termblock
 {
+   Termpty     *pty;
+   const char  *path, *link, *chid;
+   Evas_Object *obj;
+   Eina_List   *cmds;
    int          id;
    int          type;
    int          refs;
    short        w, h;
    short        x, y;
-   const char  *path, *link, *chid;
-   Evas_Object *obj;
-   Eina_List   *cmds;
    Eina_Bool    scale_stretch : 1;
    Eina_Bool    scale_center : 1;
    Eina_Bool    scale_fill : 1;
@@ -180,6 +183,8 @@ Termblock *termpty_block_new(Termpty *ty, int w, int h, 
const char *path, const
 void       termpty_block_insert(Termpty *ty, int ch, Termblock *blk);
 int        termpty_block_id_get(Termcell *cell, int *x, int *y);
 Termblock *termpty_block_get(Termpty *ty, int id);
+void       termpty_block_chid_update(Termpty *ty, Termblock *blk);
+Termblock *termpty_block_chid_get(Termpty *ty, const char *chid);
 
 void       termpty_cell_copy(Termpty *ty, Termcell *src, Termcell *dst, int n);
 void       termpty_cell_swap(Termpty *ty, Termcell *src, Termcell *dst, int n);

-- 

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