Author: fjoe
Date: Thu Nov 24 18:37:16 2011
New Revision: 227944
URL: http://svn.freebsd.org/changeset/base/227944

Log:
  Port to new libdialog.

Modified:
  head/usr.sbin/sade/Makefile
  head/usr.sbin/sade/devices.c
  head/usr.sbin/sade/disks.c
  head/usr.sbin/sade/dmenu.c
  head/usr.sbin/sade/install.c
  head/usr.sbin/sade/label.c
  head/usr.sbin/sade/main.c
  head/usr.sbin/sade/menus.c
  head/usr.sbin/sade/misc.c
  head/usr.sbin/sade/msg.c
  head/usr.sbin/sade/sade.h
  head/usr.sbin/sade/system.c

Modified: head/usr.sbin/sade/Makefile
==============================================================================
--- head/usr.sbin/sade/Makefile Thu Nov 24 17:58:14 2011        (r227943)
+++ head/usr.sbin/sade/Makefile Thu Nov 24 18:37:16 2011        (r227944)
@@ -19,9 +19,10 @@ WARNS?=      3
 .if ${MACHINE} == "pc98"
 CFLAGS+= -DPC98
 .endif
-CFLAGS+= -I${.CURDIR}/../../gnu/lib/libodialog -I.
+CFLAGS+= -I${.CURDIR}/../../contrib/dialog -I.
+DEBUG_FLAGS= -O0 -g
 
-DPADD= ${LIBODIALOG} ${LIBNCURSES} ${LIBUTIL} ${LIBDISK}
-LDADD= -lodialog -lncurses -lutil -ldisk
+DPADD= ${LIBDIALOG} ${LIBNCURSESW} ${LIBM} ${LIBUTIL} ${LIBDISK}
+LDADD= -ldialog -lncursesw -lm -lutil -ldisk
 
 .include <bsd.prog.mk>

Modified: head/usr.sbin/sade/devices.c
==============================================================================
--- head/usr.sbin/sade/devices.c        Thu Nov 24 17:58:14 2011        
(r227943)
+++ head/usr.sbin/sade/devices.c        Thu Nov 24 18:37:16 2011        
(r227944)
@@ -29,7 +29,6 @@
  *
  */
 
-#include "sade.h"
 #include <sys/fcntl.h>
 #include <sys/param.h>
 #include <sys/socket.h>
@@ -40,6 +39,8 @@
 #include <ctype.h>
 #include <libdisk.h>
 
+#include "sade.h"
+
 /* how much to bias minor number for a given /dev/<ct#><un#>s<s#> slice */
 #define SLICE_DELTA    (0x10000)
 
@@ -247,7 +248,7 @@ deviceGetAll(void)
        }
        free(names);
     }
-    dialog_clear_norefresh();
+    dlg_clear();
 }
 
 /* Rescan all devices, after closing previous set - convenience function */

Modified: head/usr.sbin/sade/disks.c
==============================================================================
--- head/usr.sbin/sade/disks.c  Thu Nov 24 17:58:14 2011        (r227943)
+++ head/usr.sbin/sade/disks.c  Thu Nov 24 18:37:16 2011        (r227944)
@@ -113,7 +113,7 @@ check_geometry(Disk *d)
     if (d->bios_cyl > 65536 || d->bios_hd > 256 || d->bios_sect >= 64)
 #endif
     {
-       dialog_clear_norefresh();
+       dlg_clear();
        sg = msgYesNo("WARNING:  It is safe to use a geometry of %lu/%lu/%lu 
for %s on\n"
                      "computers with modern BIOS versions.  If this disk is to 
be used\n"
                      "on an old machine it is recommended that it does not 
have more\n"
@@ -223,21 +223,21 @@ getBootMgr(char *dname, u_char **bootipl
     char *cp;
     int i = 0;
 
+    dlg_clr_result();
     cp = variable_get(VAR_BOOTMGR);
     if (!cp) {
        /* Figure out what kind of IPL the user wants */
        sprintf(str, "Install Boot Manager for drive %s?", dname);
        MenuIPLType.title = str;
-       i = dmenuOpenSimple(&MenuIPLType, FALSE);
+       i = dmenuOpen(&MenuIPLType);
     } else {
        if (!strncmp(cp, "boot", 4))
-           BootMgr = 0;
+            dlg_add_result(MenuIPLType.items[0].prompt);
        else
-           BootMgr = 1;
+            dlg_add_result(MenuIPLType.items[1].prompt);
     }
     if (cp || i) {
-       switch (BootMgr) {
-       case 0:
+        if (!strcmp(dialog_vars.input_result, MenuIPLType.items[0].prompt)) {
            if (!boot0) boot0 = bootalloc("boot0", &boot0_size);
            *bootipl = boot0;
            *bootipl_size = boot0_size;
@@ -245,10 +245,7 @@ getBootMgr(char *dname, u_char **bootipl
            *bootmenu = boot05;
            *bootmenu_size = boot05_size;
            return;
-       case 1:
-       default:
-           break;
-       }
+        }
     }
     *bootipl = NULL;
     *bootipl_size = 0;
@@ -266,36 +263,33 @@ getBootMgr(char *dname, u_char **bootCod
     char *cp;
     int i = 0;
 
+    dlg_clr_result();
     cp = variable_get(VAR_BOOTMGR);
     if (!cp) {
        /* Figure out what kind of MBR the user wants */
        sprintf(str, "Install Boot Manager for drive %s?", dname);
        MenuMBRType.title = str;
-       i = dmenuOpenSimple(&MenuMBRType, FALSE);
+       i = dmenuOpen(&MenuMBRType);
     }
     else {
+       if (!strcmp(cp, "standard"))
+            dlg_add_result(MenuMBRType.items[0].prompt);
        if (!strncmp(cp, "boot", 4))
-           BootMgr = 0;
-       else if (!strcmp(cp, "standard"))
-           BootMgr = 1;
+            dlg_add_result(MenuMBRType.items[1].prompt);
        else
-           BootMgr = 2;
+            dlg_add_result(MenuMBRType.items[2].prompt);
     }
     if (cp || i) {
-       switch (BootMgr) {
-       case 0:
-           if (!boot0) boot0 = bootalloc("boot0", &boot0_size);
-           *bootCode = boot0;
-           *bootCodeSize = boot0_size;
-           return;
-       case 1:
+        if (!strcmp(dialog_vars.input_result, MenuMBRType.items[0].prompt)) {
            if (!mbr) mbr = bootalloc("mbr", &mbr_size);
            *bootCode = mbr;
            *bootCodeSize = mbr_size;
            return;
-       case 2:
-       default:
-           break;
+       } else if (!strcmp(dialog_vars.input_result, 
MenuMBRType.items[1].prompt)) {
+           if (!boot0) boot0 = bootalloc("boot0", &boot0_size);
+           *bootCode = boot0;
+           *bootCodeSize = boot0_size;
+           return;
        }
     }
 #endif
@@ -333,7 +327,7 @@ diskPartition(Device *dev)
 
     /* Flush both the dialog and curses library views of the screen
        since we don't always know who called us */
-    dialog_clear_norefresh(), clear();
+    dlg_clear(), clear();
     current_chunk = 0;
 
     /* Set up the chunk array */
@@ -705,12 +699,15 @@ diskPartition(Device *dev)
     p = CheckRules(d);
     if (p) {
        char buf[FILENAME_MAX];
-       
-        use_helpline("Press F1 to read more about disk slices.");
-       use_helpfile(systemHelpFile("partition", buf));
+       DIALOG_VARS save_vars;
+
+       dlg_save_vars(&save_vars);
+        dialog_vars.help_line = "Press F1 to read more about disk slices.";
+       dialog_vars.help_file = systemHelpFile("partition", buf);
        if (!variable_get(VAR_NO_WARN))
-           dialog_mesgbox("Disk slicing warning:", p, -1, -1);
+           xdialog_msgbox("Disk slicing warning:", p, -1, -1, 1);
        free(p);
+       dlg_restore_vars(&save_vars);
     }
     restorescr(w);
 }
@@ -751,7 +748,7 @@ bootalloc(char *name, size_t *size)
 }
 #endif /* !__ia64__ */
 
-#ifdef WITH_SLICES
+#ifdef WITH_SLICES 
 static int
 partitionHook(dialogMenuItem *selected)
 {
@@ -804,7 +801,7 @@ diskPartitionEditor(dialogMenuItem *self
                return DITEM_FAILURE;
            }
 
-           result = dmenuOpenSimple(menu, FALSE) ? DITEM_SUCCESS : 
DITEM_FAILURE;
+           result = dmenuOpen(menu) ? DITEM_SUCCESS : DITEM_FAILURE;
            free(menu);
            return result;
        }

Modified: head/usr.sbin/sade/dmenu.c
==============================================================================
--- head/usr.sbin/sade/dmenu.c  Thu Nov 24 17:58:14 2011        (r227943)
+++ head/usr.sbin/sade/dmenu.c  Thu Nov 24 18:37:16 2011        (r227944)
@@ -34,196 +34,6 @@
 
 #define MAX_MENU               15
 
-static Boolean exited;
-
-int
-dmenuDisplayFile(dialogMenuItem *tmp)
-{
-    systemDisplayHelp((char *)tmp->data);
-    return DITEM_SUCCESS;
-}
-
-int
-dmenuSubmenu(dialogMenuItem *tmp)
-{
-    return (dmenuOpenSimple((DMenu *)(tmp->data), FALSE) ? DITEM_SUCCESS : 
DITEM_FAILURE);
-}
-
-int
-dmenuSystemCommand(dialogMenuItem *self)
-{
-    WINDOW *w = NULL;  /* Keep lint happy */
-
-    /* If aux is set, the command is known not to produce any screen-spoiling 
output */
-    if (!self->aux)
-       w = savescr();
-    systemExecute((char *)self->data);
-    if (!self->aux)
-       restorescr(w);
-    return DITEM_SUCCESS;
-}
-
-int
-dmenuSystemCommandBox(dialogMenuItem *tmp)
-{
-    WINDOW *w = savescr();
-    
-    use_helpfile(NULL);
-    use_helpline("Select OK to dismiss this dialog");
-    dialog_prgbox(tmp->title, (char *)tmp->data, 22, 76, 1, 1);
-    restorescr(w);
-    return DITEM_SUCCESS;
-}
-
-int
-dmenuExit(dialogMenuItem *tmp)
-{
-    exited = TRUE;
-    return DITEM_LEAVE_MENU;
-}
-
-int
-dmenuSetVariable(dialogMenuItem *tmp)
-{
-    variable_set((char *)tmp->data, *((char *)tmp->data) != '_');
-    return DITEM_SUCCESS;
-}
-
-int
-dmenuSetVariables(dialogMenuItem *tmp)
-{
-    char *cp1, *cp2;
-    char *copy = strdup((char *)tmp->data);
-
-    for (cp1 = copy; cp1 != NULL;) {
-       cp2 = index(cp1, ',');
-       if (cp2 != NULL) *cp2++ = '\0';
-       variable_set(cp1, *cp1 != '_');
-       cp1 = cp2;
-    }
-    free(copy);
-    return DITEM_SUCCESS;
-}
-
-int
-dmenuToggleVariable(dialogMenuItem *tmp)
-{
-    char *var, *cp;
-    int status;
-
-    if (!(var = strdup((char *)tmp->data))) {
-       msgConfirm("Incorrect data field for `%s'!", tmp->title);
-       return DITEM_FAILURE;
-    }
-    if (!(cp = index(var, '='))) {
-       msgConfirm("Data field for %s is not in var=value format!", tmp->title);
-       return DITEM_FAILURE;
-    }
-    status = variable_check(var);
-    *cp = '\0';
-    variable_set2(var, status ? "NO" : "YES", *var != '_');
-    free(var);
-    return DITEM_SUCCESS;
-}
-
-int
-dmenuISetVariable(dialogMenuItem *tmp)
-{
-    char *ans, *var;
-
-    if (!(var = (char *)tmp->data)) {
-       msgConfirm("Incorrect data field for `%s'!", tmp->title);
-       return DITEM_FAILURE;
-    }
-    ans = msgGetInput(variable_get(var), tmp->title, 1);
-    if (!ans)
-       return DITEM_FAILURE;
-    else if (!*ans)
-       variable_unset(var);
-    else
-       variable_set2(var, ans, *var != '_');
-    return DITEM_SUCCESS;
-}
-
-int
-dmenuSetFlag(dialogMenuItem *tmp)
-{
-    if (*((unsigned int *)tmp->data) & tmp->aux)
-       *((unsigned int *)tmp->data) &= ~tmp->aux;
-    else
-       *((unsigned int *)tmp->data) |= tmp->aux;
-    return DITEM_SUCCESS;
-}
-
-int
-dmenuSetValue(dialogMenuItem *tmp)
-{
-    *((unsigned int *)tmp->data) = tmp->aux;
-    return DITEM_SUCCESS;
-}
-
-/* Traverse menu but give user no control over positioning */
-Boolean
-dmenuOpenSimple(DMenu *menu, Boolean buttons)
-{
-    int choice, scroll, curr, max;
-
-    choice = scroll = curr = max = 0;
-    return dmenuOpen(menu, &choice, &scroll, &curr, &max, buttons);
-}
-
-/* Work functions for the state hook */
-int
-dmenuFlagCheck(dialogMenuItem *item)
-{
-    return (*((unsigned int *)item->data) & item->aux);
-}
-
-int
-dmenuVarCheck(dialogMenuItem *item)
-{
-    char *w;
-
-    w = (char *)item->aux;
-    if (!w)
-       w = (char *)item->data;
-    return variable_check(w);
-}
-
-int
-dmenuVarsCheck(dialogMenuItem *item)
-{
-    int res, init;
-    char *w, *cp1, *cp2;
-    char *copy;
-
-    w = (char *)item->aux;
-    if (!w)
-       w = (char *)item->data;
-    if (!w)
-       return FALSE;
-    
-    copy = strdup(w);
-    res = TRUE;
-    init = FALSE;
-    for (cp1 = copy; cp1 != NULL;) {
-        init = TRUE;
-       cp2 = index(cp1, ',');
-       if (cp2 != NULL)
-           *cp2++ = '\0';
-       res = res && variable_check(cp1);
-       cp1 = cp2;
-    }
-    free(copy);
-    return res && init;
-}
-
-int
-dmenuRadioCheck(dialogMenuItem *item)
-{
-    return (*((long *)item->data) == item->aux);
-}
-
 static int
 menu_height(DMenu *menu, int n)
 {
@@ -242,54 +52,42 @@ menu_height(DMenu *menu, int n)
 
 /* Traverse over an internal menu */
 Boolean
-dmenuOpen(DMenu *menu, int *choice, int *scroll, int *curr, int *max, Boolean 
buttons)
+dmenuOpen(DMenu *menu)
 {
     int n, rval = 0;
-    dialogMenuItem *items;
 
-    items = menu->items;
-    if (buttons)
-       items += 2;
     /* Count up all the items */
-    for (n = 0; items[n].title; n++);
+    for (n = 0; menu->items[n].title; n++)
+           ;
 
     while (1) {
        char buf[FILENAME_MAX];
+       DIALOG_VARS save_vars;
        WINDOW *w = savescr();
 
        /* Any helpful hints, put 'em up! */
-       use_helpline(menu->helpline);
-       use_helpfile(systemHelpFile(menu->helpfile, buf));
-       dialog_clear_norefresh();
+       dlg_save_vars(&save_vars);
+       dialog_vars.help_line = menu->helpline;
+       dialog_vars.help_file = systemHelpFile(menu->helpfile, buf);
+       dlg_clear();
        /* Pop up that dialog! */
-       if (menu->type & DMENU_NORMAL_TYPE)
-           rval = dialog_menu((u_char *)menu->title, (u_char *)menu->prompt,
-               -1, -1, menu_height(menu, n), -n, items,
-               (char *)(uintptr_t)buttons, choice, scroll);
-
-       else if (menu->type & DMENU_RADIO_TYPE)
-           rval = dialog_radiolist((u_char *)menu->title,
-               (u_char *)menu->prompt, -1, -1, menu_height(menu, n), -n,
-               items, (char *)(uintptr_t)buttons);
-
-       else if (menu->type & DMENU_CHECKLIST_TYPE)
-           rval = dialog_checklist((u_char *)menu->title,
-               (u_char *)menu->prompt, -1, -1, menu_height(menu, n), -n,
-               items, (char *)(uintptr_t)buttons);
-       else
+       if (menu->type & DMENU_NORMAL_TYPE) {
+           rval = xdialog_menu(menu->title, menu->prompt,
+               -1, -1, menu_height(menu, n), n, menu->items);
+       } else if (menu->type & DMENU_RADIO_TYPE) {
+           rval = xdialog_radiolist(menu->title, menu->prompt,
+               -1, -1, menu_height(menu, n), n, menu->items);
+       } else {
            msgFatal("Menu: `%s' is of an unknown type\n", menu->title);
-       if (exited) {
-           exited = FALSE;
-           restorescr(w);
-           return TRUE;
        }
-       else if (rval) {
+       dlg_restore_vars(&save_vars);
+       if (rval) {
            restorescr(w);
            return FALSE;
-       }
-       else if (menu->type & DMENU_SELECTION_RETURNS) {
+       } else if (menu->type & DMENU_SELECTION_RETURNS) {
            restorescr(w);
            return TRUE;
-       }
+       } else
+           delwin(w);
     }
 }

Modified: head/usr.sbin/sade/install.c
==============================================================================
--- head/usr.sbin/sade/install.c        Thu Nov 24 17:58:14 2011        
(r227943)
+++ head/usr.sbin/sade/install.c        Thu Nov 24 18:37:16 2011        
(r227944)
@@ -29,7 +29,6 @@
  *
  */
 
-#include "sade.h"
 #include <ctype.h>
 #include <sys/consio.h>
 #include <sys/disklabel.h>
@@ -51,6 +50,8 @@
 #include <unistd.h>
 #include <termios.h>
 
+#include "sade.h"
+
 #define TERMCAP_FILE   "/usr/share/misc/termcap"
 
 Boolean
@@ -177,7 +178,7 @@ installFilesystems(Device *dev)
                     sprintf(fname, "/dev/%s", c2->name);
                     i = (Fake || swapon(fname));
                     if (!i) {
-                        dialog_clear_norefresh();
+                        dlg_clear();
                         msgNotify("Added %s as an additional swap device", 
fname);
                     }
                     else {
@@ -209,7 +210,7 @@ installFilesystems(Device *dev)
 
     command_sort();
     command_execute();
-    dialog_clear_norefresh();
+    dlg_clear();
     return DITEM_SUCCESS | DITEM_RESTORE;
 }
 

Modified: head/usr.sbin/sade/label.c
==============================================================================
--- head/usr.sbin/sade/label.c  Thu Nov 24 17:58:14 2011        (r227943)
+++ head/usr.sbin/sade/label.c  Thu Nov 24 18:37:16 2011        (r227944)
@@ -29,7 +29,7 @@
  *
  */
 
-#include "sade.h"
+#include <sys/types.h>
 #include <ctype.h>
 #include <inttypes.h>
 #include <libdisk.h>
@@ -37,6 +37,8 @@
 #include <sys/param.h>
 #include <sys/sysctl.h>
 
+#include "sade.h"
+
 #define AUTO_HOME      0       /* do not create /home automatically */
 
 /*
@@ -161,7 +163,7 @@ diskLabelEditor(dialogMenuItem *self)
                result = DITEM_FAILURE;
            }
            else {
-               result = dmenuOpenSimple(menu, FALSE) ? DITEM_SUCCESS : 
DITEM_FAILURE;
+               result = dmenuOpen(menu) ? DITEM_SUCCESS : DITEM_FAILURE;
                free(menu);
            }
        }
@@ -417,9 +419,8 @@ get_mountpoint(PartType type, struct chu
 static PartType
 get_partition_type(void)
 {
-    char selection[20];
     int i;
-    static unsigned char *fs_types[] = {
+    static char *fs_types[] = {
 #ifdef __ia64__
        "EFI",  "An EFI system partition",
 #endif
@@ -428,6 +429,7 @@ get_partition_type(void)
     };
     WINDOW *w = savescr();
 
+    dlg_clr_result();
     i = dialog_menu("Please choose a partition type",
        "If you want to use this partition for swap space, select Swap.\n"
        "If you want to put a filesystem on it, choose FS.",
@@ -437,16 +439,16 @@ get_partition_type(void)
 #else
        2, 2,
 #endif
-       fs_types, selection, NULL, NULL);
+       fs_types);
     restorescr(w);
     if (!i) {
 #ifdef __ia64__
-       if (!strcmp(selection, "EFI"))
+       if (!strcmp(dialog_vars.input_result, "EFI"))
            return PART_EFI;
 #endif
-       if (!strcmp(selection, "FS"))
+       if (!strcmp(dialog_vars.input_result, "FS"))
            return PART_FILESYSTEM;
-       else if (!strcmp(selection, "Swap"))
+       else if (!strcmp(dialog_vars.input_result, "Swap"))
            return PART_SWAP;
     }
     return PART_NONE;
@@ -1251,7 +1253,7 @@ diskLabel(Device *dev)
            if (!msgNoYes("Are you sure you want to go into Wizard mode?\n\n"
                          "This is an entirely undocumented feature which you 
are not\n"
                          "expected to understand!")) {
-               dialog_clear();
+               dlg_clear();
                end_dialog();
                DialogActive = FALSE;
                if (dev->private) {

Modified: head/usr.sbin/sade/main.c
==============================================================================
--- head/usr.sbin/sade/main.c   Thu Nov 24 17:58:14 2011        (r227943)
+++ head/usr.sbin/sade/main.c   Thu Nov 24 18:37:16 2011        (r227944)
@@ -39,8 +39,8 @@ const char *ProgName = "sade";
 int
 main(int argc, char **argv)
 {
-    int choice, scroll, curr, max, status;
-    
+    int status;
+
     /* Record name to be able to restart */
     StartName = argv[0];
 
@@ -77,7 +77,9 @@ main(int argc, char **argv)
 
     /* Try to preserve our scroll-back buffer */
     if (OnVTY) {
-       for (curr = 0; curr < 25; curr++)
+        int i;
+
+       for (i = 0; i < 25; i++)
            putchar('\n');
     }
     /* Move stderr aside */
@@ -105,10 +107,9 @@ main(int argc, char **argv)
     }
 
     /* Begin user dialog at outer menu */
-    dialog_clear();
+    dlg_clear();
     while (1) {
-       choice = scroll = curr = max = 0;
-       dmenuOpen(&MenuMain, &choice, &scroll, &curr, &max, FALSE);
+       dmenuOpen(&MenuMain);
        if (getpid() != 1
            || !msgNoYes("Are you sure you wish to exit?")
            )

Modified: head/usr.sbin/sade/menus.c
==============================================================================
--- head/usr.sbin/sade/menus.c  Thu Nov 24 17:58:14 2011        (r227943)
+++ head/usr.sbin/sade/menus.c  Thu Nov 24 18:37:16 2011        (r227944)
@@ -53,7 +53,7 @@ DMenu MenuDiskDevices = {
     "Use [TAB] to get to the buttons and leave this menu.",
     "Press F1 for important information regarding disk geometry!",
     "drives",
-    { { NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0 } },
+    { { NULL, NULL, NULL } },
 };
 
 DMenu MenuMain = {
@@ -62,12 +62,12 @@ DMenu MenuMain = {
     "This is a utility for partitioning and/or labelling your disks.",
     "DISKUTIL",
     "main",
-    { 
+    {
 #ifdef WITH_SLICES
-      { "1 Partition",         "Managing disk partitions",     NULL, 
diskPartitionEditor, NULL, NULL, 0, 0, 0, 0 },
+      { "1 Partition",         "Managing disk partitions",     
diskPartitionEditor },
 #endif
-      { "2 Label",             "Label allocated disk partitions",      NULL, 
diskLabelEditor, NULL, NULL, 0, 0, 0, 0 },
-      { NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0 }
+      { "2 Label",             "Label allocated disk partitions",      
diskLabelEditor },
+      { NULL, NULL, NULL }
     },
 };
 
@@ -75,22 +75,20 @@ DMenu MenuMain = {
 #ifdef PC98
 /* IPL type menu */
 DMenu MenuIPLType = {
-    DMENU_NORMAL_TYPE | DMENU_SELECTION_RETURNS,
+    DMENU_RADIO_TYPE | DMENU_SELECTION_RETURNS,
     "overwrite me",            /* will be disk specific label */
     "If you want a FreeBSD Boot Manager, select \"BootMgr\".  If you would\n"
     "prefer your Boot Manager to remain untouched then select \"None\".\n\n",
     "Press F1 to read about drive setup",
     "drives",
-    { { "BootMgr",     "Install the FreeBSD Boot Manager",
-       dmenuRadioCheck, dmenuSetValue, NULL, &BootMgr, 0, 0, 0, 0 },
-      { "None",                "Leave the IPL untouched",
-       dmenuRadioCheck, dmenuSetValue, NULL, &BootMgr, '(', '*', ')', 1 },
-      { NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0 } },
+    { { "BootMgr",     "Install the FreeBSD Boot Manager", NULL },
+      { "None",                "Leave the IPL untouched", NULL },
+      { NULL, NULL, NULL } },
 };
 #else
 /* MBR type menu */
 DMenu MenuMBRType = {
-    DMENU_NORMAL_TYPE | DMENU_SELECTION_RETURNS,
+    DMENU_RADIO_TYPE | DMENU_SELECTION_RETURNS,
     "overwrite me",            /* will be disk specific label */
     "FreeBSD comes with a boot manager that allows you to easily\n"
     "select between FreeBSD and any other operating systems on your machine\n"
@@ -99,18 +97,13 @@ DMenu MenuMBRType = {
     "to do so (limitations in the PC BIOS usually prevent this otherwise).\n"
     "If you have other operating systems installed and would like a choice 
when\n"
     "booting, choose \"BootMgr\". If you would prefer to keep your existing\n"
-    "boot manager, select \"None\".\n\n",
+    "boot manager, select \"None\".\n",
     "",
     "drives",
-    { { "Standard",    "Install a standard MBR (non-interactive boot manager)",
-       dmenuRadioCheck, dmenuSetValue, NULL, &BootMgr, '(', '*', ')', 1 },
-      { "BootMgr",     "Install the FreeBSD boot manager",
-       dmenuRadioCheck, dmenuSetValue, NULL, &BootMgr, '(', '*', ')', 0 },
-      { "None",                "Do not install a boot manager",
-       dmenuRadioCheck, dmenuSetValue, NULL, &BootMgr, '(', '*', ')', 2 },
-      { NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0 } }
+    { { "Standard",    "Install a standard MBR (non-interactive boot 
manager)", NULL },
+      { "BootMgr",     "Install the FreeBSD boot manager", NULL },
+      { "None",                "Do not install a boot manager", NULL },
+      { NULL, NULL, NULL } }
 };
 #endif /* PC98 */
 #endif /* __i386__ */
-
-

Modified: head/usr.sbin/sade/misc.c
==============================================================================
--- head/usr.sbin/sade/misc.c   Thu Nov 24 17:58:14 2011        (r227943)
+++ head/usr.sbin/sade/misc.c   Thu Nov 24 18:37:16 2011        (r227944)
@@ -31,7 +31,6 @@
  *
  */
 
-#include "sade.h"
 #include <ctype.h>
 #include <unistd.h>
 #include <sys/stat.h>
@@ -47,6 +46,8 @@
 #include <sys/disklabel.h>
 #include <fs/msdosfs/msdosfsmount.h>
 
+#include "sade.h"
+
 /* Quick check to see if a file is readable */
 Boolean
 file_readable(char *fname)
@@ -217,3 +218,192 @@ restorescr(WINDOW *w)
     delwin(w);
 }
 
+static int
+xdialog_count_rows(const char *p)
+{
+       int rows = 0;
+
+       while ((p = strchr(p, '\n')) != NULL) {
+               p++;
+               if (*p == '\0')
+                       break;
+               rows++;
+       }
+
+       return rows ? rows : 1;
+}
+
+int
+xdialog_menu(const char *title, const char *cprompt, int height, int width,
+            int menu_height, int item_no, dialogMenuItem *ditems)
+{
+       int i, result, choice = 0;
+       DIALOG_LISTITEM *listitems;
+       DIALOG_VARS save_vars;
+
+       dlg_save_vars(&save_vars);
+
+       /* initialize list items */
+       listitems = dlg_calloc(DIALOG_LISTITEM, item_no + 1);
+       assert_ptr(listitems, "xdialog_menu");
+       for (i = 0; i < item_no; i++) {
+               listitems[i].name = ditems[i].prompt;
+               listitems[i].text = ditems[i].title;
+       }
+
+       /* calculate height */
+       if (height < 0)
+               height = xdialog_count_rows(cprompt) + menu_height + 4 + 2;
+       if (height > LINES)
+               height = LINES;
+
+       /* calculate width */
+       if (width < 0) {
+               int tag_x = 0;
+
+               for (i = 0; i < item_no; i++) {
+                       int j, l;
+
+                       l = strlen(listitems[i].name);
+                       for (j = 0; j < item_no; j++) {
+                               int k = strlen(listitems[j].text);
+                               tag_x = MAX(tag_x, l + k + 2);
+                       }
+               }
+               width = MAX(dlg_count_columns(cprompt), title != NULL ? 
dlg_count_columns(title) : 0);
+               width = MAX(width, tag_x + 4) + 4;
+       }
+       width = MAX(width, 24);
+       if (width > COLS)
+               width = COLS;
+
+       /* show menu */
+       dialog_vars.default_item = listitems[choice].name;
+       result = dlg_menu(title, cprompt, height, width,
+           menu_height, item_no, listitems, &choice, NULL);
+       switch (result) {
+       case DLG_EXIT_ESC:
+               result = -1;
+               break;
+       case DLG_EXIT_OK:
+               if (ditems[choice].fire != NULL) {
+                       int status;
+                       WINDOW *save;
+
+                       save = savescr();
+                       status = ditems[choice].fire(ditems + choice);
+                       restorescr(save);
+               }
+               result = 0;
+               break;
+       case DLG_EXIT_CANCEL:
+       default:
+               result = 1;
+               break;
+       }
+
+       free(listitems);
+       dlg_restore_vars(&save_vars);
+       return result;
+}
+
+int
+xdialog_radiolist(const char *title, const char *cprompt, int height, int 
width,
+                 int menu_height, int item_no, dialogMenuItem *ditems)
+{
+       int i, result, choice = 0;
+       DIALOG_LISTITEM *listitems;
+       DIALOG_VARS save_vars;
+
+       dlg_save_vars(&save_vars);
+
+       /* initialize list items */
+       listitems = dlg_calloc(DIALOG_LISTITEM, item_no + 1);
+       assert_ptr(listitems, "xdialog_menu");
+       for (i = 0; i < item_no; i++) {
+               listitems[i].name = ditems[i].prompt;
+               listitems[i].text = ditems[i].title;
+               listitems[i].state = i == choice;
+       }
+
+       /* calculate height */
+       if (height < 0)
+               height = xdialog_count_rows(cprompt) + menu_height + 4 + 2;
+       if (height > LINES)
+               height = LINES;
+
+       /* calculate width */
+       if (width < 0) {
+               int check_x = 0;
+
+               for (i = 0; i < item_no; i++) {
+                       int j, l;
+
+                       l = strlen(listitems[i].name);
+                       for (j = 0; j < item_no; j++) {
+                               int k = strlen(listitems[j].text);
+                               check_x = MAX(check_x, l + k + 6);
+                       }
+               }
+               width = MAX(dlg_count_columns(cprompt), title != NULL ? 
dlg_count_columns(title) : 0);
+               width = MAX(width, check_x + 4) + 4;
+       }
+       width = MAX(width, 24);
+       if (width > COLS)
+               width = COLS;
+
+       /* show menu */
+       dialog_vars.default_item = listitems[choice].name;
+       result = dlg_checklist(title, cprompt, height, width,
+           menu_height, item_no, listitems, NULL, FLAG_RADIO, &choice);
+       switch (result) {
+       case DLG_EXIT_ESC:
+               result = -1;
+               break;
+       case DLG_EXIT_OK:
+               if (ditems[choice].fire != NULL) {
+                       int status;
+                       WINDOW *save;
+
+                       save = savescr();
+                       status = ditems[choice].fire(ditems + choice);
+                       restorescr(save);
+               }
+               result = 0;
+               break;
+       case DLG_EXIT_CANCEL:
+       default:
+               result = 1;
+               break;
+       }
+
+       /* save result */
+       if (result == 0)
+               dlg_add_result(listitems[choice].name);
+       free(listitems);
+       dlg_restore_vars(&save_vars);
+       return result;
+}
+
+int
+xdialog_msgbox(const char *title, const char *cprompt,
+              int height, int width, int pauseopt)
+{
+       /* calculate height */
+       if (height < 0)
+               height = 2 + xdialog_count_rows(cprompt) + 2 + !!pauseopt;
+       if (height > LINES)
+               height = LINES;
+
+       /* calculate width */
+       if (width < 0) {
+               width = title != NULL ? dlg_count_columns(title) : 0;
+               width = MAX(width, dlg_count_columns(cprompt)) + 4;
+       }
+       if (pauseopt)
+               width = MAX(width, 10);
+       if (width > COLS)
+               width = COLS;
+
+       return dialog_msgbox(title, cprompt, height, width, pauseopt);
+}

Modified: head/usr.sbin/sade/msg.c
==============================================================================
--- head/usr.sbin/sade/msg.c    Thu Nov 24 17:58:14 2011        (r227943)
+++ head/usr.sbin/sade/msg.c    Thu Nov 24 18:37:16 2011        (r227944)
@@ -184,13 +184,16 @@ msgConfirm(const char *fmt, ...)
     va_start(args, fmt);
     vsnprintf(errstr, FILENAME_MAX, fmt, args);
     va_end(args);
-    use_helpline(NULL);
-    use_helpfile(NULL);
+    dialog_vars.help_line = NULL;
+    dialog_vars.help_file = NULL;
     if (OnVTY) {
        ioctl(0, VT_ACTIVATE, 1);
        msgInfo(NULL);
     }
-    dialog_notify(errstr);
+    dialog_vars.help_line = "Press Enter or Space";
+    xdialog_msgbox("Message", errstr, -1, -1, 1);
+    dialog_vars.help_line = NULL;
+
     restorescr(w);
 }
 
@@ -205,11 +208,11 @@ msgNotify(const char *fmt, ...)
     va_start(args, fmt);
     vsnprintf(errstr, FILENAME_MAX, fmt, args);
     va_end(args);
-    use_helpline(NULL);
-    use_helpfile(NULL);
+    dialog_vars.help_line = NULL;
+    dialog_vars.help_file = NULL;
     if (isDebug())
        msgDebug("Notify: %s\n", errstr);
-    dialog_msgbox(NULL, errstr, -1, -1, 0);
+    xdialog_msgbox(NULL, errstr, -1, -1, 0);
 }
 
 /* Put up a message in a popup yes/no box and return 0 for YES, 1 for NO */
@@ -225,8 +228,8 @@ msgYesNo(const char *fmt, ...)
     va_start(args, fmt);
     vsnprintf(errstr, FILENAME_MAX, fmt, args);
     va_end(args);
-    use_helpline(NULL);
-    use_helpfile(NULL);
+    dialog_vars.help_line = NULL;
+    dialog_vars.help_file = NULL;
     if (OnVTY) {
        ioctl(0, VT_ACTIVATE, 1);       /* Switch back */
        msgInfo(NULL);
@@ -246,20 +249,24 @@ msgNoYes(const char *fmt, ...)
     char *errstr;
     int ret;
     WINDOW *w = savescr();
-    
+    DIALOG_VARS save_vars;
+
     errstr = (char *)alloca(FILENAME_MAX);
     va_start(args, fmt);
     vsnprintf(errstr, FILENAME_MAX, fmt, args);
     va_end(args);
-    use_helpline(NULL);
-    use_helpfile(NULL);
+    dialog_vars.help_line = NULL;
+    dialog_vars.help_file = NULL;
     if (OnVTY) {
        ioctl(0, VT_ACTIVATE, 1);       /* Switch back */
        msgInfo(NULL);
     }
     if (variable_get(VAR_NONINTERACTIVE))
        return 1;       /* If non-interactive, return NO all the time */
-    ret = dialog_noyes("User Confirmation Requested", errstr, -1, -1);
+    dlg_save_vars(&save_vars);
+    dialog_vars.defaultno = TRUE;
+    ret = dialog_yesno("User Confirmation Requested", errstr, -1, -1);
+    dlg_restore_vars(&save_vars);
     restorescr(w);
     return ret;
 }
@@ -278,8 +285,8 @@ msgGetInput(char *buf, const char *fmt, 
     va_start(args, fmt);
     vsnprintf(errstr, FILENAME_MAX, fmt, args);
     va_end(args);
-    use_helpline(NULL);
-    use_helpfile(NULL);
+    dialog_vars.help_line = NULL;
+    dialog_vars.help_file = NULL;
     if (buf)
        SAFE_STRCPY(input_buffer, buf);
     else
@@ -288,10 +295,10 @@ msgGetInput(char *buf, const char *fmt, 
        ioctl(0, VT_ACTIVATE, 1);       /* Switch back */
        msgInfo(NULL);
     }

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to