diff --git a/configure.ac b/configure.ac index df8736ff..188ed0ee 100644 --- a/configure.ac +++ b/configure.ac @@ -32,7 +32,8 @@ requirements="\ ecore-imf >= 1.7.0 \ ecore-imf-evas >= 1.7.0 \ ecore-ipc >= 1.7.0 \ - efreet >= 1.7.0 + efreet >= 1.7.0 \ + ethumb_client >= 1.7.0 \ " PKG_CHECK_MODULES([TERMINOLOGY], [${requirements}]) diff --git a/src/bin/media.c b/src/bin/media.c index 6d8740ca..0a22cd48 100644 --- a/src/bin/media.c +++ b/src/bin/media.c @@ -1,6 +1,7 @@ #include "private.h" #include +#include #include #include #include @@ -19,6 +20,7 @@ struct _Media Ecore_Job *restart_job; Ecore_Con_Url *url; Ecore_Event_Handler *url_prog_hand, *url_compl_hand; + Ethumb_Client_Async *et_req; const char *src; const char *ext; const char *realf; @@ -55,6 +57,140 @@ _is_fmt(const char *f, const char **extn) return NULL; } +//////////////////////// thumb + +static Ethumb_Client *et_client = NULL; +static Eina_Bool et_connected = EINA_FALSE; + +static void _et_init(void); + +static void +_et_disconnect(void *data __UNUSED__, Ethumb_Client *c) +{ + if (c != et_client) return; + ethumb_client_disconnect(et_client); + et_connected = EINA_FALSE; + et_client = NULL; + _et_init(); +} + +static void +_et_connect(void *data __UNUSED__, Ethumb_Client *c, Eina_Bool ok) +{ + if (ok) + { + et_connected = EINA_TRUE; + ethumb_client_on_server_die_callback_set(c, _et_disconnect, + NULL, NULL); + } + else + et_client = NULL; +} + +static void +_et_init(void) +{ + if (et_client) return; + + ethumb_client_init(); + et_client = ethumb_client_connect(_et_connect, NULL, NULL); +} + +static void +_type_thumb_calc(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +{ + Media *sd = evas_object_smart_data_get(obj); + if (!sd) return; + + if ((w <= 0) || (h <= 0) || (sd->iw <= 0) || (sd->ih <= 0)) + { + w = 1; + h = 1; + } + else + { + int iw = 1, ih = 1; + + iw = w; + ih = (sd->ih * w) / sd->iw; + if (ih > h) + { + ih = h; + iw = (sd->iw * h) / sd->ih; + if (iw > w) iw = w; + } + if ((iw > sd->iw) || (ih > sd->ih)) + { + iw = sd->iw; + ih = sd->ih; + } + x += ((w - iw) / 2); + y += ((h - ih) / 2); + w = iw; + h = ih; + } + evas_object_move(sd->o_img, x, y); + evas_object_resize(sd->o_img, w, h); +} + +static void +_cb_thumb_preloaded(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__) +{ + Media *sd = evas_object_smart_data_get(data); + Evas_Coord ox, oy, ow, oh; + if (!sd) return; + + evas_object_geometry_get(data, &ox, &oy, &ow, &oh); + _type_thumb_calc(data, ox, oy, ow, oh); + evas_object_show(sd->o_img); + evas_object_show(sd->clip); +} + +static void +_et_done(Ethumb_Client *c, const char *file, const char *key, void *data) +{ + Evas_Object *obj = data; + Media *sd = evas_object_smart_data_get(obj); + if (!sd) return; + + if (c != et_client) return; + sd->et_req = NULL; + evas_object_event_callback_add(sd->o_img, EVAS_CALLBACK_IMAGE_PRELOADED, + _cb_thumb_preloaded, obj); + evas_object_image_file_set(sd->o_img, file, key); + evas_object_image_size_get(sd->o_img, &(sd->iw), &(sd->ih)); + evas_object_image_preload(sd->o_img, EINA_FALSE); +} + +static void +_et_error(Ethumb_Client *c, void *data) +{ + Evas_Object *obj = data; + Media *sd = evas_object_smart_data_get(obj); + if (!sd) return; + + if (c != et_client) return; + sd->et_req = NULL; +} + +static void +_type_thumb_init(Evas_Object *obj) +{ + Evas_Object *o; + Media *sd = evas_object_smart_data_get(obj); + if (!sd) return; + sd->type = TYPE_THUMB; + _et_init(); + o = sd->o_img = evas_object_image_filled_add(evas_object_evas_get(obj)); + evas_object_smart_member_add(o, obj); + evas_object_clip_set(o, sd->clip); + sd->iw = 64; + sd->ih = 64; + ethumb_client_file_set(et_client, sd->realf, NULL); + sd->et_req = ethumb_client_thumb_async_get(et_client, _et_done, + _et_error, obj); +} + //////////////////////// img static void _cb_img_preloaded(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__) @@ -639,6 +775,9 @@ _smart_del(Evas_Object *obj) if (sd->anim) ecore_timer_del(sd->anim); if (sd->smooth_timer) sd->smooth_timer = ecore_timer_del(sd->smooth_timer); if (sd->restart_job) ecore_job_del(sd->restart_job); + if ((et_client) && (sd->et_req)) + ethumb_client_thumb_async_cancel(et_client, sd->et_req); + sd->et_req = NULL; _parent_sc.del(obj); } @@ -732,6 +871,7 @@ _smart_calculate(Evas_Object *obj) else if (sd->type == TYPE_SCALE) _type_scale_calc(obj, ox, oy, ow, oh); else if (sd->type == TYPE_EDJE) _type_edje_calc(obj, ox, oy, ow, oh); else if (sd->type == TYPE_MOV) _type_mov_calc(obj, ox, oy, ow, oh); + else if (sd->type == TYPE_THUMB) _type_thumb_calc(obj, ox, oy, ow, oh); evas_object_move(sd->clip, ox, oy); evas_object_resize(sd->clip, ow, oh); if (sd->o_busy) @@ -930,23 +1070,31 @@ media_add(Evas_Object *parent, const char *src, const Config *config, int mode, #endif if (!sd->url) sd->realf = eina_stringshare_add(sd->src); - - switch (t) + + if ((mode & MEDIA_SIZE_MASK) == MEDIA_THUMB) { - case TYPE_IMG: - if (!sd->url) _type_img_init(obj); - break; - case TYPE_SCALE: - if (!sd->url) _type_scale_init(obj); - break; - case TYPE_EDJE: - if (!sd->url) _type_edje_init(obj); - break; - case TYPE_MOV: - if (!sd->url) _type_mov_init(obj); - break; - default: - break; + // XXX: handle sd->url being true? + _type_thumb_init(obj); + } + else + { + switch (t) + { + case TYPE_IMG: + if (!sd->url) _type_img_init(obj); + break; + case TYPE_SCALE: + if (!sd->url) _type_scale_init(obj); + break; + case TYPE_EDJE: + if (!sd->url) _type_edje_init(obj); + break; + case TYPE_MOV: + if (!sd->url) _type_mov_init(obj); + break; + default: + break; + } } if (type) *type = t; return obj; diff --git a/src/bin/media.h b/src/bin/media.h index 7a238a24..ba67a0bc 100644 --- a/src/bin/media.h +++ b/src/bin/media.h @@ -7,6 +7,7 @@ #define MEDIA_BG 0x0000 #define MEDIA_POP 0x0001 #define MEDIA_STRETCH 0x0002 +#define MEDIA_THUMB 0x0003 // bitmask for options - on or off #define MEDIA_RECOVER 0x0010 #define MEDIA_SAVE 0x0020 @@ -16,6 +17,7 @@ #define TYPE_SCALE 1 #define TYPE_EDJE 2 #define TYPE_MOV 3 +#define TYPE_THUMB 4 #include "config.h" diff --git a/src/bin/termio.c b/src/bin/termio.c index e7de6a5b..61a8ee7d 100644 --- a/src/bin/termio.c +++ b/src/bin/termio.c @@ -481,6 +481,9 @@ _smart_apply(Evas_Object *obj) 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 @@ -2619,7 +2622,8 @@ _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] == 'f') || + (sd->pty->cur_cmd[1] == 't')) { const char *p, *p0, *path; int ww = 0, hh = 0, repch; @@ -2661,6 +2665,8 @@ _smart_pty_command(void *data) blk->scale_center = EINA_TRUE; else if (sd->pty->cur_cmd[1] == 'f') blk->scale_fill = EINA_TRUE; + else if (sd->pty->cur_cmd[1] == 't') + blk->thumb = EINA_TRUE; termpty_block_insert(sd->pty, repch, blk); } } diff --git a/src/bin/termpty.h b/src/bin/termpty.h index 974d74fb..6c73fa1b 100644 --- a/src/bin/termpty.h +++ b/src/bin/termpty.h @@ -149,6 +149,7 @@ struct _Termblock Eina_Bool scale_stretch : 1; Eina_Bool scale_center : 1; Eina_Bool scale_fill : 1; + Eina_Bool thumb : 1; Eina_Bool active : 1; Eina_Bool was_active : 1; diff --git a/src/bin/tyls.c b/src/bin/tyls.c index 90b46cf1..ec024628 100644 --- a/src/bin/tyls.c +++ b/src/bin/tyls.c @@ -11,6 +11,9 @@ #include #include +// this code sucks. just letting you know... in advance... in case you +// might be tempted to think otherwise... :) + enum { SMALL, MEDIUM, @@ -72,34 +75,22 @@ is_fmt(const char *f, const char **extn) } static void -prnt(const char *path, int w, int h, int mode) +size_print(char *buf, int bufsz, unsigned long long size) { - int x, y, i; - char *line, buf[4096]; - - if ((w >= 512) || (h >= 512)) return; - line = malloc(w + 100); - if (!line) return; - snprintf(buf, sizeof(buf), "%c}ic#%i;%i;%s", 0x1b, w, h, path); - if (write(0, buf, strlen(buf) + 1) < 0) perror("write"); - i = 0; - line[i++] = 0x1b; - line[i++] = '}'; - line[i++] = 'i'; - line[i++] = 'b'; - line[i++] = 0; - for (x = 0; x < w; x++) line[i++] = '#'; - line[i++] = 0x1b; - line[i++] = '}'; - line[i++] = 'i'; - line[i++] = 'e'; - line[i++] = 0; - line[i++] = '\n'; - for (y = 0; y < h; y++) - { - if (write(0, line, i) < 0) perror("write"); - } - free(line); + if (size < 1024LL) + snprintf(buf, bufsz, " %4lld", size); + else if (size < (1024LL * 1024LL)) + snprintf(buf, bufsz, "%4lldK", size / (1024LL)); + else if (size < (1024LL * 1024LL * 1024LL)) + snprintf(buf, bufsz, "%4lldM", size / (1024LL * 1024LL)); + else if (size < (1024LL * 1024LL * 1024LL * 1024LL)) + snprintf(buf, bufsz, "%4lldG", size / (1024LL * 1024 * 1024LL)); + else if (size < (1024LL * 1024LL * 1024LL * 1024LL * 1024LL)) + snprintf(buf, bufsz, "%4lldT", size / (1024LL * 1024LL * 1024LL * 1024LL)); + else if (size < (1024LL * 1024LL * 1024LL * 1024LL * 1024LL * 1024LL)) + snprintf(buf, bufsz, "%4lldP", size / (1024LL * 1024LL * 1024LL * 1024LL * 1024LL)); + else + snprintf(buf, bufsz, "%4lldE", size / (1024LL * 1024LL * 1024LL * 1024LL * 1024LL * 1024LL)); } static void @@ -107,11 +98,11 @@ list_dir(const char *dir, int mode) { Eina_List *files, *l; char *s, **names; - int maxlen = 0, cols, c, i, j, num, cw, stuff; + int maxlen = 0, cols, c, rows, i, j, k, num, cw, stuff; files = ecore_file_ls(dir); if (!files) return; - names = calloc(eina_list_count(files), sizeof(char *)); + names = calloc(eina_list_count(files) * 2, sizeof(char *)); if (!names) return; i = 0; EINA_LIST_FOREACH(files, l, s) @@ -126,8 +117,10 @@ list_dir(const char *dir, int mode) num = i; stuff = 0; if (mode == SMALL) stuff += 2; - stuff += 1; // spacer at start + else if (mode == MEDIUM) stuff += 4; stuff += 5; // xxxx[ /K/M/G/T/P...] + stuff += 1; // spacer at start + // name stuff += 1; // type [@/*/|/=...] stuff += 1; // spacer maxlen += stuff; @@ -135,56 +128,113 @@ list_dir(const char *dir, int mode) { cols = tw / maxlen; if (cols < 1) cols = 1; - for (i = 0; i < ((num + (cols - 1)) / cols); i++) + if (cols == 1) { - for (c = 0; c < cols; c++) + maxlen--; + stuff--; + } + rows = ((num + (cols - 1)) / cols); + for (i = 0; i < rows; i++) + { + if (mode == SMALL) { - char buf[4096], sz[6]; - long long size; - - s = names[((c * (num + (cols - 1))) / cols) + i]; - if (!s) continue; - snprintf(buf, sizeof(buf), "%s/%s", dir, s); - int len = eina_unicode_utf8_get_len(s); - cw = tw / cols; - size = ecore_file_size(buf); - if (size < 1024) - snprintf(sz, sizeof(sz), " %4lld", size); - else if (size < (1024 * 1024)) - snprintf(sz, sizeof(sz), "%4lldK", size / (1024)); - else if (size < (1024 * 1024 * 1024)) - snprintf(sz, sizeof(sz), "%4lldM", size / (1024 * 1024)); - else if (size < (1024 * 1024 * 1024 * 1024LL)) - snprintf(sz, sizeof(sz), "%4lldG", size / (1024 * 1024 * 1024LL)); - else if (size < (1024 * 1024 * 1024 * 1024LL * 1024LL)) - snprintf(sz, sizeof(sz), "%4lldT", size / (1024 * 1024 * 1024 * 1024LL)); - else if (size < (1024 * 1024 * 1024 * 1024LL * 1024LL * 1024LL)) - snprintf(sz, sizeof(sz), "%4lldP", size / (1024 * 1024 * 1024 * 1024LL * 1024LL)); - len += stuff; - printf("%c}ic#%i;%i;%s%c", 0x1b, 2, 1, buf, 0); - printf("%c}ib%c", 0x1b, 0); - printf("##"); - printf("%c}ie%c", 0x1b, 0); - printf(" %s %s", sz, s); - if (ecore_file_is_dir(buf)) printf("/"); - else + for (c = 0; c < cols; c++) { - char *ts; + char buf[4096], sz[6]; + long long size; - ts = ecore_file_readlink(buf); - if (ts) - { - printf("@"); - free(ts); - } + s = names[(c * rows) + i]; + if (!s) continue; + snprintf(buf, sizeof(buf), "%s/%s", dir, s); + int len = eina_unicode_utf8_get_len(s); + cw = tw / cols; + size = ecore_file_size(buf); + size_print(sz, sizeof(sz), size); + len += stuff; + printf("%c}it#%i;%i;%s%c", 0x1b, 2, 1, buf, 0); + printf("%c}ib%c", 0x1b, 0); + printf("##"); + printf("%c}ie%c", 0x1b, 0); + printf("%s %s", sz, s); + if (ecore_file_is_dir(buf)) printf("/"); else { - printf(" "); + char *ts; + + ts = ecore_file_readlink(buf); + if (ts) + { + printf("@"); + free(ts); + } + else + { + printf(" "); + } } + for (j = 0; j < (cw - len); j++) printf(" "); } - for (j = 0; j < (cw - len); j++) printf(" "); + printf("\n"); + } + else if (mode == MEDIUM) + { + for (c = 0; c < cols; c++) + { + char buf[4096]; + + s = names[(c * rows) + i]; + if (!s) continue; + int len = eina_unicode_utf8_get_len(s); + snprintf(buf, sizeof(buf), "%s/%s", dir, s); + cw = tw / cols; + len += 4; + if (cols > 1) len += 1; + printf("%c}it%c%i;%i;%s%c", 0x1b, 33 + c, 4, 2, buf, 0); + printf("%c}ib%c", 0x1b, 0); + printf("%c%c%c%c", 33 + c, 33 + c, 33 + c, 33 + c); + printf("%c}ie%c", 0x1b, 0); + printf("%s", s); + for (j = 0; j < (cw - len); j++) printf(" "); + } + printf("\n"); + for (c = 0; c < cols; c++) + { + char buf[4096], sz[6]; + long long size; + int len; + + s = names[(c * rows) + i]; + if (!s) continue; + snprintf(buf, sizeof(buf), "%s/%s", dir, s); + cw = tw / cols; + size = ecore_file_size(buf); + size_print(sz, sizeof(sz), size); + len = eina_unicode_utf8_get_len(sz) + 2; + if (cols > 1) len += 1; + printf("%c}ib%c", 0x1b, 0); + printf("%c%c%c%c", 33 + c, 33 + c, 33 + c, 33 + c); + printf("%c}ie%c", 0x1b, 0); + printf("%s ", sz); + if (ecore_file_is_dir(buf)) printf("/"); + else + { + char *ts; + + ts = ecore_file_readlink(buf); + if (ts) + { + printf("@"); + free(ts); + } + else + { + printf(" "); + } + } + for (j = 0; j < (cw - len); j++) printf(" "); + } + printf("\n"); } - printf("\n"); } } free(names);