From fa37257ce072c7faac7d0fedbd37a99774cb9267 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Sun, 24 Jun 2012 14:45:55 +0200 Subject: menu: use read_key We have the read_key function which reads a key and parses escape sequences. Use it in the menu instead of reimplementing this manually. Signed-off-by: Sascha Hauer --- common/menu.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) (limited to 'common/menu.c') diff --git a/common/menu.c b/common/menu.c index 6c530b6f86..cb2a6fe163 100644 --- a/common/menu.c +++ b/common/menu.c @@ -297,7 +297,6 @@ static int menu_alloc_display_buffer(struct menu *m) int menu_show(struct menu *m) { int ch, ch_previous = 0; - int escape = 0; int countdown; int auto_display_len = 16; uint64_t start, second; @@ -347,19 +346,12 @@ int menu_show(struct menu *m) if (m->auto_select >= 0) ch = KEY_RETURN; else - ch = getc(); + ch = read_key(); m->auto_select = -1; - switch(ch) { - case 0x1b: - escape = 1; - break; - case '[': - if (escape) - break; - case 'A': /* up */ - escape = 0; + switch (ch) { + case KEY_UP: print_menu_entry(m, m->selected, 0); m->selected = list_entry(m->selected->list.prev, struct menu_entry, list); @@ -369,8 +361,7 @@ int menu_show(struct menu *m) } print_menu_entry(m, m->selected, 1); break; - case 'B': /* down */ - escape = 0; + case KEY_DOWN: print_menu_entry(m, m->selected, 0); m->selected = list_entry(m->selected->list.next, struct menu_entry, list); -- cgit v1.2.3 From 4f02e70d6d04ee949ceee6c1aaec1a2d804fe8a1 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Sun, 24 Jun 2012 14:53:10 +0200 Subject: menu: store repaint state in variable Instead of calling print_menu_entry multiple times in each case, store the repaint state in a variable and call it once at the end to save a few bytes of binary space. Signed-off-by: Sascha Hauer --- common/menu.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'common/menu.c') diff --git a/common/menu.c b/common/menu.c index cb2a6fe163..0f5df2cb00 100644 --- a/common/menu.c +++ b/common/menu.c @@ -343,6 +343,9 @@ int menu_show(struct menu *m) gotoXY(m->selected->num + 1, 3); do { + struct menu_entry *old_selected = m->selected; + int repaint = 0; + if (m->auto_select >= 0) ch = KEY_RETURN; else @@ -352,24 +355,22 @@ int menu_show(struct menu *m) switch (ch) { case KEY_UP: - print_menu_entry(m, m->selected, 0); m->selected = list_entry(m->selected->list.prev, struct menu_entry, list); if (&(m->selected->list) == &(m->entries)) { m->selected = list_entry(m->selected->list.prev, struct menu_entry, list); } - print_menu_entry(m, m->selected, 1); + repaint = 1; break; case KEY_DOWN: - print_menu_entry(m, m->selected, 0); m->selected = list_entry(m->selected->list.next, struct menu_entry, list); if (&(m->selected->list) == &(m->entries)) { m->selected = list_entry(m->selected->list.next, struct menu_entry, list); } - print_menu_entry(m, m->selected, 1); + repaint = 1; break; case ' ': if (m->selected->type != MENU_ENTRY_BOX) @@ -377,7 +378,7 @@ int menu_show(struct menu *m) m->selected->box_state = !m->selected->box_state; if (m->selected->action) m->selected->action(m, m->selected); - print_menu_entry(m, m->selected, 1); + repaint = 1; break; case KEY_ENTER: if (ch_previous == KEY_RETURN) @@ -395,6 +396,12 @@ int menu_show(struct menu *m) default: break; } + + if (repaint) { + print_menu_entry(m, old_selected, 0); + print_menu_entry(m, m->selected, 1); + } + ch_previous = ch; } while(1); -- cgit v1.2.3 From 13b70bb921e0d3ce8986e382ad76af2e7f877fde Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Sun, 24 Jun 2012 14:47:34 +0200 Subject: menu: implement KEY_HOME/KEY_END To go to the first/last menu entry. Signed-off-by: Sascha Hauer --- common/menu.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'common/menu.c') diff --git a/common/menu.c b/common/menu.c index 0f5df2cb00..c50f6dd98e 100644 --- a/common/menu.c +++ b/common/menu.c @@ -393,6 +393,15 @@ int menu_show(struct menu *m) return m->selected->num; else print_menu(m); + break; + case KEY_HOME: + m->selected = list_first_entry(&m->entries, struct menu_entry, list); + repaint = 1; + break; + case KEY_END: + m->selected = list_last_entry(&m->entries, struct menu_entry, list); + repaint = 1; + break; default: break; } -- cgit v1.2.3