From a968754d3ffa61195cfa2d8863f7f51ac61a336c Mon Sep 17 00:00:00 2001 From: Ali Gholami Rudi Date: Wed, 18 Sep 2013 19:20:51 +0430 Subject: [PATCH] term: stay in lazy mode for hidden terms --- fbpad.c | 8 ++++---- fbpad.h | 20 +++++++++++--------- term.c | 39 ++++++++++++++++++++++++--------------- 3 files changed, 39 insertions(+), 28 deletions(-) diff --git a/fbpad.c b/fbpad.c index 5fb56a4..3d4a41c 100644 --- a/fbpad.c +++ b/fbpad.c @@ -89,8 +89,8 @@ static void switchterm(int oidx, int nidx, int show, int save, int load) scr_snap(&terms[oidx]); term_save(&terms[oidx]); term_load(&terms[nidx], show); - if (load && (!TERMOPEN(nidx) || !TERMSNAP(nidx) || scr_load(&terms[nidx]))) - term_redraw(); + if (load) + term_redraw(!TERMOPEN(nidx) || !TERMSNAP(nidx) || scr_load(&terms[nidx])); } static void showterm(int n) @@ -192,7 +192,7 @@ static void directkey(void) term_screenshot(); return; case 'y': - term_redraw(); + term_redraw(1); return; case CTRLKEY('l'): locked = 1; @@ -276,7 +276,7 @@ static void mainloop(char **args) cfmakeraw(&termios); tcsetattr(0, TCSAFLUSH, &termios); term_load(&terms[cterm()], 1); - term_redraw(); + term_redraw(1); if (args) { cmdmode = 1; execterm(args); diff --git a/fbpad.h b/fbpad.h index 5e2956f..7836bda 100644 --- a/fbpad.h +++ b/fbpad.h @@ -24,15 +24,17 @@ struct term_state { }; struct term { - int screen[NROWS * NCOLS]; - int hist[NHIST * NCOLS]; - short fgs[NROWS * NCOLS]; - short bgs[NROWS * NCOLS]; - struct term_state cur, sav; + int screen[NROWS * NCOLS]; /* screen content */ + int hist[NHIST * NCOLS]; /* scrolling history */ + short fgs[NROWS * NCOLS]; /* foreground color */ + short bgs[NROWS * NCOLS]; /* background color */ + int dirty[NROWS]; /* changed rows in lazy mode */ + struct term_state cur, sav; /* terminal saved state */ + int fd; /* terminal file descriptor */ int histtail; /* the next history row */ - int fd; - int pid; - int top, bot; + int lazy; /* lazy mode */ + int pid; /* pid of the terminal program */ + int top, bot; /* terminal top and bot */ }; void term_load(struct term *term, int visible); @@ -44,7 +46,7 @@ void term_exec(char **args); void term_end(void); void term_screenshot(void); void term_hist(int pos); -void term_redraw(void); +void term_redraw(int all); /* pad.c */ #define FN_I 0x100 /* italic font */ diff --git a/term.c b/term.c index 4124c99..416329d 100644 --- a/term.c +++ b/term.c @@ -31,6 +31,8 @@ static struct term *term; static int *screen; static short *fgs, *bgs; +static int *dirty; +static int lazy; static int row, col; static int fg, bg; static int top, bot; @@ -39,9 +41,6 @@ static int visible; /* low level drawing and lazy updating */ -static int dirty[NROWS]; -static int lazy; - static int fgcolor(void) { int c = mode & ATTR_REV ? bg : fg; @@ -82,12 +81,10 @@ static void _draw_row(int r) static int candraw(int sr, int er) { int i; - if (visible && !lazy) - return 1; - if (visible && lazy) + if (lazy) for (i = sr; i < er; i++) dirty[i] = 1; - return 0; + return visible && !lazy; } static void draw_rows(int sr, int er) @@ -124,7 +121,7 @@ static void draw_cursor(int put) static void lazy_start(void) { - memset(dirty, 0, sizeof(dirty)); + memset(dirty, 0, sizeof(term->dirty)); lazy = 1; } @@ -133,17 +130,18 @@ static void lazy_flush(void) int i; if (!visible || !lazy) return; - _draw_pos(row, col, 0); for (i = 0; i < pad_rows(); i++) if (dirty[i]) _draw_row(i); - _draw_pos(row, col, 1); + if (dirty[row]) + _draw_pos(row, col, 1); lazy = 0; } static void screen_reset(int i, int n) { int c; + candraw(i / pad_cols(), (i + n) / pad_cols() + 1); memset(screen + i, 0, n * sizeof(*screen)); for (c = 0; c < n; c++) fgs[i + c] = fg; @@ -153,6 +151,10 @@ static void screen_reset(int i, int n) static void screen_move(int dst, int src, int n) { + if (n > 0) + candraw(MIN(src, dst) / pad_cols(), (MAX(src, dst) + n) / pad_cols() + 1); + else + candraw((MIN(src, dst) + n) / pad_cols(), MAX(src, dst) / pad_cols() + 1); memmove(screen + dst, screen + src, n * sizeof(*screen)); memmove(fgs + dst, fgs + src, n * sizeof(*fgs)); memmove(bgs + dst, bgs + src, n * sizeof(*bgs)); @@ -340,16 +342,21 @@ static void misc_load(struct term_state *state) void term_save(struct term *term) { visible = 0; + if (!lazy) + lazy_start(); misc_save(&term->cur); term->top = top; term->bot = bot; + term->lazy = lazy; } -void term_redraw(void) +void term_redraw(int all) { if (term->fd) { - lazy_start(); - memset(dirty, 1, sizeof(dirty)); + if (all) { + lazy_start(); + memset(dirty, 1, sizeof(term->dirty)); + } lazy_flush(); } else { pad_blank(0); @@ -366,6 +373,8 @@ void term_load(struct term *t, int flags) visible = flags; top = term->top; bot = term->bot; + lazy = term->lazy; + dirty = term->dirty; } void term_end(void) @@ -375,7 +384,7 @@ void term_end(void) memset(term, 0, sizeof(*term)); term_load(term, visible); if (visible) - term_redraw(); + term_redraw(1); } static int writeutf8(char *dst, int c) @@ -450,7 +459,7 @@ void term_hist(int scrl) return; } lazy_start(); - memset(dirty, 1, sizeof(dirty)); + memset(dirty, 1, sizeof(term->dirty)); for (i = 0; i < pad_rows(); i++) { int off = (i - scrl) * pad_cols(); int *_scr = i < scrl ? HISTROW(scrl - i) : term->screen + off; -- 2.11.4.GIT