raster pushed a commit to branch master.
commit 3aa98cd6f6d3c739fb6ea7d2c0ad013924a3d281
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date: Sat Apr 20 10:37:05 2013 +0900
allow for raw edje files to be inlined ANd to set tet, emit signals to
them etc.
---
src/bin/termio.c | 329 +++++++++++++++++++++++++++++++++++++++++++++---------
src/bin/termpty.c | 3 +
src/bin/termpty.h | 4 +-
3 files changed, 280 insertions(+), 56 deletions(-)
diff --git a/src/bin/termio.c b/src/bin/termio.c
index 7dd32af..d50ca23 100644
--- a/src/bin/termio.c
+++ b/src/bin/termio.c
@@ -622,6 +622,200 @@ _smart_media_del(void *data, Evas *e __UNUSED__,
Evas_Object *obj, void *info __
}
static void
+_block_edje_cmds(Termblock *blk, Eina_List *cmds)
+{
+ 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
+ l = cmds;
+ while (l)
+ {
+ s = l->data;
+
+ /////////////////////////////////////////////////////////////////////
+ if (ISCMD("text")) // set text part
+ {
+ char *prt, *txt;
+
+ GETS(prt);
+ GETS(txt);
+ edje_object_part_text_set(blk->obj, prt, txt);
+ }
+ /////////////////////////////////////////////////////////////////////
+ else if (ISCMD("emit")) // emit signal
+ {
+ char *sig, *src;
+
+ GETS(sig);
+ GETS(src);
+ edje_object_signal_emit(blk->obj, sig, src);
+ }
+ /////////////////////////////////////////////////////////////////////
+ else if (ISCMD("drag")) // set dragable
+ {
+ char *prt, *val;
+ double v1, v2;
+
+ GETS(prt);
+ GETS(val);
+ GETF(v1);
+ GETF(v2);
+ if (!strcmp(val, "value"))
+ edje_object_part_drag_value_set(blk->obj, prt, v1, v2);
+ else if (!strcmp(val, "size"))
+ edje_object_part_drag_size_set(blk->obj, prt, v1, v2);
+ else if (!strcmp(val, "step"))
+ edje_object_part_drag_step_set(blk->obj, prt, v1, v2);
+ else if (!strcmp(val, "page"))
+ edje_object_part_drag_page_set(blk->obj, prt, v1, v2);
+ }
+ /////////////////////////////////////////////////////////////////////
+ else if (ISCMD("message")) // send message
+ {
+ char *typ;
+
+ GETS(typ);
+ // XXX: handle
+ if (!strcmp(typ, "string"))
+ {
+ }
+ else if (!strcmp(typ, "int"))
+ {
+ }
+ else if (!strcmp(typ, "float"))
+ {
+ }
+ else if (!strcmp(typ, "string_set"))
+ {
+ }
+ else if (!strcmp(typ, "int_set"))
+ {
+ }
+ else if (!strcmp(typ, "float_set"))
+ {
+ }
+ else if (!strcmp(typ, "string_int"))
+ {
+ }
+ else if (!strcmp(typ, "string_float"))
+ {
+ }
+ else if (!strcmp(typ, "string_int_set"))
+ {
+ }
+ else if (!strcmp(typ, "string_float_set"))
+ {
+ }
+ }
+ /////////////////////////////////////////////////////////////////////
+ else if (ISCMD("chid")) // set callback channel id
+ {
+ char *chid;
+
+ GETS(chid);
+ 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
+ }
+ }
+
+ if (l) l = l->next;
+ }
+}
+
+static void
+_block_edje_activate(Evas_Object *obj, Termblock *blk)
+{
+ Termio *sd = evas_object_smart_data_get(obj);
+ Eina_Bool ok = EINA_FALSE;
+
+ if (!sd) return;
+ if ((!blk->path) || (!blk->link)) return;
+ blk->obj = edje_object_add(evas_object_evas_get(obj));
+ if (blk->path[0] == '/')
+ ok = edje_object_file_set(blk->obj, blk->path, blk->link);
+ else if (!strcmp(blk->path, "THEME"))
+ ok = edje_object_file_set(blk->obj,
+ config_theme_path_default_get
+ (sd->config),
+ blk->link);
+ else
+ {
+ char path[PATH_MAX], home[PATH_MAX];
+
+ if (homedir_get(home, sizeof(home)))
+ {
+ snprintf(path, sizeof(path), "%s/.terminology/objlib/%s",
+ home, blk->path);
+ ok = edje_object_file_set(blk->obj, path, blk->link);
+ }
+ if (!ok)
+ {
+ snprintf(path, sizeof(path), "%s/objlib/%s",
+ elm_app_data_dir_get(), blk->path);
+ ok = edje_object_file_set(blk->obj, path, blk->link);
+ }
+ }
+ evas_object_smart_member_add(blk->obj, obj);
+ evas_object_stack_above(blk->obj, sd->grid.obj);
+ evas_object_show(blk->obj);
+ evas_object_data_set(blk->obj, "blk", blk);
+
+ if (ok) _block_edje_cmds(blk, blk->cmds);
+}
+
+static void
+_block_media_activate(Evas_Object *obj, Termblock *blk)
+{
+ Termio *sd = evas_object_smart_data_get(obj);
+ int type = 0;
+ int media = MEDIA_STRETCH;
+
+ if (!sd) return;
+ if (blk->scale_stretch) media = MEDIA_STRETCH;
+ else if (blk->scale_center) media = MEDIA_POP;
+ else if (blk->scale_fill) media = MEDIA_BG;
+ else if (blk->thumb) media = MEDIA_THUMB;
+// media = MEDIA_POP;
+ if (!blk->was_active_before) media |= MEDIA_SAVE;
+ else media |= MEDIA_RECOVER | MEDIA_SAVE;
+ blk->obj = media_add(obj, blk->path, sd->config, media, &type);
+ evas_object_event_callback_add
+ (blk->obj, EVAS_CALLBACK_DEL, _smart_media_del, blk);
+ blk->type = type;
+ evas_object_smart_member_add(blk->obj, obj);
+ evas_object_stack_above(blk->obj, sd->grid.obj);
+ evas_object_show(blk->obj);
+ evas_object_data_set(blk->obj, "blk", blk);
+ if (blk->thumb)
+ evas_object_smart_callback_add
+ (blk->obj, "clicked", _smart_media_clicked, obj);
+}
+
+static void
+_block_activate(Evas_Object *obj, Termblock *blk)
+{
+ Termio *sd = evas_object_smart_data_get(obj);
+ if (!sd) return;
+ if (blk->active) return;
+ blk->active = EINA_TRUE;
+ if (blk->obj) return;
+ if (blk->edje) _block_edje_activate(obj, blk);
+ else _block_media_activate(obj, blk);
+ blk->was_active_before = EINA_TRUE;
+ if (!blk->was_active)
+ sd->pty->block.active = eina_list_append(sd->pty->block.active, blk);
+}
+
+static void
_smart_apply(Evas_Object *obj)
{
Termio *sd = evas_object_smart_data_get(obj);
@@ -688,47 +882,7 @@ _smart_apply(Evas_Object *obj)
blk = termpty_block_get(sd->pty, bid);
if (blk)
{
- if (!blk->active)
- {
- blk->active = EINA_TRUE;
- if (!blk->obj)
- {
- int type = 0;
- int media = MEDIA_STRETCH;
-
- if (blk->scale_stretch)
- media = MEDIA_STRETCH;
- else if (blk->scale_center)
- media = MEDIA_POP;
- else if (blk->scale_fill)
- media = MEDIA_BG;
- else if (blk->thumb)
- media = MEDIA_THUMB;
-// media = MEDIA_POP;
- if (!blk->was_active_before)
- media |= MEDIA_SAVE;
- else
- media |= MEDIA_RECOVER | MEDIA_SAVE;
- blk->obj = media_add(obj, blk->path,
- sd->config,
- media, &type);
- evas_object_event_callback_add
- (blk->obj, EVAS_CALLBACK_DEL,
- _smart_media_del, blk);
- blk->type = type;
- evas_object_smart_member_add(blk->obj,
obj);
- evas_object_stack_above(blk->obj,
sd->grid.obj);
- evas_object_show(blk->obj);
- evas_object_data_set(blk->obj, "blk",
blk);
- if (blk->thumb)
- evas_object_smart_callback_add
- (blk->obj, "clicked",
- _smart_media_clicked, obj);
- }
- blk->was_active_before = EINA_TRUE;
- if (!blk->was_active)
- sd->pty->block.active =
eina_list_append(sd->pty->block.active, blk);
- }
+ _block_activate(obj, blk);
blk->x = (x - bx);
blk->y = (y - by);
evas_object_move(blk->obj,
@@ -860,8 +1014,10 @@ _smart_apply(Evas_Object *obj)
if (!blk->active)
{
blk->was_active = EINA_FALSE;
+ // XXX: move to func
if (blk->obj)
{
+ // XXX: handle if edje not media
evas_object_event_callback_del_full
(blk->obj, EVAS_CALLBACK_DEL,
_smart_media_del, blk);
@@ -3102,11 +3258,13 @@ _smart_pty_command(void *data)
if ((sd->pty->cur_cmd[1] == 's') ||
(sd->pty->cur_cmd[1] == 'c') ||
(sd->pty->cur_cmd[1] == 'f') ||
- (sd->pty->cur_cmd[1] == 't'))
+ (sd->pty->cur_cmd[1] == 't') ||
+ (sd->pty->cur_cmd[1] == 'j'))
{
- const char *p, *p0, *path;
+ const char *p, *p0, *p1, *path = NULL;
char *pp;
int ww = 0, hh = 0, repch;
+ Eina_List *strs = NULL;
// exact size in CHAR CELLS - WW (decimal) width CELLS,
// HH (decimal) in CELLS.
@@ -3114,6 +3272,12 @@ _smart_pty_command(void *data)
// isCWW;HH;PATH
// OR
// isCWW;HH;LINK\nPATH
+ // OR specific to 'j' (edje)
+ // ijCWW;HH;PATH\nGROUP[commands]
+ // WHERE [commands] is an optional string set of:
+ // \nCMD\nP1[\nP2][\nP3][[\nCMD2\nP21[\nP22]]...
+ // CMD is the command, P1, P2, P3 etc. are parameters (P2 and
+ // on are optional depending on CMD)
repch = sd->pty->cur_cmd[2];
if (repch)
{
@@ -3137,23 +3301,75 @@ _smart_pty_command(void *data)
break;
}
}
- path = p;
- p = strchr(path, '\n');
- if (p)
+ if (sd->pty->cur_cmd[1] == 'j')
{
- link = strdup(path);
- path = p + 1;
- if (isspace(path[0])) path++;
- pp = strchr(link, '\n');
- if (pp) *pp = 0;
- pp = strchr(link, '\r');
- if (pp) *pp = 0;
+ // 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++;
+ }
+ }
+ else
+ {
+ path = p;
+ p = strchr(path, '\n');
+ if (p)
+ {
+ link = strdup(path);
+ path = p + 1;
+ if (isspace(path[0])) path++;
+ pp = strchr(link, '\n');
+ if (pp) *pp = 0;
+ pp = strchr(link, '\r');
+ if (pp) *pp = 0;
+ }
}
if ((ww < 512) && (hh < 512))
{
- Termblock *blk;
+ Termblock *blk = NULL;
- blk = termpty_block_new(sd->pty, ww, hh, path, link);
+ if (strs)
+ {
+ const char *file, *group;
+ Eina_List *l;
+
+ file = eina_list_nth(strs, 0);
+ group = eina_list_nth(strs, 1);
+ l = eina_list_nth_list(strs, 2);
+ blk = termpty_block_new(sd->pty, ww, hh, file,
group);
+ for (;l; l = l->next)
+ {
+ pp = l->data;
+ if (pp)
+ blk->cmds = eina_list_append(blk->cmds, pp);
+ l->data = NULL;
+ }
+ }
+ else
+ blk = termpty_block_new(sd->pty, ww, hh, path, link);
if (blk)
{
if (sd->pty->cur_cmd[1] == 's')
@@ -3164,10 +3380,13 @@ _smart_pty_command(void *data)
blk->scale_fill = EINA_TRUE;
else if (sd->pty->cur_cmd[1] == 't')
blk->thumb = EINA_TRUE;
+ else if (sd->pty->cur_cmd[1] == 'j')
+ blk->edje = EINA_TRUE;
termpty_block_insert(sd->pty, repch, blk);
}
}
if (link) free(link);
+ EINA_LIST_FREE(strs, pp) free(pp);
}
return;
}
diff --git a/src/bin/termpty.c b/src/bin/termpty.c
index b805bfd..35f437e 100644
--- a/src/bin/termpty.c
+++ b/src/bin/termpty.c
@@ -1221,9 +1221,12 @@ termpty_pid_get(const Termpty *ty)
void
termpty_block_free(Termblock *tb)
{
+ char *s;
if (tb->path) eina_stringshare_del(tb->path);
if (tb->link) eina_stringshare_del(tb->link);
+ if (tb->chid) eina_stringshare_del(tb->chid);
if (tb->obj) evas_object_del(tb->obj);
+ EINA_LIST_FREE(tb->cmds, s) free(s);
free(tb);
}
diff --git a/src/bin/termpty.h b/src/bin/termpty.h
index 6c49d93..8392fca 100644
--- a/src/bin/termpty.h
+++ b/src/bin/termpty.h
@@ -144,12 +144,14 @@ struct _Termblock
int refs;
short w, h;
short x, y;
- const char *path, *link;
+ 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;
Eina_Bool thumb : 1;
+ Eina_Bool edje : 1;
Eina_Bool active : 1;
Eina_Bool was_active : 1;
--
------------------------------------------------------------------------------
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