From 42cbf2f0ed75032d09a27b680fd9329095e49e8c Mon Sep 17 00:00:00 2001 From: Boris Faure Date: Sun, 4 May 2014 20:18:23 +0200 Subject: [PATCH] miniview: fix with splits --- data/themes/default.edc | 2 -- src/bin/main.c | 49 +++++++++++++++++++-------- src/bin/miniview.c | 74 ++++++++++++++++++++++++++++++----------- src/bin/termio.c | 5 +-- 4 files changed, 91 insertions(+), 39 deletions(-) diff --git a/data/themes/default.edc b/data/themes/default.edc index e028a345..65268411 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -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"; } diff --git a/src/bin/main.c b/src/bin/main.c index f5019de3..d7525c3a 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -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; } diff --git a/src/bin/miniview.c b/src/bin/miniview.c index 7b80e9f9..d8a3c474 100644 --- a/src/bin/miniview.c +++ b/src/bin/miniview.c @@ -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; diff --git a/src/bin/termio.c b/src/bin/termio.c index f8b50882..0f0d3bbc 100644 --- a/src/bin/termio.c +++ b/src/bin/termio.c @@ -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