miniview: fix with splits

This commit is contained in:
Boris Faure 2014-05-04 20:18:23 +02:00
parent 2e2862dd22
commit 42cbf2f0ed
4 changed files with 91 additions and 39 deletions

View File

@ -392,13 +392,11 @@ collections {
program {
signal: "miniview,off"; source: "terminology";
action: STATE_SET "default" 0.0;
transition: DECELERATE 0.5;
target: "terminology.miniview";
}
program {
signal: "miniview,on"; source: "terminology";
action: STATE_SET "on" 0.0;
transition: DECELERATE 0.5;
target: "terminology.miniview";
}

View File

@ -261,7 +261,7 @@ _term_resize_track_stop(Split *sp)
static void
_split_split(Split *sp, Eina_Bool horizontal)
{
Split *sp2;
Split *sp2, *sp1;
Evas_Object *o;
Config *config;
char buf[PATH_MAX], *wdir = NULL;
@ -276,18 +276,18 @@ _split_split(Split *sp, Eina_Bool horizontal)
elm_panes_horizontal_set(o, sp->horizontal);
_term_resize_track_stop(sp);
sp2 = sp->s1 = calloc(1, sizeof(Split));
sp2->parent = sp;
sp2->wn = sp->wn;
sp2->term = sp->term;
sp2->terms = sp->terms;
_term_resize_track_start(sp2);
sp1 = sp->s1 = calloc(1, sizeof(Split));
sp1->parent = sp;
sp1->wn = sp->wn;
sp1->term = sp->term;
sp1->terms = sp->terms;
_term_resize_track_start(sp1);
sp->terms = NULL;
sp->terms = NULL;
if (!sp->parent) edje_object_part_unswallow(sp->wn->base, sp->term->bg);
main_term_bg_redo(sp2->term);
_split_tabcount_update(sp2, sp2->term);
main_term_bg_redo(sp1->term);
_split_tabcount_update(sp1, sp1->term);
sp2 = sp->s2 = calloc(1, sizeof(Split));
sp2->parent = sp;
@ -303,8 +303,8 @@ _split_split(Split *sp, Eina_Bool horizontal)
_term_media_update(sp2->term, config);
_split_tabcount_update(sp2, sp2->term);
evas_object_data_set(sp2->term->term, "sizedone", sp2->term->term);
elm_object_part_content_set(sp->panes, PANES_TOP, sp->s1->term->bg);
elm_object_part_content_set(sp->panes, PANES_BOTTOM, sp->s2->term->bg);
elm_object_part_content_set(sp->panes, PANES_TOP, sp1->term->bg);
elm_object_part_content_set(sp->panes, PANES_BOTTOM, sp2->term->bg);
if (!sp->parent)
edje_object_part_swallow(sp->wn->base, "terminology.content", sp->panes);
@ -1102,15 +1102,17 @@ _cb_miniview_toggle(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSE
EINA_SAFETY_ON_NULL_RETURN(term);
EINA_SAFETY_ON_NULL_RETURN(term->miniview);
ERR("MINIVIEW TOGGLE");
ERR("MINIVIEW TOGGLE term:%p", term);
if (term->miniview_shown)
{
ERR("OFF bg:%p", term->bg);
edje_object_signal_emit(term->bg, "miniview,off", "terminology");
term->miniview_shown = EINA_FALSE;
}
else
{
ERR("ON bg:%p", term->bg);
edje_object_signal_emit(term->bg, "miniview,on", "terminology");
term->miniview_shown = EINA_TRUE;
}
@ -2075,6 +2077,7 @@ main_term_bg_config(Term *term)
_cb_tabcount_next, term);
edje_object_part_swallow(term->base, "terminology.content", term->term);
edje_object_part_swallow(term->bg, "terminology.content", term->base);
edje_object_part_swallow(term->bg, "terminology.miniview", term->miniview);
if (term->popmedia)
{
edje_object_part_swallow(term->bg, "terminology.popmedia", term->popmedia);
@ -2120,6 +2123,8 @@ main_term_bg_config(Term *term)
elm_object_focus_set(term->wn->cmdbox, EINA_FALSE);
elm_object_focus_set(term->term, EINA_TRUE);
}
if (term->miniview_shown)
edje_object_signal_emit(term->bg, "miniview,on", "terminology");
}
static void
@ -2132,6 +2137,12 @@ main_term_bg_redo(Term *term)
evas_object_del(term->tabcount_spacer);
term->tabcount_spacer = NULL;
}
if (term->miniview)
{
edje_object_part_unswallow(term->bg, term->miniview);
evas_object_del(term->miniview);
term->miniview = NULL;
}
evas_object_del(term->base);
evas_object_del(term->bg);
@ -2148,11 +2159,19 @@ main_term_bg_redo(Term *term)
evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
theme_apply(o, term->config, "terminology/background");
term->miniview = o = miniview_add(term->wn->win, term->term);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
o = term->bg;
theme_auto_reload_enable(o);
evas_object_data_set(o, "theme_reload_func", main_term_bg_config);
evas_object_data_set(o, "theme_reload_func_data", term);
evas_object_show(o);
main_term_bg_config(term);
if (term->miniview_shown)
edje_object_signal_emit(term->bg, "miniview,on", "terminology");
}
static Term *
@ -2307,7 +2326,9 @@ Evas_Object *main_term_evas_object_get(Term *term)
Evas_Object *
term_miniview_get(Term *term)
{
return term->miniview;
if (term)
return term->miniview;
return NULL;
}

View File

@ -23,8 +23,6 @@ int _miniview_log_dom = -1;
#define INF(...) EINA_LOG_DOM_INFO(_miniview_log_dom, __VA_ARGS__)
#define DBG(...) EINA_LOG_DOM_DBG(_miniview_log_dom, __VA_ARGS__)
/*TODO: work with splits */
void
miniview_init(void)
{
@ -50,7 +48,6 @@ struct _Miniview
Evas_Object *self;
Evas_Object *img;
Evas_Object *termio;
Termpty *pty;
int img_hist; /* history rendered is between img_hist (<0) and
img_hist + img_h */
@ -60,8 +57,8 @@ struct _Miniview
Ecore_Timer *deferred_renderer;
int is_shown : 1;
int to_render : 1;
unsigned int is_shown : 1;
unsigned int to_render : 1;
};
static Evas_Smart *_smart = NULL;
@ -171,8 +168,13 @@ _smart_add(Evas_Object *obj)
o = evas_object_image_add(canvas);
evas_object_image_alpha_set(o, EINA_TRUE);
evas_object_smart_member_add(o, obj);
//evas_object_smart_member_add(o, obj);
mv->img = o;
mv->is_shown = 0;
mv->to_render = 0;
mv->img_h = 0;
mv->rows = 0;
mv->cols = 0;
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_WHEEL,
_smart_cb_mouse_wheel, obj);
@ -185,14 +187,14 @@ _smart_del(Evas_Object *obj)
{
Miniview *mv = evas_object_smart_data_get(obj);
DBG("%p", obj);
if (!mv) return;
DBG("del obj:%p mv:%p", obj, mv);
ecore_timer_del(mv->deferred_renderer);
//evas_object_smart_member_del(mv->img);
evas_object_del(mv->img);
free(mv);
DBG("%p", obj);
}
static void
@ -201,9 +203,9 @@ _smart_move(Evas_Object *obj, Evas_Coord x EINA_UNUSED, Evas_Coord y EINA_UNUSED
Miniview *mv = evas_object_smart_data_get(obj);
if (!mv) return;
/* TODO */
DBG("%p x:%d y:%d", obj, x, y);
evas_object_move(mv->img, x, y);
evas_object_move(mv->img, x + mv->img_h - mv->cols, y);
mv->to_render = 1;
}
static void
@ -211,11 +213,16 @@ _smart_show(Evas_Object *obj)
{
Miniview *mv = evas_object_smart_data_get(obj);
DBG("mv:%p is_shown:%d", mv, mv != NULL ? mv->is_shown : -1);
if (!mv) return;
Evas_Coord ox, oy, ow, oh;
evas_object_geometry_get(mv->img, &ox, &oy, &ow, &oh);
DBG("ox:%d oy:%d ow:%d oh:%d", ox, oy, ow, oh);
if (!mv->is_shown)
{
Evas_Coord ox, oy, ow, oh, font_w, font_h;
Evas_Coord /*ox, oy, ow, oh,*/ font_w, font_h;
mv->is_shown = 1;
mv->img_hist = 0;
@ -236,6 +243,8 @@ _smart_show(Evas_Object *obj)
evas_object_image_size_set(mv->img, mv->cols, mv->img_h);
evas_object_image_fill_set(mv->img, 0, 0, mv->cols, mv->img_h);
DBG("ox:%d ow:%d cols:%d oy:%d", ox, ow, mv->cols, oy);
evas_object_move(mv->img, ox + ow - mv->cols, oy);
mv->to_render = 1;
@ -276,16 +285,26 @@ _deferred_renderer(void *data)
int history_len, wret;
unsigned int *pixels, y;
Termcell *cells;
Termpty *ty;
if (!mv || !mv->is_shown || !mv->to_render) return EINA_TRUE;
if (!mv || !mv->is_shown || !mv->to_render || mv->img_h == 0)
return EINA_TRUE;
ty = termio_pty_get(mv->termio);
evas_object_geometry_get(mv->termio, &ox, &oy, &ow, &oh);
if (ow == 0 || oh == 0) return EINA_TRUE;
history_len = mv->pty->backscroll_num;
history_len = ty->backscroll_num;
evas_object_image_size_get(mv->img, &ow, &oh);
if (ow != (Evas_Coord)mv->cols || oh != (Evas_Coord)mv->img_h)
return EINA_TRUE;
DBG("ow:%d oh:%d cols:%d img_h:%d", ow, oh, mv->cols, mv->img_h);
pixels = evas_object_image_data_get(mv->img, EINA_TRUE);
memset(pixels, 0, sizeof(*pixels) * mv->cols * mv->img_h);
memset(pixels, 0, sizeof(*pixels) * ow * oh);
mv->img_h = oh;
DBG("history_len:%d hist:%d img_h:%d rows:%d cols:%d",
history_len, mv->img_hist, mv->img_h, mv->rows, mv->cols);
@ -297,7 +316,7 @@ _deferred_renderer(void *data)
for (y = 0; y < mv->img_h; y++)
{
cells = termpty_cellrow_get(mv->pty, mv->img_hist + y, &wret);
cells = termpty_cellrow_get(ty, mv->img_hist + y, &wret);
if (cells == NULL)
{
DBG("y:%d get:%d", y, mv->img_hist + y);
@ -309,7 +328,8 @@ _deferred_renderer(void *data)
DBG("history_len:%d hist:%d img_h:%d rows:%d cols:%d",
history_len, mv->img_hist, mv->img_h, mv->rows, mv->cols);
evas_object_image_data_set(mv->img, pixels);
evas_object_image_data_update_add(mv->img, 0, 0, mv->cols, mv->img_h);
evas_object_image_pixels_dirty_set(mv->img, EINA_FALSE);
evas_object_image_data_update_add(mv->img, 0, 0, ow, oh);
mv->to_render = 0;
@ -320,11 +340,28 @@ _deferred_renderer(void *data)
static void
_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
{
Evas_Coord font_w, font_h, ox, oy;
Miniview *mv = evas_object_smart_data_get(obj);
if (!mv) return;
DBG("smart resize %p w:%d h:%d", obj, w, h);
evas_object_resize(mv->img, w, h);
mv->img_h = h;
evas_object_geometry_get(mv->termio, &ox, &oy, NULL, NULL);
evas_object_size_hint_min_get(mv->termio, &font_w, &font_h);
if (font_w <= 0 || font_h <= 0) return;
mv->rows = h / font_h;
mv->cols = w / font_w;
if (mv->rows == 0 || mv->cols == 0) return;
evas_object_resize(mv->img, mv->cols, mv->img_h);
evas_object_image_size_set(mv->img, mv->cols, mv->img_h);
evas_object_image_fill_set(mv->img, 0, 0, mv->cols, mv->img_h);
evas_object_move(mv->img, ox + w - mv->cols, oy);
mv->to_render = 1;
}
@ -357,16 +394,15 @@ miniview_add(Evas_Object *parent, Evas_Object *termio)
e = evas_object_evas_get(parent);
if (!e) return NULL;
DBG("ADD parent:%p", parent);
if (!_smart) _smart_init();
obj = evas_object_smart_add(e, _smart);
mv = evas_object_smart_data_get(obj);
if (!mv) return obj;
DBG("ADD parent:%p mv:%p", parent, mv);
mv->termio = termio;
mv->pty = termio_pty_get(termio);
mv->deferred_renderer = ecore_timer_add(0.1, _deferred_renderer, mv);
return obj;

View File

@ -1625,7 +1625,6 @@ _smart_apply(Evas_Object *obj)
evas_object_hide(sd->sel.theme);
if (sd->mouseover_delay) ecore_timer_del(sd->mouseover_delay);
sd->mouseover_delay = ecore_timer_add(0.05, _smart_mouseover_delay, obj);
//printf("How are you today?\n?");
miniview_redraw(term_miniview_get(sd->term));
}
@ -4819,10 +4818,8 @@ termio_mouseover_suspend_pushpop(Evas_Object *obj, int dir)
{
if (sd->anim) ecore_animator_del(sd->anim);
sd->anim = NULL;
_smart_apply(obj);
}
else
_smart_update_queue(obj, sd);
_smart_update_queue(obj, sd);
}
void