After spending some time on the miniview feature and with the help of
raster I finally reached the point where it is somehow usable.

I have some issues where i need some guidance/help/feedback.
First, I want to bring miniview image below controls menu but i don't know
how. Currently when miniview is enabled and we have some history lines
drawn, when you press right click the controls menu is below miniview but
we don't want this...

My second issue is that i want to use an animation when miniview
appears/dissapears. Actually what I want for default behaviour is this:
When the user enables miniview it'll slide in from the right and it will
show up just for couple of seconds (lets say 5), then it will slide back
and only one small part of the miniview will be visible only to indicate to
the user that it's enabled and when the user mouses over it will re-slide
in...

Also i'm having an issue when resizing the window, some "garbage" pixels
are drawn inside the miniview image and I can't find where are coming from.
If someone has a clue it'll be very helpfull! :D

Please try my patch and tell me what you think
Cheers, Panos.

>From 5c334290e9aa1d6aa2a02ae6bde8ff7a3d6dece6 Mon Sep 17 00:00:00 2001
From: Godfath3r <galatsan...@gmail.com>
Date: Sun, 23 Jun 2013 03:07:27 +0300
Subject: [PATCH 1/1] add miniview feature to terminology. Pressing
 ctrl+shift+f toggles miniview on the side of each
 terminal/split/tab

---
 data/themes/default.edc |  24 +++
 src/bin/Makefile.am     |   1 +
 src/bin/config.c        |   5 +
 src/bin/config.h        |   1 +
 src/bin/main.c          |  61 +++++++-
 src/bin/scrolio.c       | 397
++++++++++++++++++++++++++++++++++++++++++++++++
 src/bin/termio.c        | 101 +++++++++++-
 src/bin/termio.h        |   3 +
 8 files changed, 582 insertions(+), 11 deletions(-)
 create mode 100644 src/bin/scrolio.c
 create mode 100644 src/bin/scrolio.h

diff --git a/data/themes/default.edc b/data/themes/default.edc
index 42e3f2a..dfeea2d 100644
--- a/data/themes/default.edc
+++ b/data/themes/default.edc
@@ -3597,4 +3597,28 @@ target: "4.bottom"
          }
       }
    }
+
+   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 e95dae7..3be4322 100644
--- a/src/bin/Makefile.am
+++ b/src/bin/Makefile.am
@@ -27,6 +27,7 @@ options_video.c options_video.h \
 options_theme.c options_theme.h \
 options_wallpaper.c options_wallpaper.h \
 sel.c sel.h \
+scrolio.c scrolio.h \
 termio.c termio.h \
 termcmd.c termcmd.h \
 termiolink.c termiolink.h \
diff --git a/src/bin/config.c b/src/bin/config.c
index eafa3da..f03e041 100644
--- a/src/bin/config.c
+++ b/src/bin/config.c
@@ -89,6 +89,8 @@ config_init(void)
      (edd_base, Config, "cg_width", cg_width, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC
      (edd_base, Config, "cg_height", cg_height, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC
+     (edd_base, Config, "miniview", miniview, EET_T_UCHAR);
 }

 void
@@ -171,6 +173,7 @@ config_sync(const Config *config_src, Config *config)
    config->custom_geometry = config_src->custom_geometry;
    config->cg_width = config_src->cg_width;
    config->cg_height = config_src->cg_height;
+   config->miniview = config_src->miniview;
 }

 Config *
@@ -426,6 +429,7 @@ config_load(const char *key)
              config->custom_geometry = EINA_FALSE;
              config->cg_width = 80;
              config->cg_height = 24;
+             config->miniview = EINA_FALSE;
           }
      }

@@ -474,6 +478,7 @@ config_fork(Config *config)
    CPY(custom_geometry);
    CPY(cg_width);
    CPY(cg_height);
+   CPY(miniview);

    CPY(temporary);
    SCPY(config_key);
diff --git a/src/bin/config.h b/src/bin/config.h
index cda50ff..79cc1c3 100644
--- a/src/bin/config.h
+++ b/src/bin/config.h
@@ -43,6 +43,7 @@ struct _Config
    Eina_Bool         custom_geometry;
    int               cg_width;
    int               cg_height;
+   Eina_Bool         miniview;

    Eina_Bool         temporary; /* not in EET */
    const char       *config_key; /* not in EET, the key that config was
loaded */
diff --git a/src/bin/main.c b/src/bin/main.c
index 5bbf3dc..77ea8ae 100644
--- a/src/bin/main.c
+++ b/src/bin/main.c
@@ -4,6 +4,7 @@
 #include <Elementary.h>
 #include "main.h"
 #include "win.h"
+#include "scrolio.h"
 #include "termio.h"
 #include "termpty.h"
 #include "termcmd.h"
@@ -23,9 +24,9 @@
   #define PANES_BOTTOM "bottom"
 #endif

-typedef struct _Win   Win;
-typedef struct _Term  Term;
-typedef struct _Split Split;
+typedef struct _Win     Win;
+typedef struct _Term    Term;
+typedef struct _Split   Split;

 struct _Win
 {
@@ -53,6 +54,7 @@ struct _Term
    Evas_Object *term;
    Evas_Object *media;
    Evas_Object *popmedia;
+   Evas_Object *miniview;
    Evas_Object *sel;
    Evas_Object *tabcount_spacer;
    Eina_List   *popmedia_queue;
@@ -1036,6 +1038,36 @@ _popmedia_show(Term *term, const char *src)
 }

 static void
+_cb_scrolio_toggle(void *data, Evas_Object *obj __UNUSED__, void *event
__UNUSED__)
+{
+   Term *term = data;
+   Config *config = termio_config_get(term->term);
+   if (!config->miniview)
+     {
+        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);
+        //edje_object_part_swallow(term->term, "terminology.content",
term->miniview);
+        evas_object_show(term->miniview);
+     }
+   else
+     {
+        evas_object_hide(term->miniview);
+        //edje_object_part_unswallow(term->term, term->miniview);
+        termio_miniview_hide(term->term);
+        term->miniview = NULL;
+
+        config->miniview = EINA_FALSE;
+        config_save(config, NULL);
+     }
+}
+
+static void
 _popmedia_queue_process(Term *term)
 {
    const char *src;
@@ -1964,6 +1996,13 @@ main_term_free(Term *term)
      }
    term->media = NULL;
    if (term->popmedia) evas_object_del(term->popmedia);
+   if (term->miniview)
+     {
+        evas_object_hide(term->miniview);
+        //edje_object_part_unswallow(term->term, term->miniview);
+        termio_miniview_hide(term->term);
+        term->miniview = NULL;
+     }
    term->popmedia = NULL;
    evas_object_del(term->term);
    term->term = NULL;
@@ -2167,6 +2206,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_0, term);
+   evas_object_smart_callback_add(o, "miniview,toggle",
_cb_scrolio_toggle, term);
    evas_object_show(o);

    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
@@ -2181,7 +2221,20 @@ main_term_new(Win *wn, Config *config, const char
*cmd,
 //        edje_object_signal_emit(term->base, "focus,in", "terminology");
      }
    wn->terms = eina_list_append(wn->terms, term);
-
+
+   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);
+
+        //term->miniview = (Evas_Object *)
termio_miniview_show(term->term,
+        //                                                          ox,
oy, ow, oh);
+        edje_object_part_swallow(term->term, "terminology.content",
+                                 term->miniview);
+        evas_object_show(term->miniview);
+     }
+
    return term;
 }

diff --git a/src/bin/scrolio.c b/src/bin/scrolio.c
new file mode 100644
index 0000000..76b8db3
--- /dev/null
+++ b/src/bin/scrolio.c
@@ -0,0 +1,397 @@
+#include <Elementary.h>
+#include <stdio.h>
+#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
new file mode 100644
index 0000000..e69de29
diff --git a/src/bin/termio.c b/src/bin/termio.c
index f685929..0f1aa0f 100644
--- a/src/bin/termio.c
+++ b/src/bin/termio.c
@@ -3,6 +3,7 @@
 #include <Ecore_IMF_Evas.h>
 #include <Elementary.h>
 #include <Ecore_Input.h>
+#include "scrolio.h"
 #include "termio.h"
 #include "termiolink.h"
 #include "termpty.h"
@@ -61,6 +62,7 @@ struct _Termio
          Eina_Bool dndobjdel : 1;
       } down;
    } link;
+   Evas_Object *scrolio;
    int zoom_fontsize_start;
    int scroll;
    unsigned int last_keyup;
@@ -1127,7 +1129,11 @@ _block_edje_activate(Evas_Object *obj, Termblock
*blk)
    evas_object_show(blk->obj);
    evas_object_data_set(blk->obj, "blk", blk);

-   if (ok) _block_edje_cmds(sd->pty, blk, blk->cmds, EINA_TRUE);
+   if (ok)
+     {
+        _block_edje_cmds(sd->pty, blk, blk->cmds, EINA_TRUE);
+        //scrolio_pty_update(sd->scrolio, sd->pty);
+     }
 }

 static void
@@ -1180,7 +1186,7 @@ _smart_apply(Evas_Object *obj)
    Evas_Coord ox, oy, ow, oh;
    Eina_List *l, *ln;
    Termblock *blk;
-   int j, x, y, w, ch1 = 0, ch2 = 0, inv = 0;
+   int j, x, y, w, ch1 = 0, ch2 = 0, inv = 0, jinx=0;

    if (!sd) return;
    evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
@@ -1392,6 +1398,7 @@ _smart_apply(Evas_Object *obj)
         if (ch1 >= 0)
           evas_object_textgrid_update_add(sd->grid.obj, ch1, y,
                                           ch2 - ch1 + 1, 1);
+          //printf("I'm fine thanx\n");
      }
    termpty_cellcomp_thaw(sd->pty);

@@ -1414,7 +1421,6 @@ _smart_apply(Evas_Object *obj)
                (sd->pty->block.active, l);
           }
      }
-
    if ((sd->scroll != 0) || (sd->pty->state.hidecursor))
      evas_object_hide(sd->cur.obj);
    else
@@ -1537,6 +1543,7 @@ _smart_apply(Evas_Object *obj)
      evas_object_hide(sd->cur.selo_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?");
 }

 static void
@@ -1551,11 +1558,12 @@ _smart_size(Evas_Object *obj, int w, int h,
Eina_Bool force)
      {
         if ((w == sd->grid.w) && (h == sd->grid.h)) return;
      }
-
-   evas_event_freeze(evas_object_evas_get(obj));
-   evas_object_textgrid_size_set(sd->grid.obj, w, h);
    sd->grid.w = w;
    sd->grid.h = h;
+
+   evas_event_freeze(evas_object_evas_get(obj));
+   evas_object_textgrid_size_set(sd->grid.obj, sd->grid.w, sd->grid.h);
+
    evas_object_resize(sd->cur.obj, sd->font.chw, sd->font.chh);
    evas_object_size_hint_min_set(obj, sd->font.chw, sd->font.chh);
    if (!sd->noreqsize)
@@ -1563,8 +1571,14 @@ _smart_size(Evas_Object *obj, int w, int h,
Eina_Bool force)
                                        sd->font.chw * sd->grid.w,
                                        sd->font.chh * sd->grid.h);
    termpty_resize(sd->pty, w, h);
+
    _smart_calculate(obj);
    _smart_apply(obj);
+   if (sd->scrolio)
+     {
+        scrolio_miniview_resize(sd->scrolio, 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));
 }

@@ -1597,6 +1611,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));
    return EINA_FALSE;
 }

@@ -1605,6 +1621,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));
 }

 static void
@@ -1929,6 +1947,28 @@ _handle_shift(Evas_Event_Key_Down *ev, int by,
Evas_Object *term, Termio *sd)
 }

 void
+termio_miniview_hide(Evas_Object *obj)
+{
+   Termio *sd = evas_object_smart_data_get(obj);
+   if (!sd) return;
+
+   scrolio_miniview_hide(sd->scrolio);
+   sd->scrolio = 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;
+
+   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;
+}
+
+void
 _smart_cb_key_down(void *data, Evas *e __UNUSED__, Evas_Object *obj
__UNUSED__, void *event)
 {
    Evas_Event_Key_Down *ev = event;
@@ -1988,7 +2028,21 @@ _smart_cb_key_down(void *data, Evas *e __UNUSED__,
Evas_Object *obj __UNUSED__,
              evas_object_smart_callback_call(data, "tab,6", NULL);
              goto end;
           }
+<<<<<<< HEAD
         else if (!strcmp(ev->keyname, "7"))
+=======
+        else if (!strcmp(ev->keyname, "f"))
+          {
+             evas_object_smart_callback_call(data, "miniview,toggle",
NULL);
+             goto end;
+          }
+     }
+   if ((evas_key_modifier_is_set(ev->modifiers, "Alt")) &&
+       (!evas_key_modifier_is_set(ev->modifiers, "Shift")) &&
+       (!evas_key_modifier_is_set(ev->modifiers, "Control")))
+     {
+        if (!strcmp(ev->keyname, "Home"))
+>>>>>>> add miniview feature to terminology. Pressing ctrl+shift+f toggles
miniview on the side of each terminal/split/tab
           {
              _compose_seq_reset(sd);
              evas_object_smart_callback_call(data, "tab,7", NULL);
@@ -3166,6 +3220,8 @@ _smart_cb_mouse_wheel(void *data, Evas *e __UNUSED__,
Evas_Object *obj __UNUSED_
           default:
             break;
          }
+        if (sd->scrolio)
+          scrolio_miniview_update_scroll(sd->scrolio,
termio_scroll_get(obj));
      }
 }

@@ -3210,6 +3266,7 @@ _termio_config_set(Evas_Object *obj, Config *config)
    evas_object_textgrid_font_set(sd->grid.obj, sd->font.name,
sd->font.size);
    evas_object_textgrid_size_set(sd->grid.obj, 1, 1);
    evas_object_textgrid_cell_size_get(sd->grid.obj, &w, &h);
+
    if (w < 1) w = 1;
    if (h < 1) h = 1;
    sd->font.chw = w;
@@ -3549,6 +3606,7 @@ 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;

    if (!sd) return;
@@ -3558,6 +3616,18 @@ _smart_calculate(Evas_Object *obj)
    evas_object_resize(sd->grid.obj,
                       sd->grid.w * sd->font.chw,
                       sd->grid.h * sd->font.chh);
+
+   //evas_object_move(sd->scrolio.grid.obj, ox, oy);
+   //evas_object_resize(sd->scrolio.grid.obj,
+   //                   sd->grid.w * sd->font.chw,
+   //                   sd->grid.h * sd->font.chh);
+
+   //scr_obj = scrolio_grid_object_get(sd->scrolio);
+   //evas_object_move(scr_obj, ox, oy);
+   //evas_object_resize(scr_obj,
+   //                   sd->grid.w * sd->font.chw,
+   //                   sd->grid.h * sd->font.chh);
+
    evas_object_move(sd->cur.obj,
                     ox + (sd->cur.x * sd->font.chw),
                     oy + (sd->cur.y * sd->font.chh));
@@ -3571,6 +3641,8 @@ _smart_move(Evas_Object *obj, Evas_Coord x
__UNUSED__, Evas_Coord y __UNUSED__)
    Termio *sd = evas_object_smart_data_get(obj);
    if (!sd) return;
    evas_object_smart_changed(obj);
+   if (sd->scrolio)
+     scrolio_miniview_move(sd->scrolio, x, y);
 }

 static void
@@ -3617,6 +3689,7 @@ _smart_pty_scroll(void *data)
      {
         // adjust scroll position for added scrollback
         sd->scroll++;
+        ERR("scroll: %d", sd->scroll);
         if (sd->scroll > sd->pty->backscroll_num)
           sd->scroll = sd->pty->backscroll_num;
         changed = 1;
@@ -3869,7 +3942,9 @@ _smart_pty_command(void *data)
                   char *chid = strs->data;
                   blk = termpty_block_chid_get(sd->pty, chid);
                   if (blk)
-                    _block_edje_cmds(sd->pty, blk, strs->next, EINA_FALSE);
+                    {
+                       _block_edje_cmds(sd->pty, blk, strs->next,
EINA_FALSE);
+                    }
                }
              EINA_LIST_FREE(strs, pp) free(pp);
           }
@@ -4302,6 +4377,10 @@ termio_config_update(Evas_Object *obj)
    evas_object_scale_set(sd->grid.obj, elm_config_scale_get());
    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);
    if (w < 1) w = 1;
    if (h < 1) h = 1;
    sd->font.chw = w;
@@ -4380,6 +4459,14 @@ termio_scroll_get(Evas_Object *obj)
    return sd->scroll;
 }

+void
+termio_scroll_set(Evas_Object *obj, int scroll)
+{
+   Termio *sd = evas_object_smart_data_get(obj);
+   sd->scroll = scroll;
+   _smart_apply(obj);
+}
+
 pid_t
 termio_pid_get(const Evas_Object *obj)
 {
diff --git a/src/bin/termio.h b/src/bin/termio.h
index 485a311..4266dcb 100644
--- a/src/bin/termio.h
+++ b/src/bin/termio.h
@@ -29,6 +29,9 @@ Evas_Object *termio_win_get(Evas_Object *obj);
 Evas_Object *termio_mirror_add(Evas_Object *obj);
 const char  *termio_title_get(Evas_Object *obj);
 const char  *termio_icon_name_get(Evas_Object *obj);
+<<<<<<< HEAD
 void         termio_debugwhite_set(Evas_Object *obj, Eina_Bool dbg);

+=======
+>>>>>>> add miniview feature to terminology. Pressing ctrl+shift+f toggles
miniview on the side of each terminal/split/tab
 #endif
-- 
1.7.12.4
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to