billiob pushed a commit to branch master.

commit df08549f84dafaeea238fa7c1f38ffe4eb7695a8
Author: Boris Faure <[email protected]>
Date:   Mon Mar 25 21:34:52 2013 +0100

    reflow: horizontally shrink the screen buffer
---
 src/bin/termpty.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 88 insertions(+), 5 deletions(-)

diff --git a/src/bin/termpty.c b/src/bin/termpty.c
index 24c4df4..e86bc84 100644
--- a/src/bin/termpty.c
+++ b/src/bin/termpty.c
@@ -616,10 +616,7 @@ expand_screen:
 
    ty->circular_offset = 0;
 
-   /* TODO:
-    * change of height (handle later?)
-    * double-width :)
-    */
+   /* TODO double-width :) */
 
    for (old_y = 0; old_y < old_h; old_y++)
      {
@@ -954,7 +951,93 @@ shrink_screen:
    if (ty->altbuf)
      return;
 
-   /* TODO */
+   ty->circular_offset = 0;
+
+   /* TODO double-width :) */
+   x = 0;
+   y = 0;
+
+   if (old_ts)
+     {
+        memcpy(ty->screen,
+               old_cells,
+               old_ts->w * sizeof(Termcell));
+        x = old_ts->w;
+        if (!rewrapping)
+          y++;
+        free(old_ts);
+        old_ts = NULL;
+        old_cells = NULL;
+     }
+
+   for (old_y = 0; old_y < old_h; old_y++)
+     {
+        ssize_t cur_line_length;
+        int remaining_width,
+            len;
+
+        cur_line_length = termpty_line_length(&OLD_SCREEN(0, old_y), old_w);
+
+        old_x = 0;
+        do
+          {
+             Eina_Bool need_new_line = EINA_FALSE;
+
+             remaining_width = ty->w - x;
+             len = MIN(remaining_width, cur_line_length);
+             memcpy(&TERMPTY_SCREEN(ty, x, y),
+                    &OLD_SCREEN(old_x, old_y),
+                    len * sizeof(Termcell));
+             x += len;
+             old_x += len;
+             cur_line_length -= len;
+             if (cur_line_length > 0)
+               {
+                  TERMPTY_SCREEN(ty, x - 1, y).att.autowrapped = 1;
+                  need_new_line = EINA_TRUE;
+               }
+             else
+               {
+                  Termcell *cell = &TERMPTY_SCREEN(ty, x - 1, y);
+                  if (cell->att.autowrapped)
+                    {
+                       if (x >= ty->w)
+                         need_new_line = EINA_TRUE;
+                       else
+                         {
+                            cell->att.autowrapped = 0;
+                            need_new_line = EINA_FALSE;
+                         }
+                    }
+                  else
+                    {
+                       if (old_y < old_h - 1)
+                          need_new_line = EINA_TRUE;
+                    }
+               }
+             if (need_new_line)
+               {
+                  x = 0;
+                  if (y >= ty->h - 1)
+                    {
+                       Termcell *cells;
+
+                       ty->circular_offset++;
+                       if (ty->circular_offset >= ty->h)
+                         ty->circular_offset = 0;
+                       cells = &TERMPTY_SCREEN(ty, 0, y);
+                       len = termpty_line_length(cells, ty->w);
+                       termpty_text_save_top(ty, cells, len);
+                       ty->state.cy++;
+                    }
+                  else
+                    y++;
+               }
+          }
+        while (cur_line_length > 0);
+     }
+   if (ty->state.cy >= ty->h)
+     ty->state.cy = ty->h - 1;
 }
 #undef OLD_SCREEN
 

-- 

------------------------------------------------------------------------------
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