summaryrefslogtreecommitdiffstats
path: root/gnu
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1996-01-01 03:43:58 +0000
committerjkh <jkh@FreeBSD.org>1996-01-01 03:43:58 +0000
commitff9186df13d1aa41b177a5cc27eae6ebed5bff8b (patch)
tree5a29b9e618eb6168395065b6c57c1bd661a23bef /gnu
parent2d12b11ef801b89eb3beaa3f42ddc8e8fdac9b2e (diff)
downloadFreeBSD-src-ff9186df13d1aa41b177a5cc27eae6ebed5bff8b.zip
FreeBSD-src-ff9186df13d1aa41b177a5cc27eae6ebed5bff8b.tar.gz
Next round of changes - make dialog boxes drawable at arbitrary X,Y locations
and add selection traversal callbacks so context-sensitive behavior can even be implemented for individual menu items. These work around the two largest issues holding me back with some of my sysinstall changes.
Diffstat (limited to 'gnu')
-rw-r--r--gnu/lib/libdialog/checklist.c45
-rw-r--r--gnu/lib/libdialog/dialog.328
-rw-r--r--gnu/lib/libdialog/dialog.h2
-rw-r--r--gnu/lib/libdialog/inputbox.c4
-rw-r--r--gnu/lib/libdialog/kernel.c6
-rw-r--r--gnu/lib/libdialog/menubox.c64
-rw-r--r--gnu/lib/libdialog/msgbox.c4
-rw-r--r--gnu/lib/libdialog/prgbox.c4
-rw-r--r--gnu/lib/libdialog/radiolist.c46
-rw-r--r--gnu/lib/libdialog/textbox.c4
-rw-r--r--gnu/lib/libdialog/yesno.c4
11 files changed, 127 insertions, 84 deletions
diff --git a/gnu/lib/libdialog/checklist.c b/gnu/lib/libdialog/checklist.c
index 66f0c8f..96bac9f 100644
--- a/gnu/lib/libdialog/checklist.c
+++ b/gnu/lib/libdialog/checklist.c
@@ -36,8 +36,9 @@ static int list_width, check_x, item_x;
/*
* Display a dialog box with a list of options that can be turned on or off
*/
-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
+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;
@@ -70,7 +71,7 @@ int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, in
/* Initializes status */
for (i = 0; i < item_no; i++) {
- status[i] = ditems[i].checked ? (*ditems[i].checked)(&ditems[i]) : FALSE;
+ 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";
@@ -179,10 +180,10 @@ int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, in
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);
+ 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);
+ ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE);
}
else {
cancelButton = 'C';
@@ -198,7 +199,7 @@ int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, in
/* Shortcut to OK? */
if (toupper(key) == okButton) {
if (ditems && result && ditems[OK_BUTTON].fire) {
- if ((*ditems[OK_BUTTON].fire)(&ditems[OK_BUTTON]) == DITEM_FAILURE)
+ if (ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]) == DITEM_FAILURE)
continue;
else
delwin(dialog);
@@ -218,7 +219,7 @@ int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, in
/* 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)
+ if (ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]) == DITEM_FAILURE)
continue;
}
delwin(dialog);
@@ -266,13 +267,15 @@ int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, in
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));
+ 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));
+ 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);
@@ -287,7 +290,7 @@ int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, in
if (ditems) {
if (ditems[scroll+choice].fire) {
- int st = (*ditems[scroll+choice].fire)(&ditems[scroll+choice]);
+ 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 */
@@ -299,7 +302,7 @@ int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, in
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;
+ 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));
}
@@ -309,7 +312,7 @@ int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, in
}
}
status[scroll+choice] = ditems[scroll+choice].checked ?
- (*ditems[scroll+choice].checked)(&ditems[scroll+choice]) : FALSE;
+ ditems[scroll+choice].checked(&ditems[scroll+choice]) : FALSE;
lbra = ditems[scroll+choice].lbra;
rbra = ditems[scroll+choice].rbra;
mark = ditems[scroll+choice].mark;
@@ -392,15 +395,15 @@ int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, in
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);
+ 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);
+ 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);
+ 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);
+ ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button);
}
}
else {
@@ -421,7 +424,7 @@ int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, in
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]) ==
+ if (ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire(&ditems[button ? CANCEL_BUTTON : OK_BUTTON]) ==
DITEM_FAILURE)
continue;
}
@@ -470,8 +473,9 @@ int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, in
/*
* Print list item
*/
-static void print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int status, int choice, int selected,
- dialogMenuItem *me)
+static void
+print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int status, int choice, int selected,
+ dialogMenuItem *me)
{
int i;
@@ -494,5 +498,8 @@ static void print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int
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)
+ me->selected(me, selected);
}
/* End of print_item() */
diff --git a/gnu/lib/libdialog/dialog.3 b/gnu/lib/libdialog/dialog.3
index 35f4ea1..06b13a9 100644
--- a/gnu/lib/libdialog/dialog.3
+++ b/gnu/lib/libdialog/dialog.3
@@ -11,7 +11,7 @@
.\" nor does the author assume any responsibility for damages incurred with
.\" its use.
.\"
-.\" $Id$
+.\" $Id: dialog.3,v 1.1 1995/12/23 01:10:15 jkh Exp $
.\"
.Dd December 18, 1995
.Dt dialog 3
@@ -63,6 +63,7 @@ typedef struct _dmenu_item {
char *\fBtitle\fR;
int (*\fBchecked\fR)(struct _dmenu_item *self);
int (*\fBfire\fR)(struct _dmenu_item *self);
+ int (*\fBselected\fR)(struct _dmenu_item *self, int is_selected);
void *\fBdata\fR;
char \fBlbra\fR, \fBmark\fR, \fBrbra\fR;
} \fBdialogMenuItem\fR;
@@ -72,20 +73,29 @@ The \fBprompt\fR and \fBtitle\fR strings are pretty much self-explanatory,
and the \fBchecked\fR and \fBfire\fR function pointers provide optional
display and action hooks (the \fBdata\fR variable being available for
the convenience of those hooks) when more tightly coupled feedback between
-a menu object and user code is required. A number of clever tricks for
-simulating various kinds of item types can also be done by adjusting the
-values of \fBlbra\fR (default: '['), \fB\mark\fR (default: '*' for radio
-menus, 'X' for check menus) and \fBrbra\fR (default: ']') and declaring
-a reasonable \fBchecked\fR hook, which should return TRUE for the `marked' state
-and FALSE for `unmarked.' If an item has a \fBfire\fR hook associated
-with it, it will also be called whenever the item is "toggled" in some way
-and should return one of the following codes:
+a menu object and user code is required. The \fBselected\fR hook also
+allows you to verify whether or not a given item is selected (the cursor is
+over it) for implementing pretty much any possible context-sensitive
+behavior. A number of clever tricks for simulating various kinds of item
+types can also be done by adjusting the values of \fBlbra\fR
+(default: '['), \fB\mark\fR (default: '*' for radio menus, 'X' for check menus)
+and \fBrbra\fR (default: ']') and declaring a reasonable \fBchecked\fR hook,
+which should return TRUE for the `marked' state and FALSE for `unmarked.'
+If an item has a \fBfire\fR hook associated with it, it will also be called
+whenever the item is "toggled" in some way and should return one of the
+following codes:
.nf
#define DITEM_SUCCESS 0 /* Successful completion */
#define DITEM_FAILURE -1 /* Failed to "fire" */
#define DITEM_LEAVE_MENU -2 /* Treat selection as "Ok" */
#define DITEM_REDRAW -3 /* Menu has changed, redraw it */
+
+Two special globals also exist for putting a dialog at any arbitrary
+X,Y location (the early designers rather short-sightedly made no provisions
+for this). If set to zero, the default centering behavior will be in
+effect.
+
.fi
.Sh SYNOPSIS
diff --git a/gnu/lib/libdialog/dialog.h b/gnu/lib/libdialog/dialog.h
index afca1db..a3e82fc 100644
--- a/gnu/lib/libdialog/dialog.h
+++ b/gnu/lib/libdialog/dialog.h
@@ -54,6 +54,7 @@ typedef struct _dmenu_item {
char *title;
int (*checked)(struct _dmenu_item *self);
int (*fire)(struct _dmenu_item *self);
+ void (*selected)(struct _dmenu_item *self, int is_selected);
void *data;
char lbra, mark, rbra;
} dialogMenuItem;
@@ -68,6 +69,7 @@ typedef struct _dmenu_item {
#define FALSE (0)
#endif
+extern int DialogX, DialogY;
/*
* Attribute names
diff --git a/gnu/lib/libdialog/inputbox.c b/gnu/lib/libdialog/inputbox.c
index b552a9a..fc9a40c 100644
--- a/gnu/lib/libdialog/inputbox.c
+++ b/gnu/lib/libdialog/inputbox.c
@@ -47,8 +47,8 @@ int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int
if (height > LINES)
height = LINES;
/* center dialog box on screen */
- x = (COLS - width)/2;
- y = (LINES - height)/2;
+ x = DialogX ? DialogX : (COLS - width)/2;
+ y = DialogY ? DialogY : (LINES - height)/2;
#ifdef HAVE_NCURSES
if (use_shadow)
diff --git a/gnu/lib/libdialog/kernel.c b/gnu/lib/libdialog/kernel.c
index 1c38fa5..dd31047 100644
--- a/gnu/lib/libdialog/kernel.c
+++ b/gnu/lib/libdialog/kernel.c
@@ -85,6 +85,11 @@
#include "colors.h"
#endif
+/* These are two "secret" globals that can be fiddled to make a dialog
+ * come up someplace other than a "centered" calculation for X,Y
+ */
+int DialogX, DialogY;
+
/*
* Do some initialization for dialog
*/
@@ -114,6 +119,7 @@ void init_dialog(void)
/* Set screen to screen attribute */
dialog_clear_norefresh();
+ DialogX = DialogY = 0;
}
/* End of init_dialog() */
diff --git a/gnu/lib/libdialog/menubox.c b/gnu/lib/libdialog/menubox.c
index 6961d07..650d090 100644
--- a/gnu/lib/libdialog/menubox.c
+++ b/gnu/lib/libdialog/menubox.c
@@ -25,18 +25,22 @@
#include "dialog.priv.h"
#include <ncurses.h>
-static void print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int choice, int selected);
+static void print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int choice, int selected,
+ dialogMenuItem *me);
+
+#define DREF(di, item) ((di) ? &((di)[(item)]) : NULL)
static int menu_width, tag_x, item_x;
/*
* Display a menu for choosing among a number of options
*/
-int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width, int menu_height,
- int item_no, void *it, unsigned char *result, int *ch, int *sc)
+int
+dialog_menu(unsigned char *title, unsigned char *prompt, int height, int width, int menu_height,
+ int item_no, void *it, unsigned char *result, int *ch, int *sc)
{
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;
+ l, k, scroll = 0, max_choice, redraw_menu = FALSE;
char okButton, cancelButton;
WINDOW *dialog, *menu;
unsigned char **items;
@@ -92,8 +96,8 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int wid
if (height > LINES)
height = LINES;
/* center dialog box on screen */
- x = (COLS - width)/2;
- y = (LINES - height)/2;
+ x = DialogX ? DialogX : (COLS - width)/2;
+ y = DialogY ? DialogY : (LINES - height)/2;
#ifdef HAVE_NCURSES
if (use_shadow)
@@ -152,7 +156,7 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int wid
/* Print the menu */
for (i = 0; i < max_choice; i++)
- print_item(menu, items[(scroll+i)*2], items[(scroll+i)*2 + 1], i, i == choice);
+ print_item(menu, items[(scroll+i)*2], items[(scroll+i)*2 + 1], i, i == choice, DREF(ditems, scroll + i));
wnoutrefresh(menu);
print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y);
@@ -164,10 +168,10 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int wid
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);
+ 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);
+ ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE);
}
else {
cancelButton = 'C';
@@ -184,7 +188,7 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int wid
/* Shortcut to OK? */
if (toupper(key) == okButton) {
if (ditems && result && ditems[OK_BUTTON].fire) {
- if ((*ditems[OK_BUTTON].fire)(&ditems[OK_BUTTON]) == DITEM_FAILURE)
+ if (ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]) == DITEM_FAILURE)
continue;
else
delwin(dialog);
@@ -198,7 +202,7 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int wid
/* 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)
+ if (ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]) == DITEM_FAILURE)
continue;
}
delwin(dialog);
@@ -221,13 +225,13 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int wid
getyx(dialog, cur_y, cur_x); /* Save cursor position */
if (menu_height > 1) {
/* De-highlight current first item before scrolling down */
- print_item(menu, items[scroll*2], items[scroll*2 + 1], 0, FALSE);
+ print_item(menu, items[scroll*2], items[scroll*2 + 1], 0, FALSE, DREF(ditems, scroll));
scrollok(menu, TRUE);
wscrl(menu, -1);
scrollok(menu, FALSE);
}
scroll--;
- print_item(menu, items[scroll*2], items[scroll*2 + 1], 0, TRUE);
+ print_item(menu, items[scroll*2], items[scroll*2 + 1], 0, TRUE, DREF(ditems, scroll));
wnoutrefresh(menu);
print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y);
wrefresh(dialog);
@@ -244,13 +248,15 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int wid
getyx(dialog, cur_y, cur_x); /* Save cursor position */
if (menu_height > 1) {
/* De-highlight current last item before scrolling up */
- print_item(menu, items[(scroll+max_choice-1)*2], items[(scroll+max_choice-1)*2 + 1], max_choice-1, FALSE);
+ print_item(menu, items[(scroll + max_choice - 1) * 2], items[(scroll + max_choice - 1) * 2 + 1],
+ max_choice-1, FALSE, DREF(ditems, scroll + max_choice - 1));
scrollok(menu, TRUE);
scroll(menu);
scrollok(menu, FALSE);
}
scroll++;
- print_item(menu, items[(scroll+max_choice-1)*2], items[(scroll+max_choice-1)*2 + 1], max_choice-1, TRUE);
+ print_item(menu, items[(scroll + max_choice - 1) * 2], items[(scroll + max_choice - 1) * 2 + 1],
+ max_choice - 1, TRUE, DREF(ditems, scroll + max_choice - 1));
wnoutrefresh(menu);
print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y);
wrefresh(dialog);
@@ -263,11 +269,13 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int wid
if (i != choice) {
/* De-highlight current item */
getyx(dialog, cur_y, cur_x); /* Save cursor position */
- print_item(menu, items[(scroll+choice)*2], items[(scroll+choice)*2 + 1], choice, FALSE);
+ print_item(menu, items[(scroll + choice) * 2], items[(scroll + choice) * 2 + 1], choice, FALSE,
+ DREF(ditems, scroll + choice));
/* Highlight new item */
choice = i;
- print_item(menu, items[(scroll+choice)*2], items[(scroll+choice)*2 + 1], choice, TRUE);
+ print_item(menu, items[(scroll + choice) * 2], items[(scroll + choice) * 2 + 1], choice, TRUE,
+ DREF(ditems, scroll + choice));
wnoutrefresh(menu);
wmove(dialog, cur_y, cur_x); /* Restore cursor to previous position */
wrefresh(dialog);
@@ -322,15 +330,15 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int wid
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);
+ 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);
+ 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);
+ 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);
+ ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button);
}
}
else {
@@ -351,7 +359,7 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int wid
case '\n':
if (!button) {
if (ditems && ditems[scroll + choice].fire) {
- if ((*ditems[scroll + choice].fire)(&ditems[scroll + choice]) == DITEM_FAILURE)
+ if (ditems[scroll + choice].fire(&ditems[scroll + choice]) == DITEM_FAILURE)
continue;
}
else if (result)
@@ -371,8 +379,8 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int wid
if (redraw_menu) {
for (i = 0; i < max_choice; i++) {
- print_item(menu, items[(scroll+i)*2],
- items[(scroll+i)*2 + 1], i, i == choice);
+ print_item(menu, items[(scroll + i) * 2], items[(scroll + i) * 2 + 1], i, i == choice,
+ DREF(ditems, scroll + i));
}
wnoutrefresh(menu);
print_arrows(dialog, scroll, menu_height, item_no, box_x, box_y, tag_x, cur_x, cur_y);
@@ -390,7 +398,8 @@ int dialog_menu(unsigned char *title, unsigned char *prompt, int height, int wid
/*
* Print menu item
*/
-static void print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int choice, int selected)
+static void
+print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int choice, int selected, dialogMenuItem *me)
{
int i;
@@ -407,6 +416,11 @@ static void print_item(WINDOW *win, unsigned char *tag, unsigned char *item, int
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/msgbox.c b/gnu/lib/libdialog/msgbox.c
index 75ff399..ebc89eb 100644
--- a/gnu/lib/libdialog/msgbox.c
+++ b/gnu/lib/libdialog/msgbox.c
@@ -53,8 +53,8 @@ int dialog_msgbox(unsigned char *title, unsigned char *prompt, int height, int w
if (height > LINES)
height = LINES;
/* center dialog box on screen */
- x = (COLS - width)/2;
- y = (LINES - height)/2;
+ x = DialogX ? DialogX : (COLS - width)/2;
+ y = DialogY ? DialogY : (LINES - height)/2;
#ifdef HAVE_NCURSES
if (use_shadow)
diff --git a/gnu/lib/libdialog/prgbox.c b/gnu/lib/libdialog/prgbox.c
index 11274e2..951d666 100644
--- a/gnu/lib/libdialog/prgbox.c
+++ b/gnu/lib/libdialog/prgbox.c
@@ -49,8 +49,8 @@ int dialog_prgbox(unsigned char *title, const unsigned char *line, int height, i
if (height > LINES)
height = LINES;
/* center dialog box on screen */
- x = (COLS - width)/2;
- y = (LINES - height)/2;
+ x = DialogX ? DialogX : (COLS - width)/2;
+ y = DialogY ? DialogY : (LINES - height)/2;
#ifdef HAVE_NCURSES
if (use_shadow)
diff --git a/gnu/lib/libdialog/radiolist.c b/gnu/lib/libdialog/radiolist.c
index a23a82e..db408f9 100644
--- a/gnu/lib/libdialog/radiolist.c
+++ b/gnu/lib/libdialog/radiolist.c
@@ -26,8 +26,7 @@
#include "dialog.priv.h"
-static void print_item(WINDOW *win, char *tag, char *item, int status, int choice, int selected,
- dialogMenuItem *me);
+static void print_item(WINDOW *win, char *tag, char *item, int status, int choice, int selected, dialogMenuItem *me);
#define DREF(di, item) ((di) ? &((di)[(item)]) : NULL)
@@ -37,11 +36,12 @@ static int list_width, check_x, item_x;
/*
* Display a dialog box with a list of options that can be turned on or off
*/
-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
+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;
+ l, k, scroll = 0, max_choice, *status, was_on = 0;
int redraw_menu = FALSE;
char okButton, cancelButton;
WINDOW *dialog, *list;
@@ -78,7 +78,7 @@ int dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, in
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;
+ status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE;
if (status[i]) {
if (was_on)
status[i] = FALSE;
@@ -118,8 +118,8 @@ int dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, in
if (height > LINES)
height = LINES;
/* center dialog box on screen */
- x = (COLS - width)/2;
- y = (LINES - height)/2;
+ x = DialogX ? DialogX : (COLS - width)/2;
+ y = DialogY ? DialogY : (LINES - height)/2;
#ifdef HAVE_NCURSES
if (use_shadow)
@@ -189,10 +189,10 @@ int dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, in
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);
+ 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);
+ ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE);
}
else {
cancelButton = 'C';
@@ -208,7 +208,7 @@ int dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, in
/* 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)
+ if (ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]) == DITEM_FAILURE)
continue;
else
delwin(dialog);
@@ -228,7 +228,7 @@ int dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, in
/* 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)
+ if (ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]) == DITEM_FAILURE)
continue;
}
delwin(dialog);
@@ -297,7 +297,7 @@ int dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, in
continue;
else if (ditems) {
if (ditems[scroll + choice].fire) {
- int st = (*ditems[scroll + choice].fire)(&ditems[scroll + choice]);
+ 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 */
@@ -308,7 +308,7 @@ int dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, in
continue;
}
for (i = 0; i < item_no; i++)
- status[i] = ditems[i].checked ? (*ditems[i].checked)(&ditems[i]) : FALSE;
+ status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE;
}
else {
for (i = 0; i < item_no; i++)
@@ -383,15 +383,15 @@ int dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, in
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);
+ 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);
+ 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);
+ 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);
+ ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button);
}
}
else {
@@ -412,7 +412,8 @@ int dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, in
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 (ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire(&ditems[button ? CANCEL_BUTTON : OK_BUTTON]) ==
+ DITEM_FAILURE)
continue;
}
else {
@@ -459,8 +460,8 @@ int dialog_radiolist(unsigned char *title, unsigned char *prompt, int height, in
/*
* Print list item
*/
-static void print_item(WINDOW *win, char *tag, char *item, int status, int choice, int selected,
- dialogMenuItem *me)
+static void
+print_item(WINDOW *win, char *tag, char *item, int status, int choice, int selected, dialogMenuItem *me)
{
int i;
@@ -483,5 +484,8 @@ static void print_item(WINDOW *win, char *tag, char *item, int status, int choic
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)
+ me->selected(me, selected);
}
/* End of print_item() */
diff --git a/gnu/lib/libdialog/textbox.c b/gnu/lib/libdialog/textbox.c
index b466f79..2abd3e9 100644
--- a/gnu/lib/libdialog/textbox.c
+++ b/gnu/lib/libdialog/textbox.c
@@ -89,8 +89,8 @@ int dialog_textbox(unsigned char *title, unsigned char *file, int height, int wi
if (height > LINES)
height = LINES;
/* center dialog box on screen */
- x = (COLS - width)/2;
- y = (LINES - height)/2;
+ x = DialogX ? DialogX : (COLS - width)/2;
+ y = DialogY ? DialogY : (LINES - height)/2;
#ifdef HAVE_NCURSES
if (use_shadow)
diff --git a/gnu/lib/libdialog/yesno.c b/gnu/lib/libdialog/yesno.c
index 67de424..2390821 100644
--- a/gnu/lib/libdialog/yesno.c
+++ b/gnu/lib/libdialog/yesno.c
@@ -50,8 +50,8 @@ int dialog_yesno(unsigned char *title, unsigned char * prompt, int height, int w
if (height > LINES)
height = LINES;
/* center dialog box on screen */
- x = (COLS - width)/2;
- y = (LINES - height)/2;
+ x = DialogX ? DialogX : (COLS - width)/2;
+ y = DialogY ? DialogY : (LINES - height)/2;
#ifdef HAVE_NCURSES
if (use_shadow)
OpenPOWER on IntegriCloud