From e5c8da2cbd53e7affd4f75401ad8ea7ae1af57b0 Mon Sep 17 00:00:00 2001 From: Boris Faure Date: Fri, 2 May 2014 00:08:58 +0200 Subject: [PATCH] miniview: correctly handle resizing --- src/bin/main.c | 9 +++++- src/bin/main.h | 1 + src/bin/miniview.c | 68 +++++++++++++++++++++++++++------------------- src/bin/miniview.h | 4 ++- src/bin/termio.c | 9 +++++- src/bin/termio.h | 3 +- 6 files changed, 62 insertions(+), 32 deletions(-) diff --git a/src/bin/main.c b/src/bin/main.c index 34d6fa18..f5019de3 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -2212,7 +2212,7 @@ main_term_new(Win *wn, Config *config, const char *cmd, } term->term = o = termio_add(wn->win, config, cmd, login_shell, cd, - size_w, size_h); + size_w, size_h, term); colors_term_init(termio_textgrid_get(term->term), term->bg, config); termio_win_set(o, wn->win); @@ -2304,6 +2304,13 @@ Evas_Object *main_term_evas_object_get(Term *term) return term->term; } +Evas_Object * +term_miniview_get(Term *term) +{ + return term->miniview; +} + + static void main_ipc_new(Ipc_Instance *inst) { diff --git a/src/bin/main.h b/src/bin/main.h index 3904435a..2f024c99 100644 --- a/src/bin/main.h +++ b/src/bin/main.h @@ -26,5 +26,6 @@ Win *main_term_win_get(Term *term); Evas_Object *main_win_evas_object_get(Win *wn); Eina_List *main_win_terms_get(Win *wn); Evas_Object *main_term_evas_object_get(Term *term); +Evas_Object *term_miniview_get(Term *term); #endif diff --git a/src/bin/miniview.c b/src/bin/miniview.c index c680ff6f..f4899249 100644 --- a/src/bin/miniview.c +++ b/src/bin/miniview.c @@ -2,6 +2,7 @@ #include #include +#include "miniview.h" #include "col.h" #include "termpty.h" #include "termio.h" @@ -58,6 +59,8 @@ struct _Miniview int viewport_h; int rows; int columns; + + int is_shown; }; static Evas_Smart *_smart = NULL; @@ -249,6 +252,8 @@ _smart_cb_key_down(void *data, Evas *e EINA_UNUSED, EINA_SAFETY_ON_NULL_RETURN(mv); + /* TODO handle keybinding to hide */ + if (!strcmp(ev->key, "Prior")) _scroll(mv, -10); else if (!strcmp(ev->key, "Next")) @@ -337,8 +342,15 @@ _smart_show(Evas_Object *obj) { Miniview *mv = evas_object_smart_data_get(obj); + DBG("smart show obj:%p mv:%p", obj, mv); if (!mv) return; + if (!mv->is_shown) + { + mv->is_shown = 1; + miniview_redraw(obj, mv->columns, mv->rows); + evas_object_show(mv->img); + } /* Evas_Coord ox, oy, ow, oh; evas_object_geometry_get(mv->img, &ox, &oy, &ow, &oh); @@ -351,7 +363,6 @@ _smart_show(Evas_Object *obj) evas_object_layer_get(mv->termio)); */ - evas_object_show(mv->img); } static void @@ -359,36 +370,41 @@ _smart_hide(Evas_Object *obj) { Miniview *mv = evas_object_smart_data_get(obj); + DBG("smart hide obj:%p mv:%p", obj, mv); if (!mv) return; - evas_object_hide(mv->img); + if (mv->is_shown) + { + mv->is_shown = 0; + evas_object_hide(mv->img); + } } -static void -_smart_size(Evas_Object *obj) +void +miniview_redraw(Evas_Object *obj, int columns, int rows) { - Miniview *mv = evas_object_smart_data_get(obj); - Evas_Coord ox, oy, ow, oh, font_w, font_h; + Miniview *mv; + Evas_Coord ox, oy, ow, oh; int history_len, h, y, wret; unsigned int *pixels; Termcell *cells; + if (!obj) return; + mv = evas_object_smart_data_get(obj); if (!mv) return; + mv->columns = columns; + mv->rows = rows; + if (!mv->is_shown) return; DBG("smart size %p", obj); evas_object_geometry_get(mv->termio, &ox, &oy, &ow, &oh); if (ow == 0 || oh == 0) return; - evas_object_size_hint_min_get(mv->termio, &font_w, &font_h); - if (font_w <= 0) return; - - mv->columns = ow / font_w; - mv->rows = oh / font_h; mv->img_h = 3 * oh; - DBG("ox:%d oy:%d ow:%d oh:%d font_w:%d columns:%d rows:%d", - ox, oy, ow, oh, font_w, mv->columns, mv->rows); + DBG("ox:%d oy:%d ow:%d oh:%d columns:%d rows:%d", + ox, oy, ow, oh, mv->columns, mv->rows); evas_object_resize(mv->img, mv->columns, mv->img_h); evas_object_image_size_set(mv->img, mv->columns, mv->img_h); @@ -397,6 +413,9 @@ _smart_size(Evas_Object *obj) history_len = mv->pty->backscroll_num; + DBG("backscroll_num:%d backmax:%d backpos:%d", + mv->pty->backscroll_num, mv->pty->backmax, mv->pty->backpos); + pixels = evas_object_image_data_get(mv->img, EINA_TRUE); memset(pixels, 0, sizeof(*pixels) * mv->columns * mv->img_h); @@ -447,9 +466,6 @@ _smart_size(Evas_Object *obj) } - - - static void _smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h) { @@ -458,7 +474,6 @@ _smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h) DBG("smart resize %p w:%d h:%d", obj, w, h); evas_object_resize(mv->img, w, h); - _smart_size(obj); } @@ -480,22 +495,13 @@ _smart_init(void) _smart = evas_smart_class_new(&sc); } - -void -miniview_update_scroll(Evas_Object *obj, int scroll_position) -{ - Miniview *mv = evas_object_smart_data_get(obj); - if (!mv) return; - - DBG("obj:%p mv:%p scroll_position:%d", obj, mv, scroll_position); -} - Evas_Object * miniview_add(Evas_Object *parent, Evas_Object *termio) { Evas *e; Evas_Object *obj; Miniview *mv; + Evas_Coord ow, oh, font_w, font_h; EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL); e = evas_object_evas_get(parent); @@ -512,7 +518,13 @@ miniview_add(Evas_Object *parent, Evas_Object *termio) mv->termio = termio; mv->pty = termio_pty_get(termio); - _smart_size(obj); + evas_object_geometry_get(mv->termio, NULL, NULL, &ow, &oh); + if (ow == 0 || oh == 0) return obj; + evas_object_size_hint_min_get(mv->termio, &font_w, &font_h); + + if (font_w <= 0 || font_h <= 0) return obj; + + miniview_redraw(obj, ow / font_w, oh / font_h); return obj; } diff --git a/src/bin/miniview.h b/src/bin/miniview.h index 65fe5d0c..c5354bc3 100644 --- a/src/bin/miniview.h +++ b/src/bin/miniview.h @@ -1,9 +1,11 @@ #ifndef _MINIVIEW_H__ #define _MINIVIEW_H__ 1 -void miniview_update_scroll(Evas_Object *obj, int scroll_position); + Evas_Object * miniview_add(Evas_Object *parent, Evas_Object *termio); +void miniview_redraw(Evas_Object *obj, int columns, int rows); + void miniview_init(void); void miniview_shutdown(void); #endif diff --git a/src/bin/termio.c b/src/bin/termio.c index 0daa9c7a..7e348895 100644 --- a/src/bin/termio.c +++ b/src/bin/termio.c @@ -16,6 +16,7 @@ #include "utils.h" #include "media.h" #include "dbus.h" +#include "miniview.h" #if defined (__MacOSX__) || (defined (__MACH__) && defined (__APPLE__)) # include @@ -68,6 +69,8 @@ struct _Termio Eina_List *seq; Evas_Object *self; Evas_Object *event; + Term *term; + Termpty *pty; Ecore_Animator *anim; Ecore_Timer *delayed_size_timer; @@ -1649,6 +1652,7 @@ _smart_size(Evas_Object *obj, int w, int h, Eina_Bool force) sd->font.chh * sd->grid.h); _sel_set(obj, EINA_FALSE); termpty_resize(sd->pty, w, h); + miniview_redraw(term_miniview_get(sd->term), w, h); _smart_calculate(obj); _smart_apply(obj); @@ -4448,7 +4452,9 @@ _smart_cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev) #endif Evas_Object * -termio_add(Evas_Object *parent, Config *config, const char *cmd, Eina_Bool login_shell, const char *cd, int w, int h) +termio_add(Evas_Object *parent, Config *config, + const char *cmd, Eina_Bool login_shell, const char *cd, + int w, int h, Term *term) { Evas *e; Evas_Object *obj, *g; @@ -4477,6 +4483,7 @@ termio_add(Evas_Object *parent, Config *config, const char *cmd, Eina_Bool login mod = modules[config->vidmod]; termio_config_set(obj, config); + sd->term = term; sd->glayer = g = elm_gesture_layer_add(parent); elm_gesture_layer_attach(g, sd->event); diff --git a/src/bin/termio.h b/src/bin/termio.h index 8c75ea49..42755ec5 100644 --- a/src/bin/termio.h +++ b/src/bin/termio.h @@ -2,10 +2,11 @@ #define _TERMIO_H__ 1 #include "config.h" +#include "main.h" #include "col.h" #include "termpty.h" -Evas_Object *termio_add(Evas_Object *parent, Config *config, const char *cmd, Eina_Bool login_shell, const char *cd, int w, int h); +Evas_Object *termio_add(Evas_Object *parent, Config *config, const char *cmd, Eina_Bool login_shell, const char *cd, int w, int h, Term *term); void termio_win_set(Evas_Object *obj, Evas_Object *win); void termio_theme_set(Evas_Object *obj, Evas_Object *theme); Evas_Object *termio_theme_get(Evas_Object *obj);