diff --git a/src/bin/termio.c b/src/bin/termio.c index dbc6ef21..9457abd9 100644 --- a/src/bin/termio.c +++ b/src/bin/termio.c @@ -548,6 +548,20 @@ _smart_media_clicked(void *data, Evas_Object *obj, void *info __UNUSED__) evas_object_smart_callback_call(data, "popup", (void *)file); } +static void +_smart_media_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *info __UNUSED__) +{ + Termblock *blk = data; + + if (blk->obj == obj) + { + evas_object_event_callback_del_full + (blk->obj, EVAS_CALLBACK_DEL, + _smart_media_del, blk); + blk->obj = NULL; + } +} + static void _smart_apply(Evas_Object *obj) { @@ -639,6 +653,9 @@ _smart_apply(Evas_Object *obj) 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); @@ -785,6 +802,9 @@ _smart_apply(Evas_Object *obj) blk->was_active = EINA_FALSE; if (blk->obj) { + evas_object_event_callback_del_full + (blk->obj, EVAS_CALLBACK_DEL, + _smart_media_del, blk); evas_object_del(blk->obj); blk->obj = NULL; } @@ -2889,9 +2909,13 @@ _smart_pty_command(void *data) // HH (decimal) in CELLS. // // isCWW;HH;PATH + // OR + // isCWW;HH;LINK\nPATH repch = sd->pty->cur_cmd[2]; if (repch) { + char *link = NULL; + for (p0 = p = &(sd->pty->cur_cmd[3]); *p; p++) { if (*p == ';') @@ -2911,9 +2935,18 @@ _smart_pty_command(void *data) } } path = p; + p = strchr(path, '\n'); + if (p) + { + link = strdup(path); + link[p - path] = 0; + path = p + 1; + } if ((ww < 512) && (hh < 512)) { - Termblock *blk = termpty_block_new(sd->pty, ww, hh, path); + Termblock *blk; + + blk = termpty_block_new(sd->pty, ww, hh, path, link); if (blk) { if (sd->pty->cur_cmd[1] == 's') @@ -2927,6 +2960,7 @@ _smart_pty_command(void *data) termpty_block_insert(sd->pty, repch, blk); } } + if (link) free(link); } return; } diff --git a/src/bin/termpty.c b/src/bin/termpty.c index 802a8419..af4c4363 100644 --- a/src/bin/termpty.c +++ b/src/bin/termpty.c @@ -563,12 +563,13 @@ void termpty_block_free(Termblock *tb) { if (tb->path) eina_stringshare_del(tb->path); + if (tb->link) eina_stringshare_del(tb->link); if (tb->obj) evas_object_del(tb->obj); free(tb); } Termblock * -termpty_block_new(Termpty *ty, int w, int h, const char *path) +termpty_block_new(Termpty *ty, int w, int h, const char *path, const char *link) { Termblock *tb; int id; @@ -590,6 +591,7 @@ termpty_block_new(Termpty *ty, int w, int h, const char *path) tb->w = w; tb->h = h; tb->path = eina_stringshare_add(path); + if (link) tb->link = eina_stringshare_add(link); eina_hash_add(ty->block.blocks, &id, tb); ty->block.curid++; if (ty->block.curid >= 8192) ty->block.curid = 0; diff --git a/src/bin/termpty.h b/src/bin/termpty.h index 6c73fa1b..9510d611 100644 --- a/src/bin/termpty.h +++ b/src/bin/termpty.h @@ -144,7 +144,7 @@ struct _Termblock int refs; short w, h; short x, y; - const char *path; + const char *path, *link; Evas_Object *obj; Eina_Bool scale_stretch : 1; Eina_Bool scale_center : 1; @@ -174,7 +174,7 @@ void termpty_backscroll_set(Termpty *ty, int size); pid_t termpty_pid_get(const Termpty *ty); void termpty_block_free(Termblock *tb); -Termblock *termpty_block_new(Termpty *ty, int w, int h, const char *path); +Termblock *termpty_block_new(Termpty *ty, int w, int h, const char *path, const char *link); 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);