summaryrefslogtreecommitdiffstats
path: root/ui/ncurses/nc-boot-editor.c
diff options
context:
space:
mode:
authorSamuel Mendoza-Jonas <sam.mj@au1.ibm.com>2015-02-04 12:02:23 +1100
committerSamuel Mendoza-Jonas <sam.mj@au1.ibm.com>2015-02-16 14:25:23 +1100
commit91143069d1a40cefd997522d85cb2d8adf1681f7 (patch)
treebda3d7e66f2c6c927309987d693585965d43bbde /ui/ncurses/nc-boot-editor.c
parent7b67c329067af30ffd2a1dd44cd938a7ee55af56 (diff)
downloadtalos-petitboot-91143069d1a40cefd997522d85cb2d8adf1681f7.tar.gz
talos-petitboot-91143069d1a40cefd997522d85cb2d8adf1681f7.zip
ui/ncurses: Reduce unnecessary calls to redrawwin
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>
Diffstat (limited to 'ui/ncurses/nc-boot-editor.c')
-rw-r--r--ui/ncurses/nc-boot-editor.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/ui/ncurses/nc-boot-editor.c b/ui/ncurses/nc-boot-editor.c
index f78da56..274bd9d 100644
--- a/ui/ncurses/nc-boot-editor.c
+++ b/ui/ncurses/nc-boot-editor.c
@@ -44,6 +44,7 @@ struct boot_editor {
void (*on_exit)(struct cui *cui,
struct pmenu_item *item,
struct pb_boot_data *bd);
+ bool need_redraw;
int label_x;
int field_x;
@@ -111,7 +112,10 @@ static int boot_editor_post(struct nc_scr *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;
@@ -231,6 +235,7 @@ static void boot_editor_process_key(struct nc_scr *scr, int key)
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;
@@ -568,6 +573,7 @@ struct boot_editor *boot_editor_init(struct cui *cui,
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:"));
OpenPOWER on IntegriCloud