All current *_post() methods in ui/ncurses call redrawwin() and
wrefresh() together. wrefresh() updates any lines on the screen that
have been marked as changed or invalid. However redrawwin() marks the
entire screen as invalid unconditionally. We can reduce the amount of
data written to the screen by avoiding calls to redrawwin().
Screen transitions are the primary use case of redrawwin(), where the
whole screen must be invalidated to avoid stale data remaining on
screen. All other 'in-screen' updates such as changes to widgets or
changing focus do not require a call to redrawwin(). The most noticeable
performance improvement is in nc-menu, which makes an unnecssary call to
redrawwin() after every addition to the boot option menu.
eg. The number of bytes written to STDOUT in the main menu:
# Boot options | Before | After
--------------------------------
8 | 5488 | 1149
133 | 422454 | 4652
Signed-off-by: Samuel Mendoza-Jonas <sam.mj@au1.ibm.com>
bool exit;
bool show_help;
bool exit;
bool show_help;
void (*on_exit)(struct cui *);
int label_x;
void (*on_exit)(struct cui *);
int label_x;
} else if (screen->show_help) {
screen->show_help = false;
} else if (screen->show_help) {
screen->show_help = false;
+ screen->need_redraw = true;
cui_show_help(screen->cui, _("Retrieve Config"),
&add_url_help_text);
cui_show_help(screen->cui, _("Retrieve Config"),
&add_url_help_text);
struct add_url_screen *screen = add_url_screen_from_scr(scr);
widgetset_post(screen->widgetset);
nc_scr_frame_draw(scr);
struct add_url_screen *screen = add_url_screen_from_scr(scr);
widgetset_post(screen->widgetset);
nc_scr_frame_draw(scr);
- redrawwin(scr->main_ncw);
+ if (screen->need_redraw) {
+ redrawwin(scr->main_ncw);
+ screen->need_redraw = false;
+ }
wrefresh(screen->scr.main_ncw);
return 0;
}
wrefresh(screen->scr.main_ncw);
return 0;
}
screen->on_exit = on_exit;
screen->label_x = 2;
screen->field_x = 25;
screen->on_exit = on_exit;
screen->label_x = 2;
screen->field_x = 25;
+ screen->need_redraw = false;
nc_scr_init(&screen->scr, pb_add_url_screen_sig, 0,
cui, add_url_screen_process_key,
nc_scr_init(&screen->scr, pb_add_url_screen_sig, 0,
cui, add_url_screen_process_key,
void (*on_exit)(struct cui *cui,
struct pmenu_item *item,
struct pb_boot_data *bd);
void (*on_exit)(struct cui *cui,
struct pmenu_item *item,
struct pb_boot_data *bd);
int label_x;
int field_x;
int label_x;
int field_x;
struct boot_editor *boot_editor = boot_editor_from_scr(scr);
widgetset_post(boot_editor->widgetset);
nc_scr_frame_draw(scr);
struct boot_editor *boot_editor = boot_editor_from_scr(scr);
widgetset_post(boot_editor->widgetset);
nc_scr_frame_draw(scr);
- redrawwin(scr->main_ncw);
+ if (boot_editor->need_redraw) {
+ redrawwin(scr->main_ncw);
+ boot_editor->need_redraw = false;
+ }
wrefresh(boot_editor->scr.main_ncw);
pad_refresh(boot_editor);
return 0;
wrefresh(boot_editor->scr.main_ncw);
pad_refresh(boot_editor);
return 0;
break;
case STATE_HELP:
boot_editor->state = STATE_EDIT;
break;
case STATE_HELP:
boot_editor->state = STATE_EDIT;
+ boot_editor->need_redraw = true;
cui_show_help(boot_editor->cui, _("Boot Option Editor"),
&boot_editor_help_text);
break;
cui_show_help(boot_editor->cui, _("Boot Option Editor"),
&boot_editor_help_text);
break;
boot_editor->item = item;
boot_editor->on_exit = on_exit;
boot_editor->state = STATE_EDIT;
boot_editor->item = item;
boot_editor->on_exit = on_exit;
boot_editor->state = STATE_EDIT;
+ boot_editor->need_redraw = false;
int ncols1 = strncols(_("Device tree:"));
int ncols2 = strncols(_("Boot arguments:"));
int ncols1 = strncols(_("Device tree:"));
int ncols2 = strncols(_("Boot arguments:"));
bool exit;
bool show_help;
bool exit;
bool show_help;
void (*on_exit)(struct cui *);
int scroll_y;
void (*on_exit)(struct cui *);
int scroll_y;
} else if (screen->show_help) {
screen->show_help = false;
} else if (screen->show_help) {
screen->show_help = false;
+ screen->need_redraw = true;
cui_show_help(screen->cui, _("System Configuration"),
&config_help_text);
cui_show_help(screen->cui, _("System Configuration"),
&config_help_text);
struct config_screen *screen = config_screen_from_scr(scr);
widgetset_post(screen->widgetset);
nc_scr_frame_draw(scr);
struct config_screen *screen = config_screen_from_scr(scr);
widgetset_post(screen->widgetset);
nc_scr_frame_draw(scr);
- redrawwin(scr->main_ncw);
+ if (screen->need_redraw) {
+ redrawwin(scr->main_ncw);
+ screen->need_redraw = false;
+ }
wrefresh(screen->scr.main_ncw);
pad_refresh(screen);
return 0;
wrefresh(screen->scr.main_ncw);
pad_refresh(screen);
return 0;
screen->cui = cui;
screen->on_exit = on_exit;
screen->cui = cui;
screen->on_exit = on_exit;
+ screen->need_redraw = false;
screen->label_x = 2;
screen->field_x = 17;
screen->label_x = 2;
screen->field_x = 17;
struct lang_screen *screen = lang_screen_from_scr(scr);
widgetset_post(screen->widgetset);
nc_scr_frame_draw(scr);
struct lang_screen *screen = lang_screen_from_scr(scr);
widgetset_post(screen->widgetset);
nc_scr_frame_draw(scr);
- redrawwin(scr->main_ncw);
wrefresh(screen->scr.main_ncw);
pad_refresh(screen);
return 0;
wrefresh(screen->scr.main_ncw);
pad_refresh(screen);
return 0;
result = post_menu(menu->ncm);
nc_scr_frame_draw(scr);
result = post_menu(menu->ncm);
nc_scr_frame_draw(scr);
- redrawwin(menu->scr.main_ncw);
wrefresh(menu->scr.main_ncw);
return result;
wrefresh(menu->scr.main_ncw);
return result;