From 23d3944b7666dcab53714e90062fb8f1af6b13d9 Mon Sep 17 00:00:00 2001 From: Boris Faure Date: Tue, 18 Mar 2014 22:53:02 +0100 Subject: [PATCH] miniview: cleanup --- data/themes/default.edc | 47 ++--- src/bin/Makefile.am | 2 +- src/bin/main.c | 12 +- src/bin/miniview.c | 393 +++++++++++++++++++++++++++++++++++++++ src/bin/miniview.h | 10 + src/bin/scrolio.c | 397 ---------------------------------------- src/bin/scrolio.h | 0 src/bin/termio.c | 58 +++--- src/bin/termio.h | 5 + 9 files changed, 468 insertions(+), 456 deletions(-) create mode 100644 src/bin/miniview.c create mode 100644 src/bin/miniview.h delete mode 100644 src/bin/scrolio.c delete mode 100644 src/bin/scrolio.h diff --git a/data/themes/default.edc b/data/themes/default.edc index 4aef00e8..7c4f1c7f 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -2958,6 +2958,30 @@ target: "0.clip"; target: "1.clip"; target: "2.clip"; target: "3.clip"; target: } } + group { name: "terminology/miniview"; + parts { + part { name: "miniview"; type: SWALLOW; + mouse_events: 0; + description { state: "default" 0.0; + color: 25 50 30 100; + rel1.relative: 0.85 0.0; + } + } + part { name: "miniview_screen"; type: RECT; + mouse_events: 1; + dragable { + confine: "miniview"; + x: 0 0 0; + y: 1 1 0; + } + description { state: "default" 0.0; + color: 255 255 255 30; + fixed:1 1; + } + } + } + } + ////////////////////////////////////////////////////////////////////////////// //// the multimedia controls group { name: "terminology/mediabusy"; @@ -3438,27 +3462,4 @@ target: "0.clip"; target: "1.clip"; target: "2.clip"; target: "3.clip"; target: } } - group { name: "terminology/miniview"; - parts { - part { name: "miniview"; type: SWALLOW; - mouse_events: 0; - description { state: "default" 0.0; - color: 25 50 30 100; - rel1.relative: 0.85 0.0; - } - } - part { name: "miniview_screen"; type: RECT; - mouse_events: 1; - dragable { - confine: "miniview"; - x: 0 0 0; - y: 1 1 0; - } - description { state: "default" 0.0; - color: 255 255 255 30; - fixed:1 1; - } - } - } - } } diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index 24f6738b..56cedeb2 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -30,7 +30,7 @@ options_keys.c options_keys.h \ options_helpers.c options_helpers.h \ options_video.c options_video.h \ sel.c sel.h \ -scrolio.c scrolio.h \ +miniview.c miniview.h \ termio.c termio.h \ termcmd.c termcmd.h \ termiolink.c termiolink.h \ diff --git a/src/bin/main.c b/src/bin/main.c index b352bb0d..6c9b06c1 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -4,7 +4,6 @@ #include #include "main.h" #include "win.h" -#include "scrolio.h" #include "termio.h" #include "termpty.h" #include "termcmd.h" @@ -16,6 +15,7 @@ #include "sel.h" #include "dbus.h" #include "app_server.h" +#include "miniview.h" #if (ELM_VERSION_MAJOR == 1) && (ELM_VERSION_MINOR < 8) #define PANES_TOP "left" @@ -1094,20 +1094,19 @@ _popmedia_show(Term *term, const char *src) } static void -_cb_scrolio_toggle(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__) +_cb_miniview_toggle(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__) { Term *term = data; Config *config = termio_config_get(term->term); if (!config->miniview) { + Evas_Coord ox, oy, ow, oh; config->miniview = EINA_TRUE; config_save(config, NULL); - Evas_Object *o; - Evas_Coord ox, oy, ow, oh; evas_object_geometry_get(term->term, &ox, &oy, &ow, &oh); - term->miniview = (Evas_Object *) termio_miniview_show(term->term, ox, oy, ow, oh); + term->miniview = termio_miniview_show(term->term, ox, oy, ow, oh); //edje_object_part_swallow(term->term, "terminology.content", term->miniview); evas_object_show(term->miniview); } @@ -2265,7 +2264,7 @@ main_term_new(Win *wn, Config *config, const char *cmd, evas_object_smart_callback_add(o, "tab,8", _cb_tab_8, term); evas_object_smart_callback_add(o, "tab,9", _cb_tab_9, term); evas_object_smart_callback_add(o, "tab,0", _cb_tab_10, term); - evas_object_smart_callback_add(o, "miniview,toggle", _cb_scrolio_toggle, term); + evas_object_smart_callback_add(o, "miniview,toggle", _cb_miniview_toggle, term); evas_object_show(o); evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, @@ -2282,7 +2281,6 @@ main_term_new(Win *wn, Config *config, const char *cmd, if (term->config->miniview && !term->miniview) { - Evas_Object *o; Evas_Coord ox, oy, ow, oh; evas_object_geometry_get(term->term, &ox, &oy, &ow, &oh); diff --git a/src/bin/miniview.c b/src/bin/miniview.c new file mode 100644 index 00000000..dd336f06 --- /dev/null +++ b/src/bin/miniview.c @@ -0,0 +1,393 @@ +#include +#include +#include "col.h" +#include "termpty.h" +#include "termio.h" + +typedef struct _Miniview Miniview; + +struct _Miniview +{ + Evas_Object_Smart_Clipped_Data __clipped_data; + Evas_Object *obj, *image_obj, *edje_obj, *screen_obj; + struct { + int size; + const char *name; + int chw, chh; + } font; + struct { + int w, h; + Evas_Object *obj; + } grid; + Evas_Object *termio; + Termpty *pty; + int parent_x, parent_y, parent_w, parent_h; + int scroll; + int scrollback; + double miniview_screen_size, miniview_screen_step, miniview_screen_default_pos, + lines_drawn, screen_obj_scroll_val, screen_obj_custom_pos; +}; + +static Evas_Smart *_smart = NULL; +static Evas_Smart_Class _parent_sc = EVAS_SMART_CLASS_INIT_NULL; + +static void +_smart_add(Evas_Object *obj) +{ + Miniview *mv; + Evas_Object *o; + + mv = calloc(1, sizeof(Miniview)); + EINA_SAFETY_ON_NULL_RETURN(mv); + evas_object_smart_data_set(obj, mv); + + _parent_sc.add(obj); + + /* miniview output widget */ + o = evas_object_image_add(evas_object_evas_get(obj)); + //evas_object_image_file_set(o, "data/themes/images/miniview_white_bg.png", NULL); + //err = evas_object_image_load_error_get(o); + //if (err != EVAS_LOAD_ERROR_NONE) + // printf("error\n"); + evas_object_image_alpha_set(o, EINA_TRUE); + evas_object_smart_member_add(o, obj); + mv->image_obj = o; +} + +static void +_smart_del() +{ + +} + +static void +_smart_move() +{ + +} + +static void +_smart_calculate(Evas_Object *obj) +{ + Miniview *mv = evas_object_smart_data_get(obj); + if (!mv) return; + + //evas_object_geometry_get(mv->obj, &ox, &oy, &ow, &oh); + //evas_object_move(mv->grid.obj, ox+(mv->grid.w*0.8), oy); + //evas_object_resize(mv->grid.obj, + // mv->grid.w * mv->font.chw, + // mv->grid.h * mv->font.chh); + evas_object_image_size_set(mv->image_obj, mv->parent_w / mv->font.chw, + (mv->parent_h / mv->font.chh) + mv->scrollback); + evas_object_image_fill_set(mv->image_obj, 0, 0, mv->parent_w * 0.15, + mv->parent_h); + evas_object_resize(mv->image_obj, mv->parent_w * 0.15, mv->parent_h); + evas_object_move(mv->image_obj, mv->parent_x + (mv->parent_w * 0.85), + mv->parent_y); + +} + +static void +_smart_apply(Evas_Object *obj) +{ + Miniview *mv = evas_object_smart_data_get(obj); + + evas_object_show(mv->image_obj); + evas_object_show(mv->edje_obj); + evas_object_show(mv->screen_obj); +} + +static void +_smart_size(Evas_Object *obj) +{ + Miniview *mv = evas_object_smart_data_get(obj); + + if (!mv) return; + mv->miniview_screen_size = (double) mv->parent_h / + (double) (mv->scrollback * mv->font.chh); + mv->miniview_screen_step = (double) mv->parent_h / (double) mv->scrollback; + mv->miniview_screen_default_pos = (((double) mv->parent_h/(double) mv->scrollback) + * (mv->lines_drawn - mv->scroll)) + / (double) mv->parent_h + - mv->miniview_screen_size; + + evas_object_image_size_set(mv->image_obj, (mv->parent_w / mv->font.chw), + mv->parent_h); + evas_object_move(mv->edje_obj, mv->parent_x, mv->parent_y); + evas_object_resize(mv->edje_obj, mv->parent_w, mv->parent_h); + + edje_object_part_drag_size_set(mv->screen_obj, "miniview_screen", 1.0, + mv->miniview_screen_size); + if (!edje_object_part_drag_step_set(mv->screen_obj, "miniview_screen", 0.0, + mv->miniview_screen_step)) + printf("error when setting drag step size.\n"); + evas_object_move(mv->screen_obj, mv->parent_x, mv->parent_y); + evas_object_resize(mv->screen_obj, mv->parent_w, mv->parent_h); + + _smart_calculate(obj); + _smart_apply(obj); +} + +static void +_smart_resize() +{ +/* + Miniview *mv = evas_object_smart_data_get(obj); + if (!mv) return; + + _smart_size(obj); + _miniview_draw(obj, mv->grid.obj, mv->parent_w, mv->parent_h); +*/ +} + + +static void +_smart_init(void) +{ + static Evas_Smart_Class sc; + + evas_object_smart_clipped_smart_set(&_parent_sc); + sc = _parent_sc; + sc.name = "miniview"; + sc.version = EVAS_SMART_CLASS_VERSION; + sc.add = _smart_add; + sc.del = _smart_del; + sc.resize = _smart_resize; + sc.move = _smart_move; + sc.calculate = _smart_calculate; + _smart = evas_smart_class_new(&sc); +} + +static void +_on_knob_moved(void *data, Evas_Object *o, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) +{ + Miniview *mv = evas_object_smart_data_get(data); + double val; + + edje_object_part_drag_value_get(o, "miniview_screen", NULL, &val); + mv->scroll = mv->lines_drawn - + ((mv->lines_drawn - (mv->parent_h / mv->font.chh)) * + (val + mv->miniview_screen_size)); + + // if miniview lines are less than scrollback lines + // (miniview obj isn't fully drawn from top to bottom) + if (mv->lines_drawn < mv->scrollback + (mv->parent_h / mv->font.chh) - 1) + { + if (val > mv->miniview_screen_default_pos) + { + val = mv->miniview_screen_default_pos; + mv->scroll = 0; + } + else + { + mv->scroll = mv->lines_drawn - + ((mv->lines_drawn - (mv->parent_h / mv->font.chh)) * + ((val / mv->miniview_screen_default_pos))) - + mv->parent_h / mv->font.chh; + + } + } + if (mv->scroll < 0) mv->scroll = 0; + printf("mv->scroll is:: %d and lines are: %f\n", mv->scroll, mv->lines_drawn); + termio_scroll_set(mv->termio, mv->scroll); +} + +static void +_miniview_draw(Evas_Object *obj) +{ + Miniview *mv = evas_object_smart_data_get(obj); + Termcell *cells; + + unsigned int *pixels, *p; + int x=0, y=0, r, g, b, i; + int wret=0; + int pty_scan_width = 0; + Eina_Bool pty_compact_w = EINA_FALSE; + + mv->lines_drawn = 0; + pixels = evas_object_image_data_get(mv->image_obj, EINA_TRUE); + p = pixels; + for (y = 0 - mv->pty->backscroll_num; y < mv->parent_h / mv->font.chh; y++) + { + cells = termpty_cellrow_get(mv->pty, y, &wret); + if (wret < mv->parent_w / mv->font.chw) + { + pty_scan_width = wret; + pty_compact_w = EINA_TRUE; + } + else + { + pty_scan_width = mv->parent_w / mv->font.chw; + pty_compact_w = EINA_FALSE; + } + for (x=0; x < pty_scan_width; x++) + { + if (cells[x].codepoint == 0 || cells[x].codepoint == ' ' || + cells[x].att.newline || cells[x].att.tab || + cells[x].codepoint == '\0' || cells[x].codepoint <= 0) + { + r=0; g = 0; b = 0; + *p = (r << 16) | (g << 8) | (b); + p++; + } + else + { + switch (cells[x].att.fg) + { + // TODO: get pixel colors from current themee... + case 0: + r = 180; g = 180; b = 180; + break; + case 2: + r = 204; g = 51; b = 51; + break; + case 3: + r = 51; g = 204; b = 51; + break; + case 4: + r = 204; g = 136; b = 51; + break; + case 5: + r = 51; g = 51; b = 204; + break; + case 6: + r = 204; g = 51; b = 204; + break; + case 7: + r = 51; g = 204; b = 204; + break; + default: + r = 180; g = 180; b = 180; + } + *p = (r << 16) | (g << 8) | (b); + p++; + } + } + if (pty_compact_w) + for (i=0; i < (mv->parent_w / mv->font.chw) - wret; i++) + { + r=0; g = 0; b = 0; + *p = (r << 16) | (g << 8) | (b); + p++; + } + mv->lines_drawn++; + } + evas_object_image_data_set(mv->image_obj, pixels); + evas_object_image_data_update_add(mv->image_obj, 0, 0, mv->parent_w * 0.85, mv->parent_h * mv->parent_h); +} + +void +miniview_resize(Evas_Object *obj, Termpty *pty, int w, int h) +{ + Miniview *mv = evas_object_smart_data_get(obj); + if (!mv) return; + + mv->parent_w = w; + mv->parent_h = h; + mv->pty = pty; + _smart_size(obj); +} + +void +miniview_move(Evas_Object *obj, int x, int y) +{ + Miniview *mv = evas_object_smart_data_get(obj); + if (!mv) return; + + mv->parent_x = x; + mv->parent_y = y; + _smart_size(obj); +} + +void +miniview_update_scroll(Evas_Object *obj, int scroll_position) +{ + Miniview *mv = evas_object_smart_data_get(obj); + if (!mv) return; + + mv->scroll = scroll_position; + _smart_size(obj); + edje_object_part_drag_value_set(mv->screen_obj, "miniview_screen", 0.0, mv->miniview_screen_default_pos); + + _miniview_draw(obj); +} + +Evas_Object * +miniview_add(Evas_Object *parent, int fontw, int fonth, Termpty *pty, + int scroll_position, int x, int y, int w, int h) +{ + Evas *e; + Evas_Object *obj, *edje_obj; + Config *config = termio_config_get(parent); + Miniview *mv; + + EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL); + e = evas_object_evas_get(parent); + if (!e) return NULL; + + if (!_smart) _smart_init(); + obj = evas_object_smart_add(e, _smart); + mv = evas_object_smart_data_get(obj); + if (!mv) return obj; + + mv->parent_x = x; + mv->parent_y = y; + mv->parent_w = w; + mv->parent_h = h; + mv->font.chw = fontw; + mv->font.chh = fonth; + mv->pty = pty; + mv->scrollback = config->scrollback; + mv->scroll = scroll_position; + mv->miniview_screen_size = (double) mv->parent_h + / mv->font.chh * mv->scrollback; + mv->miniview_screen_step = (double) mv->parent_h / (double) mv->scrollback; + mv->miniview_screen_default_pos = + (((double) mv->parent_h/(double) mv->scrollback)// pixels for each line drawn + * (mv->lines_drawn - mv->scroll)) // number of lines drawn + / (double) mv->parent_h // Divided by height to find the percentage + - mv->miniview_screen_size; + mv->termio = parent; + edje_obj = edje_object_add(e); + edje_object_file_set(edje_obj, config_theme_path_get(config), + "terminology/miniview"); + edje_object_part_swallow(edje_obj, "miniview", obj); + evas_object_move(edje_obj, x, y); + evas_object_resize(edje_obj, w, h); + mv->edje_obj = edje_obj; + + edje_obj = edje_object_add(e); + edje_object_file_set(edje_obj, config_theme_path_get(config), + "terminology/miniview"); + edje_object_part_drag_size_set(edje_obj, "miniview_screen", 1.0, + mv->miniview_screen_size); + if (!edje_object_part_drag_step_set(edje_obj, "miniview_screen", 0.0, mv->miniview_screen_step)) + printf("error when setting drag step size.\n"); + edje_object_signal_callback_add(edje_obj, "drag", "miniview_screen", _on_knob_moved, obj); + + evas_object_move(edje_obj, x, y); + evas_object_resize(edje_obj, w, h); + mv->screen_obj = edje_obj; + + _smart_size(obj); + _miniview_draw(obj); + + miniview_update_scroll(obj, mv->scroll); + + return obj; +} + +void +miniview_hide(Evas_Object *obj) +{ + Miniview *mv = evas_object_smart_data_get(obj); + if (!mv) return; + + evas_object_hide(mv->image_obj); + evas_object_hide(mv->edje_obj); + evas_object_hide(mv->screen_obj); + + mv->image_obj = NULL; + mv->edje_obj = NULL; + mv->screen_obj = NULL; +} diff --git a/src/bin/miniview.h b/src/bin/miniview.h new file mode 100644 index 00000000..89ee6b57 --- /dev/null +++ b/src/bin/miniview.h @@ -0,0 +1,10 @@ +#ifndef _MINIVIEW_H__ +#define _MINIVIEW_H__ 1 + +void miniview_resize(Evas_Object *obj, Termpty *pty, int w, int h); +void miniview_move(Evas_Object *obj, int x, int y); +void miniview_update_scroll(Evas_Object *obj, int scroll_position); +Evas_Object * miniview_add(Evas_Object *parent, int fontw, int fonth, Termpty *pty, + int scroll_position, int x, int y, int w, int h); +void miniview_hide(Evas_Object *obj); +#endif diff --git a/src/bin/scrolio.c b/src/bin/scrolio.c deleted file mode 100644 index 76b8db3c..00000000 --- a/src/bin/scrolio.c +++ /dev/null @@ -1,397 +0,0 @@ -#include -#include -#include "col.h" -#include "termpty.h" -#include "termio.h" - -// Scrolio is the smart object responsible for miniview -// feature. (this scroll thing at your right) - -typedef struct _Scrolio Scrolio; - -struct _Scrolio -{ - Evas_Object_Smart_Clipped_Data __clipped_data; - Evas_Object *obj, *image_obj, *edje_obj, *screen_obj; - struct { - int size; - const char *name; - int chw, chh; - } font; - struct { - int w, h; - Evas_Object *obj; - } grid; - Evas_Object *termio; - Termpty *pty; - int parent_x, parent_y, parent_w, parent_h; - int scroll; - int scrollback; - double miniview_screen_size, miniview_screen_step, miniview_screen_default_pos, - lines_drawn, screen_obj_scroll_val, screen_obj_custom_pos; -}; - -static Evas_Smart *_smart = NULL; -static Evas_Smart_Class _parent_sc = EVAS_SMART_CLASS_INIT_NULL; - -static void -_smart_add(Evas_Object *obj) -{ - Scrolio *sd; - Evas_Object *o; - Evas_Load_Error err; - - sd = calloc(1, sizeof(Scrolio)); - EINA_SAFETY_ON_NULL_RETURN(sd); - evas_object_smart_data_set(obj, sd); - - _parent_sc.add(obj); - - /* miniview output widget */ - o = evas_object_image_add(evas_object_evas_get(obj)); - //evas_object_image_file_set(o, "data/themes/images/miniview_white_bg.png", NULL); - //err = evas_object_image_load_error_get(o); - //if (err != EVAS_LOAD_ERROR_NONE) - // printf("error\n"); - evas_object_image_alpha_set(o, EINA_TRUE); - evas_object_smart_member_add(o, obj); - sd->image_obj = o; -} - -static void -_smart_del() -{ - -} - -static void -_smart_move() -{ - -} - -static void -_smart_calculate(Evas_Object *obj) -{ - Scrolio *sd = evas_object_smart_data_get(obj); - if (!sd) return; - - //evas_object_geometry_get(sd->obj, &ox, &oy, &ow, &oh); - //evas_object_move(sd->grid.obj, ox+(sd->grid.w*0.8), oy); - //evas_object_resize(sd->grid.obj, - // sd->grid.w * sd->font.chw, - // sd->grid.h * sd->font.chh); - evas_object_image_size_set(sd->image_obj, sd->parent_w / sd->font.chw, - (sd->parent_h / sd->font.chh) + sd->scrollback); - evas_object_image_fill_set(sd->image_obj, 0, 0, sd->parent_w * 0.15, - sd->parent_h); - evas_object_resize(sd->image_obj, sd->parent_w * 0.15, sd->parent_h); - evas_object_move(sd->image_obj, sd->parent_x + (sd->parent_w * 0.85), - sd->parent_y); - -} - -static void -_smart_apply(Evas_Object *obj) -{ - Scrolio *sd = evas_object_smart_data_get(obj); - - evas_object_show(sd->image_obj); - evas_object_show(sd->edje_obj); - evas_object_show(sd->screen_obj); -} - -static void -_smart_size(Evas_Object *obj) -{ - Scrolio *sd = evas_object_smart_data_get(obj); - - if (!sd) return; - sd->miniview_screen_size = (double) sd->parent_h / - (double) (sd->scrollback * sd->font.chh); - sd->miniview_screen_step = (double) sd->parent_h / (double) sd->scrollback; - sd->miniview_screen_default_pos = (((double) sd->parent_h/(double) sd->scrollback) - * (sd->lines_drawn - sd->scroll)) - / (double) sd->parent_h - - sd->miniview_screen_size; - - evas_object_image_size_set(sd->image_obj, (sd->parent_w / sd->font.chw), - sd->parent_h); - evas_object_move(sd->edje_obj, sd->parent_x, sd->parent_y); - evas_object_resize(sd->edje_obj, sd->parent_w, sd->parent_h); - - edje_object_part_drag_size_set(sd->screen_obj, "miniview_screen", 1.0, - sd->miniview_screen_size); - if (!edje_object_part_drag_step_set(sd->screen_obj, "miniview_screen", 0.0, - sd->miniview_screen_step)) - printf("error when setting drag step size.\n"); - evas_object_move(sd->screen_obj, sd->parent_x, sd->parent_y); - evas_object_resize(sd->screen_obj, sd->parent_w, sd->parent_h); - - _smart_calculate(obj); - _smart_apply(obj); -} - -static void -_smart_resize() -{ -/* - Scrolio *sd = evas_object_smart_data_get(obj); - if (!sd) return; - - _smart_size(obj); - _scrolio_draw(obj, sd->grid.obj, sd->parent_w, sd->parent_h); -*/ -} - - -static void -_smart_init(void) -{ - static Evas_Smart_Class sc; - - evas_object_smart_clipped_smart_set(&_parent_sc); - sc = _parent_sc; - sc.name = "scrolio"; - sc.version = EVAS_SMART_CLASS_VERSION; - sc.add = _smart_add; - sc.del = _smart_del; - sc.resize = _smart_resize; - sc.move = _smart_move; - sc.calculate = _smart_calculate; - _smart = evas_smart_class_new(&sc); -} - -static void -_on_knob_moved(void *data, Evas_Object *o, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) -{ - Scrolio *sd = evas_object_smart_data_get(data); - double val; - - edje_object_part_drag_value_get(o, "miniview_screen", NULL, &val); - sd->scroll = sd->lines_drawn - - ((sd->lines_drawn - (sd->parent_h / sd->font.chh)) * - (val + sd->miniview_screen_size)); - - // if miniview lines are less than scrollback lines - // (miniview obj isn't fully drawn from top to bottom) - if (sd->lines_drawn < sd->scrollback + (sd->parent_h / sd->font.chh) - 1) - { - if (val > sd->miniview_screen_default_pos) - { - val = sd->miniview_screen_default_pos; - sd->scroll = 0; - } - else - { - sd->scroll = sd->lines_drawn - - ((sd->lines_drawn - (sd->parent_h / sd->font.chh)) * - ((val / sd->miniview_screen_default_pos))) - - sd->parent_h / sd->font.chh; - - } - } - if (sd->scroll < 0) sd->scroll = 0; - printf("sd->scroll is:: %d and lines are: %f\n", sd->scroll, sd->lines_drawn); - termio_scroll_set(sd->termio, sd->scroll); -} - -void -_scrolio_draw(Evas_Object *obj) -{ - Scrolio *sd = evas_object_smart_data_get(obj); - Termcell *cells; - - unsigned int *pixels, *p; - int x=0, y=0, r, g, b, i; - int wret=0; - int pty_scan_width = 0; - Eina_Bool pty_compact_w = EINA_FALSE; - - sd->lines_drawn = 0; - pixels = evas_object_image_data_get(sd->image_obj, EINA_TRUE); - p = pixels; - for (y = 0 - sd->pty->backscroll_num; y < sd->parent_h / sd->font.chh; y++) - { - cells = termpty_cellrow_get(sd->pty, y, &wret); - if (wret < sd->parent_w / sd->font.chw) - { - pty_scan_width = wret; - pty_compact_w = EINA_TRUE; - } - else - { - pty_scan_width = sd->parent_w / sd->font.chw; - pty_compact_w = EINA_FALSE; - } - for (x=0; x < pty_scan_width; x++) - { - if (cells[x].codepoint == 0 || cells[x].codepoint == ' ' || - cells[x].att.newline || cells[x].att.tab || - cells[x].codepoint == '\0' || cells[x].codepoint <= 0) - { - r=0; g = 0; b = 0; - *p = (r << 16) | (g << 8) | (b); - p++; - } - else - { - switch (cells[x].att.fg) - { - // TODO: get pixel colors from current themee... - case 0: - r = 180; g = 180; b = 180; - break; - case 2: - r = 204; g = 51; b = 51; - break; - case 3: - r = 51; g = 204; b = 51; - break; - case 4: - r = 204; g = 136; b = 51; - break; - case 5: - r = 51; g = 51; b = 204; - break; - case 6: - r = 204; g = 51; b = 204; - break; - case 7: - r = 51; g = 204; b = 204; - break; - default: - r = 180; g = 180; b = 180; - } - *p = (r << 16) | (g << 8) | (b); - p++; - } - } - if (pty_compact_w) - for (i=0; i < (sd->parent_w / sd->font.chw) - wret; i++) - { - r=0; g = 0; b = 0; - *p = (r << 16) | (g << 8) | (b); - p++; - } - sd->lines_drawn++; - } - evas_object_image_data_set(sd->image_obj, pixels); - evas_object_image_data_update_add(sd->image_obj, 0, 0, sd->parent_w * 0.85, sd->parent_h * sd->parent_h); -} - -void -scrolio_miniview_resize(Evas_Object *obj, Termpty *pty, int w, int h) -{ - Scrolio *sd = evas_object_smart_data_get(obj); - if (!sd) return; - - sd->parent_w = w; - sd->parent_h = h; - sd->pty = pty; - _smart_size(obj); -} - -void -scrolio_miniview_move(Evas_Object *obj, int x, int y) -{ - Scrolio *sd = evas_object_smart_data_get(obj); - if (!sd) return; - - sd->parent_x = x; - sd->parent_y = y; - _smart_size(obj); -} - -void -scrolio_miniview_update_scroll(Evas_Object *obj, int scroll_position) -{ - Scrolio *sd = evas_object_smart_data_get(obj); - if (!sd) return; - - sd->scroll = scroll_position; - _smart_size(obj); - edje_object_part_drag_value_set(sd->screen_obj, "miniview_screen", 0.0, sd->miniview_screen_default_pos); - - _scrolio_draw(obj); -} - -Evas_Object * -scrolio_miniview_add(Evas_Object *parent, int fontw, int fonth, Termpty *pty, - int scroll, int scroll_position, int x, int y, int w, int h) -{ - Evas *e; - Evas_Object *obj, *edje_obj; - Config *config = termio_config_get(parent); - Scrolio *sd; - - EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL); - e = evas_object_evas_get(parent); - if (!e) return NULL; - - if (!_smart) _smart_init(); - obj = evas_object_smart_add(e, _smart); - sd = evas_object_smart_data_get(obj); - if (!sd) return obj; - - sd->parent_x = x; - sd->parent_y = y; - sd->parent_w = w; - sd->parent_h = h; - sd->font.chw = fontw; - sd->font.chh = fonth; - sd->pty = pty; - sd->scrollback = config->scrollback; - sd->scroll = scroll_position; - sd->miniview_screen_size = (double) sd->parent_h / sd->font.chh * sd->scrollback; - (double) (sd->scrollback * sd->font.chh); - (double) (sd->scrollback * sd->font.chh); - sd->miniview_screen_step = (double) sd->parent_h / (double) sd->scrollback; - sd->miniview_screen_default_pos = (((double) sd->parent_h/(double) sd->scrollback)// How many pixels we need for each line drawn - * (sd->lines_drawn - sd->scroll)) // Multiplied by how many lines are drawn - / (double) sd->parent_h // Divided by height to find the percentage - - sd->miniview_screen_size; - sd->termio = parent; - edje_obj = edje_object_add(e); - edje_object_file_set(edje_obj, config_theme_path_get(config), - "terminology/miniview"); - edje_object_part_swallow(edje_obj, "miniview", obj); - evas_object_move(edje_obj, x, y); - evas_object_resize(edje_obj, w, h); - sd->edje_obj = edje_obj; - - edje_obj = edje_object_add(e); - edje_object_file_set(edje_obj, config_theme_path_get(config), - "terminology/miniview"); - edje_object_part_drag_size_set(edje_obj, "miniview_screen", 1.0, - sd->miniview_screen_size); - if (!edje_object_part_drag_step_set(edje_obj, "miniview_screen", 0.0, sd->miniview_screen_step)) - printf("error when setting drag step size.\n"); - edje_object_signal_callback_add(edje_obj, "drag", "miniview_screen", _on_knob_moved, obj); - - evas_object_move(edje_obj, x, y); - evas_object_resize(edje_obj, w, h); - sd->screen_obj = edje_obj; - - _smart_size(obj); - _scrolio_draw(obj); - - scrolio_miniview_update_scroll(obj, sd->scroll); - - return obj; -} - -void -scrolio_miniview_hide(Evas_Object *obj) -{ - Scrolio *sd = evas_object_smart_data_get(obj); - if (!sd) return; - - evas_object_hide(sd->image_obj); - evas_object_hide(sd->edje_obj); - evas_object_hide(sd->screen_obj); - - sd->image_obj = NULL; - sd->edje_obj = NULL; - sd->screen_obj = NULL; -} diff --git a/src/bin/scrolio.h b/src/bin/scrolio.h deleted file mode 100644 index e69de29b..00000000 diff --git a/src/bin/termio.c b/src/bin/termio.c index a976bd2a..8ccc595f 100644 --- a/src/bin/termio.c +++ b/src/bin/termio.c @@ -1,9 +1,10 @@ #include "private.h" + #include #include #include #include -#include "scrolio.h" + #include "termio.h" #include "termiolink.h" #include "termpty.h" @@ -15,6 +16,7 @@ #include "utils.h" #include "media.h" #include "dbus.h" +#include "miniview.h" #if defined (__MacOSX__) || (defined (__MACH__) && defined (__APPLE__)) # include @@ -61,7 +63,7 @@ struct _Termio Eina_Bool dndobjdel : 1; } down; } link; - Evas_Object *scrolio; + Evas_Object *miniview; int zoom_fontsize_start; int scroll; Eina_List *mirrors; @@ -1253,7 +1255,7 @@ _block_edje_activate(Evas_Object *obj, Termblock *blk) if (ok) { _block_edje_cmds(sd->pty, blk, blk->cmds, EINA_TRUE); - //scrolio_pty_update(sd->scrolio, sd->pty); + //scrolio_pty_update(sd->miniview, sd->pty); } } @@ -1653,9 +1655,10 @@ _smart_size(Evas_Object *obj, int w, int h, Eina_Bool force) _smart_calculate(obj); _smart_apply(obj); - if (sd->scrolio) + if (sd->miniview) { - scrolio_miniview_resize(sd->scrolio, sd->pty, w * sd->font.chw, h * sd->font.chh); + miniview_resize(sd->miniview, sd->pty, + w * sd->font.chw, h * sd->font.chh); evas_object_smart_callback_call(obj, "miniview,show", NULL); } evas_event_thaw(evas_object_evas_get(obj)); @@ -1690,8 +1693,8 @@ _smart_cb_change(void *data) sd->anim = NULL; _smart_apply(obj); evas_object_smart_callback_call(obj, "changed", NULL); - if (sd->scrolio) - scrolio_miniview_update_scroll(sd->scrolio, termio_scroll_get(obj)); + if (sd->miniview) + miniview_update_scroll(sd->miniview, termio_scroll_get(obj)); return EINA_FALSE; } @@ -1700,8 +1703,8 @@ _smart_update_queue(Evas_Object *obj, Termio *sd) { if (sd->anim) return; sd->anim = ecore_animator_add(_smart_cb_change, obj); - if (sd->scrolio) - scrolio_miniview_update_scroll(sd->scrolio, termio_scroll_get(obj)); + if (sd->miniview) + miniview_update_scroll(sd->miniview, termio_scroll_get(obj)); } static void @@ -2081,22 +2084,21 @@ void termio_miniview_hide(Evas_Object *obj) { Termio *sd = evas_object_smart_data_get(obj); - if (!sd) return; + EINA_SAFETY_ON_NULL_RETURN(sd); - scrolio_miniview_hide(sd->scrolio); - sd->scrolio = NULL; + miniview_hide(sd->miniview); + sd->miniview = NULL; } Evas_Object * termio_miniview_show(Evas_Object *obj, int x, int y, int w, int h) { Termio *sd = evas_object_smart_data_get(obj); - if (!sd) return; + EINA_SAFETY_ON_NULL_RETURN_VAL(sd, NULL); - sd->scrolio = (Evas_Object *) scrolio_miniview_add(obj, sd->font.chw, sd->font.chh, - sd->pty, sd->pty->backscroll_num, - termio_scroll_get(obj), x, y, w, h); - return sd->scrolio; + sd->miniview = miniview_add(obj, sd->font.chw, sd->font.chh, + sd->pty, termio_scroll_get(obj), x, y, w, h); + return sd->miniview; } static void @@ -3561,8 +3563,8 @@ _smart_cb_mouse_wheel(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNU default: break; } - if (sd->scrolio) - scrolio_miniview_update_scroll(sd->scrolio, termio_scroll_get(obj)); + if (sd->miniview) + miniview_update_scroll(sd->miniview, termio_scroll_get(obj)); } } @@ -3947,7 +3949,6 @@ static void _smart_calculate(Evas_Object *obj) { Termio *sd = evas_object_smart_data_get(obj); - Evas_Object *scr_obj; Evas_Coord ox, oy, ow, oh; EINA_SAFETY_ON_NULL_RETURN(sd); @@ -3961,12 +3962,12 @@ _smart_calculate(Evas_Object *obj) ox + (sd->cursor.x * sd->font.chw), oy + (sd->cursor.y * sd->font.chh)); - //evas_object_move(sd->scrolio.grid.obj, ox, oy); - //evas_object_resize(sd->scrolio.grid.obj, + //evas_object_move(sd->miniview.grid.obj, ox, oy); + //evas_object_resize(sd->miniview.grid.obj, // sd->grid.w * sd->font.chw, // sd->grid.h * sd->font.chh); - //scr_obj = scrolio_grid_object_get(sd->scrolio); + //scr_obj = scrolio_grid_object_get(sd->miniview); //evas_object_move(scr_obj, ox, oy); //evas_object_resize(scr_obj, // sd->grid.w * sd->font.chw, @@ -3983,8 +3984,8 @@ _smart_move(Evas_Object *obj, Evas_Coord x EINA_UNUSED, Evas_Coord y EINA_UNUSED EINA_SAFETY_ON_NULL_RETURN(sd); evas_object_smart_changed(obj); - if (sd->scrolio) - scrolio_miniview_move(sd->scrolio, x, y); + if (sd->miniview) + miniview_move(sd->miniview, x, y); } static void @@ -4812,9 +4813,9 @@ termio_config_update(Evas_Object *obj) evas_object_textgrid_font_set(sd->grid.obj, sd->font.name, sd->font.size); evas_object_textgrid_cell_size_get(sd->grid.obj, &w, &h); - //evas_object_scale_set(sd->scrolio.grid.obj, elm_config_scale_get()); - //evas_object_textgrid_font_set(sd->scrolio.grid.obj, sd->font.name, sd->font.size); - //evas_object_textgrid_cell_size_get(sd->scrolio.grid.obj, &w, &h); + //evas_object_scale_set(sd->miniview.grid.obj, elm_config_scale_get()); + //evas_object_textgrid_font_set(sd->miniview.grid.obj, sd->font.name, sd->font.size); + //evas_object_textgrid_cell_size_get(sd->miniview.grid.obj, &w, &h); if (w < 1) w = 1; if (h < 1) h = 1; sd->font.chw = w; @@ -4901,6 +4902,7 @@ void termio_scroll_set(Evas_Object *obj, int scroll) { Termio *sd = evas_object_smart_data_get(obj); + EINA_SAFETY_ON_NULL_RETURN(sd); sd->scroll = scroll; _smart_apply(obj); } diff --git a/src/bin/termio.h b/src/bin/termio.h index d07f8d30..b984a049 100644 --- a/src/bin/termio.h +++ b/src/bin/termio.h @@ -12,6 +12,7 @@ char *termio_selection_get(Evas_Object *obj, int c1x, int c1y, int c2x, int c2y, size_t *len); Eina_Bool termio_selection_exists(const Evas_Object *obj); +void termio_scroll_set(Evas_Object *obj, int scroll); void termio_scroll(Evas_Object *obj, int direction, int start_y, int end_y); void termio_content_change(Evas_Object *obj, Evas_Coord x, Evas_Coord y, int n); @@ -38,4 +39,8 @@ void termio_config_set(Evas_Object *obj, Config *config); Config *termio_config_get(const Evas_Object *obj); void termio_debugwhite_set(Evas_Object *obj, Eina_Bool dbg); + +void termio_miniview_hide(Evas_Object *obj); +Evas_Object *termio_miniview_show(Evas_Object *obj, int x, int y, int w, int h); + #endif