billiob pushed a commit to branch master.

http://git.enlightenment.org/apps/terminology.git/commit/?id=77ab1efb9dc2e4c0a6cac4c84551ae53f049ee8e

commit 77ab1efb9dc2e4c0a6cac4c84551ae53f049ee8e
Author: Boris Faure <[email protected]>
Date:   Sun Nov 24 16:14:00 2019 +0100

    backlog: be smarter when changing backlog's size
---
 src/bin/backlog.c | 39 +++++++++++++++++++++++++++++++++++----
 1 file changed, 35 insertions(+), 4 deletions(-)

diff --git a/src/bin/backlog.c b/src/bin/backlog.c
index 62669b9..aac4db8 100644
--- a/src/bin/backlog.c
+++ b/src/bin/backlog.c
@@ -166,21 +166,52 @@ end:
 void
 termpty_backlog_size_set(Termpty *ty, size_t size)
 {
+   Termsave *new_back;
+
    if (ty->backsize == size)
      return;
 
-   /* TODO: RESIZE: handle that case better: changing backscroll size */
    termpty_backlog_lock();
 
-   termpty_backlog_free(ty);
+   if (size == 0)
+     {
+        termpty_backlog_free(ty);
+        goto end;
+     }
    if (size > 0)
      {
-        ty->back = calloc(1, sizeof(Termsave) * size);
-        _accounting_change(sizeof(Termsave) * size);
+        size_t i;
+        if (size > ty->backsize)
+          {
+             new_back = realloc(ty->back, sizeof(Termsave) * size);
+             if (!new_back)
+               return;
+             memset(new_back + ty->backsize, 0,
+                    sizeof(Termsave) * (size - ty->backsize));
+             ty->back = new_back;
+          }
+        else
+          {
+             new_back = calloc(1, sizeof(Termsave) * size);
+             if (!new_back)
+               return;
+             for (i = 0; i < size; i++)
+               new_back[i] = ty->back[i];
+             for (i = size; i < ty->backsize; i++)
+               termpty_save_free(ty, &ty->back[i]);
+             free(ty->back);
+             ty->back = new_back;
+          }
+        _accounting_change(sizeof(Termsave) * (size - ty->backsize));
      }
    else
      ty->back = NULL;
+end:
    ty->backpos = 0;
    ty->backsize = size;
+   /* Reset beacon */
+   ty->backlog_beacon.screen_y = 0;
+   ty->backlog_beacon.backlog_y = 0;
+
    termpty_backlog_unlock();
 }

-- 


Reply via email to