inline thumb mode uses ethumb now... :)

SVN revision: 83566
This commit is contained in:
Carsten Haitzler 2013-02-01 14:10:51 +00:00
parent 800383bb0b
commit 156b168979
6 changed files with 297 additions and 89 deletions

View File

@ -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}])

View File

@ -1,6 +1,7 @@
#include "private.h"
#include <Elementary.h>
#include <Ethumb_Client.h>
#include <Emotion.h>
#include <stdlib.h>
#include <unistd.h>
@ -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;

View File

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

View File

@ -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);
}
}

View File

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

View File

@ -11,6 +11,9 @@
#include <unistd.h>
#include <string.h>
// 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);