tidy yp tycat - handle edj and mp3/audio files - ahare extensions

handling and filtering, actually free tup termblocks when no longer
referenced without needing a gc, etc. ...



SVN revision: 83441
This commit is contained in:
Carsten Haitzler 2013-01-29 15:54:47 +00:00
parent 510e14530f
commit 0015767f4b
8 changed files with 257 additions and 96 deletions

View File

@ -37,9 +37,12 @@ termptygfx.c termptygfx.h \
termptyext.c termptyext.h \
utf8.c utf8.h \
win.c win.h \
utils.c utils.h
utils.c utils.h \
extns.h
tycat_SOURCES = tycat.c
tycat_SOURCES = \
tycat.c \
extns.h
tycat_CPPFLAGS = -I. \
-DPACKAGE_BIN_DIR=\"$(bindir)\" -DPACKAGE_LIB_DIR=\"$(libdir)\" \

39
src/bin/extns.h Normal file
View File

@ -0,0 +1,39 @@
static const char *extn_img[] =
{
".png", ".jpg", ".jpeg", ".jpe", ".jfif", ".tif", ".tiff", ".gif",
".bmp", ".ico", ".ppm", ".pgm", ".pbm", ".pnm", ".xpm", ".psd", ".wbmp",
".cur", ".xcf", ".xcf.gz", ".arw", ".cr2", ".crw", ".dcr", ".dng", ".k25",
".kdc", ".erf", ".mrw", ".nef", ".nrf", ".nrw", ".orf", ".raw", ".rw2",
".rw2", ".pef", ".raf", ".sr2", ".srf", ".x3f", ".webp",
NULL
};
static const char *extn_scale[] =
{
".svg", ".svgz", ".svg.gz", ".ps", ".ps.gz", ".pdf",
NULL
};
static const char *extn_edj[] =
{
".edj",
NULL
};
static const char *extn_mov[] =
{
".asf", ".avi", ".bdm", ".bdmv", ".clpi", ".cpi", ".dv", ".fla", ".flv",
".m1v", ".m2t", ".m2v", ".m4v", ".mkv", ".mov", ".mp2", ".mp2ts", ".mp4",
".mpe", ".mpeg", ".mpg", ".mpl", ".mpls", ".mts", ".mxf", ".nut", ".nuv",
".ogg", ".ogm", ".ogv", ".qt", ".rm", ".rmj", ".rmm", ".rms", ".rmvb",
".rmx", ".rv", ".swf", ".ts", ".weba", ".webm", ".wmv", ".3g2", ".3gp",
".3gp2", ".3gpp", ".3gpp2", ".3p2", ".264",
".mp3", ".aac", ".wav",
NULL
};
static const char *extn_aud[] =
{
".mp3", ".aac", ".wav",
NULL
};

View File

@ -38,39 +38,7 @@ struct _Media
static Evas_Smart *_smart = NULL;
static Evas_Smart_Class _parent_sc = EVAS_SMART_CLASS_INIT_NULL;
static const char *extn_img[] =
{
".png", ".jpg", ".jpeg", ".jpe", ".jfif", ".tif", ".tiff", ".gif",
".bmp", ".ico", ".ppm", ".pgm", ".pbm", ".pnm", ".xpm", ".psd", ".wbmp",
".cur", ".xcf", ".xcf.gz", ".arw", ".cr2", ".crw", ".dcr", ".dng", ".k25",
".kdc", ".erf", ".mrw", ".nef", ".nrf", ".nrw", ".orf", ".raw", ".rw2",
".rw2", ".pef", ".raf", ".sr2", ".srf", ".x3f", ".webp",
NULL
};
static const char *extn_scale[] =
{
".svg", ".svgz", ".svg.gz", ".ps", ".ps.gz", ".pdf",
NULL
};
static const char *extn_edj[] =
{
".edj",
NULL
};
static const char *extn_mov[] =
{
".asf", ".avi", ".bdm", ".bdmv", ".clpi", ".cpi", ".dv", ".fla", ".flv",
".m1v", ".m2t", ".m2v", ".m4v", ".mkv", ".mov", ".mp2", ".mp2ts", ".mp4",
".mpe", ".mpeg", ".mpg", ".mpl", ".mpls", ".mts", ".mxf", ".nut", ".nuv",
".ogg", ".ogm", ".ogv", ".qt", ".rm", ".rmj", ".rmm", ".rms", ".rmvb",
".rmx", ".rv", ".swf", ".ts", ".weba", ".webm", ".wmv", ".3g2", ".3gp",
".3gp2", ".3gpp", ".3gpp2", ".3p2", ".264",
".mp3", ".aac", ".wav",
NULL
};
#include "extns.h"
static const char *
_is_fmt(const char *f, const char **extn)

View File

@ -514,10 +514,12 @@ termpty_resize(Termpty *ty, int w, int h)
c1 = &(olds[y * oldw]);
c2 = &(TERMPTY_SCREEN(ty, 0, y));
_termpty_text_copy(ty, c1, c2, ww);
termpty_cell_fill(ty, NULL, c1, ww);
c1 = &(olds2[y * oldw]);
c2 = &(ty->screen2[y * ty->w]);
_termpty_text_copy(ty, c1, c2, ww);
termpty_cell_fill(ty, NULL, c1, ww);
}
ty->circular_offset = 0;
@ -634,5 +636,103 @@ termpty_block_id_get(Termcell *cell, int *x, int *y)
Termblock *
termpty_block_get(Termpty *ty, int id)
{
if (!ty->block.blocks) return NULL;
return eina_hash_find(ty->block.blocks, &id);
}
static void
_handle_block_codepoint_overwrite(Termpty *ty, int oldc, int newc)
{
Termblock *tb;
int ido = 0, idn = 0;
if (oldc & 0x80000000) ido = (oldc >> 18) & 0x1fff;
if (newc & 0x80000000) idn = (newc >> 18) & 0x1fff;
if (((oldc & 0x80000000) && (newc & 0x80000000)) && (idn == ido)) return;
if (oldc & 0x80000000)
{
tb = termpty_block_get(ty, ido);
if (!tb) return;
tb->refs--;
if (tb->refs == 0)
{
if (tb->active)
ty->block.active = eina_list_remove(ty->block.active, tb);
eina_hash_del(ty->block.blocks, &ido, tb);
}
}
if (newc & 0x80000000)
{
tb = termpty_block_get(ty, idn);
if (!tb) return;
tb->refs++;
}
}
void
termpty_cell_copy(Termpty *ty, Termcell *src, Termcell *dst, int n)
{
int i;
for (i = 0; i < n; i++)
{
_handle_block_codepoint_overwrite(ty, dst[i].codepoint, src[i].codepoint);
dst[i] = src[i];
}
}
void
termpty_cell_swap(Termpty *ty __UNUSED__, Termcell *src, Termcell *dst, int n)
{
int i;
Termcell t;
for (i = 0; i < n; i++)
{
t = dst[i];
dst[i] = src[i];
dst[i] = t;
}
}
void
termpty_cell_fill(Termpty *ty, Termcell *src, Termcell *dst, int n)
{
int i;
if (src)
{
for (i = 0; i < n; i++)
{
_handle_block_codepoint_overwrite(ty, dst[i].codepoint, src[0].codepoint);
dst[i] = src[0];
}
}
else
{
for (i = 0; i < n; i++)
{
_handle_block_codepoint_overwrite(ty, dst[i].codepoint, 0);
memset(&(dst[i]), 0, sizeof(*dst));
}
}
}
void
termpty_cell_codepoint_att_fill(Termpty *ty, int codepoint, Termatt att, Termcell *dst, int n)
{
int i;
for (i = 0; i < n; i++)
{
_handle_block_codepoint_overwrite(ty, dst[i].codepoint, codepoint);
dst[i].codepoint = codepoint;
dst[i].att = att;
}
}

View File

@ -141,6 +141,7 @@ struct _Termblock
{
int id;
int type;
int refs;
short w, h;
short x, y;
const char *path;
@ -177,6 +178,11 @@ 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_cell_copy(Termpty *ty, Termcell *src, Termcell *dst, int n);
void termpty_cell_swap(Termpty *ty, Termcell *src, Termcell *dst, int n);
void termpty_cell_fill(Termpty *ty, Termcell *src, Termcell *dst, int n);
void termpty_cell_codepoint_att_fill(Termpty *ty, int codepoint, Termatt att, Termcell *dst, int n);
extern int _termpty_log_dom;
#define TERMPTY_SCREEN(Tpty, X, Y) \

View File

@ -461,9 +461,9 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
for (x = ty->state.cx; x < (ty->w); x++)
{
if (x < lim)
cells[x] = cells[x + arg];
termpty_cell_copy(ty, &(cells[x + arg]), &(cells[x]), 1);
else
memset(&(cells[x]), 0, sizeof(*cells));
termpty_cell_fill(ty, NULL, &(cells[x]), 1);
}
}
break;
@ -702,13 +702,10 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
size = ty->w * ty->h;
// swap screen content now
for (i = 0; i < size; i++)
{
Termcell t;
t = ty->screen[(i + ty->circular_offset) % ty->h];
ty->screen[(i + ty->circular_offset) % ty->h] = ty->screen2[i];
ty->screen2[i] = t;
}
termpty_cell_swap(ty,
&(ty->screen[(i + ty->circular_offset) % ty->h]),
&(ty->screen2[i]),
1);
ty->altbuf = !ty->altbuf;
if (ty->cb.cancel_sel.func)
ty->cb.cancel_sel.func(ty->cb.cancel_sel.data);
@ -963,10 +960,18 @@ static int
_handle_esc_terminology(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
{
Eina_Unicode *cc;
Eina_Unicode buf[4096], *b;
Eina_Unicode *buf, bufsmall[1024], *b;
char *s;
int slen = 0;
int blen = 0, slen = 0;
cc = (Eina_Unicode *)c;
while ((cc < ce) && (*cc != 0x0))
{
blen++;
cc++;
}
buf = bufsmall;
if (blen > (int)(sizeof(bufsmall) - 10)) buf = malloc(blen + 10);
cc = (Eina_Unicode *)c;
b = buf;
while ((cc < ce) && (*cc != 0x0))
@ -976,8 +981,12 @@ _handle_esc_terminology(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
cc++;
}
*b = 0;
if (*cc == 0x0) cc++;
else return 0;
if ((*cc == 0x0) && (cc < ce)) cc++;
else
{
if (buf != bufsmall) free(buf);
return 0;
}
// commands are stored in the buffer, 0 bytes not allowd (end marker)
s = eina_unicode_unicode_to_utf8(buf, &slen);
ty->cur_cmd = s;
@ -987,6 +996,7 @@ _handle_esc_terminology(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
}
ty->cur_cmd = NULL;
if (s) free(s);
if (buf != bufsmall) free(buf);
return cc - c;
}
@ -1112,7 +1122,7 @@ _handle_esc(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
if (len < 2) return 0;
if (c[1] == '8')
{
int i, size;
int size;
Termcell *cells;
DBG("reset to init mode and clear then fill with E");
@ -1126,7 +1136,10 @@ _handle_esc(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
size = ty->w * ty->h;
if (cells)
{
for (i = 0; i < size; i++) cells[i].codepoint = 'E';
Termatt att;
memset((&att), 0, sizeof(att));
termpty_cell_codepoint_att_fill(ty, 'E', att, cells, size);
}
}
return 2;
@ -1293,6 +1306,7 @@ _termpty_handle_seq(Termpty *ty, Eina_Unicode *c, Eina_Unicode *ce)
default:
ERR("unhandled char 0x%02x", c[0]);
ty->state.had_cr = 0;
sleep(1);
return 1;
}
}

View File

@ -20,17 +20,12 @@
static void
_text_clear(Termpty *ty, Termcell *cells, int count, int val, Eina_Bool inherit_att)
{
int i;
Termcell src;
memset(&src, 0, sizeof (src));
memset(&src, 0, sizeof(src));
src.codepoint = val;
if (inherit_att) src.att = ty->state.att;
for (i = 0; i < count; i++)
memcpy(cells + i, &src, sizeof (src));
termpty_cell_fill(ty, &src, cells, count);
}
static void
@ -43,7 +38,12 @@ _text_save_top(Termpty *ty)
ts->w = ty->w;
_termpty_text_copy(ty, &(TERMPTY_SCREEN(ty, 0, 0)), ts->cell, ty->w);
if (!ty->back) ty->back = calloc(1, sizeof(Termsave *) * ty->backmax);
if (ty->back[ty->backpos]) free(ty->back[ty->backpos]);
if (ty->back[ty->backpos])
{
termpty_cell_fill(ty, NULL, ty->back[ty->backpos]->cell,
ty->back[ty->backpos]->w);
free(ty->back[ty->backpos]);
}
ty->back[ty->backpos] = ts;
ty->backpos++;
if (ty->backpos >= ty->backmax) ty->backpos = 0;
@ -52,9 +52,9 @@ _text_save_top(Termpty *ty)
}
void
_termpty_text_copy(Termpty *ty __UNUSED__, Termcell *cells, Termcell *dest, int count)
_termpty_text_copy(Termpty *ty, Termcell *cells, Termcell *dest, int count)
{
memcpy(dest, cells, sizeof(*(cells)) * count);
termpty_cell_copy(ty, cells, dest, count);
}
void
@ -190,20 +190,18 @@ _termpty_text_append(Termpty *ty, const Eina_Unicode *codepoints, int len)
if (ty->state.insert)
{
for (j = ty->w - 1; j > ty->state.cx; j--)
cells[j] = cells[j - 1];
termpty_cell_copy(ty, &(cells[j - 1]), &(cells[j]), 1);
}
g = _termpty_charset_trans(codepoints[i], ty->state.charsetch);
cells[ty->state.cx].codepoint = g;
cells[ty->state.cx].att = ty->state.att;
termpty_cell_codepoint_att_fill(ty, g, ty->state.att,
&(cells[ty->state.cx]), 1);
#if defined(SUPPORT_DBLWIDTH)
cells[ty->state.cx].att.dblwidth = _termpty_is_dblwidth_get(ty, g);
if ((cells[ty->state.cx].att.dblwidth) && (ty->state.cx < (ty->w - 1)))
{
cells[ty->state.cx + 1].codepoint = 0;
cells[ty->state.cx + 1].att = cells[ty->state.cx].att;
}
termpty_cell_codepoint_att_fill(ty, 0, cells[ty->state.cx].att,
&(cells[ty->state.cx + 1]), 1);
#endif
if (ty->state.wrap)
{
@ -330,7 +328,7 @@ void
_termpty_clear_all(Termpty *ty)
{
if (!ty->screen) return;
memset(ty->screen, 0, sizeof(*(ty->screen)) * ty->w * ty->h);
termpty_cell_fill(ty, NULL, ty->screen, ty->w * ty->h);
}
void

View File

@ -24,6 +24,8 @@ Evas_Object *o = NULL;
struct termios told, tnew;
int tw = 0, th = 0, cw = 0, ch = 0;
#include "extns.h"
static int
echo_off(void)
{
@ -55,6 +57,21 @@ scaleterm(int w, int h, int *iw, int *ih)
}
}
static const char *
is_fmt(const char *f, const char **extn)
{
int i, len, l;
len = strlen(f);
for (i = 0; extn[i]; i++)
{
l = strlen(extn[i]);
if (len < l) continue;
if (!strcasecmp(extn[i], f + len - l)) return extn[i];
}
return NULL;
}
static void
prnt(const char *path, int w, int h, int mode)
{
@ -84,7 +101,6 @@ prnt(const char *path, int w, int h, int mode)
line[i++] = 'e';
line[i++] = 0;
line[i++] = '\n';
line[i++] = 0;
for (y = 0; y < h; y++)
{
if (write(0, line, i) < 0) perror("write");
@ -164,15 +180,24 @@ main(int argc, char **argv)
rp = ecore_file_realpath(path);
if (rp)
{
o = evas_object_image_add(evas);
evas_object_image_file_set(o, rp, NULL);
evas_object_image_size_get(o, &w, &h);
if ((w >= 0) && (h > 0))
if ((is_fmt(rp, extn_img)) ||
(is_fmt(rp, extn_scale)) ||
(is_fmt(rp, extn_mov)))
{
scaleterm(w, h, &iw, &ih);
prnt(rp, iw, ih, mode);
o = evas_object_image_add(evas);
evas_object_image_file_set(o, rp, NULL);
evas_object_image_size_get(o, &w, &h);
if ((w >= 0) && (h > 0))
{
scaleterm(w, h, &iw, &ih);
prnt(rp, iw, ih, mode);
goto done;
}
evas_object_del(o);
o = NULL;
}
else
if (is_fmt(rp, extn_edj))
{
Eina_Bool ok = EINA_TRUE;
@ -199,36 +224,44 @@ main(int argc, char **argv)
}
scaleterm(mw, mh, &iw, &ih);
prnt(rp, iw, ih, mode);
goto done;
}
else
evas_object_del(o);
o = NULL;
}
if ((is_fmt(rp, extn_aud)) ||
(is_fmt(rp, extn_mov)))
{
Eina_Bool ok = EINA_TRUE;
o = emotion_object_add(evas);
ok = emotion_object_init(o, NULL);
if (ok)
{
ok = EINA_TRUE;
evas_object_del(o);
o = emotion_object_add(evas);
ok = emotion_object_init(o, NULL);
if (ok)
if (emotion_object_file_set(o, rp))
{
if (emotion_object_file_set(o, rp))
emotion_object_audio_mute_set(o, EINA_TRUE);
if (emotion_object_video_handled_get(o))
{
emotion_object_audio_mute_set(o, EINA_TRUE);
if (emotion_object_video_handled_get(o))
emotion_object_size_get(o, &w, &h);
if ((w >= 0) && (h > 0))
{
emotion_object_size_get(o, &w, &h);
if ((w >= 0) && (h > 0))
{
scaleterm(w, h, &iw, &ih);
prnt(rp, iw, ih, mode);
}
scaleterm(w, h, &iw, &ih);
prnt(rp, iw, ih, mode);
}
else
prnt(rp, tw, 3, NOIMG);
}
else
prnt(rp, tw, 3, NOIMG);
goto done;
}
}
evas_object_del(o);
o = NULL;
}
evas_object_del(o);
done:
if (o) evas_object_del(o);
o = NULL;
free(rp);
}
evas_norender(evas);