From 6bdc36b15a15c98bbb33582908740346675485cc Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Thu, 29 Sep 2011 14:04:47 +0200 Subject: Avoid unnecessary window updates Add a window bitmask to wins_update() and only update windows that might actually require an update in our main loop. This improves response times of the user interface a bit. Signed-off-by: Lukas Fleischer --- src/calcurse.c | 93 ++++++++++++++++++++++++++++++++++++++++------------------ src/calcurse.h | 13 ++++++-- src/custom.c | 4 +-- src/wins.c | 64 +++++++++++++++++++++------------------- 4 files changed, 111 insertions(+), 63 deletions(-) diff --git a/src/calcurse.c b/src/calcurse.c index 09a52e0..2540a1f 100644 --- a/src/calcurse.c +++ b/src/calcurse.c @@ -69,7 +69,6 @@ main (int argc, char **argv) int non_interactive; int no_data_file = 1; int cut_item = 0; - unsigned do_update = 1; char *no_color_support = _("Sorry, colors are not supported by your terminal\n" "(Press [ENTER] to continue)"); @@ -167,11 +166,11 @@ main (int argc, char **argv) wins_reinit (); if (notify_bar ()) notify_start_main_thread (); - wins_update (); + wins_update (FLAG_ALL); io_startup_screen (conf.skip_system_dialogs, no_data_file); inday = *day_process_storage (0, 0, &inday); wins_slctd_set (CAL); - wins_update (); + wins_update (FLAG_ALL); calendar_start_date_thread (); if (conf.periodic_save > 0) io_start_psave_thread (&conf); @@ -181,14 +180,15 @@ main (int argc, char **argv) { int key; - do_update = 1; + if (resize) + { + resize = 0; + wins_reset (); + } + key = keys_getch (win[STA].p); switch (key) { - case ERR: - do_update = 0; - break; - case KEY_GENERIC_REDRAW: resize = 1; break; @@ -212,10 +212,12 @@ main (int argc, char **argv) default: break; } + wins_update (FLAG_ALL); break; case KEY_GENERIC_OTHER_CMD: wins_other_status_page (wins_slctd ()); + wins_update (FLAG_STA); break; case KEY_GENERIC_GOTO: @@ -227,6 +229,7 @@ main (int argc, char **argv) else calendar_change_day (conf.input_datefmt); inday = do_storage (1); + wins_update (FLAG_CAL | FLAG_APP | FLAG_STA); break; case KEY_VIEW_ITEM: @@ -234,6 +237,7 @@ main (int argc, char **argv) day_popup_item (); else if ((wins_slctd () == TOD) && (todo_hilt () != 0)) item_in_popup (NULL, NULL, todo_saved_mesg (), _("To do :")); + wins_update (FLAG_ALL); break; case KEY_GENERIC_CONFIG_MENU: @@ -279,23 +283,25 @@ main (int argc, char **argv) continue; } wins_reset (); - wins_update (); + wins_update (FLAG_ALL); wins_erase_status_bar (); custom_config_bar (); inday = do_storage (0); } - wins_update (); + wins_update (FLAG_ALL); break; case KEY_GENERIC_ADD_APPT: apoint_add (); inday = do_storage (1); + wins_update (FLAG_CAL | FLAG_APP | FLAG_STA); break; case KEY_GENERIC_ADD_TODO: todo_new_item (); if (todo_hilt () == 0 && todo_nb () == 1) todo_hilt_increase (); + wins_update (FLAG_TOD | FLAG_STA); break; case KEY_ADD_ITEM: @@ -304,11 +310,13 @@ main (int argc, char **argv) case APP: apoint_add (); inday = do_storage (0); + wins_update (FLAG_CAL | FLAG_APP | FLAG_STA); break; case TOD: todo_new_item (); if (todo_hilt () == 0 && todo_nb () == 1) todo_hilt_increase (); + wins_update (FLAG_TOD | FLAG_STA); break; default: break; @@ -320,9 +328,13 @@ main (int argc, char **argv) { day_edit_item (&conf); inday = do_storage (0); + wins_update (FLAG_CAL | FLAG_APP | FLAG_STA); } else if (wins_slctd () == TOD && todo_hilt () != 0) - todo_edit_item (); + { + todo_edit_item (); + wins_update (FLAG_TOD | FLAG_STA); + } break; case KEY_DEL_ITEM: @@ -330,9 +342,13 @@ main (int argc, char **argv) { apoint_delete (&conf, &inday.nb_events, &inday.nb_apoints); inday = do_storage (0); + wins_update (FLAG_CAL | FLAG_APP | FLAG_STA); } else if (wins_slctd () == TOD && todo_hilt () != 0) - todo_delete (&conf); + { + todo_delete (&conf); + wins_update (FLAG_TOD | FLAG_STA); + } break; case KEY_GENERIC_CUT: @@ -340,6 +356,7 @@ main (int argc, char **argv) { cut_item = apoint_cut (&inday.nb_events, &inday.nb_apoints); inday = do_storage (0); + wins_update (FLAG_CAL | FLAG_APP); } break; @@ -349,6 +366,7 @@ main (int argc, char **argv) apoint_paste (&inday.nb_events, &inday.nb_apoints, cut_item); cut_item = 0; inday = do_storage (0); + wins_update (FLAG_CAL | FLAG_APP); } break; @@ -356,6 +374,7 @@ main (int argc, char **argv) if (wins_slctd () == APP && apoint_hilt () != 0) recur_repeat_item (&conf); inday = do_storage (0); + wins_update (FLAG_CAL | FLAG_APP | FLAG_STA); break; case KEY_FLAG_ITEM: @@ -363,9 +382,13 @@ main (int argc, char **argv) { apoint_switch_notify (); inday = do_storage (0); + wins_update (FLAG_APP); } else if (wins_slctd () == TOD && todo_hilt () != 0) - todo_flag (); + { + todo_flag (); + wins_update (FLAG_TOD); + } break; case KEY_PIPE_ITEM: @@ -373,6 +396,7 @@ main (int argc, char **argv) day_pipe_item (&conf); else if (wins_slctd () == TOD && todo_hilt () != 0) todo_pipe_item (); + wins_update (FLAG_ALL); break; case KEY_RAISE_PRIORITY: @@ -384,6 +408,7 @@ main (int argc, char **argv) todo_set_first (todo_hilt ()); else if (todo_hilt_pos () >= win[TOD].h - 4) todo_set_first (todo_hilt () - win[TOD].h + 5); + wins_update (FLAG_TOD); } break; @@ -395,6 +420,7 @@ main (int argc, char **argv) } else if (wins_slctd () == TOD && todo_hilt () != 0) todo_edit_note (conf.editor); + wins_update (FLAG_ALL); break; case KEY_VIEW_NOTE: @@ -402,21 +428,25 @@ main (int argc, char **argv) day_view_note (conf.pager); else if (wins_slctd () == TOD && todo_hilt () != 0) todo_view_note (conf.pager); + wins_update (FLAG_ALL); break; case KEY_GENERIC_HELP: wins_status_bar (); help_screen (); + wins_update (FLAG_ALL); break; case KEY_GENERIC_SAVE: io_save_cal (&conf, IO_SAVE_DISPLAY_BAR); + wins_update (FLAG_STA); break; case KEY_GENERIC_IMPORT: wins_erase_status_bar (); io_import_data (IO_IMPORT_ICAL, &conf, NULL); inday = do_storage (0); + wins_update (FLAG_ALL); break; case KEY_GENERIC_EXPORT: @@ -436,12 +466,12 @@ main (int argc, char **argv) break; } wins_reset (); - wins_update (); + wins_update (FLAG_ALL); wins_erase_status_bar (); io_export_bar (); } inday = do_storage (0); - wins_update (); + wins_update (FLAG_ALL); break; case KEY_GENERIC_NEXT_DAY: @@ -450,6 +480,7 @@ main (int argc, char **argv) { calendar_move (RIGHT); inday = do_storage (1); + wins_update (FLAG_CAL | FLAG_APP); } break; @@ -459,6 +490,7 @@ main (int argc, char **argv) { calendar_move (LEFT); inday = do_storage (1); + wins_update (FLAG_CAL | FLAG_APP); } break; @@ -468,17 +500,20 @@ main (int argc, char **argv) { calendar_move (UP); inday = do_storage (1); + wins_update (FLAG_CAL | FLAG_APP); } else if ((wins_slctd () == APP) && (apoint_hilt () > 1)) { apoint_hilt_decrease (); apoint_scroll_pad_up (inday.nb_events); + wins_update (FLAG_APP); } else if ((wins_slctd () == TOD) && (todo_hilt () > 1)) { todo_hilt_decrease (); if (todo_hilt_pos () < 0) todo_first_decrease (); + wins_update (FLAG_TOD); } break; @@ -488,18 +523,21 @@ main (int argc, char **argv) { calendar_move (DOWN); inday = do_storage (1); + wins_update (FLAG_CAL | FLAG_APP); } else if ((wins_slctd () == APP) && (apoint_hilt () < inday.nb_events + inday.nb_apoints)) { apoint_hilt_increase (); apoint_scroll_pad_down (inday.nb_events, win[APP].h); + wins_update (FLAG_APP); } else if ((wins_slctd () == TOD) && (todo_hilt () < todo_nb ())) { todo_hilt_increase (); if (todo_hilt_pos () == win[TOD].h - 4) todo_first_increase (); + wins_update (FLAG_TOD); } break; @@ -508,6 +546,7 @@ main (int argc, char **argv) { calendar_move (WEEK_START); inday = do_storage (1); + wins_update (FLAG_CAL | FLAG_APP); } break; @@ -516,17 +555,24 @@ main (int argc, char **argv) { calendar_move (WEEK_END); inday = do_storage (1); + wins_update (FLAG_CAL | FLAG_APP); } break; case KEY_GENERIC_SCROLL_UP: if (wins_slctd () == CAL) - calendar_view_prev (); + { + calendar_view_prev (); + wins_update (FLAG_CAL | FLAG_APP); + } break; case KEY_GENERIC_SCROLL_DOWN: if (wins_slctd () == CAL) - calendar_view_next (); + { + calendar_view_next (); + wins_update (FLAG_CAL | FLAG_APP); + } break; case KEY_GENERIC_QUIT: @@ -544,6 +590,7 @@ main (int argc, char **argv) else { wins_erase_status_bar (); + wins_update (FLAG_STA); break; } } @@ -551,19 +598,9 @@ main (int argc, char **argv) exit_calcurse (EXIT_SUCCESS); break; + case ERR: default: - do_update = 0; break; } - - 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 48325e8..aaf9e24 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -430,6 +430,13 @@ enum win { NBWINS }; +#define FLAG_CAL (1 << CAL) +#define FLAG_APP (1 << APP) +#define FLAG_TOD (1 << TOD) +#define FLAG_NOT (1 << NOT) +#define FLAG_STA (1 << STA) +#define FLAG_ALL ((1 << NBWINS) - 1) + enum ui_mode { UI_CURSES, UI_CMDLINE, @@ -946,9 +953,9 @@ void wins_reinit (void); void wins_reinit_panels (void); void wins_show (WINDOW *, char *); void wins_get_config (void); -void wins_update_border (void); -void wins_update_panels (void); -void wins_update (void); +void wins_update_border (int); +void wins_update_panels (int); +void wins_update (int); void wins_reset (void); void wins_prepare_external (void); void wins_unprepare_external (void); diff --git a/src/custom.c b/src/custom.c index 78a3a6a..50c2e82 100644 --- a/src/custom.c +++ b/src/custom.c @@ -696,8 +696,8 @@ custom_sidebar_config (void) else { wins_reinit_panels (); - wins_update_border (); - wins_update_panels (); + wins_update_border (FLAG_ALL); + wins_update_panels (FLAG_ALL); keys_display_bindings_bar (win[STA].p, binding, 0, binding_size); wins_doupdate (); } diff --git a/src/wins.c b/src/wins.c index 0e4b402..efe324f 100644 --- a/src/wins.c +++ b/src/wins.c @@ -539,37 +539,40 @@ border_nocolor (WINDOW *window) } void -wins_update_border (void) +wins_update_border (int flags) { - switch (slctd_win) + if (flags & FLAG_CAL) { - case CAL: - border_color (win[CAL].p); - border_nocolor (win[APP].p); - border_nocolor (win[TOD].p); - break; - case APP: - border_color (win[APP].p); - border_nocolor (win[CAL].p); - border_nocolor (win[TOD].p); - break; - case TOD: - border_color (win[TOD].p); - border_nocolor (win[APP].p); - border_nocolor (win[CAL].p); - break; - default: - EXIT (_("no window selected")); - /* NOTREACHED */ + if (slctd_win == CAL) + border_color (win[CAL].p); + else + border_nocolor (win[CAL].p); + } + if (flags & FLAG_APP) + { + if (slctd_win == APP) + border_color (win[APP].p); + else + border_nocolor (win[APP].p); + } + if (flags & FLAG_TOD) + { + if (slctd_win == TOD) + border_color (win[TOD].p); + else + border_nocolor (win[TOD].p); } } void -wins_update_panels (void) +wins_update_panels (int flags) { - apoint_update_panel (slctd_win); - todo_update_panel (slctd_win); - calendar_update_panel (&win[CAL]); + if (flags & FLAG_APP) + apoint_update_panel (slctd_win); + if (flags & FLAG_TOD) + todo_update_panel (slctd_win); + if (flags & FLAG_CAL) + calendar_update_panel (&win[CAL]); } /* @@ -577,12 +580,13 @@ wins_update_panels (void) * selected window. */ void -wins_update (void) +wins_update (int flags) { - wins_update_border (); - wins_update_panels (); - wins_status_bar (); - if (notify_bar ()) + wins_update_border (flags); + wins_update_panels (flags); + if (flags & FLAG_STA) + wins_status_bar (); + if ((flags & FLAG_NOT) && notify_bar ()) notify_update_bar (); wmove (win[STA].p, 0, 0); wins_doupdate (); @@ -596,7 +600,7 @@ wins_reset (void) wins_refresh (); curs_set (0); wins_reinit (); - wins_update (); + wins_update (FLAG_ALL); } /* Prepare windows for the execution of an external command. */ -- cgit v1.2.3-70-g09d2