aboutsummaryrefslogtreecommitdiff
path: root/gnu/lib
diff options
context:
space:
mode:
authorJordan K. Hubbard <jkh@FreeBSD.org>1996-04-16 12:17:27 +0000
committerJordan K. Hubbard <jkh@FreeBSD.org>1996-04-16 12:17:27 +0000
commit6562be49a5bba5cfbc3491268eaa8f7486f29907 (patch)
tree4657bce2c0155f54b1e409704ce7296c2c885a8a /gnu/lib
parentdb3a276987345b60db473bd7e60b4007d86381ac (diff)
Notes
Diffstat (limited to 'gnu/lib')
-rw-r--r--gnu/lib/libdialog/TESTS/check1.c56
-rw-r--r--gnu/lib/libdialog/TESTS/check2.c90
-rw-r--r--gnu/lib/libdialog/TESTS/check3.c68
-rw-r--r--gnu/lib/libdialog/TESTS/menu1.c126
-rw-r--r--gnu/lib/libdialog/TESTS/menu2.c132
-rw-r--r--gnu/lib/libdialog/TESTS/menu3.c102
-rw-r--r--gnu/lib/libdialog/TESTS/radio1.c42
-rw-r--r--gnu/lib/libdialog/TESTS/radio2.c58
-rw-r--r--gnu/lib/libdialog/TESTS/radio3.c78
-rw-r--r--gnu/lib/libdialog/checklist.c907
-rw-r--r--gnu/lib/libdialog/dialog.h12
-rw-r--r--gnu/lib/libdialog/menubox.c50
-rw-r--r--gnu/lib/libdialog/radiolist.c892
13 files changed, 1367 insertions, 1246 deletions
diff --git a/gnu/lib/libdialog/TESTS/check1.c b/gnu/lib/libdialog/TESTS/check1.c
index b66f48b9518a..e8a0751e2914 100644
--- a/gnu/lib/libdialog/TESTS/check1.c
+++ b/gnu/lib/libdialog/TESTS/check1.c
@@ -13,7 +13,7 @@
* the author assume any responsibility for damages incurred with
* its use.
*
- * $Id: check1.c,v 1.1 1996/01/01 03:45:22 jkh Exp $
+ * $Id: check1.c,v 1.2 1996/04/07 03:20:50 jkh Exp $
*/
#include <stdio.h>
@@ -28,19 +28,19 @@
static int
getBool(dialogMenuItem *self)
{
- if (self->data && *((int *)self->data))
- return TRUE;
- return FALSE;
+ if (self->data && *((int *)self->data))
+ return TRUE;
+ return FALSE;
}
static int
setBool(dialogMenuItem *self)
{
- if (self->data) {
- *((int *)self->data) = !*((int *)self->data);
- return DITEM_SUCCESS;
- }
- return DITEM_FAILURE;
+ if (self->data) {
+ *((int *)self->data) = !*((int *)self->data);
+ return DITEM_SUCCESS;
+ }
+ return DITEM_FAILURE;
}
static int german_book, italian_book, slang_book;
@@ -48,17 +48,17 @@ static int german_book, italian_book, slang_book;
static int
clearBooks(dialogMenuItem *self)
{
- german_book = italian_book = slang_book = FALSE;
- return DITEM_REDRAW;
+ german_book = italian_book = slang_book = FALSE;
+ return DITEM_SUCCESS | DITEM_REDRAW;
}
/* menu2 - A more advanced way of using checked and fire hooks to manipulate the backing-variables directly */
- /* prompt title checked fire sel data */
+/* prompt title checked fire sel data */
static dialogMenuItem menu2[] = {
- { "German", "Buy book on learning German", getBool, setBool, NULL, &german_book},
- { "Italian", "Buy book on learning Italian", getBool, setBool, NULL, &italian_book },
- { "Slang", "Buy book on commonly used insults", getBool, setBool, NULL, &slang_book },
- { "Clear", "Clear book list", NULL, clearBooks, NULL, NULL, ' ', ' ', ' ' },
+ { "German", "Buy book on learning German", getBool, setBool, NULL, &german_book},
+ { "Italian", "Buy book on learning Italian", getBool, setBool, NULL, &italian_book },
+ { "Slang", "Buy book on commonly used insults", getBool, setBool, NULL, &slang_book },
+ { "Clear", "Clear book list", NULL, clearBooks, NULL, NULL, ' ', ' ', ' ' },
};
/* End of hook functions */
@@ -67,16 +67,16 @@ static dialogMenuItem menu2[] = {
int
main(int argc, unsigned char *argv[])
{
- int retval;
-
- init_dialog();
-
- retval = dialog_checklist("this is a dialog_checklist() in action, test #1",
- "this checklist menu shows off some of the straight-forward features\n"
- "of the new menu system's check & fire dispatch hooks", -1, -1, 4, -4, menu2, NULL);
- dialog_clear();
- fprintf(stderr, "returned value for dialog_checklist was %d (%d %d %d)\n", retval, german_book, italian_book, slang_book);
-
- end_dialog();
- return 0;
+ int retval;
+
+ init_dialog();
+
+ retval = dialog_checklist("this is a dialog_checklist() in action, test #1",
+ "this checklist menu shows off some of the straight-forward features\n"
+ "of the new menu system's check & fire dispatch hooks", -1, -1, 4, -4, menu2, NULL);
+ dialog_clear();
+ fprintf(stderr, "returned value for dialog_checklist was %d (%d %d %d)\n", retval, german_book, italian_book, slang_book);
+
+ end_dialog();
+ return 0;
}
diff --git a/gnu/lib/libdialog/TESTS/check2.c b/gnu/lib/libdialog/TESTS/check2.c
index c28222a43be5..edad6cf5a115 100644
--- a/gnu/lib/libdialog/TESTS/check2.c
+++ b/gnu/lib/libdialog/TESTS/check2.c
@@ -13,7 +13,7 @@
* the author assume any responsibility for damages incurred with
* its use.
*
- * $Id: test1.c,v 1.2 1995/12/23 14:53:07 jkh Exp $
+ * $Id: check2.c,v 1.1 1996/01/01 03:45:23 jkh Exp $
*/
#include <stdio.h>
@@ -28,19 +28,19 @@
static int
getBool(dialogMenuItem *self)
{
- if (self->data && *((int *)self->data))
- return TRUE;
- return FALSE;
+ if (self->data && *((int *)self->data))
+ return TRUE;
+ return FALSE;
}
static int
setBool(dialogMenuItem *self)
{
- if (self->data) {
- *((int *)self->data) = !*((int *)self->data);
- return DITEM_SUCCESS;
- }
- return DITEM_FAILURE;
+ if (self->data) {
+ *((int *)self->data) = !*((int *)self->data);
+ return DITEM_SUCCESS;
+ }
+ return DITEM_FAILURE;
}
static int german_book, italian_book, slang_book;
@@ -48,39 +48,39 @@ static int german_book, italian_book, slang_book;
static int
clearBooks(dialogMenuItem *self)
{
- german_book = italian_book = slang_book = FALSE;
- return DITEM_REDRAW;
+ german_book = italian_book = slang_book = FALSE;
+ return DITEM_SUCCESS | DITEM_REDRAW;
}
static int
buyBooks(dialogMenuItem *self)
{
- char foo[256];
-
- if (german_book || italian_book || slang_book) {
- strcpy(foo, "Ok, you're buying books on");
- if (german_book)
- strcat(foo, " german");
- if (italian_book)
- strcat(foo, " italian");
- if (slang_book)
- strcat(foo, " slang");
- }
- else
- strcpy(foo, "You're not buying any books?");
- dialog_mesgbox("This is a direct callback for the `Buy' button", foo, -1, -1);
- return DITEM_SUCCESS;
+ char foo[256];
+
+ if (german_book || italian_book || slang_book) {
+ strcpy(foo, "Ok, you're buying books on");
+ if (german_book)
+ strcat(foo, " german");
+ if (italian_book)
+ strcat(foo, " italian");
+ if (slang_book)
+ strcat(foo, " slang");
+ }
+ else
+ strcpy(foo, "You're not buying any books?");
+ dialog_mesgbox("This is a direct callback for the `Buy' button", foo, -1, -1);
+ return DITEM_SUCCESS;
}
/* menu3 - Look mom! We can finally use our own OK and Cancel buttons! */
- /* prompt title checked fire sel data */
+/* prompt title checked fire sel data */
static dialogMenuItem menu3[] = {
- { "Buy!", NULL, NULL, buyBooks }, /* New "OK" button */
- { "No Way!", NULL, NULL, NULL }, /* New "Cancel" button */
- { "German", "Buy books on learning German", getBool, setBool, NULL, &german_book },
- { "Italian", "Buy books on learning Italian", getBool, setBool, NULL, &italian_book },
- { "Slang", "Buy books on commonly used insults", getBool, setBool, NULL, &slang_book },
- { "Clear", "Clear book list", NULL, clearBooks, NULL, NULL, ' ', ' ', ' ' },
+ { "Buy!", NULL, NULL, buyBooks }, /* New "OK" button */
+ { "No Way!", NULL, NULL, NULL }, /* New "Cancel" button */
+ { "German", "Buy books on learning German", getBool, setBool, NULL, &german_book },
+ { "Italian", "Buy books on learning Italian", getBool, setBool, NULL, &italian_book },
+ { "Slang", "Buy books on commonly used insults", getBool, setBool, NULL, &slang_book },
+ { "Clear", "Clear book list", NULL, clearBooks, NULL, NULL, ' ', ' ', ' ' },
};
/* End of hook functions */
@@ -89,16 +89,16 @@ static dialogMenuItem menu3[] = {
int
main(int argc, unsigned char *argv[])
{
- int retval;
-
- init_dialog();
-
- retval = dialog_checklist("this is dialog_checklist() in action, test #2",
- "Same as before, but now we relabel the buttons and override the OK action.",
- -1, -1, 4, -4, menu3 + 2, (char *)TRUE);
- dialog_clear();
- fprintf(stderr, "returned value for dialog_checklist was %d\n", retval);
-
- end_dialog();
- return 0;
+ int retval;
+
+ init_dialog();
+
+ retval = dialog_checklist("this is dialog_checklist() in action, test #2",
+ "Same as before, but now we relabel the buttons and override the OK action.",
+ -1, -1, 4, -4, menu3 + 2, (char *)TRUE);
+ dialog_clear();
+ fprintf(stderr, "returned value for dialog_checklist was %d\n", retval);
+
+ end_dialog();
+ return 0;
}
diff --git a/gnu/lib/libdialog/TESTS/check3.c b/gnu/lib/libdialog/TESTS/check3.c
index ecd4275d58ee..6ba01ce11ace 100644
--- a/gnu/lib/libdialog/TESTS/check3.c
+++ b/gnu/lib/libdialog/TESTS/check3.c
@@ -13,7 +13,7 @@
* the author assume any responsibility for damages incurred with
* its use.
*
- * $Id$
+ * $Id: check3.c,v 1.1 1996/01/01 03:45:23 jkh Exp $
*
*/
@@ -25,19 +25,19 @@
static int
getBool(dialogMenuItem *self)
{
- if (self->data && *((int *)self->data))
- return TRUE;
- return FALSE;
+ if (self->data && *((int *)self->data))
+ return TRUE;
+ return FALSE;
}
static int
setBool(dialogMenuItem *self)
{
- if (self->data) {
- *((int *)self->data) = !*((int *)self->data);
- return DITEM_SUCCESS;
- }
- return DITEM_FAILURE;
+ if (self->data) {
+ *((int *)self->data) = !*((int *)self->data);
+ return DITEM_SUCCESS;
+ }
+ return DITEM_FAILURE;
}
static int german_book, italian_book, slang_book;
@@ -46,26 +46,26 @@ static int spending;
static int
check(dialogMenuItem *self)
{
- return ((int)self->data == spending);
+ return ((int)self->data == spending);
}
static int
spend(dialogMenuItem *self)
{
- spending = (int)self->data;
- return DITEM_REDRAW;
+ spending = (int)self->data;
+ return DITEM_SUCCESS | DITEM_REDRAW;
}
/* menu4 - Show off a simulated compound menu (group at top is checklist, group at bottom radio) */
- /* prompt title checked fire sel, data lbra mark rbra */
+/* prompt title checked fire sel, data lbra mark rbra */
static dialogMenuItem menu4[] = {
- { "German", "Buy books on learning German", getBool, setBool, NULL, &german_book },
- { "Italian", "Buy books on learning Italian", getBool, setBool, NULL, &italian_book },
- { "Slang", "Buy books on commonly used insults", getBool, setBool, NULL, &slang_book },
- { "-----", "----------------------------------", NULL, NULL, NULL, NULL, ' ', ' ', ' ' },
- { "1000", "Spend $1,000", check, spend, NULL, (void *)1000, '(', '*', ')' },
- { "500", "Spend $500", check, spend, NULL, (void *)500, '(', '*', ')' },
- { "100", "Spend $100", check, spend, NULL, (void *)100, '(', '*', ')' },
+ { "German", "Buy books on learning German", getBool, setBool, NULL, &german_book },
+ { "Italian","Buy books on learning Italian", getBool, setBool, NULL, &italian_book },
+ { "Slang", "Buy books on commonly used insults", getBool, setBool, NULL, &slang_book },
+ { "-----", "----------------------------------", NULL, NULL, NULL, NULL, ' ', ' ', ' ' },
+ { "1000", "Spend $1,000", check, spend, NULL, (void *)1000, '(', '*', ')' },
+ { "500", "Spend $500", check, spend, NULL, (void *)500, '(', '*', ')' },
+ { "100", "Spend $100", check, spend, NULL, (void *)100, '(', '*', ')' },
};
/* End of hook functions */
@@ -74,18 +74,18 @@ static dialogMenuItem menu4[] = {
int
main(int argc, unsigned char *argv[])
{
- int retval;
-
- init_dialog();
-
-
- retval = dialog_checklist("this is dialog_checklist() in action, test #3",
- "Now we show off some of the button 'styles' one can create.",
- -1, -1, 7, -7, menu4, NULL);
- dialog_clear();
- fprintf(stderr, "spent $%d on %s%s%s books\n", spending, german_book ? " german" : "",
- italian_book ? " italian" : "", slang_book ? " slang" : "");
-
- end_dialog();
- return 0;
+ int retval;
+
+ init_dialog();
+
+
+ retval = dialog_checklist("this is dialog_checklist() in action, test #3",
+ "Now we show off some of the button 'styles' one can create.",
+ -1, -1, 7, -7, menu4, NULL);
+ dialog_clear();
+ fprintf(stderr, "spent $%d on %s%s%s books\n", spending, german_book ? " german" : "",
+ italian_book ? " italian" : "", slang_book ? " slang" : "");
+
+ end_dialog();
+ return 0;
}
diff --git a/gnu/lib/libdialog/TESTS/menu1.c b/gnu/lib/libdialog/TESTS/menu1.c
index bbab588f52f5..5e5a1add71cb 100644
--- a/gnu/lib/libdialog/TESTS/menu1.c
+++ b/gnu/lib/libdialog/TESTS/menu1.c
@@ -13,7 +13,7 @@
* the author assume any responsibility for damages incurred with
* its use.
*
- * $Id: menu1.c,v 1.1 1996/01/01 03:45:26 jkh Exp $
+ * $Id: menu1.c,v 1.2 1996/04/07 03:20:52 jkh Exp $
*/
#include <stdio.h>
@@ -29,69 +29,69 @@ static enum { nowhere, berlin, rome, ny } where;
static int
_menu1_berlin_action(dialogMenuItem *self)
{
- WINDOW *w;
- int st = DITEM_FAILURE;
-
- w = dupwin(newscr);
- if (where == berlin) {
- dialog_mesgbox("excuse me?", "But you're already *in* Berlin!", -1, -1);
- }
- else {
- where = berlin;
- dialog_mesgbox("whoosh!", "Welcome to Berlin! Have a beer!", -1, -1);
- }
- touchwin(w);
- wrefresh(w);
- delwin(w);
- return st;
+ WINDOW *w;
+ int st = DITEM_FAILURE;
+
+ w = dupwin(newscr);
+ if (where == berlin) {
+ dialog_mesgbox("excuse me?", "But you're already *in* Berlin!", -1, -1);
+ }
+ else {
+ where = berlin;
+ dialog_mesgbox("whoosh!", "Welcome to Berlin! Have a beer!", -1, -1);
+ }
+ touchwin(w);
+ wrefresh(w);
+ delwin(w);
+ return st;
}
static int
_menu1_rome_action(dialogMenuItem *self)
{
- WINDOW *w;
- int st = DITEM_FAILURE;
-
- w = dupwin(newscr);
- if (where == rome) {
- dialog_mesgbox("The wine must be getting to you..", "You're already in Rome!", -1, -1);
- }
- else {
- where = rome;
- dialog_mesgbox("whoosh!", "Welcome to Rome! Have a coffee!", -1, -1);
- }
- touchwin(w);
- wrefresh(w);
- delwin(w);
- return st;
+ WINDOW *w;
+ int st = DITEM_FAILURE;
+
+ w = dupwin(newscr);
+ if (where == rome) {
+ dialog_mesgbox("The wine must be getting to you..", "You're already in Rome!", -1, -1);
+ }
+ else {
+ where = rome;
+ dialog_mesgbox("whoosh!", "Welcome to Rome! Have a coffee!", -1, -1);
+ }
+ touchwin(w);
+ wrefresh(w);
+ delwin(w);
+ return st;
}
static int
_menu1_ny_action(dialogMenuItem *self)
{
- WINDOW *w;
- int st = DITEM_FAILURE;
-
- w = dupwin(newscr);
- if (where == ny) {
- dialog_mesgbox("Say what?", "You're already there!", -1, -1);
- }
- else {
- where = ny;
- dialog_mesgbox("whoosh!", "Welcome to New York! Now go someplace else!", -1, -1);
- }
- touchwin(w);
- wrefresh(w);
- delwin(w);
- return st;
+ WINDOW *w;
+ int st = DITEM_FAILURE;
+
+ w = dupwin(newscr);
+ if (where == ny) {
+ dialog_mesgbox("Say what?", "You're already there!", -1, -1);
+ }
+ else {
+ where = ny;
+ dialog_mesgbox("whoosh!", "Welcome to New York! Now go someplace else!", -1, -1);
+ }
+ touchwin(w);
+ wrefresh(w);
+ delwin(w);
+ return st;
}
/* menu1 - show off the "fire" action hook */
- /* prompt title checked fire */
+/* prompt title checked fire */
static dialogMenuItem menu1[] = {
- { "Berlin", "Go visit Germany's new capitol", NULL, _menu1_berlin_action },
- { "Rome", "Go visit the Roman ruins", NULL, _menu1_rome_action },
- { "New York", "Go visit the streets of New York", NULL, _menu1_ny_action },
+ { "Berlin", "Go visit Germany's new capitol", NULL, _menu1_berlin_action },
+ { "Rome", "Go visit the Roman ruins", NULL, _menu1_rome_action },
+ { "New York", "Go visit the streets of New York", NULL, _menu1_ny_action },
};
/* End of hook functions */
@@ -100,17 +100,17 @@ static dialogMenuItem menu1[] = {
int
main(int argc, unsigned char *argv[])
{
- int retval;
-
- init_dialog();
-
- retval = dialog_menu("this is dialog_menu() in action, test #1",
- "this simple menu shows off some of the straight-forward features\n"
- "of the new menu system's action dispatch hooks. Select Cancel to leave",
- -1, -1, 3, -3, menu1, NULL, NULL, NULL);
- dialog_clear();
- fprintf(stderr, "returned value for dialog_menu was %d\n", retval);
-
- end_dialog();
- return 0;
+ int retval;
+
+ init_dialog();
+
+ retval = dialog_menu("this is dialog_menu() in action, test #1",
+ "this simple menu shows off some of the straight-forward features\n"
+ "of the new menu system's action dispatch hooks. Select Cancel to leave",
+ -1, -1, 3, -3, menu1, NULL, NULL, NULL);
+ dialog_clear();
+ fprintf(stderr, "returned value for dialog_menu was %d\n", retval);
+
+ end_dialog();
+ return 0;
}
diff --git a/gnu/lib/libdialog/TESTS/menu2.c b/gnu/lib/libdialog/TESTS/menu2.c
index de0923812b8e..40f279e49b30 100644
--- a/gnu/lib/libdialog/TESTS/menu2.c
+++ b/gnu/lib/libdialog/TESTS/menu2.c
@@ -13,7 +13,7 @@
* the author assume any responsibility for damages incurred with
* its use.
*
- * $Id: menu2.c,v 1.1 1996/01/01 03:45:26 jkh Exp $
+ * $Id: menu2.c,v 1.2 1996/04/07 03:20:54 jkh Exp $
*/
#include <stdio.h>
@@ -29,69 +29,69 @@ static enum { nowhere, berlin, rome, ny } where;
static int
_menu1_berlin_action(dialogMenuItem *self)
{
- WINDOW *w;
- int st = DITEM_FAILURE;
-
- w = dupwin(newscr);
- if (where == berlin) {
- dialog_mesgbox("excuse me?", "But you're already *in* Berlin!", -1, -1);
- }
- else {
- where = berlin;
- dialog_mesgbox("whoosh!", "Welcome to Berlin! Have a beer!", -1, -1);
- }
- touchwin(w);
- wrefresh(w);
- delwin(w);
- return st;
+ WINDOW *w;
+ int st = DITEM_FAILURE;
+
+ w = dupwin(newscr);
+ if (where == berlin) {
+ dialog_mesgbox("excuse me?", "But you're already *in* Berlin!", -1, -1);
+ }
+ else {
+ where = berlin;
+ dialog_mesgbox("whoosh!", "Welcome to Berlin! Have a beer!", -1, -1);
+ }
+ touchwin(w);
+ wrefresh(w);
+ delwin(w);
+ return st;
}
static int
_menu1_rome_action(dialogMenuItem *self)
{
- WINDOW *w;
- int st = DITEM_FAILURE;
-
- w = dupwin(newscr);
- if (where == rome) {
- dialog_mesgbox("The wine must be getting to you..", "You're already in Rome!", -1, -1);
- }
- else {
- where = rome;
- dialog_mesgbox("whoosh!", "Welcome to Rome! Have a coffee!", -1, -1);
- }
- touchwin(w);
- wrefresh(w);
- delwin(w);
- return st;
+ WINDOW *w;
+ int st = DITEM_FAILURE;
+
+ w = dupwin(newscr);
+ if (where == rome) {
+ dialog_mesgbox("The wine must be getting to you..", "You're already in Rome!", -1, -1);
+ }
+ else {
+ where = rome;
+ dialog_mesgbox("whoosh!", "Welcome to Rome! Have a coffee!", -1, -1);
+ }
+ touchwin(w);
+ wrefresh(w);
+ delwin(w);
+ return st;
}
static int
_menu1_ny_action(dialogMenuItem *self)
{
- WINDOW *w;
- int st = DITEM_FAILURE;
-
- w = dupwin(newscr);
- if (where == ny) {
- dialog_mesgbox("Say what?", "You're already there!", -1, -1);
- }
- else {
- where = ny;
- dialog_mesgbox("whoosh!", "Welcome to New York! Now go someplace else!", -1, -1);
- }
- touchwin(w);
- wrefresh(w);
- delwin(w);
- return st;
+ WINDOW *w;
+ int st = DITEM_FAILURE;
+
+ w = dupwin(newscr);
+ if (where == ny) {
+ dialog_mesgbox("Say what?", "You're already there!", -1, -1);
+ }
+ else {
+ where = ny;
+ dialog_mesgbox("whoosh!", "Welcome to New York! Now go someplace else!", -1, -1);
+ }
+ touchwin(w);
+ wrefresh(w);
+ delwin(w);
+ return st;
}
/* menu1 - show off the "fire" action hook */
- /* prompt title checked fire */
+/* prompt title checked fire */
static dialogMenuItem menu1[] = {
- { "Berlin", "Go visit Germany's new capitol", NULL, _menu1_berlin_action },
- { "Rome", "Go visit the Roman ruins", NULL, _menu1_rome_action },
- { "New York", "Go visit the streets of New York", NULL, _menu1_ny_action },
+ { "Berlin", "Go visit Germany's new capitol", NULL, _menu1_berlin_action },
+ { "Rome", "Go visit the Roman ruins", NULL, _menu1_rome_action },
+ { "New York", "Go visit the streets of New York", NULL, _menu1_ny_action },
};
/* End of hook functions */
@@ -100,20 +100,20 @@ static dialogMenuItem menu1[] = {
int
main(int argc, unsigned char *argv[])
{
- int retval;
-
- init_dialog();
-
- use_helpfile("menu2.c");
- use_helpline("Type F1 to view the source for this demo");
- retval = dialog_menu("this is dialog_menu() in action, test #2",
- "this simple menu shows off some of the straight-forward features\n"
- "of the new menu system's action dispatch hooks as well as a helpline\n"
- "and a helpfile. Select Cancel to leave",
- -1, -1, 3, -3, menu1, NULL, NULL, NULL);
- dialog_clear();
- fprintf(stderr, "returned value for dialog_menu was %d\n", retval);
-
- end_dialog();
- return 0;
+ int retval;
+
+ init_dialog();
+
+ use_helpfile("menu2.c");
+ use_helpline("Type F1 to view the source for this demo");
+ retval = dialog_menu("this is dialog_menu() in action, test #2",
+ "this simple menu shows off some of the straight-forward features\n"
+ "of the new menu system's action dispatch hooks as well as a helpline\n"
+ "and a helpfile. Select Cancel to leave",
+ -1, -1, 3, -3, menu1, NULL, NULL, NULL);
+ dialog_clear();
+ fprintf(stderr, "returned value for dialog_menu was %d\n", retval);
+
+ end_dialog();
+ return 0;
}
diff --git a/gnu/lib/libdialog/TESTS/menu3.c b/gnu/lib/libdialog/TESTS/menu3.c
index 5b291b00a6dc..f1acd3cd96de 100644
--- a/gnu/lib/libdialog/TESTS/menu3.c
+++ b/gnu/lib/libdialog/TESTS/menu3.c
@@ -13,7 +13,7 @@
* the author assume any responsibility for damages incurred with
* its use.
*
- * $Id: menu3.c,v 1.1 1996/01/01 03:45:27 jkh Exp $
+ * $Id: menu3.c,v 1.2 1996/04/07 03:20:55 jkh Exp $
*/
#include <stdio.h>
@@ -28,61 +28,61 @@
static int
stop(dialogMenuItem *self)
{
- dialog_mesgbox("!", "I'm no idiot!", -1, -1);
- return DITEM_SUCCESS;
+ dialog_mesgbox("!", "I'm no idiot!", -1, -1);
+ return DITEM_SUCCESS;
}
static int
maybe(dialogMenuItem *self)
{
- WINDOW *w;
-
- w = dupwin(newscr);
- dialog_mesgbox("!", "I said don't rush me! I'm THINKING!", -1, -1);
- touchwin(w);
- wrefresh(w);
- delwin(w);
- return DITEM_FAILURE;
+ WINDOW *w;
+
+ w = dupwin(newscr);
+ dialog_mesgbox("!", "I said don't rush me! I'm THINKING!", -1, -1);
+ touchwin(w);
+ wrefresh(w);
+ delwin(w);
+ return DITEM_FAILURE;
}
/* Dummy menu just to show of the ability */
static char *insurance[] = {
- "1,000,000", "Mondo insurance policy", "Off",
- "5,000,000", "Mega insurance policy", "Off",
- "10,000,000", "Friend! Most Favored customer!"
+ "1,000,000", "Mondo insurance policy", "Off",
+ "5,000,000", "Mega insurance policy", "Off",
+ "10,000,000", "Friend! Most Favored customer!"
};
static void
preinsure(dialogMenuItem *self, int is_selected)
{
- if (is_selected) {
- static WINDOW *w;
-
- /* This has to be here first if you want to see selection traverse properly in the invoking menu */
- refresh();
-
- w = dupwin(newscr);
- DialogX = 1;
- DialogY = 13;
- dialog_radiolist("How much insurance would you like to take out?",
- "If you're really going to do this, we recommend some insurance\n"
- "first! What kind of life insurance policy would you like?",
- -1, -1, 3, 3, insurance, NULL);
- touchwin(w);
- wrefresh(w);
- delwin(w);
- }
+ if (is_selected) {
+ static WINDOW *w;
+
+ /* This has to be here first if you want to see selection traverse properly in the invoking menu */
+ refresh();
+
+ w = dupwin(newscr);
+ DialogX = 1;
+ DialogY = 13;
+ dialog_radiolist("How much insurance would you like to take out?",
+ "If you're really going to do this, we recommend some insurance\n"
+ "first! What kind of life insurance policy would you like?",
+ -1, -1, 3, 3, insurance, NULL);
+ touchwin(w);
+ wrefresh(w);
+ delwin(w);
+ }
}
/*
* Show a simple menu that puts up a sub menu when a certain item is traversed to
*/
- /* prompt title checked fire sel */
+/* prompt title checked fire sel */
static dialogMenuItem doit[] = {
- { "Stop", "No, I'm not going to do that!", NULL, stop, NULL },
- { "Maybe", "I'm still thinking about it, don't rush me!", NULL, maybe, NULL, },
- { "Go", "Yes! Yes! I want to do it!", NULL, NULL, preinsure },
+ { "Stop", "No, I'm not going to do that!", NULL, stop, NULL },
+ { "Maybe", "I'm still thinking about it, don't rush me!", NULL, maybe, NULL, },
+ { "Go", "Yes! Yes! I want to do it!", NULL, NULL, preinsure },
};
/* End of hook functions */
@@ -91,20 +91,20 @@ static dialogMenuItem doit[] = {
int
main(int argc, unsigned char *argv[])
{
- int retval;
-
- init_dialog();
-
-
- DialogX = 5;
- DialogY = 1;
- retval = dialog_menu("Do you have the GUTS?",
- "C'mon, macho man! Do you have what it takes to do something REALLY\n"
- "dangerous and stupid? WHAT ARE YOU WAITING FOR?!",
- -1, -1, 3, -3, doit, NULL, NULL, NULL);
- dialog_clear();
- fprintf(stderr, "returned value for dialog_menu was %d\n", retval);
-
- end_dialog();
- return 0;
+ int retval;
+
+ init_dialog();
+
+
+ DialogX = 5;
+ DialogY = 1;
+ retval = dialog_menu("Do you have the GUTS?",
+ "C'mon, macho man! Do you have what it takes to do something REALLY\n"
+ "dangerous and stupid? WHAT ARE YOU WAITING FOR?!",
+ -1, -1, 3, -3, doit, NULL, NULL, NULL);
+ dialog_clear();
+ fprintf(stderr, "returned value for dialog_menu was %d\n", retval);
+
+ end_dialog();
+ return 0;
}
diff --git a/gnu/lib/libdialog/TESTS/radio1.c b/gnu/lib/libdialog/TESTS/radio1.c
index bee0fb655a5e..19532073971c 100644
--- a/gnu/lib/libdialog/TESTS/radio1.c
+++ b/gnu/lib/libdialog/TESTS/radio1.c
@@ -13,7 +13,7 @@
* the author assume any responsibility for damages incurred with
* its use.
*
- * $Id: radio1.c,v 1.1 1996/01/01 03:45:29 jkh Exp $
+ * $Id: radio1.c,v 1.2 1996/04/07 03:20:57 jkh Exp $
*/
#include <stdio.h>
@@ -30,22 +30,22 @@ static int spending;
static int
check(dialogMenuItem *self)
{
- return ((int)self->data == spending);
+ return ((int)self->data == spending);
}
static int
spend(dialogMenuItem *self)
{
- spending = (int)self->data;
- return DITEM_REDRAW;
+ spending = (int)self->data;
+ return DITEM_SUCCESS | DITEM_REDRAW;
}
/* menu5 - Show a simple radiolist menu that inherits the radio appearance by default */
- /* prompt title checked fire sel data */
+/* prompt title checked fire sel data */
static dialogMenuItem menu5[] = {
- { "1000", "Spend $1,000", check, spend, NULL, (void *)1000 },
- { "500", "Spend $500", check, spend, NULL, (void *)500 },
- { "100", "Spend $100", check, spend, NULL, (void *)100 },
+ { "1000", "Spend $1,000", check, spend, NULL, (void *)1000 },
+ { "500", "Spend $500", check, spend, NULL, (void *)500 },
+ { "100", "Spend $100", check, spend, NULL, (void *)100 },
};
/* End of hook functions */
@@ -54,17 +54,17 @@ static dialogMenuItem menu5[] = {
int
main(int argc, unsigned char *argv[])
{
- int retval;
-
- init_dialog();
-
-
- retval = dialog_radiolist("this is dialog_radiolist() in action, test #1",
- "this radio menu shows off some of the straight-forward features\n"
- "of the new menu system's check & fire dispatch hooks", -1, -1, 3, -3, menu5, NULL);
- dialog_clear();
- fprintf(stderr, "returned value for dialog_radiolist was %d (money set to %d)\n", retval, spending);
-
- end_dialog();
- return 0;
+ int retval;
+
+ init_dialog();
+
+
+ retval = dialog_radiolist("this is dialog_radiolist() in action, test #1",
+ "this radio menu shows off some of the straight-forward features\n"
+ "of the new menu system's check & fire dispatch hooks", -1, -1, 3, -3, menu5, NULL);
+ dialog_clear();
+ fprintf(stderr, "returned value for dialog_radiolist was %d (money set to %d)\n", retval, spending);
+
+ end_dialog();
+ return 0;
}
diff --git a/gnu/lib/libdialog/TESTS/radio2.c b/gnu/lib/libdialog/TESTS/radio2.c
index 665f686974d8..3f97048a4c98 100644
--- a/gnu/lib/libdialog/TESTS/radio2.c
+++ b/gnu/lib/libdialog/TESTS/radio2.c
@@ -13,7 +13,7 @@
* the author assume any responsibility for damages incurred with
* its use.
*
- * $Id: radio2.c,v 1.1 1996/01/01 03:45:29 jkh Exp $
+ * $Id: radio2.c,v 1.2 1996/04/07 03:20:59 jkh Exp $
*/
#include <stdio.h>
@@ -30,39 +30,39 @@ static char bachelor[10], bachelette[10];
static int
getBachelor(dialogMenuItem *self)
{
- return !strcmp(bachelor, self->prompt);
+ return !strcmp(bachelor, self->prompt);
}
static int
setBachelor(dialogMenuItem *self)
{
- strcpy(bachelor, self->prompt);
- return DITEM_REDRAW;
+ strcpy(bachelor, self->prompt);
+ return DITEM_SUCCESS | DITEM_REDRAW;
}
static int
getBachelette(dialogMenuItem *self)
{
- return !strcmp(bachelette, self->prompt);
+ return !strcmp(bachelette, self->prompt);
}
static int
setBachelette(dialogMenuItem *self)
{
- strcpy(bachelette, self->prompt);
- return DITEM_REDRAW;
+ strcpy(bachelette, self->prompt);
+ return DITEM_SUCCESS | DITEM_REDRAW;
}
/* menu6- More complex radiolist menu that creates two groups in a single menu */
- /* prompt title checked fire */
+/* prompt title checked fire */
static dialogMenuItem menu6[] = {
- { "Tom", "Tom's a dynamic shoe salesman from Tulsa, OK!", getBachelor, setBachelor },
- { "Dick", "Dick's a retired engine inspector from McDonnell-Douglas!", getBachelor, setBachelor },
- { "Harry", "Harry's a professional female impersonator from Las Vegas!", getBachelor, setBachelor },
- { "-----", "----------------------------------", NULL, NULL, NULL, NULL, ' ', ' ', ' ' },
- { "Jane", "Jane's a twice-divorced housewife from Moose, Oregon!", getBachelette, setBachelette },
- { "Sally", "Sally's a shy Human Resources Manager for IBM!", getBachelette, setBachelette },
- { "Mary", "Mary's an energetic serial killer on the lam!", getBachelette, setBachelette },
+ { "Tom", "Tom's a dynamic shoe salesman from Tulsa, OK!", getBachelor, setBachelor },
+ { "Dick", "Dick's a retired engine inspector from McDonnell-Douglas!", getBachelor, setBachelor },
+ { "Harry", "Harry's a professional female impersonator from Las Vegas!", getBachelor, setBachelor },
+ { "-----", "----------------------------------", NULL, NULL, NULL, NULL, ' ', ' ', ' ' },
+ { "Jane", "Jane's a twice-divorced housewife from Moose, Oregon!", getBachelette, setBachelette },
+ { "Sally", "Sally's a shy Human Resources Manager for IBM!", getBachelette, setBachelette },
+ { "Mary", "Mary's an energetic serial killer on the lam!", getBachelette, setBachelette },
};
/* End of hook functions */
@@ -71,18 +71,18 @@ static dialogMenuItem menu6[] = {
int
main(int argc, unsigned char *argv[])
{
- int retval;
-
- init_dialog();
-
- retval = dialog_radiolist("this is dialog_radiolist() in action, test #2",
- "Welcome to \"The Love Blender!\" - America's favorite game show\n"
- "where YOU, the contestant, get to choose which of these two\n"
- "fine specimens of humanity will go home together, whether they\n"
- "like it or not!", -1, -1, 7, -7, menu6, NULL);
- dialog_clear();
- fprintf(stderr, "I'm sure that %s and %s will be very happy together!\n", bachelor, bachelette);
-
- end_dialog();
- return 0;
+ int retval;
+
+ init_dialog();
+
+ retval = dialog_radiolist("this is dialog_radiolist() in action, test #2",
+ "Welcome to \"The Love Blender!\" - America's favorite game show\n"
+ "where YOU, the contestant, get to choose which of these two\n"
+ "fine specimens of humanity will go home together, whether they\n"
+ "like it or not!", -1, -1, 7, -7, menu6, NULL);
+ dialog_clear();
+ fprintf(stderr, "I'm sure that %s and %s will be very happy together!\n", bachelor, bachelette);
+
+ end_dialog();
+ return 0;
}
diff --git a/gnu/lib/libdialog/TESTS/radio3.c b/gnu/lib/libdialog/TESTS/radio3.c
index 7ec206188ac9..6a50287d1a6f 100644
--- a/gnu/lib/libdialog/TESTS/radio3.c
+++ b/gnu/lib/libdialog/TESTS/radio3.c
@@ -13,7 +13,7 @@
* the author assume any responsibility for damages incurred with
* its use.
*
- * $Id: radio3.c,v 1.1 1996/01/01 03:45:30 jkh Exp $
+ * $Id: radio3.c,v 1.2 1996/04/07 03:21:01 jkh Exp $
*/
#include <stdio.h>
@@ -30,32 +30,32 @@ static int spending;
static int
check(dialogMenuItem *self)
{
- return ((int)self->data == spending);
+ return ((int)self->data == spending);
}
static int
spend(dialogMenuItem *self)
{
- spending = (int)self->data;
- return DITEM_REDRAW;
+ spending = (int)self->data;
+ return DITEM_SUCCESS | DITEM_REDRAW;
}
static void
ask(dialogMenuItem *self, int is_selected)
{
- if (is_selected) {
- char *str;
-
- if (!strcmp(self->prompt, "1000"))
- str = "You'd better ask both your parents first! ";
- else if (!strcmp(self->prompt, "500"))
- str = "You'd better at least ask your Dad! ";
- else
- str = "Yes, being frugal is probably a good idea!";
- DialogX = 15;
- DialogY = 17;
- dialog_msgbox("Free Advice", str, -1, -1, 0);
- }
+ if (is_selected) {
+ char *str;
+
+ if (!strcmp(self->prompt, "1000"))
+ str = "You'd better ask both your parents first! ";
+ else if (!strcmp(self->prompt, "500"))
+ str = "You'd better at least ask your Dad! ";
+ else
+ str = "Yes, being frugal is probably a good idea!";
+ DialogX = 15;
+ DialogY = 17;
+ dialog_msgbox("Free Advice", str, -1, -1, 0);
+ }
}
/*
@@ -63,11 +63,11 @@ ask(dialogMenuItem *self, int is_selected)
* a different location, leaving room for a msg box below it. This shows off the DialogX/DialogY extensions.
*/
- /* prompt title checked fire sel data */
+/* prompt title checked fire sel data */
static dialogMenuItem menu5[] = {
- { "1000", "Spend $1,000", check, spend, ask, (void *)1000 },
- { "500", "Spend $500", check, spend, ask, (void *)500 },
- { "100", "Spend $100", check, spend, ask, (void *)100 },
+ { "1000", "Spend $1,000", check, spend, ask, (void *)1000 },
+ { "500", "Spend $500", check, spend, ask, (void *)500 },
+ { "100", "Spend $100", check, spend, ask, (void *)100 },
};
/* End of hook functions */
@@ -76,22 +76,22 @@ static dialogMenuItem menu5[] = {
int
main(int argc, unsigned char *argv[])
{
- int retval;
-
- init_dialog();
-
-
- DialogX = 5;
- DialogY = 1;
- retval = dialog_radiolist("this is dialog_radiolist() in action, test #3",
- "This radio menu shows off the ability to put dialog menus and other\n"
- "controls at different locations, as well as the `selected' hook which\n"
- "lets you follow the traversal of the selection bar as well as what's\n"
- "selected.",
- -1, -1, 3, -3, menu5, NULL);
- dialog_clear();
- fprintf(stderr, "returned value for dialog_radiolist was %d (money set to %d)\n", retval, spending);
-
- end_dialog();
- return 0;
+ int retval;
+
+ init_dialog();
+
+
+ DialogX = 5;
+ DialogY = 1;
+ retval = dialog_radiolist("this is dialog_radiolist() in action, test #3",
+ "This radio menu shows off the ability to put dialog menus and other\n"
+ "controls at different locations, as well as the `selected' hook which\n"
+ "lets you follow the traversal of the selection bar as well as what's\n"
+ "selected.",
+ -1, -1, 3, -3, menu5, NULL);
+ dialog_clear();
+ fprintf(stderr, "returned value for dialog_radiolist was %d (money set to %d)\n", retval, spending);
+
+ end_dialog();
+ return 0;
}
diff --git a/gnu/lib/libdialog/checklist.c b/gnu/lib/libdialog/checklist.c
index b93baf5e6826..a43b23c043c5 100644
--- a/gnu/lib/libdialog/checklist.c
+++ b/gnu/lib/libdialog/checklist.c
@@ -40,440 +40,469 @@ int
dialog_checklist(unsigned char *title, unsigned char *prompt, int height, int width,
int list_height, int item_no, void *it, unsigned char *result)
{
- int i, j, x, y, cur_x, cur_y, box_x, box_y, key = 0, button = 0, choice = 0,
- l, k, scroll = 0, max_choice, *status;
- int redraw_menu = FALSE;
- char okButton, cancelButton;
- WINDOW *dialog, *list;
- unsigned char **items;
- dialogMenuItem *ditems;
-
- /* Allocate space for storing item on/off status */
- if ((status = alloca(sizeof(int) * abs(item_no))) == NULL) {
- endwin();
- fprintf(stderr, "\nCan't allocate memory in dialog_checklist().\n");
- exit(-1);
- }
-
- /* Previous calling syntax, e.g. just a list of strings? */
- if (item_no >= 0) {
- items = it;
- ditems = NULL;
- /* Initializes status */
- for (i = 0; i < item_no; i++)
- status[i] = !strcasecmp(items[i*3 + 2], "on");
- }
- /* It's the new specification format - fake the rest of the code out */
- else {
- item_no = abs(item_no);
- ditems = it;
- items = (unsigned char **)alloca((item_no * 3) * sizeof(unsigned char *));
-
- /* Initializes status */
- for (i = 0; i < item_no; i++) {
- status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE;
- items[i*3] = ditems[i].prompt;
- items[i*3 + 1] = ditems[i].title;
- items[i*3 + 2] = status[i] ? "on" : "off";
+ int i, j, x, y, cur_x, cur_y, box_x, box_y, key = 0, button = 0, choice = 0,
+ l, k, scroll = 0, max_choice, *status;
+ int redraw_menu = FALSE;
+ char okButton, cancelButton;
+ WINDOW *dialog, *list, *save;
+ unsigned char **items;
+ dialogMenuItem *ditems;
+
+ /* Allocate space for storing item on/off status */
+ if ((status = alloca(sizeof(int) * abs(item_no))) == NULL) {
+ endwin();
+ fprintf(stderr, "\nCan't allocate memory in dialog_checklist().\n");
+ exit(-1);
}
- }
- max_choice = MIN(list_height, item_no);
-
- check_x = 0;
- item_x = 0;
- /* Find length of longest item in order to center checklist */
- for (i = 0; i < item_no; i++) {
- l = strlen(items[i*3]);
- for (j = 0; j < item_no; j++) {
- k = strlen(items[j*3 + 1]);
- check_x = MAX(check_x, l + k + 6);
+
+ /* Previous calling syntax, e.g. just a list of strings? */
+ if (item_no >= 0) {
+ items = it;
+ ditems = NULL;
+ /* Initializes status */
+ for (i = 0; i < item_no; i++)
+ status[i] = !strcasecmp(items[i*3 + 2], "on");
}
- item_x = MAX(item_x, l);
- }
- if (height < 0)
- height = strheight(prompt)+list_height+4+2;
- if (width < 0) {
- i = strwidth(prompt);
- j = ((title != NULL) ? strwidth(title) : 0);
- width = MAX(i,j);
- width = MAX(width,check_x+4)+4;
- }
- width = MAX(width,24);
-
- if (width > COLS)
- width = COLS;
- if (height > LINES)
- height = LINES;
- /* center dialog box on screen */
- x = (COLS - width)/2;
- y = (LINES - height)/2;
-
-#ifdef HAVE_NCURSES
- if (use_shadow)
- draw_shadow(stdscr, y, x, height, width);
-#endif
- dialog = newwin(height, width, y, x);
- if (dialog == NULL) {
- endwin();
- fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width, y, x);
- return -1;
- }
- keypad(dialog, TRUE);
-
- draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
- wattrset(dialog, border_attr);
- wmove(dialog, height-3, 0);
- waddch(dialog, ACS_LTEE);
- for (i = 0; i < width-2; i++)
- waddch(dialog, ACS_HLINE);
- wattrset(dialog, dialog_attr);
- waddch(dialog, ACS_RTEE);
- wmove(dialog, height-2, 1);
- for (i = 0; i < width-2; i++)
- waddch(dialog, ' ');
-
- if (title != NULL) {
- wattrset(dialog, title_attr);
- wmove(dialog, 0, (width - strlen(title))/2 - 1);
- waddch(dialog, ' ');
- waddstr(dialog, title);
- waddch(dialog, ' ');
- }
- wattrset(dialog, dialog_attr);
- wmove(dialog, 1, 2);
- print_autowrap(dialog, prompt, height - 1, width - 2, width, 1, 2, TRUE, FALSE);
-
- list_width = width - 6;
- getyx(dialog, cur_y, cur_x);
- box_y = cur_y + 1;
- box_x = (width - list_width) / 2 - 1;
-
- /* create new window for the list */
- list = subwin(dialog, list_height, list_width, y + box_y + 1, x + box_x + 1);
- if (list == NULL) {
- endwin();
- fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", list_height, list_width,
- y + box_y + 1, x + box_x + 1);
- return -1;
- }
- keypad(list, TRUE);
-
- /* draw a box around the list items */
- draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, menubox_border_attr, menubox_attr);
-
- check_x = (list_width - check_x) / 2;
- item_x = check_x + item_x + 6;
-
- /* Print the list */
- for (i = 0; i < max_choice; i++)
- print_item(list, items[i*3], items[i*3 + 1], status[i], i, i == choice, DREF(ditems, i));
- wnoutrefresh(list);
- print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
-
- display_helpline(dialog, height-1, width);
-
- x = width/2-11;
- y = height-2;
- /* Is this a fancy new style argument string where we get to override
- * the buttons, or an old style one where they're fixed?
- */
- if (ditems && result) {
- cancelButton = toupper(ditems[CANCEL_BUTTON].prompt[0]);
- print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5,
- ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : FALSE);
- okButton = toupper(ditems[OK_BUTTON].prompt[0]);
- print_button(dialog, ditems[OK_BUTTON].prompt, y, x,
- ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE);
- }
- else {
- cancelButton = 'C';
- print_button(dialog, "Cancel", y, x + 14, FALSE);
- okButton = 'O';
- print_button(dialog, " OK ", y, x, TRUE);
- }
- wrefresh(dialog);
-
- while (key != ESC) {
- key = wgetch(dialog);
-
- /* Shortcut to OK? */
- if (toupper(key) == okButton) {
- if (ditems && result && ditems[OK_BUTTON].fire) {
- if (ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]) == DITEM_FAILURE) {
- wrefresh(dialog);
- continue;
- }
- else
- delwin(dialog);
- }
- else {
- delwin(dialog);
- *result = '\0';
+ /* It's the new specification format - fake the rest of the code out */
+ else {
+ item_no = abs(item_no);
+ ditems = it;
+ items = (unsigned char **)alloca((item_no * 3) * sizeof(unsigned char *));
+
+ /* Initializes status */
for (i = 0; i < item_no; i++) {
- if (status[i]) {
- strcat(result, items[i*3]);
- strcat(result, "\n");
- }
+ status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE;
+ items[i*3] = ditems[i].prompt;
+ items[i*3 + 1] = ditems[i].title;
+ items[i*3 + 2] = status[i] ? "on" : "off";
}
- }
- return 0;
}
- /* Shortcut to cancel? */
- else if (toupper(key) == cancelButton) {
- if (ditems && result && ditems[CANCEL_BUTTON].fire) {
- if (ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]) == DITEM_FAILURE) {
- wrefresh(dialog);
- continue;
+ max_choice = MIN(list_height, item_no);
+
+ check_x = 0;
+ item_x = 0;
+ /* Find length of longest item in order to center checklist */
+ for (i = 0; i < item_no; i++) {
+ l = strlen(items[i*3]);
+ for (j = 0; j < item_no; j++) {
+ k = strlen(items[j*3 + 1]);
+ check_x = MAX(check_x, l + k + 6);
}
- }
- delwin(dialog);
- return 1;
+ item_x = MAX(item_x, l);
+ }
+ if (height < 0)
+ height = strheight(prompt)+list_height+4+2;
+ if (width < 0) {
+ i = strwidth(prompt);
+ j = ((title != NULL) ? strwidth(title) : 0);
+ width = MAX(i,j);
+ width = MAX(width,check_x+4)+4;
}
+ width = MAX(width,24);
+
+ if (width > COLS)
+ width = COLS;
+ if (height > LINES)
+ height = LINES;
+ /* center dialog box on screen */
+ x = (COLS - width)/2;
+ y = (LINES - height)/2;
- /* Check if key pressed matches first character of any item tag in list */
+draw:
+ save = dupwin(newscr);
+#ifdef HAVE_NCURSES
+ if (use_shadow)
+ draw_shadow(stdscr, y, x, height, width);
+#endif
+ dialog = newwin(height, width, y, x);
+ if (dialog == NULL) {
+ delwin(save);
+ endwin();
+ fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width, y, x);
+ return -1;
+ }
+ keypad(dialog, TRUE);
+
+ draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+ wattrset(dialog, border_attr);
+ wmove(dialog, height-3, 0);
+ waddch(dialog, ACS_LTEE);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ACS_HLINE);
+ wattrset(dialog, dialog_attr);
+ waddch(dialog, ACS_RTEE);
+ wmove(dialog, height-2, 1);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ' ');
+
+ if (title != NULL) {
+ wattrset(dialog, title_attr);
+ wmove(dialog, 0, (width - strlen(title))/2 - 1);
+ waddch(dialog, ' ');
+ waddstr(dialog, title);
+ waddch(dialog, ' ');
+ }
+ wattrset(dialog, dialog_attr);
+ wmove(dialog, 1, 2);
+ print_autowrap(dialog, prompt, height - 1, width - 2, width, 1, 2, TRUE, FALSE);
+
+ list_width = width - 6;
+ getyx(dialog, cur_y, cur_x);
+ box_y = cur_y + 1;
+ box_x = (width - list_width) / 2 - 1;
+
+ /* create new window for the list */
+ list = subwin(dialog, list_height, list_width, y + box_y + 1, x + box_x + 1);
+ if (list == NULL) {
+ delwin(dialog);
+ delwin(save);
+ endwin();
+ fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", list_height, list_width,
+ y + box_y + 1, x + box_x + 1);
+ return -1;
+ }
+ keypad(list, TRUE);
+
+ /* draw a box around the list items */
+ draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, menubox_border_attr, menubox_attr);
+
+ check_x = (list_width - check_x) / 2;
+ item_x = check_x + item_x + 6;
+
+ /* Print the list */
for (i = 0; i < max_choice; i++)
- if (key < 0x100 && toupper(key) == toupper(items[(scroll+i)*3][0]))
- break;
-
- if (i < max_choice || (key >= '1' && key <= MIN('9', '0'+max_choice)) || key == KEY_UP ||
- key == KEY_DOWN || key == ' ' || key == '+' || key == '-' ) {
-
- if (key >= '1' && key <= MIN('9', '0'+max_choice))
- i = key - '1';
-
- else if (key == KEY_UP || key == '-') {
- if (!choice) {
- if (scroll) {
- /* Scroll list down */
- getyx(dialog, cur_y, cur_x); /* Save cursor position */
- if (list_height > 1) {
- /* De-highlight current first item before scrolling down */
- print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, FALSE, DREF(ditems, scroll));
- scrollok(list, TRUE);
- wscrl(list, -1);
- scrollok(list, FALSE);
- }
- scroll--;
- print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, TRUE, DREF(ditems, scroll));
- wnoutrefresh(list);
- print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
- wrefresh(dialog);
- }
- continue; /* wait for another key press */
- }
- else
- i = choice - 1;
- }
- else if (key == KEY_DOWN || key == '+') {
- if (choice == max_choice - 1) {
- if (scroll+choice < item_no-1) {
- /* Scroll list up */
- getyx(dialog, cur_y, cur_x); /* Save cursor position */
- if (list_height > 1) {
- /* De-highlight current last item before scrolling up */
- print_item(list, items[(scroll+max_choice-1)*3], items[(scroll+max_choice-1)*3 + 1],
- status[scroll+max_choice-1], max_choice-1, FALSE, DREF(ditems, scroll + max_choice - 1));
- scrollok(list, TRUE);
- scroll(list);
- scrollok(list, FALSE);
- }
- scroll++;
- print_item(list, items[(scroll+max_choice-1)*3], items[(scroll+max_choice-1)*3 + 1],
- status[scroll+max_choice-1], max_choice-1, TRUE, DREF(ditems, scroll + max_choice - 1));
- wnoutrefresh(list);
- print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
- wrefresh(dialog);
- }
- continue; /* wait for another key press */
- }
- else
- i = choice + 1;
- }
- else if (key == ' ') { /* Toggle item status */
- char lbra = 0, rbra = 0, mark = 0;
-
- if (ditems) {
- if (ditems[scroll+choice].fire) {
- int st = ditems[scroll+choice].fire(&ditems[scroll+choice]);
-
- if (st == DITEM_LEAVE_MENU) {
- /* Allow a fire action to take us out of the menu */
- key = ESC;
- break;
- }
- else if (st == DITEM_FAILURE) {
- wrefresh(dialog);
- continue;
+ print_item(list, items[i*3], items[i*3 + 1], status[i], i, i == choice, DREF(ditems, i));
+ wnoutrefresh(list);
+ print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
+
+ display_helpline(dialog, height-1, width);
+
+ x = width/2-11;
+ y = height-2;
+ /* Is this a fancy new style argument string where we get to override
+ * the buttons, or an old style one where they're fixed?
+ */
+ if (ditems && result) {
+ cancelButton = toupper(ditems[CANCEL_BUTTON].prompt[0]);
+ print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5,
+ ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : FALSE);
+ okButton = toupper(ditems[OK_BUTTON].prompt[0]);
+ print_button(dialog, ditems[OK_BUTTON].prompt, y, x,
+ ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE);
+ }
+ else {
+ cancelButton = 'C';
+ print_button(dialog, "Cancel", y, x + 14, FALSE);
+ okButton = 'O';
+ print_button(dialog, " OK ", y, x, TRUE);
+ }
+ wrefresh(dialog);
+
+ while (key != ESC) {
+ key = wgetch(dialog);
+
+ /* Shortcut to OK? */
+ if (toupper(key) == okButton) {
+ if (ditems && result && ditems[OK_BUTTON].fire) {
+ int st = ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]);
+
+ if (DITEM_STATUS(st) == DITEM_FAILURE) {
+ wrefresh(dialog);
+ continue;
+ }
+ else {
+ delwin(dialog);
+ if (st & DITEM_RESTORE) {
+ touchwin(save);
+ wrefresh(save);
+ }
+ }
}
- else if (st == DITEM_REDRAW) {
- for (i = 0; i < max_choice; i++) {
- status[scroll + i] = ditems[scroll + i].checked ?
- ditems[scroll + i].checked(&ditems[scroll + i]) : FALSE;
- print_item(list, items[(scroll+i)*3], items[(scroll+i)*3 + 1], status[scroll+i], i, i == choice,
- DREF(ditems, scroll + i));
- }
- wnoutrefresh(list);
- print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
- wrefresh(dialog);
+ else {
+ delwin(dialog);
+ *result = '\0';
+ for (i = 0; i < item_no; i++) {
+ if (status[i]) {
+ strcat(result, items[i*3]);
+ strcat(result, "\n");
+ }
+ }
}
- }
- status[scroll+choice] = ditems[scroll+choice].checked ?
- ditems[scroll+choice].checked(&ditems[scroll+choice]) : FALSE;
- lbra = ditems[scroll+choice].lbra;
- rbra = ditems[scroll+choice].rbra;
- mark = ditems[scroll+choice].mark;
+ delwin(save);
+ return 0;
}
- else
- status[scroll+choice] = !status[scroll+choice];
- getyx(dialog, cur_y, cur_x); /* Save cursor position */
- wmove(list, choice, check_x);
- wattrset(list, check_selected_attr);
- if (!lbra)
- lbra = '[';
- if (!rbra)
- rbra = ']';
- if (!mark)
- mark = 'X';
- wprintw(list, "%c%c%c", lbra, status[scroll+choice] ? mark : ' ', rbra);
- wnoutrefresh(list);
- wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
- wrefresh(dialog);
- continue; /* wait for another key press */
- }
+ /* Shortcut to cancel? */
+ else if (toupper(key) == cancelButton) {
+ if (ditems && result && ditems[CANCEL_BUTTON].fire) {
+ int st;
- if (i != choice) {
- /* De-highlight current item */
- getyx(dialog, cur_y, cur_x); /* Save cursor position */
- print_item(list, items[(scroll+choice)*3], items[(scroll+choice)*3 + 1], status[scroll+choice], choice, FALSE,
- DREF(ditems, scroll + choice));
+ st = ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]);
- /* Highlight new item */
- choice = i;
- print_item(list, items[(scroll+choice)*3], items[(scroll+choice)*3 + 1], status[scroll+choice], choice, TRUE,
- DREF(ditems, scroll + choice));
- wnoutrefresh(list);
- wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
- wrefresh(dialog);
- }
- continue; /* wait for another key press */
- }
-
- switch (key) {
- case KEY_PPAGE: /* can we go up? */
- if (scroll > height - 4)
- scroll -= (height-4);
- else
- scroll = 0;
- redraw_menu = TRUE;
- break;
-
- case KEY_NPAGE: /* can we go down a full page? */
- if (scroll + list_height >= item_no-1 - list_height) {
- scroll = item_no - list_height;
- if (scroll < 0)
- scroll = 0;
- }
- else
- scroll += list_height;
- redraw_menu = TRUE;
- break;
-
- case KEY_HOME: /* go to the top */
- scroll = 0;
- choice = 0;
- redraw_menu = TRUE;
- break;
-
- case KEY_END: /* Go to the bottom */
- scroll = item_no - list_height;
- if (scroll < 0)
- scroll = 0;
- choice = max_choice - 1;
- redraw_menu = TRUE;
- break;
-
- /* swap the selection of OK/Cancel buttons */
- case TAB:
- case KEY_BTAB:
- case KEY_LEFT:
- case KEY_RIGHT:
- button = !button;
- if (ditems && result) {
- if (button) {
- print_button(dialog, ditems[OK_BUTTON].prompt, y, x,
- ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button);
- print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5,
- ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button);
- }
- else {
- print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5,
- ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button);
- print_button(dialog, ditems[OK_BUTTON].prompt, y, x,
- ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button);
- }
- }
- else {
- if (button) {
- print_button(dialog, " OK ", y, x, !button);
- print_button(dialog, "Cancel", y, x + 14, button);
+ if (DITEM_STATUS(st) == DITEM_FAILURE) {
+ wrefresh(dialog);
+ continue;
+ }
+ else if (st & DITEM_RESTORE) {
+ touchwin(save);
+ wrefresh(save);
+ }
+ }
+ delwin(dialog);
+ delwin(save);
+ return 1;
}
- else {
- print_button(dialog, "Cancel", y, x + 14, button);
- print_button(dialog, " OK ", y, x, !button);
+
+ /* Check if key pressed matches first character of any item tag in list */
+ for (i = 0; i < max_choice; i++)
+ if (key < 0x100 && toupper(key) == toupper(items[(scroll+i)*3][0]))
+ break;
+
+ if (i < max_choice || (key >= '1' && key <= MIN('9', '0'+max_choice)) || key == KEY_UP ||
+ key == KEY_DOWN || key == ' ' || key == '+' || key == '-' ) {
+
+ if (key >= '1' && key <= MIN('9', '0'+max_choice))
+ i = key - '1';
+
+ else if (key == KEY_UP || key == '-') {
+ if (!choice) {
+ if (scroll) {
+ /* Scroll list down */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ if (list_height > 1) {
+ /* De-highlight current first item before scrolling down */
+ print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, FALSE, DREF(ditems, scroll));
+ scrollok(list, TRUE);
+ wscrl(list, -1);
+ scrollok(list, FALSE);
+ }
+ scroll--;
+ print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, TRUE, DREF(ditems, scroll));
+ wnoutrefresh(list);
+ print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+ else
+ i = choice - 1;
+ }
+ else if (key == KEY_DOWN || key == '+') {
+ if (choice == max_choice - 1) {
+ if (scroll+choice < item_no-1) {
+ /* Scroll list up */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ if (list_height > 1) {
+ /* De-highlight current last item before scrolling up */
+ print_item(list, items[(scroll+max_choice-1)*3], items[(scroll+max_choice-1)*3 + 1],
+ status[scroll+max_choice-1], max_choice-1, FALSE, DREF(ditems, scroll + max_choice - 1));
+ scrollok(list, TRUE);
+ scroll(list);
+ scrollok(list, FALSE);
+ }
+ scroll++;
+ print_item(list, items[(scroll+max_choice-1)*3], items[(scroll+max_choice-1)*3 + 1],
+ status[scroll+max_choice-1], max_choice-1, TRUE, DREF(ditems, scroll + max_choice - 1));
+ wnoutrefresh(list);
+ print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+ else
+ i = choice + 1;
+ }
+ else if (key == ' ') { /* Toggle item status */
+ char lbra = 0, rbra = 0, mark = 0;
+
+ if (ditems) {
+ if (ditems[scroll+choice].fire) {
+ int st = ditems[scroll+choice].fire(&ditems[scroll+choice]);
+
+ if (st & DITEM_REDRAW) {
+ for (i = 0; i < max_choice; i++)
+ print_item(list, items[(scroll+i)*3], items[(scroll+i)*3 + 1], status[scroll+i], i, i == choice,
+ DREF(ditems, scroll + i));
+ wnoutrefresh(list);
+ print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
+ wrefresh(dialog);
+ }
+ if (DITEM_STATUS(st) == DITEM_FAILURE) {
+ wrefresh(dialog);
+ continue;
+ }
+ else if (st & DITEM_RESTORE) {
+ touchwin(save);
+ wrefresh(save);
+ }
+ if (st & DITEM_RECREATE) {
+ delwin(save);
+ delwin(dialog);
+ goto draw;
+ }
+ else if (st & DITEM_LEAVE_MENU) {
+ /* Allow a fire action to take us out of the menu */
+ key = ESC;
+ break;
+ }
+ }
+ status[scroll+choice] = ditems[scroll+choice].checked ?
+ ditems[scroll+choice].checked(&ditems[scroll+choice]) : FALSE;
+ lbra = ditems[scroll+choice].lbra;
+ rbra = ditems[scroll+choice].rbra;
+ mark = ditems[scroll+choice].mark;
+ }
+ else
+ status[scroll+choice] = !status[scroll+choice];
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ wmove(list, choice, check_x);
+ wattrset(list, check_selected_attr);
+ if (!lbra)
+ lbra = '[';
+ if (!rbra)
+ rbra = ']';
+ if (!mark)
+ mark = 'X';
+ wprintw(list, "%c%c%c", lbra, status[scroll+choice] ? mark : ' ', rbra);
+ wnoutrefresh(list);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
+ wrefresh(dialog);
+ continue; /* wait for another key press */
+ }
+
+ if (i != choice) {
+ /* De-highlight current item */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ print_item(list, items[(scroll+choice)*3], items[(scroll+choice)*3 + 1], status[scroll+choice], choice, FALSE,
+ DREF(ditems, scroll + choice));
+
+ /* Highlight new item */
+ choice = i;
+ print_item(list, items[(scroll+choice)*3], items[(scroll+choice)*3 + 1], status[scroll+choice], choice, TRUE,
+ DREF(ditems, scroll + choice));
+ wnoutrefresh(list);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
}
- }
- wrefresh(dialog);
- break;
-
- /* Select either the OK or Cancel button */
- case '\n':
- case '\r':
- if (!button && result) {
- if (ditems && ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire) {
- if (ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire(&ditems[button ? CANCEL_BUTTON : OK_BUTTON]) ==
- DITEM_FAILURE) {
+
+ switch (key) {
+ case KEY_PPAGE: /* can we go up? */
+ if (scroll > height - 4)
+ scroll -= (height-4);
+ else
+ scroll = 0;
+ redraw_menu = TRUE;
+ break;
+
+ case KEY_NPAGE: /* can we go down a full page? */
+ if (scroll + list_height >= item_no-1 - list_height) {
+ scroll = item_no - list_height;
+ if (scroll < 0)
+ scroll = 0;
+ }
+ else
+ scroll += list_height;
+ redraw_menu = TRUE;
+ break;
+
+ case KEY_HOME: /* go to the top */
+ scroll = 0;
+ choice = 0;
+ redraw_menu = TRUE;
+ break;
+
+ case KEY_END: /* Go to the bottom */
+ scroll = item_no - list_height;
+ if (scroll < 0)
+ scroll = 0;
+ choice = max_choice - 1;
+ redraw_menu = TRUE;
+ break;
+
+ /* swap the selection of OK/Cancel buttons */
+ case TAB:
+ case KEY_BTAB:
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ button = !button;
+ if (ditems && result) {
+ if (button) {
+ print_button(dialog, ditems[OK_BUTTON].prompt, y, x,
+ ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button);
+ print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5,
+ ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button);
+ }
+ else {
+ print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5,
+ ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button);
+ print_button(dialog, ditems[OK_BUTTON].prompt, y, x,
+ ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button);
+ }
+ }
+ else {
+ if (button) {
+ print_button(dialog, " OK ", y, x, !button);
+ print_button(dialog, "Cancel", y, x + 14, button);
+ }
+ else {
+ print_button(dialog, "Cancel", y, x + 14, button);
+ print_button(dialog, " OK ", y, x, !button);
+ }
+ }
wrefresh(dialog);
- continue;
- }
- }
- else {
- *result = '\0';
- for (i = 0; i < item_no; i++) {
- if (status[i]) {
- strcat(result, items[i*3]);
- strcat(result, "\n");
+ break;
+
+ /* Select either the OK or Cancel button */
+ case '\n':
+ case '\r':
+ if (!button && result) {
+ if (ditems && ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire) {
+ if (ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire(&ditems[button ? CANCEL_BUTTON : OK_BUTTON]) ==
+ DITEM_FAILURE) {
+ wrefresh(dialog);
+ continue;
+ }
+ }
+ else {
+ *result = '\0';
+ for (i = 0; i < item_no; i++) {
+ if (status[i]) {
+ strcat(result, items[i*3]);
+ strcat(result, "\n");
+ }
+ }
+ }
}
- }
+ delwin(dialog);
+ delwin(save);
+ return button;
+ break;
+
+ /* Let me outta here! */
+ case ESC:
+ break;
+
+ /* Help! */
+ case KEY_F(1):
+ case '?':
+ display_helpfile();
+ break;
+ }
+
+ if (redraw_menu) {
+ for (i = 0; i < max_choice; i++)
+ print_item(list, items[(scroll+i)*3], items[(scroll+i)*3 + 1], status[scroll+i], i, i == choice,
+ DREF(ditems, scroll + i));
+ wnoutrefresh(list);
+ print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
+ wrefresh(dialog);
+ redraw_menu = FALSE;
}
- }
- delwin(dialog);
- return button;
- break;
-
- /* Let me outta here! */
- case ESC:
- break;
-
- /* Help! */
- case KEY_F(1):
- case '?':
- display_helpfile();
- break;
- }
-
- if (redraw_menu) {
- for (i = 0; i < max_choice; i++)
- print_item(list, items[(scroll+i)*3], items[(scroll+i)*3 + 1], status[scroll+i], i, i == choice,
- DREF(ditems, scroll + i));
- wnoutrefresh(list);
- print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
- wrefresh(dialog);
- redraw_menu = FALSE;
}
- }
-
- delwin(dialog);
- return -1; /* ESC pressed */
+ delwin(dialog);
+ delwin(save);
+ return -1; /* ESC pressed */
}
/* End of dialog_checklist() */
@@ -485,31 +514,31 @@ static void
print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int status, int choice, int selected,
dialogMenuItem *me)
{
- int i;
-
- /* Clear 'residue' of last item */
- wattrset(win, menubox_attr);
- wmove(win, choice, 0);
- for (i = 0; i < list_width; i++)
+ int i;
+
+ /* Clear 'residue' of last item */
+ wattrset(win, menubox_attr);
+ wmove(win, choice, 0);
+ for (i = 0; i < list_width; i++)
+ waddch(win, ' ');
+ wmove(win, choice, check_x);
+ wattrset(win, selected ? check_selected_attr : check_attr);
+ wprintw(win, "%c%c%c", me && me->lbra ? me->lbra : '[',
+ status ? me && me->mark ? me->mark : 'X' : ' ',
+ me && me->rbra ? me->rbra : ']');
+ wattrset(win, menubox_attr);
waddch(win, ' ');
- wmove(win, choice, check_x);
- wattrset(win, selected ? check_selected_attr : check_attr);
- wprintw(win, "%c%c%c", me && me->lbra ? me->lbra : '[',
- status ? me && me->mark ? me->mark : 'X' : ' ',
- me && me->rbra ? me->rbra : ']');
- wattrset(win, menubox_attr);
- waddch(win, ' ');
- wattrset(win, selected ? tag_key_selected_attr : tag_key_attr);
- waddch(win, tag[0]);
- wattrset(win, selected ? tag_selected_attr : tag_attr);
- waddstr(win, tag + 1);
- wmove(win, choice, item_x);
- wattrset(win, selected ? item_selected_attr : item_attr);
- waddstr(win, item);
- /* If have a selection handler for this, call it */
- if (me && me->selected) {
- wrefresh(win);
- me->selected(me, selected);
- }
+ wattrset(win, selected ? tag_key_selected_attr : tag_key_attr);
+ waddch(win, tag[0]);
+ wattrset(win, selected ? tag_selected_attr : tag_attr);
+ waddstr(win, tag + 1);
+ wmove(win, choice, item_x);
+ wattrset(win, selected ? item_selected_attr : item_attr);
+ waddstr(win, item);
+ /* If have a selection handler for this, call it */
+ if (me && me->selected) {
+ wrefresh(win);
+ me->selected(me, selected);
+ }
}
/* End of print_item() */
diff --git a/gnu/lib/libdialog/dialog.h b/gnu/lib/libdialog/dialog.h
index 28c96f628a1a..9619adfbf966 100644
--- a/gnu/lib/libdialog/dialog.h
+++ b/gnu/lib/libdialog/dialog.h
@@ -39,10 +39,16 @@
#endif
/* special return codes for `fire' actions */
+#define DITEM_STATUS(flag) ((flag) & 0x0000FFFF)
#define DITEM_SUCCESS 0
-#define DITEM_FAILURE -1
-#define DITEM_LEAVE_MENU -2
-#define DITEM_REDRAW -3
+#define DITEM_FAILURE 1
+
+/* Flags - returned in upper 16 bits of return status */
+#define DITEM_LEAVE_MENU (1 << 16)
+#define DITEM_REDRAW (1 << 17)
+#define DITEM_RECREATE (1 << 18)
+#define DITEM_RESTORE (1 << 19)
+
/* negative offsets for buttons in item lists, if specified */
#define OK_BUTTON -2
diff --git a/gnu/lib/libdialog/menubox.c b/gnu/lib/libdialog/menubox.c
index 572463a61121..9308aaa0a179 100644
--- a/gnu/lib/libdialog/menubox.c
+++ b/gnu/lib/libdialog/menubox.c
@@ -42,7 +42,7 @@ dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width,
int i, j, x, y, cur_x, cur_y, box_x, box_y, key = 0, button = 0, choice = 0,
l, k, scroll = 0, max_choice, redraw_menu = FALSE;
char okButton, cancelButton;
- WINDOW *dialog, *menu;
+ WINDOW *dialog, *menu, *save;
unsigned char **items;
dialogMenuItem *ditems;
@@ -99,12 +99,15 @@ dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width,
x = DialogX ? DialogX : (COLS - width)/2;
y = DialogY ? DialogY : (LINES - height)/2;
+draw:
+ save = dupwin(newscr);
#ifdef HAVE_NCURSES
if (use_shadow)
draw_shadow(stdscr, y, x, height, width);
#endif
dialog = newwin(height, width, y, x);
if (dialog == NULL) {
+ delwin(save);
endwin();
fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x);
return -1;
@@ -142,6 +145,7 @@ dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width,
/* create new window for the menu */
menu = subwin(dialog, menu_height, menu_width, y + box_y + 1, x + box_x + 1);
if (menu == NULL) {
+ delwin(save);
endwin();
fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", menu_height,menu_width,y+box_y+1,x+box_x+1);
return -1;
@@ -188,24 +192,42 @@ dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width,
/* Shortcut to OK? */
if (toupper(key) == okButton) {
if (ditems && result && ditems[OK_BUTTON].fire) {
- if (ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]) == DITEM_FAILURE)
+ int status;
+
+ status = ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]);
+ if (DITEM_STATUS(status) == DITEM_FAILURE)
continue;
- else
+ else {
delwin(dialog);
+ if (status & DITEM_RESTORE) {
+ touchwin(save);
+ wrefresh(save);
+ }
+ }
+
}
else {
delwin(dialog);
- strcpy(result, items[(scroll+choice)*2]);
+ strcpy(result, items[(scroll + choice) * 2]);
}
+ delwin(save);
return 0;
}
/* Shortcut to cancel? */
else if (toupper(key) == cancelButton) {
if (ditems && result && ditems[CANCEL_BUTTON].fire) {
- if (ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]) == DITEM_FAILURE)
+ int status;
+
+ status = ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]);
+ if (DITEM_STATUS(status) == DITEM_FAILURE)
continue;
+ else if (status & DITEM_RESTORE) {
+ touchwin(save);
+ wrefresh(save);
+ }
}
delwin(dialog);
+ delwin(save);
return 1;
}
@@ -358,14 +380,29 @@ dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width,
case '\r':
case '\n':
if (!button) {
+ /* A fire routine can do just about anything to the screen, so be prepared
+ to accept some hints as to what to do in the aftermath. */
if (ditems && ditems[scroll + choice].fire) {
- if (ditems[scroll + choice].fire(&ditems[scroll + choice]) == DITEM_FAILURE)
+ int status;
+
+ status = ditems[scroll + choice].fire(&ditems[scroll + choice]);
+ if (DITEM_STATUS(status) == DITEM_FAILURE)
continue;
+ else if (status & DITEM_RESTORE) {
+ touchwin(save);
+ wrefresh(save);
+ }
+ else if (status & DITEM_RECREATE) {
+ delwin(save);
+ delwin(dialog);
+ goto draw;
+ }
}
else if (result)
strcpy(result, items[(scroll+choice)*2]);
}
delwin(dialog);
+ delwin(save);
return button;
case ESC:
@@ -390,6 +427,7 @@ dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width,
}
delwin(dialog);
+ delwin(save);
return -1; /* ESC pressed */
}
/* End of dialog_menu() */
diff --git a/gnu/lib/libdialog/radiolist.c b/gnu/lib/libdialog/radiolist.c
index 3443eceb10dc..fd0c25632ee1 100644
--- a/gnu/lib/libdialog/radiolist.c
+++ b/gnu/lib/libdialog/radiolist.c
@@ -40,427 +40,475 @@ int
dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, int width, int list_height,
int item_no, void *it, unsigned char *result)
{
- int i, j, x, y, cur_x, cur_y, box_x, box_y, key = 0, button = 0, choice = 0,
- l, k, scroll = 0, max_choice, *status, was_on = 0;
- int redraw_menu = FALSE;
- char okButton, cancelButton;
- WINDOW *dialog, *list;
- unsigned char **items;
- dialogMenuItem *ditems;
-
- /* Allocate space for storing item on/off status */
- if ((status = alloca(sizeof(int) * abs(item_no))) == NULL) {
- endwin();
- fprintf(stderr, "\nCan't allocate memory in dialog_radiolist().\n");
- exit(-1);
- }
-
- /* Previous calling syntax, e.g. just a list of strings? */
- if (item_no >= 0) {
- items = it;
- ditems = NULL;
-
- /* Initializes status */
- for (i = 0; i < item_no; i++) {
- status[i] = !strcasecmp(items[i*3 + 2], "on");
- if (status[i]) {
- if (was_on)
- status[i] = FALSE;
- else
- was_on = 1;
- }
- }
- }
- /* It's the new specification format - fake the rest of the code out */
- else {
- item_no = abs(item_no);
- ditems = it;
- items = (unsigned char **)alloca((item_no * 3) * sizeof(unsigned char *));
- /* Initializes status */
- for (i = 0; i < item_no; i++) {
- status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE;
- if (status[i]) {
- if (was_on)
- status[i] = FALSE;
- else
- was_on = 1;
- }
- items[i*3] = ditems[i].prompt;
- items[i*3 + 1] = ditems[i].title;
- items[i*3 + 2] = status[i] ? "on" : "off";
- }
- }
- max_choice = MIN(list_height, item_no);
-
- check_x = 0;
- item_x = 0;
- /* Find length of longest item in order to center radiolist */
- for (i = 0; i < item_no; i++) {
- l = strlen(items[i*3]);
- for (j = 0; j < item_no; j++) {
- k = strlen(items[j*3 + 1]);
- check_x = MAX(check_x, l + k + 6);
+ int i, j, x, y, cur_x, cur_y, box_x, box_y, key = 0, button = 0, choice = 0,
+ l, k, scroll = 0, max_choice, *status, was_on = 0;
+ int redraw_menu = FALSE;
+ char okButton, cancelButton;
+ WINDOW *dialog, *list, *save;
+ unsigned char **items;
+ dialogMenuItem *ditems;
+
+ /* Allocate space for storing item on/off status */
+ if ((status = alloca(sizeof(int) * abs(item_no))) == NULL) {
+ endwin();
+ fprintf(stderr, "\nCan't allocate memory in dialog_radiolist().\n");
+ exit(-1);
}
- item_x = MAX(item_x, l);
- }
- if (height < 0)
- height = strheight(prompt)+list_height+4+2;
- if (width < 0) {
- i = strwidth(prompt);
- j = ((title != NULL) ? strwidth(title) : 0);
- width = MAX(i,j);
- width = MAX(width,check_x+4)+4;
- }
- width = MAX(width,24);
-
- if (width > COLS)
- width = COLS;
- if (height > LINES)
- height = LINES;
- /* center dialog box on screen */
- x = DialogX ? DialogX : (COLS - width)/2;
- y = DialogY ? DialogY : (LINES - height)/2;
-
-#ifdef HAVE_NCURSES
- if (use_shadow)
- draw_shadow(stdscr, y, x, height, width);
-#endif
- dialog = newwin(height, width, y, x);
- if (dialog == NULL) {
- endwin();
- fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x);
- return -1;
- }
- keypad(dialog, TRUE);
-
- draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
- wattrset(dialog, border_attr);
- wmove(dialog, height-3, 0);
- waddch(dialog, ACS_LTEE);
- for (i = 0; i < width-2; i++)
- waddch(dialog, ACS_HLINE);
- wattrset(dialog, dialog_attr);
- waddch(dialog, ACS_RTEE);
- wmove(dialog, height-2, 1);
- for (i = 0; i < width-2; i++)
- waddch(dialog, ' ');
-
- if (title != NULL) {
- wattrset(dialog, title_attr);
- wmove(dialog, 0, (width - strlen(title))/2 - 1);
- waddch(dialog, ' ');
- waddstr(dialog, title);
- waddch(dialog, ' ');
- }
- wattrset(dialog, dialog_attr);
- wmove(dialog, 1, 2);
- print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE);
-
- list_width = width-6;
- getyx(dialog, cur_y, cur_x);
- box_y = cur_y + 1;
- box_x = (width - list_width)/2 - 1;
-
- /* create new window for the list */
- list = subwin(dialog, list_height, list_width, y + box_y + 1, x + box_x + 1);
- if (list == NULL) {
- endwin();
- fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", list_height,list_width,y+box_y+1,x+box_x+1);
- return -1;
- }
- keypad(list, TRUE);
-
- /* draw a box around the list items */
- draw_box(dialog, box_y, box_x, list_height+2, list_width+2, menubox_border_attr, menubox_attr);
-
- check_x = (list_width - check_x) / 2;
- item_x = check_x + item_x + 6;
-
- /* Print the list */
- for (i = 0; i < max_choice; i++)
- print_item(list, items[i*3], items[i*3 + 1], status[i], i, i == choice, DREF(ditems, i));
- wnoutrefresh(list);
- print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
-
- display_helpline(dialog, height-1, width);
-
- x = width/2-11;
- y = height-2;
- if (ditems && result) {
- cancelButton = toupper(ditems[CANCEL_BUTTON].prompt[0]);
- print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5,
- ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : FALSE);
- okButton = toupper(ditems[OK_BUTTON].prompt[0]);
- print_button(dialog, ditems[OK_BUTTON].prompt, y, x,
- ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE);
- }
- else {
- cancelButton = 'C';
- print_button(dialog, "Cancel", y, x + 14, FALSE);
- okButton = 'O';
- print_button(dialog, " OK ", y, x, TRUE);
- }
- wrefresh(dialog);
-
- while (key != ESC) {
- key = wgetch(dialog);
-
- /* See if its the short-cut to "OK" */
- if (toupper(key) == okButton) {
- if (ditems && result && ditems[OK_BUTTON].fire) {
- if (ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]) == DITEM_FAILURE) {
- wrefresh(dialog);
- continue;
+
+ /* Previous calling syntax, e.g. just a list of strings? */
+ if (item_no >= 0) {
+ items = it;
+ ditems = NULL;
+
+ /* Initializes status */
+ for (i = 0; i < item_no; i++) {
+ status[i] = !strcasecmp(items[i*3 + 2], "on");
+ if (status[i]) {
+ if (was_on)
+ status[i] = FALSE;
+ else
+ was_on = 1;
+ }
}
- else
- delwin(dialog);
- }
- else {
- delwin(dialog);
- *result = '\0';
+ }
+ /* It's the new specification format - fake the rest of the code out */
+ else {
+ item_no = abs(item_no);
+ ditems = it;
+ items = (unsigned char **)alloca((item_no * 3) * sizeof(unsigned char *));
+ /* Initializes status */
for (i = 0; i < item_no; i++) {
- if (status[i]) {
- strcat(result, items[i*3]);
- break;
- }
+ status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE;
+ if (status[i]) {
+ if (was_on)
+ status[i] = FALSE;
+ else
+ was_on = 1;
+ }
+ items[i*3] = ditems[i].prompt;
+ items[i*3 + 1] = ditems[i].title;
+ items[i*3 + 2] = status[i] ? "on" : "off";
}
- }
- return 0;
}
- /* Shortcut to cancel */
- else if (toupper(key) == cancelButton) {
- if (ditems && result && ditems[CANCEL_BUTTON].fire) {
- if (ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]) == DITEM_FAILURE) {
- wrefresh(dialog);
- continue;
+ max_choice = MIN(list_height, item_no);
+
+ check_x = 0;
+ item_x = 0;
+ /* Find length of longest item in order to center radiolist */
+ for (i = 0; i < item_no; i++) {
+ l = strlen(items[i*3]);
+ for (j = 0; j < item_no; j++) {
+ k = strlen(items[j*3 + 1]);
+ check_x = MAX(check_x, l + k + 6);
}
- }
- delwin(dialog);
- return 1;
+ item_x = MAX(item_x, l);
+ }
+ if (height < 0)
+ height = strheight(prompt)+list_height+4+2;
+ if (width < 0) {
+ i = strwidth(prompt);
+ j = ((title != NULL) ? strwidth(title) : 0);
+ width = MAX(i,j);
+ width = MAX(width,check_x+4)+4;
}
+ width = MAX(width,24);
+
+ if (width > COLS)
+ width = COLS;
+ if (height > LINES)
+ height = LINES;
+ /* center dialog box on screen */
+ x = DialogX ? DialogX : (COLS - width)/2;
+ y = DialogY ? DialogY : (LINES - height)/2;
- /* Check if key pressed matches first character of any item tag in list */
+draw:
+ save = dupwin(newscr);
+#ifdef HAVE_NCURSES
+ if (use_shadow)
+ draw_shadow(stdscr, y, x, height, width);
+#endif
+ dialog = newwin(height, width, y, x);
+ if (dialog == NULL) {
+ delwin(save);
+ endwin();
+ fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width,y,x);
+ return -1;
+ }
+ keypad(dialog, TRUE);
+
+ draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
+ wattrset(dialog, border_attr);
+ wmove(dialog, height-3, 0);
+ waddch(dialog, ACS_LTEE);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ACS_HLINE);
+ wattrset(dialog, dialog_attr);
+ waddch(dialog, ACS_RTEE);
+ wmove(dialog, height-2, 1);
+ for (i = 0; i < width-2; i++)
+ waddch(dialog, ' ');
+
+ if (title != NULL) {
+ wattrset(dialog, title_attr);
+ wmove(dialog, 0, (width - strlen(title))/2 - 1);
+ waddch(dialog, ' ');
+ waddstr(dialog, title);
+ waddch(dialog, ' ');
+ }
+ wattrset(dialog, dialog_attr);
+ wmove(dialog, 1, 2);
+ print_autowrap(dialog, prompt, height-1, width-2, width, 1, 2, TRUE, FALSE);
+
+ list_width = width-6;
+ getyx(dialog, cur_y, cur_x);
+ box_y = cur_y + 1;
+ box_x = (width - list_width)/2 - 1;
+
+ /* create new window for the list */
+ list = subwin(dialog, list_height, list_width, y + box_y + 1, x + box_x + 1);
+ if (list == NULL) {
+ delwin(save);
+ delwin(dialog);
+ endwin();
+ fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", list_height,list_width,y+box_y+1,x+box_x+1);
+ return -1;
+ }
+ keypad(list, TRUE);
+
+ /* draw a box around the list items */
+ draw_box(dialog, box_y, box_x, list_height+2, list_width+2, menubox_border_attr, menubox_attr);
+
+ check_x = (list_width - check_x) / 2;
+ item_x = check_x + item_x + 6;
+
+ /* Print the list */
for (i = 0; i < max_choice; i++)
- if (toupper(key) == toupper(items[(scroll+i)*3][0]))
- break;
-
- if (i < max_choice || (key >= '1' && key <= MIN('9', '0' + max_choice)) ||
- key == KEY_UP || key == KEY_DOWN || key == ' ' || key == '+' || key == '-' ) {
- if (key >= '1' && key <= MIN('9', '0' + max_choice))
- i = key - '1';
- else if (key == KEY_UP || key == '-') {
- if (!choice) {
- if (scroll) {
- /* Scroll list down */
- getyx(dialog, cur_y, cur_x); /* Save cursor position */
- if (list_height > 1) {
- /* De-highlight current first item before scrolling down */
- print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, FALSE, DREF(ditems, scroll));
- scrollok(list, TRUE);
- wscrl(list, -1);
- scrollok(list, FALSE);
- }
- scroll--;
- print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, TRUE, DREF(ditems, scroll));
- wnoutrefresh(list);
- print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
- wrefresh(dialog);
- }
- continue; /* wait for another key press */
- }
- else
- i = choice - 1;
- }
- else if (key == KEY_DOWN || key == '+') {
- if (choice == max_choice - 1) {
- if (scroll+choice < item_no-1) {
- /* Scroll list up */
- getyx(dialog, cur_y, cur_x); /* Save cursor position */
- if (list_height > 1) {
- /* De-highlight current last item before scrolling up */
- print_item(list, items[(scroll + max_choice - 1) * 3], items[(scroll + max_choice - 1) * 3 + 1],
- status[scroll + max_choice - 1], max_choice - 1, FALSE, DREF(ditems, scroll + max_choice - 1));
- scrollok(list, TRUE);
- scroll(list);
- scrollok(list, FALSE);
- }
- scroll++;
- print_item(list, items[(scroll + max_choice - 1) * 3], items[(scroll + max_choice - 1) * 3 + 1],
- status[scroll + max_choice - 1], max_choice - 1, TRUE, DREF(ditems, scroll + max_choice - 1));
- wnoutrefresh(list);
- print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
- wrefresh(dialog);
- }
- continue; /* wait for another key press */
- }
- else
- i = choice + 1;
- }
- else if (key == ' ') { /* Toggle item status */
- if (status[scroll + choice])
- continue;
- else if (ditems) {
- if (ditems[scroll + choice].fire) {
- int st = ditems[scroll + choice].fire(&ditems[scroll + choice]);
+ print_item(list, items[i*3], items[i*3 + 1], status[i], i, i == choice, DREF(ditems, i));
+ wnoutrefresh(list);
+ print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
+
+ display_helpline(dialog, height-1, width);
+
+ x = width/2-11;
+ y = height-2;
+ if (ditems && result) {
+ cancelButton = toupper(ditems[CANCEL_BUTTON].prompt[0]);
+ print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5,
+ ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : FALSE);
+ okButton = toupper(ditems[OK_BUTTON].prompt[0]);
+ print_button(dialog, ditems[OK_BUTTON].prompt, y, x,
+ ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE);
+ }
+ else {
+ cancelButton = 'C';
+ print_button(dialog, "Cancel", y, x + 14, FALSE);
+ okButton = 'O';
+ print_button(dialog, " OK ", y, x, TRUE);
+ }
+ wrefresh(dialog);
+
+ while (key != ESC) {
+ key = wgetch(dialog);
+
+ /* See if its the short-cut to "OK" */
+ if (toupper(key) == okButton) {
+ if (ditems && result && ditems[OK_BUTTON].fire) {
+ int st;
- if (st == DITEM_LEAVE_MENU) {
- /* Allow a fire action to take us out of the menu */
- key = ESC;
- break;
+ st = ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]);
+ if (DITEM_STATUS(st) == DITEM_FAILURE)
+ continue;
+ else {
+ delwin(dialog);
+ if (st & DITEM_RESTORE) {
+ touchwin(save);
+ wrefresh(save);
+ }
+ }
}
- else if (st == DITEM_FAILURE) {
- wrefresh(dialog);
- continue;
+ else {
+ delwin(dialog);
+ *result = '\0';
+ for (i = 0; i < item_no; i++) {
+ if (status[i]) {
+ strcat(result, items[i*3]);
+ break;
+ }
+ }
}
- }
- for (i = 0; i < item_no; i++)
- status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE;
+ delwin(save);
+ return 0;
}
- else {
- for (i = 0; i < item_no; i++)
- status[i] = 0;
- status[scroll + choice] = TRUE;
+ /* Shortcut to cancel */
+ else if (toupper(key) == cancelButton) {
+ if (ditems && result && ditems[CANCEL_BUTTON].fire) {
+ int st;
+
+ st = ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]);
+ if (DITEM_STATUS(st) == DITEM_FAILURE) {
+ wrefresh(dialog);
+ continue;
+ }
+ else if (st & DITEM_RESTORE) {
+ touchwin(save);
+ wrefresh(save);
+ }
+ }
+ delwin(dialog);
+ delwin(save);
+ return 1;
}
- getyx(dialog, cur_y, cur_x); /* Save cursor position */
+
+ /* Check if key pressed matches first character of any item tag in list */
for (i = 0; i < max_choice; i++)
- print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], status[scroll + i], i, i == choice,
- DREF(ditems, scroll + i));
- wnoutrefresh(list);
- wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
- wrefresh(dialog);
- continue; /* wait for another key press */
- }
-
- if (i != choice) {
- /* De-highlight current item */
- getyx(dialog, cur_y, cur_x); /* Save cursor position */
- print_item(list, items[(scroll+choice)*3], items[(scroll+choice)*3 +1], status[scroll+choice], choice, FALSE,
- DREF(ditems, scroll + choice));
- /* Highlight new item */
- choice = i;
- print_item(list, items[(scroll+choice)*3], items[(scroll+choice)*3 + 1], status[scroll+choice], choice, TRUE,
- DREF(ditems, scroll + choice));
- wnoutrefresh(list);
- wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
- wrefresh(dialog);
- }
- continue; /* wait for another key press */
- }
-
- switch (key) {
- case KEY_PPAGE:
- if (scroll > height-4) /* can we go up? */
- scroll -= (height-4);
- else
+ if (toupper(key) == toupper(items[(scroll+i)*3][0]))
+ break;
+
+ if (i < max_choice || (key >= '1' && key <= MIN('9', '0' + max_choice)) ||
+ key == KEY_UP || key == KEY_DOWN || key == ' ' || key == '+' || key == '-' ) {
+ if (key >= '1' && key <= MIN('9', '0' + max_choice))
+ i = key - '1';
+ else if (key == KEY_UP || key == '-') {
+ if (!choice) {
+ if (scroll) {
+ /* Scroll list down */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ if (list_height > 1) {
+ /* De-highlight current first item before scrolling down */
+ print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, FALSE, DREF(ditems, scroll));
+ scrollok(list, TRUE);
+ wscrl(list, -1);
+ scrollok(list, FALSE);
+ }
+ scroll--;
+ print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, TRUE, DREF(ditems, scroll));
+ wnoutrefresh(list);
+ print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+ else
+ i = choice - 1;
+ }
+ else if (key == KEY_DOWN || key == '+') {
+ if (choice == max_choice - 1) {
+ if (scroll+choice < item_no-1) {
+ /* Scroll list up */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ if (list_height > 1) {
+ /* De-highlight current last item before scrolling up */
+ print_item(list, items[(scroll + max_choice - 1) * 3], items[(scroll + max_choice - 1) * 3 + 1],
+ status[scroll + max_choice - 1], max_choice - 1, FALSE, DREF(ditems, scroll + max_choice - 1));
+ scrollok(list, TRUE);
+ scroll(list);
+ scrollok(list, FALSE);
+ }
+ scroll++;
+ print_item(list, items[(scroll + max_choice - 1) * 3], items[(scroll + max_choice - 1) * 3 + 1],
+ status[scroll + max_choice - 1], max_choice - 1, TRUE, DREF(ditems, scroll + max_choice - 1));
+ wnoutrefresh(list);
+ print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+ else
+ i = choice + 1;
+ }
+ else if (key == ' ') { /* Toggle item status */
+ if (status[scroll + choice])
+ continue;
+ else if (ditems) {
+ if (ditems[scroll + choice].fire) {
+ int st = ditems[scroll + choice].fire(&ditems[scroll + choice]);
+
+ if (st & DITEM_REDRAW) {
+ for (i = 0; i < max_choice; i++)
+ print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1],
+ status[scroll + i], i, i == choice,
+ DREF(ditems, scroll + i));
+ wnoutrefresh(list);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
+ wrefresh(dialog);
+ }
+ if (DITEM_STATUS(st) == DITEM_FAILURE) {
+ wrefresh(dialog);
+ continue;
+ }
+ else if (st & DITEM_RESTORE) {
+ touchwin(save);
+ wrefresh(save);
+ }
+ if (st & DITEM_RECREATE) {
+ delwin(save);
+ delwin(dialog);
+ goto draw;
+ }
+ else if (st & DITEM_LEAVE_MENU) {
+ /* Allow a fire action to take us out of the menu */
+ key = ESC;
+ break;
+ }
+ }
+ for (i = 0; i < item_no; i++)
+ status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE;
+ }
+ else {
+ for (i = 0; i < item_no; i++)
+ status[i] = 0;
+ status[scroll + choice] = TRUE;
+ }
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ for (i = 0; i < max_choice; i++)
+ print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], status[scroll + i], i, i == choice,
+ DREF(ditems, scroll + i));
+ wnoutrefresh(list);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
+ wrefresh(dialog);
+ continue; /* wait for another key press */
+ }
+
+ if (i != choice) {
+ /* De-highlight current item */
+ getyx(dialog, cur_y, cur_x); /* Save cursor position */
+ print_item(list, items[(scroll+choice)*3], items[(scroll+choice)*3 +1], status[scroll+choice], choice, FALSE,
+ DREF(ditems, scroll + choice));
+ /* Highlight new item */
+ choice = i;
+ print_item(list, items[(scroll+choice)*3], items[(scroll+choice)*3 + 1], status[scroll+choice], choice, TRUE,
+ DREF(ditems, scroll + choice));
+ wnoutrefresh(list);
+ wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
+ wrefresh(dialog);
+ }
+ continue; /* wait for another key press */
+ }
+
+ switch (key) {
+ case KEY_PPAGE:
+ if (scroll > height-4) /* can we go up? */
+ scroll -= (height-4);
+ else
+ scroll = 0;
+ redraw_menu = TRUE;
+ break;
+
+ case KEY_NPAGE:
+ if (scroll + list_height >= item_no-1 - list_height) { /* can we go down a full page? */
+ scroll = item_no - list_height;
+ if (scroll < 0)
+ scroll = 0;
+ }
+ else
+ scroll += list_height;
+ redraw_menu = TRUE;
+ break;
+
+ case KEY_HOME:
scroll = 0;
- redraw_menu = TRUE;
- break;
-
- case KEY_NPAGE:
- if (scroll + list_height >= item_no-1 - list_height) { /* can we go down a full page? */
+ choice = 0;
+ redraw_menu = TRUE;
+ break;
+
+ case KEY_END:
scroll = item_no - list_height;
if (scroll < 0)
- scroll = 0;
- }
- else
- scroll += list_height;
- redraw_menu = TRUE;
- break;
-
- case KEY_HOME:
- scroll = 0;
- choice = 0;
- redraw_menu = TRUE;
- break;
-
- case KEY_END:
- scroll = item_no - list_height;
- if (scroll < 0)
- scroll = 0;
- choice = max_choice - 1;
- redraw_menu = TRUE;
+ scroll = 0;
+ choice = max_choice - 1;
+ redraw_menu = TRUE;
+ break;
+
+ case KEY_BTAB:
+ case TAB:
+ case KEY_LEFT:
+ case KEY_RIGHT:
+ button = !button;
+ if (ditems && result) {
+ if (button) {
+ print_button(dialog, ditems[OK_BUTTON].prompt, y, x,
+ ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button);
+ print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5,
+ ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button);
+ }
+ else {
+ print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5,
+ ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button);
+ print_button(dialog, ditems[OK_BUTTON].prompt, y, x,
+ ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button);
+ }
+ }
+ else {
+ if (button) {
+ print_button(dialog, " OK ", y, x, !button);
+ print_button(dialog, "Cancel", y, x + 14, button);
+ }
+ else {
+ print_button(dialog, "Cancel", y, x + 14, button);
+ print_button(dialog, " OK ", y, x, !button);
+ }
+ }
+ wrefresh(dialog);
+ break;
+
+ case '\r':
+ case '\n':
+ if (!button && result) {
+ if (ditems && ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire) {
+ int st = ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire(&ditems[button ? CANCEL_BUTTON : OK_BUTTON]);
+ if (DITEM_STATUS(st) == DITEM_FAILURE) {
+ wrefresh(dialog);
+ continue;
+ }
+ else if (st & DITEM_RESTORE) {
+ touchwin(save);
+ wrefresh(save);
+ }
+ else if (st & DITEM_RECREATE) {
+ delwin(save);
+ delwin(dialog);
+ goto draw;
+ }
+ }
+ else {
+ *result = '\0';
+ for (i = 0; i < item_no; i++) {
+ if (status[i]) {
+ strcpy(result, items[i*3]);
+ break;
+ }
+ }
+ }
+ }
+ delwin(dialog);
+ delwin(save);
+ return button;
+ break;
+
+ case ESC:
+ break;
+
+ case KEY_F(1):
+ case '?':
+ display_helpfile();
break;
-
- case KEY_BTAB:
- case TAB:
- case KEY_LEFT:
- case KEY_RIGHT:
- button = !button;
- if (ditems && result) {
- if (button) {
- print_button(dialog, ditems[OK_BUTTON].prompt, y, x,
- ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button);
- print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5,
- ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button);
- }
- else {
- print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5,
- ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button);
- print_button(dialog, ditems[OK_BUTTON].prompt, y, x,
- ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button);
- }
- }
- else {
- if (button) {
- print_button(dialog, " OK ", y, x, !button);
- print_button(dialog, "Cancel", y, x + 14, button);
}
- else {
- print_button(dialog, "Cancel", y, x + 14, button);
- print_button(dialog, " OK ", y, x, !button);
- }
- }
- wrefresh(dialog);
- break;
-
- case ' ':
- case '\r':
- case '\n':
- if (!button && result) {
- if (ditems && ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire) {
- if (ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire(&ditems[button ? CANCEL_BUTTON : OK_BUTTON]) ==
- DITEM_FAILURE) {
+
+ if (redraw_menu) {
+ for (i = 0; i < max_choice; i++)
+ print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], status[scroll + i], i, i == choice,
+ DREF(ditems, scroll + i));
+ wnoutrefresh(list);
+ print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
wrefresh(dialog);
- continue;
- }
- }
- else {
- *result = '\0';
- for (i = 0; i < item_no; i++) {
- if (status[i]) {
- strcpy(result, items[i*3]);
- break;
- }
- }
+ redraw_menu = FALSE;
}
- }
- delwin(dialog);
- return button;
- break;
-
- case ESC:
- break;
-
- case KEY_F(1):
- case '?':
- display_helpfile();
- break;
}
- if (redraw_menu) {
- for (i = 0; i < max_choice; i++)
- print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], status[scroll + i], i, i == choice,
- DREF(ditems, scroll + i));
- wnoutrefresh(list);
- print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y);
- wrefresh(dialog);
- redraw_menu = FALSE;
- }
- }
-
- delwin(dialog);
- free(status);
- return -1; /* ESC pressed */
+ delwin(dialog);
+ delwin(save);
+ free(status);
+ return -1; /* ESC pressed */
}
/* End of dialog_radiolist() */
@@ -471,31 +519,31 @@ dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, int wi
static void
print_item(WINDOW *win, char *tag, char *item, int status, int choice, int selected, dialogMenuItem *me)
{
- int i;
-
- /* Clear 'residue' of last item */
- wattrset(win, menubox_attr);
- wmove(win, choice, 0);
- for (i = 0; i < list_width; i++)
+ int i;
+
+ /* Clear 'residue' of last item */
+ wattrset(win, menubox_attr);
+ wmove(win, choice, 0);
+ for (i = 0; i < list_width; i++)
+ waddch(win, ' ');
+ wmove(win, choice, check_x);
+ wattrset(win, selected ? check_selected_attr : check_attr);
+ wprintw(win, "%c%c%c", me && me->lbra ? me->lbra : '(',
+ status ? me && me->mark ? me->mark : '*' : ' ',
+ me && me->rbra ? me->rbra : ')');
+ wattrset(win, menubox_attr);
waddch(win, ' ');
- wmove(win, choice, check_x);
- wattrset(win, selected ? check_selected_attr : check_attr);
- wprintw(win, "%c%c%c", me && me->lbra ? me->lbra : '(',
- status ? me && me->mark ? me->mark : '*' : ' ',
- me && me->rbra ? me->rbra : ')');
- wattrset(win, menubox_attr);
- waddch(win, ' ');
- wattrset(win, selected ? tag_key_selected_attr : tag_key_attr);
- waddch(win, tag[0]);
- wattrset(win, selected ? tag_selected_attr : tag_attr);
- waddstr(win, tag + 1);
- wmove(win, choice, item_x);
- wattrset(win, selected ? item_selected_attr : item_attr);
- waddstr(win, item);
- /* If have a selection handler for this, call it */
- if (me && me->selected) {
- wrefresh(win);
- me->selected(me, selected);
- }
+ wattrset(win, selected ? tag_key_selected_attr : tag_key_attr);
+ waddch(win, tag[0]);
+ wattrset(win, selected ? tag_selected_attr : tag_attr);
+ waddstr(win, tag + 1);
+ wmove(win, choice, item_x);
+ wattrset(win, selected ? item_selected_attr : item_attr);
+ waddstr(win, item);
+ /* If have a selection handler for this, call it */
+ if (me && me->selected) {
+ wrefresh(win);
+ me->selected(me, selected);
+ }
}
/* End of print_item() */