From b5ef65a931ebc9111eaaa03df1db5cb9afaaa8cf Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 3 Feb 2015 10:37:33 +0100 Subject: cfdisk: force main menu to default to Quit/New menu items Reported-by: Benno Schulenberg Signed-off-by: Karel Zak --- disk-utils/cfdisk.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) (limited to 'disk-utils/cfdisk.c') diff --git a/disk-utils/cfdisk.c b/disk-utils/cfdisk.c index 042579138..ebd1e8ff5 100644 --- a/disk-utils/cfdisk.c +++ b/disk-utils/cfdisk.c @@ -155,6 +155,7 @@ struct cfdisk_menu { size_t nitems; /* number of the active menu items */ size_t page_sz;/* when menu longer than screen */ size_t idx; /* the current menu item */ + int prefkey;/* preferred menu item */ struct cfdisk_menu *prev; /* @ignore keys generator */ @@ -729,7 +730,7 @@ static void menu_update_ignore(struct cfdisk *cf) char ignore[128] = { 0 }; int i = 0; struct cfdisk_menu *m; - struct cfdisk_menuitem *d, *org; + struct cfdisk_menuitem *d, *org = NULL; size_t idx; assert(cf); @@ -737,19 +738,20 @@ static void menu_update_ignore(struct cfdisk *cf) assert(cf->menu->ignore_cb); m = cf->menu; - org = menu_get_menuitem(cf, m->idx); - DBG(MENU, ul_debug("update menu ignored keys")); i = m->ignore_cb(cf, ignore, sizeof(ignore)); ignore[i] = '\0'; /* return if no change */ - if ( (!m->ignore && !*ignore) + if ((!m->ignore && !*ignore) || (m->ignore && *ignore && strcmp(m->ignore, ignore) == 0)) { return; } + if (!m->prefkey) + org = menu_get_menuitem(cf, m->idx); + free(m->ignore); m->ignore = xstrdup(ignore); m->nitems = 0; @@ -760,9 +762,13 @@ static void menu_update_ignore(struct cfdisk *cf) m->nitems++; } + DBG(MENU, ul_debug("update menu preferred keys")); + /* refresh menu index to be at the same menuitem or go to the first */ if (org && menu_get_menuitem_by_key(cf, org->key, &idx)) m->idx = idx; + else if (m->prefkey && menu_get_menuitem_by_key(cf, m->prefkey, &idx)) + m->idx = idx; else m->idx = 0; @@ -792,6 +798,7 @@ static struct cfdisk_menu *menu_push( } cf->menu = m; + menu_refresh_size(cf); return m; } @@ -1858,7 +1865,9 @@ static int main_menu_ignore_keys(struct cfdisk *cf, char *ignore, ignore[i++] = 'd'; /* delete */ ignore[i++] = 't'; /* set type */ ignore[i++] = 'b'; /* set bootable */ + cf->menu->prefkey = 'n'; } else { + cf->menu->prefkey = 'q'; ignore[i++] = 'n'; if (!fdisk_is_label(cf->cxt, DOS) && !fdisk_is_label(cf->cxt, SGI)) @@ -2072,7 +2081,6 @@ static void ui_resize_refresh(struct cfdisk *cf) static int ui_run(struct cfdisk *cf) { int rc = 0; - size_t qitem = 0; ui_lines = LINES; ui_cols = COLS; @@ -2095,9 +2103,6 @@ static int ui_run(struct cfdisk *cf) menu_push(cf, main_menuitems); cf->menu->ignore_cb = main_menu_ignore_keys; - if (menu_get_menuitem_by_key(cf, 'q', &qitem)) - cf->menu->idx = qitem; - rc = ui_refresh(cf); if (rc) return rc; -- cgit v1.2.3-55-g7522