diff options
Diffstat (limited to 'usr.sbin/sysinstall/dmenu.c')
-rw-r--r-- | usr.sbin/sysinstall/dmenu.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/usr.sbin/sysinstall/dmenu.c b/usr.sbin/sysinstall/dmenu.c index d89f8ce..aed89d8 100644 --- a/usr.sbin/sysinstall/dmenu.c +++ b/usr.sbin/sysinstall/dmenu.c @@ -35,6 +35,7 @@ */ #include "sysinstall.h" +#include <sys/param.h> #include <errno.h> #define MAX_MENU 15 @@ -111,6 +112,21 @@ dmenuSetVariables(dialogMenuItem *tmp) } int +dmenuSetCountryVariable(dialogMenuItem *tmp) +{ + variable_set((char *)tmp->data, FALSE); +#ifdef WITH_SYSCONS + /* Don't prompt the user for a keymap if they're using the default locale. */ + if (!strcmp(variable_get(VAR_COUNTRY), DEFAULT_COUNTRY)) + return DITEM_SUCCESS; + + return keymapMenuSelect(tmp); +#else + return DITEM_SUCCESS; +#endif +} + +int dmenuSetKmapVariable(dialogMenuItem *tmp) { char *lang; @@ -264,6 +280,60 @@ menu_height(DMenu *menu, int n) return n > max ? max : n; } +/* Find a menu item that matches any field. */ +int +dmenuFindItem(DMenu *menu, const char *prompt, const char *title, void *data) +{ + dialogMenuItem *items = menu->items; + int i; + + for (i = 0; items[i].prompt; ++i) + if ((prompt && !strcmp(items[i].prompt, prompt)) || + (title && !strcmp(items[i].title, title)) || + (data && items[i].data == data)) + return i; + + return -1; +} + +/* Set the default item for a menu by index and scroll to it. */ +void +dmenuSetDefaultIndex(DMenu *menu, int *choice, int *scroll, int *curr, int *max) +{ + int nitem; + int height; + + *curr = *max = 0; + + for (nitem = 0; menu->items[nitem].prompt; ++nitem); + + height = menu_height(menu, nitem); + if (*choice > height) + { + *scroll = MIN(nitem - height, *choice); + *choice = *choice - *scroll; + } + else + *scroll = 0; +} + +/* Set the default menu item that matches any field and scroll to it. */ +Boolean +dmenuSetDefaultItem(DMenu *menu, const char *prompt, const char *title, void *data, + int *choice, int *scroll, int *curr, int *max) +{ + if ((*choice = dmenuFindItem(menu, prompt, title, data)) != -1) + { + dmenuSetDefaultIndex(menu, choice, scroll, curr, max); + return TRUE; + } + else + { + *choice = *scroll = *curr = *max = 0; + return FALSE; + } +} + /* Traverse over an internal menu */ Boolean dmenuOpen(DMenu *menu, int *choice, int *scroll, int *curr, int *max, Boolean buttons) |