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 */
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);
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;
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;
}
cf->menu = m;
+
menu_refresh_size(cf);
return m;
}
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))
static int ui_run(struct cfdisk *cf)
{
int rc = 0;
- size_t qitem = 0;
ui_lines = LINES;
ui_cols = COLS;
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;