From fec37db06bbbdff79bc9816046a76e0b29e173b4 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Tue, 28 Jun 2011 11:05:05 +0200 Subject: Avoid redundant redraws on resize Use a global flag to record whether the terminal was resized instead of redrawing everything each time a KEY_RESIZE is read. Add some additional checks to help_write_pad() as invalid actions may be passed now due to using signals instead of virtual key presses. Signed-off-by: Lukas Fleischer --- src/calcurse.c | 12 +++++++--- src/calcurse.h | 1 + src/custom.c | 72 +++++++++++++++++++++++++++++++++------------------------- src/help.c | 63 +++++++++++++++++++++++++++----------------------- src/notify.c | 33 +++++++++++++++------------ src/sigs.c | 1 + src/vars.c | 1 + 7 files changed, 106 insertions(+), 77 deletions(-) (limited to 'src') diff --git a/src/calcurse.c b/src/calcurse.c index 15ee1bd..662f185 100644 --- a/src/calcurse.c +++ b/src/calcurse.c @@ -179,9 +179,7 @@ main (int argc, char **argv) break; case KEY_GENERIC_REDRAW: - case KEY_RESIZE: - do_update = 0; - wins_reset (); + resize = 1; break; case KEY_GENERIC_CHANGE_VIEW: @@ -567,6 +565,14 @@ main (int argc, char **argv) apoint_hilt_set (1); } } + + if (resize) + { + resize = 0; + do_update = 0; + wins_reset (); + } + if (do_update) wins_update (); } diff --git a/src/calcurse.h b/src/calcurse.h index 34de7ed..6642ae9 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -864,6 +864,7 @@ void psleep (unsigned); /* vars.c */ extern int col, row; +extern int resize; extern unsigned colorize; extern enum ui_mode ui_mode; extern int days[12]; diff --git a/src/custom.c b/src/custom.c index 188ded2..9531eaa 100644 --- a/src/custom.c +++ b/src/custom.c @@ -549,12 +549,6 @@ custom_layout_config (void) need_reset = 0; switch (ch) { - case KEY_RESIZE: - endwin (); - wins_refresh (); - curs_set (0); - need_reset = 1; - break; case KEY_GENERIC_HELP: help_wins_init (&hwin, 0, 0, (notify_bar ()) ? row - 3 : row - 2, col); @@ -588,6 +582,16 @@ custom_layout_config (void) need_reset = 1; break; } + + if (resize) + { + resize = 0; + endwin (); + wins_refresh (); + curs_set (0); + need_reset = 1; + } + display_layout_config (&conf_win, mark, cursor, need_reset); } wins_set_layout (mark + 1); @@ -863,13 +867,6 @@ custom_color_config (void) switch (ch) { - case KEY_RESIZE: - endwin (); - wins_refresh (); - curs_set (0); - need_reset = 1; - break; - case KEY_GENERIC_SELECT: colorize = 1; need_reset = 1; @@ -905,6 +902,16 @@ custom_color_config (void) need_reset = 1; break; } + + if (resize) + { + resize = 0; + endwin (); + wins_refresh (); + curs_set (0); + need_reset = 1; + } + display_color_config (&conf_win, &mark_fore, &mark_back, cursor, need_reset, theme_changed); } @@ -1114,24 +1121,6 @@ custom_general_config (struct conf *conf) switch (ch) { - case KEY_RESIZE: - wins_get_config (); - wins_reset (); - wins_scrollwin_delete (&cwin); - wins_scrollwin_init (&cwin); - custom_set_swsiz (&cwin); - wins_show (cwin.win.p, cwin.label); - cwin.first_visible_line = 0; - delwin (win[STA].p); - win[STA].p = newwin (win[STA].h, win[STA].w, win[STA].y, - win[STA].x); - keypad (win[STA].p, TRUE); - if (notify_bar ()) - { - notify_reinit_bar (); - notify_update_bar (); - } - break; case CTRL ('N'): wins_scrollwin_down (&cwin, 1); break; @@ -1191,6 +1180,27 @@ custom_general_config (struct conf *conf) status_mesg (number_str, keys); break; } + + if (resize) + { + resize = 0; + wins_reset (); + wins_scrollwin_delete (&cwin); + wins_scrollwin_init (&cwin); + custom_set_swsiz (&cwin); + wins_show (cwin.win.p, cwin.label); + cwin.first_visible_line = 0; + delwin (win[STA].p); + win[STA].p = newwin (win[STA].h, win[STA].w, win[STA].y, + win[STA].x); + keypad (win[STA].p, TRUE); + if (notify_bar ()) + { + notify_reinit_bar (); + notify_update_bar (); + } + } + status_mesg (number_str, keys); cwin.total_lines = print_general_options (cwin.pad.p, conf); wins_scrollwin_display (&cwin); diff --git a/src/help.c b/src/help.c index edc916e..3f4f7c7 100644 --- a/src/help.c +++ b/src/help.c @@ -107,7 +107,7 @@ help_write_pad (struct window *win, char *title, char *text, enum key action) erase_window_part (win->p, rownum, colnum, BUFSIZ, win->w); custom_apply_attr (win->p, ATTR_HIGHEST); mvwprintw (win->p, rownum, colnum, "%s", title); - if ((int) action != KEY_RESIZE) { + if ((int) action != KEY_RESIZE && action < NBKEYS) { switch (action) { case KEY_END_OF_WEEK: @@ -131,8 +131,12 @@ help_write_pad (struct window *win, char *title, char *text, enum key action) break; default: bindings = keys_action_allkeys (action); - colnum = win->w - strlen (bindings_title) - strlen (bindings); - mvwprintw (win->p, rownum, colnum, bindings_title, bindings); + + if (bindings) + { + colnum = win->w - strlen (bindings_title) - strlen (bindings); + mvwprintw (win->p, rownum, colnum, bindings_title, bindings); + } } } colnum = 0; @@ -744,34 +748,35 @@ help_screen (void) erase_window_part (hwin.win.p, 1, hwin.pad.y, col - 2, hwin.win.h - 2); - if ((int) ch == KEY_RESIZE) { - wins_get_config (); - help_wins_reset (&hwin); - hwin.first_visible_line = 0; - hwin.total_lines = help_write_pad (&hwin.pad, hscr[oldpage].title, - hscr[oldpage].text, ch); - need_resize = 1; + switch (ch) { + case KEY_GENERIC_SCROLL_DOWN: + wins_scrollwin_down (&hwin, 1); + break; + + case KEY_GENERIC_SCROLL_UP: + wins_scrollwin_up (&hwin, 1); + break; + + default: + page = wanted_page (ch); + if (page != NOPAGE) { + hwin.first_visible_line = 0; + hwin.total_lines = help_write_pad (&hwin.pad, hscr[page].title, + hscr[page].text, ch); + oldpage = page; + } } - else { - switch (ch) { - case KEY_GENERIC_SCROLL_DOWN: - wins_scrollwin_down (&hwin, 1); - break; - - case KEY_GENERIC_SCROLL_UP: - wins_scrollwin_up (&hwin, 1); - break; - - default: - page = wanted_page (ch); - if (page != NOPAGE) { - hwin.first_visible_line = 0; - hwin.total_lines = help_write_pad (&hwin.pad, hscr[page].title, - hscr[page].text, ch); - oldpage = page; - } + + if (resize) + { + resize = 0; + wins_get_config (); + help_wins_reset (&hwin); + hwin.first_visible_line = 0; + hwin.total_lines = help_write_pad (&hwin.pad, hscr[oldpage].title, + hscr[oldpage].text, ch); + need_resize = 1; } - } wins_scrollwin_display (&hwin); ch = keys_getch (win[STA].p); diff --git a/src/notify.c b/src/notify.c index d66cf80..14a5f0c 100644 --- a/src/notify.c +++ b/src/notify.c @@ -728,20 +728,6 @@ notify_config_bar (void) switch (ch) { - case KEY_RESIZE: - wins_get_config (); - wins_reset (); - reinit_conf_win (&cwin); - delwin (win[STA].p); - win[STA].p = newwin (win[STA].h, win[STA].w, win[STA].y, - win[STA].x); - keypad (win[STA].p, TRUE); - if (notify_bar ()) - { - notify_reinit_bar (); - notify_update_bar (); - } - break; case CTRL ('N'): wins_scrollwin_down (&cwin, 1); break; @@ -815,6 +801,25 @@ notify_config_bar (void) dmon.log = !dmon.log; break; } + + if (resize) + { + resize = 0; + wins_get_config (); + wins_reset (); + reinit_conf_win (&cwin); + delwin (win[STA].p); + win[STA].p = newwin (win[STA].h, win[STA].w, win[STA].y, + win[STA].x); + keypad (win[STA].p, TRUE); + if (notify_bar ()) + { + notify_reinit_bar (); + notify_update_bar (); + } + clearok (curscr, TRUE); + } + status_mesg (number_str, keys); cwin.total_lines = print_config_options (cwin.pad.p); wins_scrollwin_display (&cwin); diff --git a/src/sigs.c b/src/sigs.c index dabb1cb..a5f7e54 100644 --- a/src/sigs.c +++ b/src/sigs.c @@ -59,6 +59,7 @@ generic_hdlr (int sig) ; break; case SIGWINCH: + resize = 1; clearok (curscr, TRUE); (void)ungetch (KEY_RESIZE); break; diff --git a/src/vars.c b/src/vars.c index 3a790f1..4b1d7cd 100644 --- a/src/vars.c +++ b/src/vars.c @@ -43,6 +43,7 @@ * variables to store window size */ int col = 0, row = 0; +int resize = 0; /* variable to tell if the terminal supports color */ unsigned colorize = 0; -- cgit v1.2.3-54-g00ecf