billiob pushed a commit to branch master.

commit ee9e6af8c0ed9e54d82ce3f296f6def09b283a3f
Author: Boris Faure <[email protected]>
Date:   Sun Mar 10 19:05:51 2013 +0100

    reflow: add backscroll expanding
    
    Refs: #1184
---
 src/bin/termpty.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 105 insertions(+), 4 deletions(-)

diff --git a/src/bin/termpty.c b/src/bin/termpty.c
index 8147580..10e168a 100644
--- a/src/bin/termpty.c
+++ b/src/bin/termpty.c
@@ -470,8 +470,109 @@ termpty_write(Termpty *ty, const char *input, int len)
 }
 
 static void
-_termpty_horizontally_expand(Termpty *ty, int old_w, int old_h,
-                             Termcell *old_screen, Termcell *old_screen2)
+_termpty_horizontally_expand_backscroll(Termpty *ty, int old_w, int old_h)
+{
+   int i,
+       new_back_pos = 0;
+   Termsave **new_back,
+            *new_ts;
+   Eina_Bool rewrapping = EINA_FALSE;
+
+   if (!ty->backmax || !ty->back)
+     return;
+
+   new_back = calloc(sizeof(Termsave*), ty->backmax);
+
+   for (i = 0; i < ty->backmax; i++)
+     {
+        Termsave *ts;
+
+        if (ty->backscroll_num == ty->backmax - 1)
+          ts = ty->back[(ty->backpos + i) % ty->backscroll_num];
+        else
+          ts = ty->back[i];
+        if (!ts)
+          break;
+
+        if (!ts->w)
+          {
+             if (rewrapping)
+               {
+                  rewrapping = EINA_FALSE;
+                  new_ts->cell[new_ts->w - 1].att.autowrapped = 0;
+               }
+             else
+               new_back[new_back_pos++] = ts;
+             continue;
+          }
+
+        if (rewrapping)
+          {
+             int remaining_width = ty->w - new_ts->w;
+             int len = ts->w;
+             Termcell *cells = ts->cell;
+
+             if (ts->w >= remaining_width)
+               {
+                  memcpy(new_ts->cell + new_ts->w,
+                         cells,
+                         remaining_width * sizeof(Termcell));
+                  new_ts->w = ty->w;
+                  new_ts->cell[new_ts->w - 1].att.autowrapped = 1;
+                  len -= remaining_width;
+                  cells += remaining_width;
+
+                  new_ts = calloc(1, sizeof(Termsave) +
+                                  (ty->w - 1) * sizeof(Termcell));
+                  new_ts->w = 0;
+                  new_back[new_back_pos++] = new_ts;
+               }
+             if (len)
+               {
+                  memcpy(new_ts->cell + new_ts->w,
+                         cells,
+                         len * sizeof(Termcell));
+                  new_ts->w += len;
+                  new_ts->cell[new_ts->w - 1].att.autowrapped = 0;
+               }
+
+             rewrapping = ts->cell[ts->w - 1].att.autowrapped;
+             if (!rewrapping)
+               new_back_pos++;
+
+             free(ts);
+          }
+        else
+          {
+             if (ts->cell[ts->w - 1].att.autowrapped)
+               {
+                  rewrapping = EINA_TRUE;
+                  new_ts = calloc(1, sizeof(Termsave) +
+                                  (ty->w - 1) * sizeof(Termcell));
+                  new_ts->w = ts->w;
+                  memcpy(new_ts->cell, ts->cell, ts->w * sizeof(Termcell));
+                  new_ts->cell[ts->w - 1].att.autowrapped = 0;
+
+                  new_back[new_back_pos++] = new_ts;
+                  free(ts);
+               }
+             else
+               {
+                  new_back[new_back_pos++] = ts;
+               }
+          }
+     }
+
+   ty->backscroll_num = new_back_pos;
+   ty->backpos = new_back_pos;
+
+   free(ty->back);
+   ty->back = new_back;
+}
+
+static void
+_termpty_horizontally_expand_screen(Termpty *ty, int old_w, int old_h,
+                                    Termcell *old_screen)
 {
    int old_y,
        old_x,
@@ -486,7 +587,6 @@ _termpty_horizontally_expand(Termpty *ty, int old_w, int 
old_h,
    ty->circular_offset = 0;
 
    /* TODO:
-    * backscroll
     * change of height (handle later?)
     * double-width :)
     * remove empty lines created because of reflowing
@@ -595,7 +695,8 @@ termpty_resize(Termpty *ty, int w, int h)
      {
         if (ty->w > oldw)
           {
-             _termpty_horizontally_expand(ty, oldw, oldh, olds, olds2);
+             _termpty_horizontally_expand_screen(ty, oldw, oldh, olds);
+             _termpty_horizontally_expand_backscroll(ty, oldw, oldh);
              return;
           }
         else

-- 

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter

Reply via email to