summaryrefslogtreecommitdiffstats
path: root/usr.sbin/sade/dmenu.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/sade/dmenu.c')
-rw-r--r--usr.sbin/sade/dmenu.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/usr.sbin/sade/dmenu.c b/usr.sbin/sade/dmenu.c
index d89f8ce..aed89d8 100644
--- a/usr.sbin/sade/dmenu.c
+++ b/usr.sbin/sade/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)
OpenPOWER on IntegriCloud