kconfig: Lindent scripts/lxdialog

The lxdialog code was not easy to read. So as first step the code
was run through Lindent.
Fix-ups will come in next patchset.

Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
This commit is contained in:
Sam Ravnborg 2005-11-19 19:13:34 +01:00
parent b286e39207
commit b1c5f1c635
10 changed files with 1861 additions and 1787 deletions

View File

@ -29,87 +29,83 @@ static int list_width, check_x, item_x, checkflag;
* Print list item * Print list item
*/ */
static void static void
print_item (WINDOW * win, const char *item, int status, print_item(WINDOW * win, const char *item, int status, int choice, int selected)
int choice, int selected)
{ {
int i; int i;
/* Clear 'residue' of last item */ /* Clear 'residue' of last item */
wattrset (win, menubox_attr); wattrset(win, menubox_attr);
wmove (win, choice, 0); wmove(win, choice, 0);
for (i = 0; i < list_width; i++) for (i = 0; i < list_width; i++)
waddch (win, ' '); waddch(win, ' ');
wmove (win, choice, check_x); wmove(win, choice, check_x);
wattrset (win, selected ? check_selected_attr : check_attr); wattrset(win, selected ? check_selected_attr : check_attr);
if (checkflag == FLAG_CHECK) if (checkflag == FLAG_CHECK)
wprintw (win, "[%c]", status ? 'X' : ' '); wprintw(win, "[%c]", status ? 'X' : ' ');
else else
wprintw (win, "(%c)", status ? 'X' : ' '); wprintw(win, "(%c)", status ? 'X' : ' ');
wattrset (win, selected ? tag_selected_attr : tag_attr); wattrset(win, selected ? tag_selected_attr : tag_attr);
mvwaddch(win, choice, item_x, item[0]); mvwaddch(win, choice, item_x, item[0]);
wattrset (win, selected ? item_selected_attr : item_attr); wattrset(win, selected ? item_selected_attr : item_attr);
waddstr (win, (char *)item+1); waddstr(win, (char *)item + 1);
if (selected) { if (selected) {
wmove (win, choice, check_x+1); wmove(win, choice, check_x + 1);
wrefresh (win); wrefresh(win);
} }
} }
/* /*
* Print the scroll indicators. * Print the scroll indicators.
*/ */
static void static void
print_arrows (WINDOW * win, int choice, int item_no, int scroll, print_arrows(WINDOW * win, int choice, int item_no, int scroll,
int y, int x, int height) int y, int x, int height)
{ {
wmove(win, y, x); wmove(win, y, x);
if (scroll > 0) { if (scroll > 0) {
wattrset (win, uarrow_attr); wattrset(win, uarrow_attr);
waddch (win, ACS_UARROW); waddch(win, ACS_UARROW);
waddstr (win, "(-)"); waddstr(win, "(-)");
} } else {
else { wattrset(win, menubox_attr);
wattrset (win, menubox_attr); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); }
}
y = y + height + 1; y = y + height + 1;
wmove(win, y, x); wmove(win, y, x);
if ((height < item_no) && (scroll + choice < item_no - 1)) { if ((height < item_no) && (scroll + choice < item_no - 1)) {
wattrset (win, darrow_attr); wattrset(win, darrow_attr);
waddch (win, ACS_DARROW); waddch(win, ACS_DARROW);
waddstr (win, "(+)"); waddstr(win, "(+)");
} } else {
else { wattrset(win, menubox_border_attr);
wattrset (win, menubox_border_attr); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); }
}
} }
/* /*
* Display the termination buttons * Display the termination buttons
*/ */
static void static void print_buttons(WINDOW * dialog, int height, int width, int selected)
print_buttons( WINDOW *dialog, int height, int width, int selected)
{ {
int x = width / 2 - 11; int x = width / 2 - 11;
int y = height - 2; int y = height - 2;
print_button (dialog, "Select", y, x, selected == 0); print_button(dialog, "Select", y, x, selected == 0);
print_button (dialog, " Help ", y, x + 14, selected == 1); print_button(dialog, " Help ", y, x + 14, selected == 1);
wmove(dialog, y, x+1 + 14*selected); wmove(dialog, y, x + 1 + 14 * selected);
wrefresh (dialog); wrefresh(dialog);
} }
/* /*
@ -117,257 +113,293 @@ print_buttons( WINDOW *dialog, int height, int width, int selected)
* The `flag' parameter is used to select between radiolist and checklist. * The `flag' parameter is used to select between radiolist and checklist.
*/ */
int int
dialog_checklist (const char *title, const char *prompt, int height, int width, dialog_checklist(const char *title, const char *prompt, int height, int width,
int list_height, int item_no, const char * const * items, int flag) int list_height, int item_no, const char *const *items,
int flag)
{ {
int i, x, y, box_x, box_y; int i, x, y, box_x, box_y;
int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status; int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
WINDOW *dialog, *list; WINDOW *dialog, *list;
checkflag = flag; checkflag = flag;
/* Allocate space for storing item on/off status */ /* Allocate space for storing item on/off status */
if ((status = malloc (sizeof (int) * item_no)) == NULL) { if ((status = malloc(sizeof(int) * item_no)) == NULL) {
endwin (); endwin();
fprintf (stderr, fprintf(stderr,
"\nCan't allocate memory in dialog_checklist().\n"); "\nCan't allocate memory in dialog_checklist().\n");
exit (-1); exit(-1);
}
/* Initializes status */
for (i = 0; i < item_no; i++) {
status[i] = !strcasecmp (items[i * 3 + 2], "on");
if ((!choice && status[i]) || !strcasecmp (items[i * 3 + 2], "selected"))
choice = i + 1;
}
if (choice)
choice--;
max_choice = MIN (list_height, item_no);
/* center dialog box on screen */
x = (COLS - width) / 2;
y = (LINES - height) / 2;
draw_shadow (stdscr, y, x, height, width);
dialog = newwin (height, width, y, x);
keypad (dialog, TRUE);
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
wattrset (dialog, border_attr);
mvwaddch (dialog, height-3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++)
waddch (dialog, ACS_HLINE);
wattrset (dialog, dialog_attr);
waddch (dialog, ACS_RTEE);
if (title != NULL && strlen(title) >= width-2 ) {
/* truncate long title -- mec */
char * title2 = malloc(width-2+1);
memcpy( title2, title, width-2 );
title2[width-2] = '\0';
title = title2;
}
if (title != NULL) {
wattrset (dialog, title_attr);
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
waddstr (dialog, (char *)title);
waddch (dialog, ' ');
}
wattrset (dialog, dialog_attr);
print_autowrap (dialog, prompt, width - 2, 1, 3);
list_width = width - 6;
box_y = height - list_height - 5;
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);
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);
/* Find length of longest item in order to center checklist */
check_x = 0;
for (i = 0; i < item_no; i++)
check_x = MAX (check_x, + strlen (items[i * 3 + 1]) + 4);
check_x = (list_width - check_x) / 2;
item_x = check_x + 4;
if (choice >= list_height) {
scroll = choice - list_height + 1;
choice -= scroll;
}
/* Print the list */
for (i = 0; i < max_choice; i++) {
print_item (list, items[(scroll+i) * 3 + 1],
status[i+scroll], i, i == choice);
}
print_arrows(dialog, choice, item_no, scroll,
box_y, box_x + check_x + 5, list_height);
print_buttons(dialog, height, width, 0);
wnoutrefresh (list);
wnoutrefresh (dialog);
doupdate ();
while (key != ESC) {
key = wgetch (dialog);
for (i = 0; i < max_choice; i++)
if (toupper(key) == toupper(items[(scroll+i)*3+1][0]))
break;
if ( i < max_choice || key == KEY_UP || key == KEY_DOWN ||
key == '+' || key == '-' ) {
if (key == KEY_UP || key == '-') {
if (!choice) {
if (!scroll)
continue;
/* Scroll list down */
if (list_height > 1) {
/* De-highlight current first item */
print_item (list, items[scroll * 3 + 1],
status[scroll], 0, FALSE);
scrollok (list, TRUE);
wscrl (list, -1);
scrollok (list, FALSE);
}
scroll--;
print_item (list, items[scroll * 3 + 1],
status[scroll], 0, TRUE);
wnoutrefresh (list);
print_arrows(dialog, choice, item_no, scroll,
box_y, box_x + check_x + 5, list_height);
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)
continue;
/* Scroll list up */
if (list_height > 1) {
/* De-highlight current last item before scrolling up */
print_item (list, items[(scroll + max_choice - 1) * 3 + 1],
status[scroll + max_choice - 1],
max_choice - 1, FALSE);
scrollok (list, TRUE);
wscrl (list, 1);
scrollok (list, FALSE);
}
scroll++;
print_item (list, items[(scroll + max_choice - 1) * 3 + 1],
status[scroll + max_choice - 1],
max_choice - 1, TRUE);
wnoutrefresh (list);
print_arrows(dialog, choice, item_no, scroll,
box_y, box_x + check_x + 5, list_height);
wrefresh (dialog);
continue; /* wait for another key press */
} else
i = choice + 1;
}
if (i != choice) {
/* De-highlight current item */
print_item (list, items[(scroll + choice) * 3 + 1],
status[scroll + choice], choice, FALSE);
/* Highlight new item */
choice = i;
print_item (list, items[(scroll + choice) * 3 + 1],
status[scroll + choice], choice, TRUE);
wnoutrefresh (list);
wrefresh (dialog);
}
continue; /* wait for another key press */
} }
switch (key) {
case 'H':
case 'h':
case '?':
fprintf (stderr, "%s", items[(scroll + choice) * 3]);
delwin (dialog);
free (status);
return 1;
case TAB:
case KEY_LEFT:
case KEY_RIGHT:
button = ((key == KEY_LEFT ? --button : ++button) < 0)
? 1 : (button > 1 ? 0 : button);
print_buttons(dialog, height, width, button); /* Initializes status */
wrefresh (dialog); for (i = 0; i < item_no; i++) {
break; status[i] = !strcasecmp(items[i * 3 + 2], "on");
case 'S': if ((!choice && status[i])
case 's': || !strcasecmp(items[i * 3 + 2], "selected"))
case ' ': choice = i + 1;
case '\n': }
if (!button) { if (choice)
if (flag == FLAG_CHECK) { choice--;
status[scroll + choice] = !status[scroll + choice];
wmove (list, choice, check_x); max_choice = MIN(list_height, item_no);
wattrset (list, check_selected_attr);
wprintw (list, "[%c]", status[scroll + choice] ? 'X' : ' '); /* center dialog box on screen */
} else { x = (COLS - width) / 2;
if (!status[scroll + choice]) { y = (LINES - height) / 2;
for (i = 0; i < item_no; i++)
status[i] = 0; draw_shadow(stdscr, y, x, height, width);
status[scroll + choice] = 1;
for (i = 0; i < max_choice; i++) dialog = newwin(height, width, y, x);
print_item (list, items[(scroll + i) * 3 + 1], keypad(dialog, TRUE);
status[scroll + i], i, i == choice);
} draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
} wattrset(dialog, border_attr);
wnoutrefresh (list); mvwaddch(dialog, height - 3, 0, ACS_LTEE);
wrefresh (dialog); for (i = 0; i < width - 2; i++)
waddch(dialog, ACS_HLINE);
for (i = 0; i < item_no; i++) { wattrset(dialog, dialog_attr);
if (status[i]) { waddch(dialog, ACS_RTEE);
if (flag == FLAG_CHECK) {
fprintf (stderr, "\"%s\" ", items[i * 3]); if (title != NULL && strlen(title) >= width - 2) {
} else { /* truncate long title -- mec */
fprintf (stderr, "%s", items[i * 3]); char *title2 = malloc(width - 2 + 1);
memcpy(title2, title, width - 2);
title2[width - 2] = '\0';
title = title2;
}
if (title != NULL) {
wattrset(dialog, title_attr);
mvwaddch(dialog, 0, (width - strlen(title)) / 2 - 1, ' ');
waddstr(dialog, (char *)title);
waddch(dialog, ' ');
}
wattrset(dialog, dialog_attr);
print_autowrap(dialog, prompt, width - 2, 1, 3);
list_width = width - 6;
box_y = height - list_height - 5;
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);
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);
/* Find length of longest item in order to center checklist */
check_x = 0;
for (i = 0; i < item_no; i++)
check_x = MAX(check_x, +strlen(items[i * 3 + 1]) + 4);
check_x = (list_width - check_x) / 2;
item_x = check_x + 4;
if (choice >= list_height) {
scroll = choice - list_height + 1;
choice -= scroll;
}
/* Print the list */
for (i = 0; i < max_choice; i++) {
print_item(list, items[(scroll + i) * 3 + 1],
status[i + scroll], i, i == choice);
}
print_arrows(dialog, choice, item_no, scroll,
box_y, box_x + check_x + 5, list_height);
print_buttons(dialog, height, width, 0);
wnoutrefresh(list);
wnoutrefresh(dialog);
doupdate();
while (key != ESC) {
key = wgetch(dialog);
for (i = 0; i < max_choice; i++)
if (toupper(key) ==
toupper(items[(scroll + i) * 3 + 1][0]))
break;
if (i < max_choice || key == KEY_UP || key == KEY_DOWN ||
key == '+' || key == '-') {
if (key == KEY_UP || key == '-') {
if (!choice) {
if (!scroll)
continue;
/* Scroll list down */
if (list_height > 1) {
/* De-highlight current first item */
print_item(list,
items[scroll * 3 +
1],
status[scroll], 0,
FALSE);
scrollok(list, TRUE);
wscrl(list, -1);
scrollok(list, FALSE);
}
scroll--;
print_item(list, items[scroll * 3 + 1],
status[scroll], 0, TRUE);
wnoutrefresh(list);
print_arrows(dialog, choice, item_no,
scroll, box_y,
box_x + check_x + 5,
list_height);
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)
continue;
/* Scroll list up */
if (list_height > 1) {
/* De-highlight current last item before scrolling up */
print_item(list,
items[(scroll +
max_choice -
1) * 3 + 1],
status[scroll +
max_choice -
1],
max_choice - 1,
FALSE);
scrollok(list, TRUE);
wscrl(list, 1);
scrollok(list, FALSE);
}
scroll++;
print_item(list,
items[(scroll + max_choice -
1) * 3 + 1],
status[scroll + max_choice -
1], max_choice - 1,
TRUE);
wnoutrefresh(list);
print_arrows(dialog, choice, item_no,
scroll, box_y,
box_x + check_x + 5,
list_height);
wrefresh(dialog);
continue; /* wait for another key press */
} else
i = choice + 1;
} }
if (i != choice) {
} /* De-highlight current item */
print_item(list,
items[(scroll + choice) * 3 + 1],
status[scroll + choice], choice,
FALSE);
/* Highlight new item */
choice = i;
print_item(list,
items[(scroll + choice) * 3 + 1],
status[scroll + choice], choice,
TRUE);
wnoutrefresh(list);
wrefresh(dialog);
}
continue; /* wait for another key press */
} }
} else switch (key) {
fprintf (stderr, "%s", items[(scroll + choice) * 3]); case 'H':
delwin (dialog); case 'h':
free (status); case '?':
return button; fprintf(stderr, "%s", items[(scroll + choice) * 3]);
case 'X': delwin(dialog);
case 'x': free(status);
key = ESC; return 1;
case ESC: case TAB:
break; case KEY_LEFT:
case KEY_RIGHT:
button = ((key == KEY_LEFT ? --button : ++button) < 0)
? 1 : (button > 1 ? 0 : button);
print_buttons(dialog, height, width, button);
wrefresh(dialog);
break;
case 'S':
case 's':
case ' ':
case '\n':
if (!button) {
if (flag == FLAG_CHECK) {
status[scroll + choice] =
!status[scroll + choice];
wmove(list, choice, check_x);
wattrset(list, check_selected_attr);
wprintw(list, "[%c]",
status[scroll +
choice] ? 'X' : ' ');
} else {
if (!status[scroll + choice]) {
for (i = 0; i < item_no; i++)
status[i] = 0;
status[scroll + choice] = 1;
for (i = 0; i < max_choice; i++)
print_item(list,
items[(scroll
+
i) *
3 + 1],
status[scroll
+ i],
i,
i == choice);
}
}
wnoutrefresh(list);
wrefresh(dialog);
for (i = 0; i < item_no; i++) {
if (status[i]) {
if (flag == FLAG_CHECK) {
fprintf(stderr,
"\"%s\" ",
items[i * 3]);
} else {
fprintf(stderr, "%s",
items[i * 3]);
}
}
}
} else
fprintf(stderr, "%s",
items[(scroll + choice) * 3]);
delwin(dialog);
free(status);
return button;
case 'X':
case 'x':
key = ESC;
case ESC:
break;
}
/* Now, update everything... */
doupdate();
} }
/* Now, update everything... */ delwin(dialog);
doupdate (); free(status);
} return -1; /* ESC pressed */
delwin (dialog);
free (status);
return -1; /* ESC pressed */
} }

View File

@ -18,7 +18,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* /*
* Default color definitions * Default color definitions
* *

View File

@ -42,7 +42,7 @@
#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE) #if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE)
#define OLD_NCURSES 1 #define OLD_NCURSES 1
#undef wbkgdset #undef wbkgdset
#define wbkgdset(w,p) /*nothing*/ #define wbkgdset(w,p) /*nothing */
#else #else
#define OLD_NCURSES 0 #define OLD_NCURSES 0
#endif #endif
@ -56,7 +56,6 @@
#define MIN(x,y) (x < y ? x : y) #define MIN(x,y) (x < y ? x : y)
#define MAX(x,y) (x > y ? x : y) #define MAX(x,y) (x > y ? x : y)
#ifndef ACS_ULCORNER #ifndef ACS_ULCORNER
#define ACS_ULCORNER '+' #define ACS_ULCORNER '+'
#endif #endif
@ -137,35 +136,34 @@ extern const char *backtitle;
/* /*
* Function prototypes * Function prototypes
*/ */
extern void create_rc (const char *filename); extern void create_rc(const char *filename);
extern int parse_rc (void); extern int parse_rc(void);
void init_dialog(void);
void end_dialog(void);
void attr_clear(WINDOW * win, int height, int width, chtype attr);
void dialog_clear(void);
void color_setup(void);
void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x);
void print_button(WINDOW * win, const char *label, int y, int x, int selected);
void draw_box(WINDOW * win, int y, int x, int height, int width, chtype box,
chtype border);
void draw_shadow(WINDOW * win, int y, int x, int height, int width);
void init_dialog (void); int first_alpha(const char *string, const char *exempt);
void end_dialog (void); int dialog_yesno(const char *title, const char *prompt, int height, int width);
void attr_clear (WINDOW * win, int height, int width, chtype attr); int dialog_msgbox(const char *title, const char *prompt, int height,
void dialog_clear (void); int width, int pause);
void color_setup (void); int dialog_textbox(const char *title, const char *file, int height, int width);
void print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x); int dialog_menu(const char *title, const char *prompt, int height, int width,
void print_button (WINDOW * win, const char *label, int y, int x, int selected); int menu_height, const char *choice, int item_no,
void draw_box (WINDOW * win, int y, int x, int height, int width, chtype box, const char *const *items);
chtype border); int dialog_checklist(const char *title, const char *prompt, int height,
void draw_shadow (WINDOW * win, int y, int x, int height, int width); int width, int list_height, int item_no,
const char *const *items, int flag);
int first_alpha (const char *string, const char *exempt);
int dialog_yesno (const char *title, const char *prompt, int height, int width);
int dialog_msgbox (const char *title, const char *prompt, int height,
int width, int pause);
int dialog_textbox (const char *title, const char *file, int height, int width);
int dialog_menu (const char *title, const char *prompt, int height, int width,
int menu_height, const char *choice, int item_no,
const char * const * items);
int dialog_checklist (const char *title, const char *prompt, int height,
int width, int list_height, int item_no,
const char * const * items, int flag);
extern char dialog_input_result[]; extern char dialog_input_result[];
int dialog_inputbox (const char *title, const char *prompt, int height, int dialog_inputbox(const char *title, const char *prompt, int height,
int width, const char *init); int width, const char *init);
/* /*
* This is the base for fictitious keys, which activate * This is the base for fictitious keys, which activate
@ -178,7 +176,6 @@ int dialog_inputbox (const char *title, const char *prompt, int height,
*/ */
#define M_EVENT (KEY_MAX+1) #define M_EVENT (KEY_MAX+1)
/* /*
* The `flag' parameter in checklist is used to select between * The `flag' parameter in checklist is used to select between
* radiolist and checklist * radiolist and checklist

View File

@ -26,215 +26,231 @@ char dialog_input_result[MAX_LEN + 1];
/* /*
* Print the termination buttons * Print the termination buttons
*/ */
static void static void print_buttons(WINDOW * dialog, int height, int width, int selected)
print_buttons(WINDOW *dialog, int height, int width, int selected)
{ {
int x = width / 2 - 11; int x = width / 2 - 11;
int y = height - 2; int y = height - 2;
print_button (dialog, " Ok ", y, x, selected==0); print_button(dialog, " Ok ", y, x, selected == 0);
print_button (dialog, " Help ", y, x + 14, selected==1); print_button(dialog, " Help ", y, x + 14, selected == 1);
wmove(dialog, y, x+1+14*selected); wmove(dialog, y, x + 1 + 14 * selected);
wrefresh(dialog); wrefresh(dialog);
} }
/* /*
* Display a dialog box for inputing a string * Display a dialog box for inputing a string
*/ */
int int
dialog_inputbox (const char *title, const char *prompt, int height, int width, dialog_inputbox(const char *title, const char *prompt, int height, int width,
const char *init) const char *init)
{ {
int i, x, y, box_y, box_x, box_width; int i, x, y, box_y, box_x, box_width;
int input_x = 0, scroll = 0, key = 0, button = -1; int input_x = 0, scroll = 0, key = 0, button = -1;
char *instr = dialog_input_result; char *instr = dialog_input_result;
WINDOW *dialog; WINDOW *dialog;
/* center dialog box on screen */ /* center dialog box on screen */
x = (COLS - width) / 2; x = (COLS - width) / 2;
y = (LINES - height) / 2; y = (LINES - height) / 2;
draw_shadow(stdscr, y, x, height, width);
draw_shadow (stdscr, y, x, height, width); dialog = newwin(height, width, y, x);
keypad(dialog, TRUE);
dialog = newwin (height, width, y, x); draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
keypad (dialog, TRUE); wattrset(dialog, border_attr);
mvwaddch(dialog, height - 3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++)
waddch(dialog, ACS_HLINE);
wattrset(dialog, dialog_attr);
waddch(dialog, ACS_RTEE);
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); if (title != NULL && strlen(title) >= width - 2) {
wattrset (dialog, border_attr); /* truncate long title -- mec */
mvwaddch (dialog, height-3, 0, ACS_LTEE); char *title2 = malloc(width - 2 + 1);
for (i = 0; i < width - 2; i++) memcpy(title2, title, width - 2);
waddch (dialog, ACS_HLINE); title2[width - 2] = '\0';
wattrset (dialog, dialog_attr); title = title2;
waddch (dialog, ACS_RTEE); }
if (title != NULL && strlen(title) >= width-2 ) { if (title != NULL) {
/* truncate long title -- mec */ wattrset(dialog, title_attr);
char * title2 = malloc(width-2+1); mvwaddch(dialog, 0, (width - strlen(title)) / 2 - 1, ' ');
memcpy( title2, title, width-2 ); waddstr(dialog, (char *)title);
title2[width-2] = '\0'; waddch(dialog, ' ');
title = title2; }
}
if (title != NULL) { wattrset(dialog, dialog_attr);
wattrset (dialog, title_attr); print_autowrap(dialog, prompt, width - 2, 1, 3);
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
waddstr (dialog, (char *)title);
waddch (dialog, ' ');
}
wattrset (dialog, dialog_attr); /* Draw the input field box */
print_autowrap (dialog, prompt, width - 2, 1, 3); box_width = width - 6;
getyx(dialog, y, x);
box_y = y + 2;
box_x = (width - box_width) / 2;
draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2,
border_attr, dialog_attr);
/* Draw the input field box */ print_buttons(dialog, height, width, 0);
box_width = width - 6;
getyx (dialog, y, x);
box_y = y + 2;
box_x = (width - box_width) / 2;
draw_box (dialog, y + 1, box_x - 1, 3, box_width + 2,
border_attr, dialog_attr);
print_buttons(dialog, height, width, 0); /* Set up the initial value */
wmove(dialog, box_y, box_x);
wattrset(dialog, inputbox_attr);
/* Set up the initial value */ if (!init)
wmove (dialog, box_y, box_x); instr[0] = '\0';
wattrset (dialog, inputbox_attr); else
strcpy(instr, init);
if (!init) input_x = strlen(instr);
instr[0] = '\0';
else
strcpy (instr, init);
input_x = strlen (instr); if (input_x >= box_width) {
scroll = input_x - box_width + 1;
input_x = box_width - 1;
for (i = 0; i < box_width - 1; i++)
waddch(dialog, instr[scroll + i]);
} else
waddstr(dialog, instr);
if (input_x >= box_width) { wmove(dialog, box_y, box_x + input_x);
scroll = input_x - box_width + 1;
input_x = box_width - 1;
for (i = 0; i < box_width - 1; i++)
waddch (dialog, instr[scroll + i]);
} else
waddstr (dialog, instr);
wmove (dialog, box_y, box_x + input_x); wrefresh(dialog);
wrefresh (dialog); while (key != ESC) {
key = wgetch(dialog);
while (key != ESC) { if (button == -1) { /* Input box selected */
key = wgetch (dialog); switch (key) {
case TAB:
if (button == -1) { /* Input box selected */ case KEY_UP:
switch (key) { case KEY_DOWN:
case TAB: break;
case KEY_UP: case KEY_LEFT:
case KEY_DOWN: continue;
break; case KEY_RIGHT:
case KEY_LEFT: continue;
continue; case KEY_BACKSPACE:
case KEY_RIGHT: case 127:
continue; if (input_x || scroll) {
case KEY_BACKSPACE: wattrset(dialog, inputbox_attr);
case 127: if (!input_x) {
if (input_x || scroll) { scroll =
wattrset (dialog, inputbox_attr); scroll <
if (!input_x) { box_width - 1 ? 0 : scroll -
scroll = scroll < box_width - 1 ? (box_width - 1);
0 : scroll - (box_width - 1); wmove(dialog, box_y, box_x);
wmove (dialog, box_y, box_x); for (i = 0; i < box_width; i++)
for (i = 0; i < box_width; i++) waddch(dialog,
waddch (dialog, instr[scroll + input_x + i] ? instr[scroll +
instr[scroll + input_x + i] : ' '); input_x +
input_x = strlen (instr) - scroll; i] ?
} else instr[scroll +
input_x--; input_x +
instr[scroll + input_x] = '\0'; i] : ' ');
mvwaddch (dialog, box_y, input_x + box_x, ' '); input_x =
wmove (dialog, box_y, input_x + box_x); strlen(instr) - scroll;
wrefresh (dialog); } else
} input_x--;
continue; instr[scroll + input_x] = '\0';
default: mvwaddch(dialog, box_y, input_x + box_x,
if (key < 0x100 && isprint (key)) { ' ');
if (scroll + input_x < MAX_LEN) { wmove(dialog, box_y, input_x + box_x);
wattrset (dialog, inputbox_attr); wrefresh(dialog);
instr[scroll + input_x] = key; }
instr[scroll + input_x + 1] = '\0'; continue;
if (input_x == box_width - 1) { default:
scroll++; if (key < 0x100 && isprint(key)) {
wmove (dialog, box_y, box_x); if (scroll + input_x < MAX_LEN) {
for (i = 0; i < box_width - 1; i++) wattrset(dialog, inputbox_attr);
waddch (dialog, instr[scroll + i]); instr[scroll + input_x] = key;
} else { instr[scroll + input_x + 1] =
wmove (dialog, box_y, input_x++ + box_x); '\0';
waddch (dialog, key); if (input_x == box_width - 1) {
scroll++;
wmove(dialog, box_y,
box_x);
for (i = 0;
i < box_width - 1;
i++)
waddch(dialog,
instr
[scroll +
i]);
} else {
wmove(dialog, box_y,
input_x++ +
box_x);
waddch(dialog, key);
}
wrefresh(dialog);
} else
flash(); /* Alarm user about overflow */
continue;
}
} }
wrefresh (dialog);
} else
flash (); /* Alarm user about overflow */
continue;
} }
} switch (key) {
case 'O':
case 'o':
delwin(dialog);
return 0;
case 'H':
case 'h':
delwin(dialog);
return 1;
case KEY_UP:
case KEY_LEFT:
switch (button) {
case -1:
button = 1; /* Indicates "Cancel" button is selected */
print_buttons(dialog, height, width, 1);
break;
case 0:
button = -1; /* Indicates input box is selected */
print_buttons(dialog, height, width, 0);
wmove(dialog, box_y, box_x + input_x);
wrefresh(dialog);
break;
case 1:
button = 0; /* Indicates "OK" button is selected */
print_buttons(dialog, height, width, 0);
break;
}
break;
case TAB:
case KEY_DOWN:
case KEY_RIGHT:
switch (button) {
case -1:
button = 0; /* Indicates "OK" button is selected */
print_buttons(dialog, height, width, 0);
break;
case 0:
button = 1; /* Indicates "Cancel" button is selected */
print_buttons(dialog, height, width, 1);
break;
case 1:
button = -1; /* Indicates input box is selected */
print_buttons(dialog, height, width, 0);
wmove(dialog, box_y, box_x + input_x);
wrefresh(dialog);
break;
}
break;
case ' ':
case '\n':
delwin(dialog);
return (button == -1 ? 0 : button);
case 'X':
case 'x':
key = ESC;
case ESC:
break;
}
} }
switch (key) {
case 'O':
case 'o':
delwin (dialog);
return 0;
case 'H':
case 'h':
delwin (dialog);
return 1;
case KEY_UP:
case KEY_LEFT:
switch (button) {
case -1:
button = 1; /* Indicates "Cancel" button is selected */
print_buttons(dialog, height, width, 1);
break;
case 0:
button = -1; /* Indicates input box is selected */
print_buttons(dialog, height, width, 0);
wmove (dialog, box_y, box_x + input_x);
wrefresh (dialog);
break;
case 1:
button = 0; /* Indicates "OK" button is selected */
print_buttons(dialog, height, width, 0);
break;
}
break;
case TAB:
case KEY_DOWN:
case KEY_RIGHT:
switch (button) {
case -1:
button = 0; /* Indicates "OK" button is selected */
print_buttons(dialog, height, width, 0);
break;
case 0:
button = 1; /* Indicates "Cancel" button is selected */
print_buttons(dialog, height, width, 1);
break;
case 1:
button = -1; /* Indicates input box is selected */
print_buttons(dialog, height, width, 0);
wmove (dialog, box_y, box_x + input_x);
wrefresh (dialog);
break;
}
break;
case ' ':
case '\n':
delwin (dialog);
return (button == -1 ? 0 : button);
case 'X':
case 'x':
key = ESC;
case ESC:
break;
}
}
delwin (dialog); delwin(dialog);
return -1; /* ESC pressed */ return -1; /* ESC pressed */
} }

View File

@ -21,30 +21,29 @@
#include "dialog.h" #include "dialog.h"
static void Usage (const char *name); static void Usage(const char *name);
typedef int (jumperFn) (const char *title, int argc, const char * const * argv); typedef int (jumperFn) (const char *title, int argc, const char *const *argv);
struct Mode { struct Mode {
char *name; char *name;
int argmin, argmax, argmod; int argmin, argmax, argmod;
jumperFn *jumper; jumperFn *jumper;
}; };
jumperFn j_menu, j_checklist, j_radiolist, j_yesno, j_textbox, j_inputbox; jumperFn j_menu, j_checklist, j_radiolist, j_yesno, j_textbox, j_inputbox;
jumperFn j_msgbox, j_infobox; jumperFn j_msgbox, j_infobox;
static struct Mode modes[] = static struct Mode modes[] = {
{ {"--menu", 9, 0, 3, j_menu},
{"--menu", 9, 0, 3, j_menu}, {"--checklist", 9, 0, 3, j_checklist},
{"--checklist", 9, 0, 3, j_checklist}, {"--radiolist", 9, 0, 3, j_radiolist},
{"--radiolist", 9, 0, 3, j_radiolist}, {"--yesno", 5, 5, 1, j_yesno},
{"--yesno", 5,5,1, j_yesno}, {"--textbox", 5, 5, 1, j_textbox},
{"--textbox", 5,5,1, j_textbox}, {"--inputbox", 5, 6, 1, j_inputbox},
{"--inputbox", 5, 6, 1, j_inputbox}, {"--msgbox", 5, 5, 1, j_msgbox},
{"--msgbox", 5, 5, 1, j_msgbox}, {"--infobox", 5, 5, 1, j_infobox},
{"--infobox", 5, 5, 1, j_infobox}, {NULL, 0, 0, 0, NULL}
{NULL, 0, 0, 0, NULL}
}; };
static struct Mode *modePtr; static struct Mode *modePtr;
@ -53,96 +52,92 @@ static struct Mode *modePtr;
#include <locale.h> #include <locale.h>
#endif #endif
int int main(int argc, const char *const *argv)
main (int argc, const char * const * argv)
{ {
int offset = 0, opt_clear = 0, end_common_opts = 0, retval; int offset = 0, opt_clear = 0, end_common_opts = 0, retval;
const char *title = NULL; const char *title = NULL;
#ifdef LOCALE #ifdef LOCALE
(void) setlocale (LC_ALL, ""); (void)setlocale(LC_ALL, "");
#endif #endif
#ifdef TRACE #ifdef TRACE
trace(TRACE_CALLS|TRACE_UPDATE); trace(TRACE_CALLS | TRACE_UPDATE);
#endif #endif
if (argc < 2) { if (argc < 2) {
Usage (argv[0]); Usage(argv[0]);
exit (-1); exit(-1);
} }
while (offset < argc - 1 && !end_common_opts) { /* Common options */ while (offset < argc - 1 && !end_common_opts) { /* Common options */
if (!strcmp (argv[offset + 1], "--title")) { if (!strcmp(argv[offset + 1], "--title")) {
if (argc - offset < 3 || title != NULL) { if (argc - offset < 3 || title != NULL) {
Usage (argv[0]); Usage(argv[0]);
exit (-1); exit(-1);
} else { } else {
title = argv[offset + 2]; title = argv[offset + 2];
offset += 2; offset += 2;
} }
} else if (!strcmp (argv[offset + 1], "--backtitle")) { } else if (!strcmp(argv[offset + 1], "--backtitle")) {
if (backtitle != NULL) { if (backtitle != NULL) {
Usage (argv[0]); Usage(argv[0]);
exit (-1); exit(-1);
} else { } else {
backtitle = argv[offset + 2]; backtitle = argv[offset + 2];
offset += 2; offset += 2;
} }
} else if (!strcmp (argv[offset + 1], "--clear")) { } else if (!strcmp(argv[offset + 1], "--clear")) {
if (opt_clear) { /* Hey, "--clear" can't appear twice! */ if (opt_clear) { /* Hey, "--clear" can't appear twice! */
Usage (argv[0]); Usage(argv[0]);
exit (-1); exit(-1);
} else if (argc == 2) { /* we only want to clear the screen */ } else if (argc == 2) { /* we only want to clear the screen */
init_dialog (); init_dialog();
refresh (); /* init_dialog() will clear the screen for us */ refresh(); /* init_dialog() will clear the screen for us */
end_dialog (); end_dialog();
return 0; return 0;
} else { } else {
opt_clear = 1; opt_clear = 1;
offset++; offset++;
} }
} else /* no more common options */ } else /* no more common options */
end_common_opts = 1; end_common_opts = 1;
} }
if (argc - 1 == offset) { /* no more options */ if (argc - 1 == offset) { /* no more options */
Usage (argv[0]); Usage(argv[0]);
exit (-1); exit(-1);
} }
/* use a table to look for the requested mode, to avoid code duplication */ /* use a table to look for the requested mode, to avoid code duplication */
for (modePtr = modes; modePtr->name; modePtr++) /* look for the mode */ for (modePtr = modes; modePtr->name; modePtr++) /* look for the mode */
if (!strcmp (argv[offset + 1], modePtr->name)) if (!strcmp(argv[offset + 1], modePtr->name))
break; break;
if (!modePtr->name) if (!modePtr->name)
Usage (argv[0]); Usage(argv[0]);
if (argc - offset < modePtr->argmin) if (argc - offset < modePtr->argmin)
Usage (argv[0]); Usage(argv[0]);
if (modePtr->argmax && argc - offset > modePtr->argmax) if (modePtr->argmax && argc - offset > modePtr->argmax)
Usage (argv[0]); Usage(argv[0]);
init_dialog();
retval = (*(modePtr->jumper)) (title, argc - offset, argv + offset);
if (opt_clear) { /* clear screen before exit */
attr_clear(stdscr, LINES, COLS, screen_attr);
refresh();
}
end_dialog();
init_dialog (); exit(retval);
retval = (*(modePtr->jumper)) (title, argc - offset, argv + offset);
if (opt_clear) { /* clear screen before exit */
attr_clear (stdscr, LINES, COLS, screen_attr);
refresh ();
}
end_dialog();
exit (retval);
} }
/* /*
* Print program usage * Print program usage
*/ */
static void static void Usage(const char *name)
Usage (const char *name)
{ {
fprintf (stderr, "\ fprintf(stderr, "\
\ndialog, by Savio Lam (lam836@cs.cuhk.hk).\ \ndialog, by Savio Lam (lam836@cs.cuhk.hk).\
\n patched by Stuart Herbert (S.Herbert@shef.ac.uk)\ \n patched by Stuart Herbert (S.Herbert@shef.ac.uk)\
\n modified/gutted for use as a Linux kernel config tool by \ \n modified/gutted for use as a Linux kernel config tool by \
@ -162,65 +157,56 @@ Usage (const char *name)
\n --inputbox <text> <height> <width> [<init>]\ \n --inputbox <text> <height> <width> [<init>]\
\n --yesno <text> <height> <width>\ \n --yesno <text> <height> <width>\
\n", name, name); \n", name, name);
exit (-1); exit(-1);
} }
/* /*
* These are the program jumpers * These are the program jumpers
*/ */
int int j_menu(const char *t, int ac, const char *const *av)
j_menu (const char *t, int ac, const char * const * av)
{ {
return dialog_menu (t, av[2], atoi (av[3]), atoi (av[4]), return dialog_menu(t, av[2], atoi(av[3]), atoi(av[4]),
atoi (av[5]), av[6], (ac - 6) / 2, av + 7); atoi(av[5]), av[6], (ac - 6) / 2, av + 7);
} }
int int j_checklist(const char *t, int ac, const char *const *av)
j_checklist (const char *t, int ac, const char * const * av)
{ {
return dialog_checklist (t, av[2], atoi (av[3]), atoi (av[4]), return dialog_checklist(t, av[2], atoi(av[3]), atoi(av[4]),
atoi (av[5]), (ac - 6) / 3, av + 6, FLAG_CHECK); atoi(av[5]), (ac - 6) / 3, av + 6, FLAG_CHECK);
} }
int int j_radiolist(const char *t, int ac, const char *const *av)
j_radiolist (const char *t, int ac, const char * const * av)
{ {
return dialog_checklist (t, av[2], atoi (av[3]), atoi (av[4]), return dialog_checklist(t, av[2], atoi(av[3]), atoi(av[4]),
atoi (av[5]), (ac - 6) / 3, av + 6, FLAG_RADIO); atoi(av[5]), (ac - 6) / 3, av + 6, FLAG_RADIO);
} }
int int j_textbox(const char *t, int ac, const char *const *av)
j_textbox (const char *t, int ac, const char * const * av)
{ {
return dialog_textbox (t, av[2], atoi (av[3]), atoi (av[4])); return dialog_textbox(t, av[2], atoi(av[3]), atoi(av[4]));
} }
int int j_yesno(const char *t, int ac, const char *const *av)
j_yesno (const char *t, int ac, const char * const * av)
{ {
return dialog_yesno (t, av[2], atoi (av[3]), atoi (av[4])); return dialog_yesno(t, av[2], atoi(av[3]), atoi(av[4]));
} }
int int j_inputbox(const char *t, int ac, const char *const *av)
j_inputbox (const char *t, int ac, const char * const * av)
{ {
int ret = dialog_inputbox (t, av[2], atoi (av[3]), atoi (av[4]), int ret = dialog_inputbox(t, av[2], atoi(av[3]), atoi(av[4]),
ac == 6 ? av[5] : (char *) NULL); ac == 6 ? av[5] : (char *)NULL);
if (ret == 0) if (ret == 0)
fprintf(stderr, dialog_input_result); fprintf(stderr, dialog_input_result);
return ret; return ret;
} }
int int j_msgbox(const char *t, int ac, const char *const *av)
j_msgbox (const char *t, int ac, const char * const * av)
{ {
return dialog_msgbox (t, av[2], atoi (av[3]), atoi (av[4]), 1); return dialog_msgbox(t, av[2], atoi(av[3]), atoi(av[4]), 1);
} }
int int j_infobox(const char *t, int ac, const char *const *av)
j_infobox (const char *t, int ac, const char * const * av)
{ {
return dialog_msgbox (t, av[2], atoi (av[3]), atoi (av[4]), 0); return dialog_msgbox(t, av[2], atoi(av[3]), atoi(av[4]), 0);
} }

View File

@ -64,382 +64,420 @@ static int menu_width, item_x;
* Print menu item * Print menu item
*/ */
static void static void
print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey) print_item(WINDOW * win, const char *item, int choice, int selected, int hotkey)
{ {
int j; int j;
char menu_item[menu_width+1]; char menu_item[menu_width + 1];
strncpy(menu_item, item, menu_width); strncpy(menu_item, item, menu_width);
menu_item[menu_width] = 0; menu_item[menu_width] = 0;
j = first_alpha(menu_item, "YyNnMmHh"); j = first_alpha(menu_item, "YyNnMmHh");
/* Clear 'residue' of last item */ /* Clear 'residue' of last item */
wattrset (win, menubox_attr); wattrset(win, menubox_attr);
wmove (win, choice, 0); wmove(win, choice, 0);
#if OLD_NCURSES #if OLD_NCURSES
{ {
int i; int i;
for (i = 0; i < menu_width; i++) for (i = 0; i < menu_width; i++)
waddch (win, ' '); waddch(win, ' ');
} }
#else #else
wclrtoeol(win); wclrtoeol(win);
#endif #endif
wattrset (win, selected ? item_selected_attr : item_attr); wattrset(win, selected ? item_selected_attr : item_attr);
mvwaddstr (win, choice, item_x, menu_item); mvwaddstr(win, choice, item_x, menu_item);
if (hotkey) { if (hotkey) {
wattrset (win, selected ? tag_key_selected_attr : tag_key_attr); wattrset(win, selected ? tag_key_selected_attr : tag_key_attr);
mvwaddch(win, choice, item_x+j, menu_item[j]); mvwaddch(win, choice, item_x + j, menu_item[j]);
} }
if (selected) { if (selected) {
wmove (win, choice, item_x+1); wmove(win, choice, item_x + 1);
wrefresh (win); wrefresh(win);
} }
} }
/* /*
* Print the scroll indicators. * Print the scroll indicators.
*/ */
static void static void
print_arrows (WINDOW * win, int item_no, int scroll, print_arrows(WINDOW * win, int item_no, int scroll, int y, int x, int height)
int y, int x, int height)
{ {
int cur_y, cur_x; int cur_y, cur_x;
getyx(win, cur_y, cur_x); getyx(win, cur_y, cur_x);
wmove(win, y, x); wmove(win, y, x);
if (scroll > 0) { if (scroll > 0) {
wattrset (win, uarrow_attr); wattrset(win, uarrow_attr);
waddch (win, ACS_UARROW); waddch(win, ACS_UARROW);
waddstr (win, "(-)"); waddstr(win, "(-)");
} } else {
else { wattrset(win, menubox_attr);
wattrset (win, menubox_attr); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); }
}
y = y + height + 1; y = y + height + 1;
wmove(win, y, x); wmove(win, y, x);
if ((height < item_no) && (scroll + height < item_no)) { if ((height < item_no) && (scroll + height < item_no)) {
wattrset (win, darrow_attr); wattrset(win, darrow_attr);
waddch (win, ACS_DARROW); waddch(win, ACS_DARROW);
waddstr (win, "(+)"); waddstr(win, "(+)");
} } else {
else { wattrset(win, menubox_border_attr);
wattrset (win, menubox_border_attr); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch (win, ACS_HLINE); }
}
wmove(win, cur_y, cur_x); wmove(win, cur_y, cur_x);
} }
/* /*
* Display the termination buttons. * Display the termination buttons.
*/ */
static void static void print_buttons(WINDOW * win, int height, int width, int selected)
print_buttons (WINDOW *win, int height, int width, int selected)
{ {
int x = width / 2 - 16; int x = width / 2 - 16;
int y = height - 2; int y = height - 2;
print_button (win, "Select", y, x, selected == 0); print_button(win, "Select", y, x, selected == 0);
print_button (win, " Exit ", y, x + 12, selected == 1); print_button(win, " Exit ", y, x + 12, selected == 1);
print_button (win, " Help ", y, x + 24, selected == 2); print_button(win, " Help ", y, x + 24, selected == 2);
wmove(win, y, x+1+12*selected); wmove(win, y, x + 1 + 12 * selected);
wrefresh (win); wrefresh(win);
} }
/* /*
* Display a menu for choosing among a number of options * Display a menu for choosing among a number of options
*/ */
int int
dialog_menu (const char *title, const char *prompt, int height, int width, dialog_menu(const char *title, const char *prompt, int height, int width,
int menu_height, const char *current, int item_no, int menu_height, const char *current, int item_no,
const char * const * items) const char *const *items)
{ {
int i, j, x, y, box_x, box_y; int i, j, x, y, box_x, box_y;
int key = 0, button = 0, scroll = 0, choice = 0, first_item = 0, max_choice; int key = 0, button = 0, scroll = 0, choice = 0, first_item =
WINDOW *dialog, *menu; 0, max_choice;
FILE *f; WINDOW *dialog, *menu;
FILE *f;
max_choice = MIN (menu_height, item_no); max_choice = MIN(menu_height, item_no);
/* center dialog box on screen */ /* center dialog box on screen */
x = (COLS - width) / 2; x = (COLS - width) / 2;
y = (LINES - height) / 2; y = (LINES - height) / 2;
draw_shadow (stdscr, y, x, height, width); draw_shadow(stdscr, y, x, height, width);
dialog = newwin (height, width, y, x); dialog = newwin(height, width, y, x);
keypad (dialog, TRUE); keypad(dialog, TRUE);
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
wattrset (dialog, border_attr); wattrset(dialog, border_attr);
mvwaddch (dialog, height - 3, 0, ACS_LTEE); mvwaddch(dialog, height - 3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch (dialog, ACS_HLINE); waddch(dialog, ACS_HLINE);
wattrset (dialog, dialog_attr); wattrset(dialog, dialog_attr);
wbkgdset (dialog, dialog_attr & A_COLOR); wbkgdset(dialog, dialog_attr & A_COLOR);
waddch (dialog, ACS_RTEE); waddch(dialog, ACS_RTEE);
if (title != NULL && strlen(title) >= width-2 ) { if (title != NULL && strlen(title) >= width - 2) {
/* truncate long title -- mec */ /* truncate long title -- mec */
char * title2 = malloc(width-2+1); char *title2 = malloc(width - 2 + 1);
memcpy( title2, title, width-2 ); memcpy(title2, title, width - 2);
title2[width-2] = '\0'; title2[width - 2] = '\0';
title = title2; title = title2;
}
if (title != NULL) {
wattrset (dialog, title_attr);
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
waddstr (dialog, (char *)title);
waddch (dialog, ' ');
}
wattrset (dialog, dialog_attr);
print_autowrap (dialog, prompt, width - 2, 1, 3);
menu_width = width - 6;
box_y = height - menu_height - 5;
box_x = (width - menu_width) / 2 - 1;
/* create new window for the menu */
menu = subwin (dialog, menu_height, menu_width,
y + box_y + 1, x + box_x + 1);
keypad (menu, TRUE);
/* draw a box around the menu items */
draw_box (dialog, box_y, box_x, menu_height + 2, menu_width + 2,
menubox_border_attr, menubox_attr);
/*
* Find length of longest item in order to center menu.
* Set 'choice' to default item.
*/
item_x = 0;
for (i = 0; i < item_no; i++) {
item_x = MAX (item_x, MIN(menu_width, strlen (items[i * 2 + 1]) + 2));
if (strcmp(current, items[i*2]) == 0) choice = i;
}
item_x = (menu_width - item_x) / 2;
/* get the scroll info from the temp file */
if ( (f=fopen("lxdialog.scrltmp","r")) != NULL ) {
if ( (fscanf(f,"%d\n",&scroll) == 1) && (scroll <= choice) &&
(scroll+max_choice > choice) && (scroll >= 0) &&
(scroll+max_choice <= item_no) ) {
first_item = scroll;
choice = choice - scroll;
fclose(f);
} else {
scroll=0;
remove("lxdialog.scrltmp");
fclose(f);
f=NULL;
} }
}
if ( (choice >= max_choice) || (f==NULL && choice >= max_choice/2) ) {
if (choice >= item_no-max_choice/2)
scroll = first_item = item_no-max_choice;
else
scroll = first_item = choice - max_choice/2;
choice = choice - scroll;
}
/* Print the menu */ if (title != NULL) {
for (i=0; i < max_choice; i++) { wattrset(dialog, title_attr);
print_item (menu, items[(first_item + i) * 2 + 1], i, i == choice, mvwaddch(dialog, 0, (width - strlen(title)) / 2 - 1, ' ');
(items[(first_item + i)*2][0] != ':')); waddstr(dialog, (char *)title);
} waddch(dialog, ' ');
wnoutrefresh (menu);
print_arrows(dialog, item_no, scroll,
box_y, box_x+item_x+1, menu_height);
print_buttons (dialog, height, width, 0);
wmove (menu, choice, item_x+1);
wrefresh (menu);
while (key != ESC) {
key = wgetch(menu);
if (key < 256 && isalpha(key)) key = tolower(key);
if (strchr("ynmh", key))
i = max_choice;
else {
for (i = choice+1; i < max_choice; i++) {
j = first_alpha(items[(scroll+i)*2+1], "YyNnMmHh");
if (key == tolower(items[(scroll+i)*2+1][j]))
break;
} }
if (i == max_choice)
for (i = 0; i < max_choice; i++) { wattrset(dialog, dialog_attr);
j = first_alpha(items[(scroll+i)*2+1], "YyNnMmHh"); print_autowrap(dialog, prompt, width - 2, 1, 3);
if (key == tolower(items[(scroll+i)*2+1][j]))
break; menu_width = width - 6;
box_y = height - menu_height - 5;
box_x = (width - menu_width) / 2 - 1;
/* create new window for the menu */
menu = subwin(dialog, menu_height, menu_width,
y + box_y + 1, x + box_x + 1);
keypad(menu, TRUE);
/* draw a box around the menu items */
draw_box(dialog, box_y, box_x, menu_height + 2, menu_width + 2,
menubox_border_attr, menubox_attr);
/*
* Find length of longest item in order to center menu.
* Set 'choice' to default item.
*/
item_x = 0;
for (i = 0; i < item_no; i++) {
item_x =
MAX(item_x, MIN(menu_width, strlen(items[i * 2 + 1]) + 2));
if (strcmp(current, items[i * 2]) == 0)
choice = i;
}
item_x = (menu_width - item_x) / 2;
/* get the scroll info from the temp file */
if ((f = fopen("lxdialog.scrltmp", "r")) != NULL) {
if ((fscanf(f, "%d\n", &scroll) == 1) && (scroll <= choice) &&
(scroll + max_choice > choice) && (scroll >= 0) &&
(scroll + max_choice <= item_no)) {
first_item = scroll;
choice = choice - scroll;
fclose(f);
} else {
scroll = 0;
remove("lxdialog.scrltmp");
fclose(f);
f = NULL;
}
}
if ((choice >= max_choice) || (f == NULL && choice >= max_choice / 2)) {
if (choice >= item_no - max_choice / 2)
scroll = first_item = item_no - max_choice;
else
scroll = first_item = choice - max_choice / 2;
choice = choice - scroll;
}
/* Print the menu */
for (i = 0; i < max_choice; i++) {
print_item(menu, items[(first_item + i) * 2 + 1], i,
i == choice,
(items[(first_item + i) * 2][0] != ':'));
}
wnoutrefresh(menu);
print_arrows(dialog, item_no, scroll,
box_y, box_x + item_x + 1, menu_height);
print_buttons(dialog, height, width, 0);
wmove(menu, choice, item_x + 1);
wrefresh(menu);
while (key != ESC) {
key = wgetch(menu);
if (key < 256 && isalpha(key))
key = tolower(key);
if (strchr("ynmh", key))
i = max_choice;
else {
for (i = choice + 1; i < max_choice; i++) {
j = first_alpha(items[(scroll + i) * 2 + 1],
"YyNnMmHh");
if (key ==
tolower(items[(scroll + i) * 2 + 1][j]))
break;
}
if (i == max_choice)
for (i = 0; i < max_choice; i++) {
j = first_alpha(items
[(scroll + i) * 2 + 1],
"YyNnMmHh");
if (key ==
tolower(items[(scroll + i) * 2 + 1]
[j]))
break;
}
}
if (i < max_choice ||
key == KEY_UP || key == KEY_DOWN ||
key == '-' || key == '+' ||
key == KEY_PPAGE || key == KEY_NPAGE) {
print_item(menu, items[(scroll + choice) * 2 + 1],
choice, FALSE,
(items[(scroll + choice) * 2][0] != ':'));
if (key == KEY_UP || key == '-') {
if (choice < 2 && scroll) {
/* Scroll menu down */
scrollok(menu, TRUE);
wscrl(menu, -1);
scrollok(menu, FALSE);
scroll--;
print_item(menu, items[scroll * 2 + 1],
0, FALSE,
(items[scroll * 2][0] !=
':'));
} else
choice = MAX(choice - 1, 0);
} else if (key == KEY_DOWN || key == '+') {
print_item(menu,
items[(scroll + choice) * 2 + 1],
choice, FALSE,
(items[(scroll + choice) * 2][0] !=
':'));
if ((choice > max_choice - 3) &&
(scroll + max_choice < item_no)
) {
/* Scroll menu up */
scrollok(menu, TRUE);
wscrl(menu, 1);
scrollok(menu, FALSE);
scroll++;
print_item(menu,
items[(scroll + max_choice -
1) * 2 + 1],
max_choice - 1, FALSE,
(items
[(scroll + max_choice -
1) * 2][0] != ':'));
} else
choice =
MIN(choice + 1, max_choice - 1);
} else if (key == KEY_PPAGE) {
scrollok(menu, TRUE);
for (i = 0; (i < max_choice); i++) {
if (scroll > 0) {
wscrl(menu, -1);
scroll--;
print_item(menu,
items[scroll * 2 +
1], 0, FALSE,
(items[scroll * 2][0]
!= ':'));
} else {
if (choice > 0)
choice--;
}
}
scrollok(menu, FALSE);
} else if (key == KEY_NPAGE) {
for (i = 0; (i < max_choice); i++) {
if (scroll + max_choice < item_no) {
scrollok(menu, TRUE);
wscrl(menu, 1);
scrollok(menu, FALSE);
scroll++;
print_item(menu,
items[(scroll +
max_choice -
1) * 2 + 1],
max_choice - 1,
FALSE,
(items
[(scroll +
max_choice -
1) * 2][0] !=
':'));
} else {
if (choice + 1 < max_choice)
choice++;
}
}
} else
choice = i;
print_item(menu, items[(scroll + choice) * 2 + 1],
choice, TRUE,
(items[(scroll + choice) * 2][0] != ':'));
print_arrows(dialog, item_no, scroll,
box_y, box_x + item_x + 1, menu_height);
wnoutrefresh(dialog);
wrefresh(menu);
continue; /* wait for another key press */
}
switch (key) {
case KEY_LEFT:
case TAB:
case KEY_RIGHT:
button = ((key == KEY_LEFT ? --button : ++button) < 0)
? 2 : (button > 2 ? 0 : button);
print_buttons(dialog, height, width, button);
wrefresh(menu);
break;
case ' ':
case 's':
case 'y':
case 'n':
case 'm':
case '/':
/* save scroll info */
if ((f = fopen("lxdialog.scrltmp", "w")) != NULL) {
fprintf(f, "%d\n", scroll);
fclose(f);
}
delwin(dialog);
fprintf(stderr, "%s\n", items[(scroll + choice) * 2]);
switch (key) {
case 's':
return 3;
case 'y':
return 3;
case 'n':
return 4;
case 'm':
return 5;
case ' ':
return 6;
case '/':
return 7;
}
return 0;
case 'h':
case '?':
button = 2;
case '\n':
delwin(dialog);
if (button == 2)
fprintf(stderr, "%s \"%s\"\n",
items[(scroll + choice) * 2],
items[(scroll + choice) * 2 + 1] +
first_alpha(items
[(scroll + choice) * 2 + 1],
""));
else
fprintf(stderr, "%s\n",
items[(scroll + choice) * 2]);
remove("lxdialog.scrltmp");
return button;
case 'e':
case 'x':
key = ESC;
case ESC:
break;
} }
} }
if (i < max_choice || delwin(dialog);
key == KEY_UP || key == KEY_DOWN || remove("lxdialog.scrltmp");
key == '-' || key == '+' || return -1; /* ESC pressed */
key == KEY_PPAGE || key == KEY_NPAGE) {
print_item (menu, items[(scroll+choice)*2+1], choice, FALSE,
(items[(scroll+choice)*2][0] != ':'));
if (key == KEY_UP || key == '-') {
if (choice < 2 && scroll) {
/* Scroll menu down */
scrollok (menu, TRUE);
wscrl (menu, -1);
scrollok (menu, FALSE);
scroll--;
print_item (menu, items[scroll * 2 + 1], 0, FALSE,
(items[scroll*2][0] != ':'));
} else
choice = MAX(choice - 1, 0);
} else if (key == KEY_DOWN || key == '+') {
print_item (menu, items[(scroll+choice)*2+1], choice, FALSE,
(items[(scroll+choice)*2][0] != ':'));
if ((choice > max_choice-3) &&
(scroll + max_choice < item_no)
) {
/* Scroll menu up */
scrollok (menu, TRUE);
wscrl (menu, 1);
scrollok (menu, FALSE);
scroll++;
print_item (menu, items[(scroll+max_choice-1)*2+1],
max_choice-1, FALSE,
(items[(scroll+max_choice-1)*2][0] != ':'));
} else
choice = MIN(choice+1, max_choice-1);
} else if (key == KEY_PPAGE) {
scrollok (menu, TRUE);
for (i=0; (i < max_choice); i++) {
if (scroll > 0) {
wscrl (menu, -1);
scroll--;
print_item (menu, items[scroll * 2 + 1], 0, FALSE,
(items[scroll*2][0] != ':'));
} else {
if (choice > 0)
choice--;
}
}
scrollok (menu, FALSE);
} else if (key == KEY_NPAGE) {
for (i=0; (i < max_choice); i++) {
if (scroll+max_choice < item_no) {
scrollok (menu, TRUE);
wscrl (menu, 1);
scrollok (menu, FALSE);
scroll++;
print_item (menu, items[(scroll+max_choice-1)*2+1],
max_choice-1, FALSE,
(items[(scroll+max_choice-1)*2][0] != ':'));
} else {
if (choice+1 < max_choice)
choice++;
}
}
} else
choice = i;
print_item (menu, items[(scroll+choice)*2+1], choice, TRUE,
(items[(scroll+choice)*2][0] != ':'));
print_arrows(dialog, item_no, scroll,
box_y, box_x+item_x+1, menu_height);
wnoutrefresh (dialog);
wrefresh (menu);
continue; /* wait for another key press */
}
switch (key) {
case KEY_LEFT:
case TAB:
case KEY_RIGHT:
button = ((key == KEY_LEFT ? --button : ++button) < 0)
? 2 : (button > 2 ? 0 : button);
print_buttons(dialog, height, width, button);
wrefresh (menu);
break;
case ' ':
case 's':
case 'y':
case 'n':
case 'm':
case '/':
/* save scroll info */
if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) {
fprintf(f,"%d\n",scroll);
fclose(f);
}
delwin (dialog);
fprintf(stderr, "%s\n", items[(scroll + choice) * 2]);
switch (key) {
case 's': return 3;
case 'y': return 3;
case 'n': return 4;
case 'm': return 5;
case ' ': return 6;
case '/': return 7;
}
return 0;
case 'h':
case '?':
button = 2;
case '\n':
delwin (dialog);
if (button == 2)
fprintf(stderr, "%s \"%s\"\n",
items[(scroll + choice) * 2],
items[(scroll + choice) * 2 + 1] +
first_alpha(items[(scroll + choice) * 2 + 1],""));
else
fprintf(stderr, "%s\n", items[(scroll + choice) * 2]);
remove("lxdialog.scrltmp");
return button;
case 'e':
case 'x':
key = ESC;
case ESC:
break;
}
}
delwin (dialog);
remove("lxdialog.scrltmp");
return -1; /* ESC pressed */
} }

View File

@ -26,60 +26,59 @@
* if the parameter 'pause' is non-zero. * if the parameter 'pause' is non-zero.
*/ */
int int
dialog_msgbox (const char *title, const char *prompt, int height, int width, dialog_msgbox(const char *title, const char *prompt, int height, int width,
int pause) int pause)
{ {
int i, x, y, key = 0; int i, x, y, key = 0;
WINDOW *dialog; WINDOW *dialog;
/* center dialog box on screen */ /* center dialog box on screen */
x = (COLS - width) / 2; x = (COLS - width) / 2;
y = (LINES - height) / 2; y = (LINES - height) / 2;
draw_shadow (stdscr, y, x, height, width); draw_shadow(stdscr, y, x, height, width);
dialog = newwin (height, width, y, x); dialog = newwin(height, width, y, x);
keypad (dialog, TRUE); keypad(dialog, TRUE);
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
if (title != NULL && strlen(title) >= width-2 ) { if (title != NULL && strlen(title) >= width - 2) {
/* truncate long title -- mec */ /* truncate long title -- mec */
char * title2 = malloc(width-2+1); char *title2 = malloc(width - 2 + 1);
memcpy( title2, title, width-2 ); memcpy(title2, title, width - 2);
title2[width-2] = '\0'; title2[width - 2] = '\0';
title = title2; title = title2;
} }
if (title != NULL) { if (title != NULL) {
wattrset (dialog, title_attr); wattrset(dialog, title_attr);
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); mvwaddch(dialog, 0, (width - strlen(title)) / 2 - 1, ' ');
waddstr (dialog, (char *)title); waddstr(dialog, (char *)title);
waddch (dialog, ' '); waddch(dialog, ' ');
} }
wattrset (dialog, dialog_attr); wattrset(dialog, dialog_attr);
print_autowrap (dialog, prompt, width - 2, 1, 2); print_autowrap(dialog, prompt, width - 2, 1, 2);
if (pause) { if (pause) {
wattrset (dialog, border_attr); wattrset(dialog, border_attr);
mvwaddch (dialog, height - 3, 0, ACS_LTEE); mvwaddch(dialog, height - 3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch (dialog, ACS_HLINE); waddch(dialog, ACS_HLINE);
wattrset (dialog, dialog_attr); wattrset(dialog, dialog_attr);
waddch (dialog, ACS_RTEE); waddch(dialog, ACS_RTEE);
print_button (dialog, " Ok ", print_button(dialog, " Ok ", height - 2, width / 2 - 4, TRUE);
height - 2, width / 2 - 4, TRUE);
wrefresh (dialog); wrefresh(dialog);
while (key != ESC && key != '\n' && key != ' ' && while (key != ESC && key != '\n' && key != ' ' &&
key != 'O' && key != 'o' && key != 'X' && key != 'x') key != 'O' && key != 'o' && key != 'X' && key != 'x')
key = wgetch (dialog); key = wgetch(dialog);
} else { } else {
key = '\n'; key = '\n';
wrefresh (dialog); wrefresh(dialog);
} }
delwin (dialog); delwin(dialog);
return key == ESC ? -1 : 0; return key == ESC ? -1 : 0;
} }

File diff suppressed because it is too large Load Diff

View File

@ -21,7 +21,6 @@
#include "dialog.h" #include "dialog.h"
/* use colors by default? */ /* use colors by default? */
bool use_colors = 1; bool use_colors = 1;
@ -32,326 +31,318 @@ const char *dialog_result;
/* /*
* Attribute values, default is for mono display * Attribute values, default is for mono display
*/ */
chtype attributes[] = chtype attributes[] = {
{ A_NORMAL, /* screen_attr */
A_NORMAL, /* screen_attr */ A_NORMAL, /* shadow_attr */
A_NORMAL, /* shadow_attr */ A_NORMAL, /* dialog_attr */
A_NORMAL, /* dialog_attr */ A_BOLD, /* title_attr */
A_BOLD, /* title_attr */ A_NORMAL, /* border_attr */
A_NORMAL, /* border_attr */ A_REVERSE, /* button_active_attr */
A_REVERSE, /* button_active_attr */ A_DIM, /* button_inactive_attr */
A_DIM, /* button_inactive_attr */ A_REVERSE, /* button_key_active_attr */
A_REVERSE, /* button_key_active_attr */ A_BOLD, /* button_key_inactive_attr */
A_BOLD, /* button_key_inactive_attr */ A_REVERSE, /* button_label_active_attr */
A_REVERSE, /* button_label_active_attr */ A_NORMAL, /* button_label_inactive_attr */
A_NORMAL, /* button_label_inactive_attr */ A_NORMAL, /* inputbox_attr */
A_NORMAL, /* inputbox_attr */ A_NORMAL, /* inputbox_border_attr */
A_NORMAL, /* inputbox_border_attr */ A_NORMAL, /* searchbox_attr */
A_NORMAL, /* searchbox_attr */ A_BOLD, /* searchbox_title_attr */
A_BOLD, /* searchbox_title_attr */ A_NORMAL, /* searchbox_border_attr */
A_NORMAL, /* searchbox_border_attr */ A_BOLD, /* position_indicator_attr */
A_BOLD, /* position_indicator_attr */ A_NORMAL, /* menubox_attr */
A_NORMAL, /* menubox_attr */ A_NORMAL, /* menubox_border_attr */
A_NORMAL, /* menubox_border_attr */ A_NORMAL, /* item_attr */
A_NORMAL, /* item_attr */ A_REVERSE, /* item_selected_attr */
A_REVERSE, /* item_selected_attr */ A_BOLD, /* tag_attr */
A_BOLD, /* tag_attr */ A_REVERSE, /* tag_selected_attr */
A_REVERSE, /* tag_selected_attr */ A_BOLD, /* tag_key_attr */
A_BOLD, /* tag_key_attr */ A_REVERSE, /* tag_key_selected_attr */
A_REVERSE, /* tag_key_selected_attr */ A_BOLD, /* check_attr */
A_BOLD, /* check_attr */ A_REVERSE, /* check_selected_attr */
A_REVERSE, /* check_selected_attr */ A_BOLD, /* uarrow_attr */
A_BOLD, /* uarrow_attr */ A_BOLD /* darrow_attr */
A_BOLD /* darrow_attr */
}; };
#include "colors.h" #include "colors.h"
/* /*
* Table of color values * Table of color values
*/ */
int color_table[][3] = int color_table[][3] = {
{ {SCREEN_FG, SCREEN_BG, SCREEN_HL},
{SCREEN_FG, SCREEN_BG, SCREEN_HL}, {SHADOW_FG, SHADOW_BG, SHADOW_HL},
{SHADOW_FG, SHADOW_BG, SHADOW_HL}, {DIALOG_FG, DIALOG_BG, DIALOG_HL},
{DIALOG_FG, DIALOG_BG, DIALOG_HL}, {TITLE_FG, TITLE_BG, TITLE_HL},
{TITLE_FG, TITLE_BG, TITLE_HL}, {BORDER_FG, BORDER_BG, BORDER_HL},
{BORDER_FG, BORDER_BG, BORDER_HL}, {BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL},
{BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL}, {BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL},
{BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL}, {BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL},
{BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL}, {BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG,
{BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL}, BUTTON_KEY_INACTIVE_HL},
{BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL}, {BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG,
{BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG, BUTTON_LABEL_ACTIVE_HL},
BUTTON_LABEL_INACTIVE_HL}, {BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG,
{INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL}, BUTTON_LABEL_INACTIVE_HL},
{INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL}, {INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL},
{SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL}, {INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL},
{SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL}, {SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL},
{SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL}, {SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL},
{POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL}, {SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL},
{MENUBOX_FG, MENUBOX_BG, MENUBOX_HL}, {POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL},
{MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL}, {MENUBOX_FG, MENUBOX_BG, MENUBOX_HL},
{ITEM_FG, ITEM_BG, ITEM_HL}, {MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL},
{ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL}, {ITEM_FG, ITEM_BG, ITEM_HL},
{TAG_FG, TAG_BG, TAG_HL}, {ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL},
{TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL}, {TAG_FG, TAG_BG, TAG_HL},
{TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL}, {TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL},
{TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL}, {TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL},
{CHECK_FG, CHECK_BG, CHECK_HL}, {TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL},
{CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL}, {CHECK_FG, CHECK_BG, CHECK_HL},
{UARROW_FG, UARROW_BG, UARROW_HL}, {CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
{DARROW_FG, DARROW_BG, DARROW_HL}, {UARROW_FG, UARROW_BG, UARROW_HL},
{DARROW_FG, DARROW_BG, DARROW_HL},
}; /* color_table */ }; /* color_table */
/* /*
* Set window to attribute 'attr' * Set window to attribute 'attr'
*/ */
void void attr_clear(WINDOW * win, int height, int width, chtype attr)
attr_clear (WINDOW * win, int height, int width, chtype attr)
{ {
int i, j; int i, j;
wattrset (win, attr); wattrset(win, attr);
for (i = 0; i < height; i++) { for (i = 0; i < height; i++) {
wmove (win, i, 0); wmove(win, i, 0);
for (j = 0; j < width; j++) for (j = 0; j < width; j++)
waddch (win, ' '); waddch(win, ' ');
} }
touchwin (win); touchwin(win);
} }
void dialog_clear (void) void dialog_clear(void)
{ {
attr_clear (stdscr, LINES, COLS, screen_attr); attr_clear(stdscr, LINES, COLS, screen_attr);
/* Display background title if it exists ... - SLH */ /* Display background title if it exists ... - SLH */
if (backtitle != NULL) { if (backtitle != NULL) {
int i; int i;
wattrset (stdscr, screen_attr); wattrset(stdscr, screen_attr);
mvwaddstr (stdscr, 0, 1, (char *)backtitle); mvwaddstr(stdscr, 0, 1, (char *)backtitle);
wmove (stdscr, 1, 1); wmove(stdscr, 1, 1);
for (i = 1; i < COLS - 1; i++) for (i = 1; i < COLS - 1; i++)
waddch (stdscr, ACS_HLINE); waddch(stdscr, ACS_HLINE);
} }
wnoutrefresh (stdscr); wnoutrefresh(stdscr);
} }
/* /*
* Do some initialization for dialog * Do some initialization for dialog
*/ */
void void init_dialog(void)
init_dialog (void)
{ {
initscr (); /* Init curses */ initscr(); /* Init curses */
keypad (stdscr, TRUE); keypad(stdscr, TRUE);
cbreak (); cbreak();
noecho (); noecho();
if (use_colors) /* Set up colors */
color_setup();
if (use_colors) /* Set up colors */ dialog_clear();
color_setup ();
dialog_clear ();
} }
/* /*
* Setup for color display * Setup for color display
*/ */
void void color_setup(void)
color_setup (void)
{ {
int i; int i;
if (has_colors ()) { /* Terminal supports color? */ if (has_colors()) { /* Terminal supports color? */
start_color (); start_color();
/* Initialize color pairs */ /* Initialize color pairs */
for (i = 0; i < ATTRIBUTE_COUNT; i++) for (i = 0; i < ATTRIBUTE_COUNT; i++)
init_pair (i + 1, color_table[i][0], color_table[i][1]); init_pair(i + 1, color_table[i][0], color_table[i][1]);
/* Setup color attributes */ /* Setup color attributes */
for (i = 0; i < ATTRIBUTE_COUNT; i++) for (i = 0; i < ATTRIBUTE_COUNT; i++)
attributes[i] = C_ATTR (color_table[i][2], i + 1); attributes[i] = C_ATTR(color_table[i][2], i + 1);
} }
} }
/* /*
* End using dialog functions. * End using dialog functions.
*/ */
void void end_dialog(void)
end_dialog (void)
{ {
endwin (); endwin();
} }
/* /*
* Print a string of text in a window, automatically wrap around to the * Print a string of text in a window, automatically wrap around to the
* next line if the string is too long to fit on one line. Newline * next line if the string is too long to fit on one line. Newline
* characters '\n' are replaced by spaces. We start on a new line * characters '\n' are replaced by spaces. We start on a new line
* if there is no room for at least 4 nonblanks following a double-space. * if there is no room for at least 4 nonblanks following a double-space.
*/ */
void void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x)
print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x)
{ {
int newl, cur_x, cur_y; int newl, cur_x, cur_y;
int i, prompt_len, room, wlen; int i, prompt_len, room, wlen;
char tempstr[MAX_LEN + 1], *word, *sp, *sp2; char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
strcpy (tempstr, prompt); strcpy(tempstr, prompt);
prompt_len = strlen(tempstr); prompt_len = strlen(tempstr);
/*
* Remove newlines
*/
for(i=0; i<prompt_len; i++) {
if(tempstr[i] == '\n') tempstr[i] = ' ';
}
if (prompt_len <= width - x * 2) { /* If prompt is short */ /*
wmove (win, y, (width - prompt_len) / 2); * Remove newlines
waddstr (win, tempstr); */
} else { for (i = 0; i < prompt_len; i++) {
cur_x = x; if (tempstr[i] == '\n')
cur_y = y; tempstr[i] = ' ';
newl = 1; }
word = tempstr;
while (word && *word) { if (prompt_len <= width - x * 2) { /* If prompt is short */
sp = index(word, ' '); wmove(win, y, (width - prompt_len) / 2);
if (sp) waddstr(win, tempstr);
*sp++ = 0; } else {
cur_x = x;
/* Wrap to next line if either the word does not fit, cur_y = y;
or it is the first word of a new sentence, and it is newl = 1;
short, and the next word does not fit. */ word = tempstr;
room = width - cur_x; while (word && *word) {
wlen = strlen(word); sp = index(word, ' ');
if (wlen > room || if (sp)
(newl && wlen < 4 && sp && wlen+1+strlen(sp) > room *sp++ = 0;
&& (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) {
cur_y++; /* Wrap to next line if either the word does not fit,
cur_x = x; or it is the first word of a new sentence, and it is
} short, and the next word does not fit. */
wmove (win, cur_y, cur_x); room = width - cur_x;
waddstr (win, word); wlen = strlen(word);
getyx (win, cur_y, cur_x); if (wlen > room ||
cur_x++; (newl && wlen < 4 && sp
if (sp && *sp == ' ') { && wlen + 1 + strlen(sp) > room
cur_x++; /* double space */ && (!(sp2 = index(sp, ' '))
while (*++sp == ' '); || wlen + 1 + (sp2 - sp) > room))) {
newl = 1; cur_y++;
} else cur_x = x;
newl = 0; }
word = sp; wmove(win, cur_y, cur_x);
waddstr(win, word);
getyx(win, cur_y, cur_x);
cur_x++;
if (sp && *sp == ' ') {
cur_x++; /* double space */
while (*++sp == ' ') ;
newl = 1;
} else
newl = 0;
word = sp;
}
} }
}
} }
/* /*
* Print a button * Print a button
*/ */
void void print_button(WINDOW * win, const char *label, int y, int x, int selected)
print_button (WINDOW * win, const char *label, int y, int x, int selected)
{ {
int i, temp; int i, temp;
wmove (win, y, x); wmove(win, y, x);
wattrset (win, selected ? button_active_attr : button_inactive_attr); wattrset(win, selected ? button_active_attr : button_inactive_attr);
waddstr (win, "<"); waddstr(win, "<");
temp = strspn (label, " "); temp = strspn(label, " ");
label += temp; label += temp;
wattrset (win, selected ? button_label_active_attr wattrset(win, selected ? button_label_active_attr
: button_label_inactive_attr); : button_label_inactive_attr);
for (i = 0; i < temp; i++) for (i = 0; i < temp; i++)
waddch (win, ' '); waddch(win, ' ');
wattrset (win, selected ? button_key_active_attr wattrset(win, selected ? button_key_active_attr
: button_key_inactive_attr); : button_key_inactive_attr);
waddch (win, label[0]); waddch(win, label[0]);
wattrset (win, selected ? button_label_active_attr wattrset(win, selected ? button_label_active_attr
: button_label_inactive_attr); : button_label_inactive_attr);
waddstr (win, (char *)label + 1); waddstr(win, (char *)label + 1);
wattrset (win, selected ? button_active_attr : button_inactive_attr); wattrset(win, selected ? button_active_attr : button_inactive_attr);
waddstr (win, ">"); waddstr(win, ">");
wmove (win, y, x + temp + 1); wmove(win, y, x + temp + 1);
} }
/* /*
* Draw a rectangular box with line drawing characters * Draw a rectangular box with line drawing characters
*/ */
void void
draw_box (WINDOW * win, int y, int x, int height, int width, draw_box(WINDOW * win, int y, int x, int height, int width,
chtype box, chtype border) chtype box, chtype border)
{ {
int i, j; int i, j;
wattrset (win, 0); wattrset(win, 0);
for (i = 0; i < height; i++) { for (i = 0; i < height; i++) {
wmove (win, y + i, x); wmove(win, y + i, x);
for (j = 0; j < width; j++) for (j = 0; j < width; j++)
if (!i && !j) if (!i && !j)
waddch (win, border | ACS_ULCORNER); waddch(win, border | ACS_ULCORNER);
else if (i == height - 1 && !j) else if (i == height - 1 && !j)
waddch (win, border | ACS_LLCORNER); waddch(win, border | ACS_LLCORNER);
else if (!i && j == width - 1) else if (!i && j == width - 1)
waddch (win, box | ACS_URCORNER); waddch(win, box | ACS_URCORNER);
else if (i == height - 1 && j == width - 1) else if (i == height - 1 && j == width - 1)
waddch (win, box | ACS_LRCORNER); waddch(win, box | ACS_LRCORNER);
else if (!i) else if (!i)
waddch (win, border | ACS_HLINE); waddch(win, border | ACS_HLINE);
else if (i == height - 1) else if (i == height - 1)
waddch (win, box | ACS_HLINE); waddch(win, box | ACS_HLINE);
else if (!j) else if (!j)
waddch (win, border | ACS_VLINE); waddch(win, border | ACS_VLINE);
else if (j == width - 1) else if (j == width - 1)
waddch (win, box | ACS_VLINE); waddch(win, box | ACS_VLINE);
else else
waddch (win, box | ' '); waddch(win, box | ' ');
} }
} }
/* /*
* Draw shadows along the right and bottom edge to give a more 3D look * Draw shadows along the right and bottom edge to give a more 3D look
* to the boxes * to the boxes
*/ */
void void draw_shadow(WINDOW * win, int y, int x, int height, int width)
draw_shadow (WINDOW * win, int y, int x, int height, int width)
{ {
int i; int i;
if (has_colors ()) { /* Whether terminal supports color? */ if (has_colors()) { /* Whether terminal supports color? */
wattrset (win, shadow_attr); wattrset(win, shadow_attr);
wmove (win, y + height, x + 2); wmove(win, y + height, x + 2);
for (i = 0; i < width; i++) for (i = 0; i < width; i++)
waddch (win, winch (win) & A_CHARTEXT); waddch(win, winch(win) & A_CHARTEXT);
for (i = y + 1; i < y + height + 1; i++) { for (i = y + 1; i < y + height + 1; i++) {
wmove (win, i, x + width); wmove(win, i, x + width);
waddch (win, winch (win) & A_CHARTEXT); waddch(win, winch(win) & A_CHARTEXT);
waddch (win, winch (win) & A_CHARTEXT); waddch(win, winch(win) & A_CHARTEXT);
}
wnoutrefresh(win);
} }
wnoutrefresh (win);
}
} }
/* /*
* Return the position of the first alphabetic character in a string. * Return the position of the first alphabetic character in a string.
*/ */
int int first_alpha(const char *string, const char *exempt)
first_alpha(const char *string, const char *exempt)
{ {
int i, in_paren=0, c; int i, in_paren = 0, c;
for (i = 0; i < strlen(string); i++) { for (i = 0; i < strlen(string); i++) {
c = tolower(string[i]); c = tolower(string[i]);
if (strchr("<[(", c)) ++in_paren; if (strchr("<[(", c))
if (strchr(">])", c) && in_paren > 0) --in_paren; ++in_paren;
if (strchr(">])", c) && in_paren > 0)
--in_paren;
if ((! in_paren) && isalpha(c) && if ((!in_paren) && isalpha(c) && strchr(exempt, c) == 0)
strchr(exempt, c) == 0)
return i; return i;
} }

View File

@ -24,95 +24,93 @@
/* /*
* Display termination buttons * Display termination buttons
*/ */
static void static void print_buttons(WINDOW * dialog, int height, int width, int selected)
print_buttons(WINDOW *dialog, int height, int width, int selected)
{ {
int x = width / 2 - 10; int x = width / 2 - 10;
int y = height - 2; int y = height - 2;
print_button (dialog, " Yes ", y, x, selected == 0); print_button(dialog, " Yes ", y, x, selected == 0);
print_button (dialog, " No ", y, x + 13, selected == 1); print_button(dialog, " No ", y, x + 13, selected == 1);
wmove(dialog, y, x+1 + 13*selected ); wmove(dialog, y, x + 1 + 13 * selected);
wrefresh (dialog); wrefresh(dialog);
} }
/* /*
* Display a dialog box with two buttons - Yes and No * Display a dialog box with two buttons - Yes and No
*/ */
int int dialog_yesno(const char *title, const char *prompt, int height, int width)
dialog_yesno (const char *title, const char *prompt, int height, int width)
{ {
int i, x, y, key = 0, button = 0; int i, x, y, key = 0, button = 0;
WINDOW *dialog; WINDOW *dialog;
/* center dialog box on screen */ /* center dialog box on screen */
x = (COLS - width) / 2; x = (COLS - width) / 2;
y = (LINES - height) / 2; y = (LINES - height) / 2;
draw_shadow (stdscr, y, x, height, width); draw_shadow(stdscr, y, x, height, width);
dialog = newwin (height, width, y, x); dialog = newwin(height, width, y, x);
keypad (dialog, TRUE); keypad(dialog, TRUE);
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
wattrset (dialog, border_attr); wattrset(dialog, border_attr);
mvwaddch (dialog, height-3, 0, ACS_LTEE); mvwaddch(dialog, height - 3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch (dialog, ACS_HLINE); waddch(dialog, ACS_HLINE);
wattrset (dialog, dialog_attr); wattrset(dialog, dialog_attr);
waddch (dialog, ACS_RTEE); waddch(dialog, ACS_RTEE);
if (title != NULL && strlen(title) >= width-2 ) { if (title != NULL && strlen(title) >= width - 2) {
/* truncate long title -- mec */ /* truncate long title -- mec */
char * title2 = malloc(width-2+1); char *title2 = malloc(width - 2 + 1);
memcpy( title2, title, width-2 ); memcpy(title2, title, width - 2);
title2[width-2] = '\0'; title2[width - 2] = '\0';
title = title2; title = title2;
}
if (title != NULL) {
wattrset (dialog, title_attr);
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
waddstr (dialog, (char *)title);
waddch (dialog, ' ');
}
wattrset (dialog, dialog_attr);
print_autowrap (dialog, prompt, width - 2, 1, 3);
print_buttons(dialog, height, width, 0);
while (key != ESC) {
key = wgetch (dialog);
switch (key) {
case 'Y':
case 'y':
delwin (dialog);
return 0;
case 'N':
case 'n':
delwin (dialog);
return 1;
case TAB:
case KEY_LEFT:
case KEY_RIGHT:
button = ((key == KEY_LEFT ? --button : ++button) < 0)
? 1 : (button > 1 ? 0 : button);
print_buttons(dialog, height, width, button);
wrefresh (dialog);
break;
case ' ':
case '\n':
delwin (dialog);
return button;
case ESC:
break;
} }
}
delwin (dialog); if (title != NULL) {
return -1; /* ESC pressed */ wattrset(dialog, title_attr);
mvwaddch(dialog, 0, (width - strlen(title)) / 2 - 1, ' ');
waddstr(dialog, (char *)title);
waddch(dialog, ' ');
}
wattrset(dialog, dialog_attr);
print_autowrap(dialog, prompt, width - 2, 1, 3);
print_buttons(dialog, height, width, 0);
while (key != ESC) {
key = wgetch(dialog);
switch (key) {
case 'Y':
case 'y':
delwin(dialog);
return 0;
case 'N':
case 'n':
delwin(dialog);
return 1;
case TAB:
case KEY_LEFT:
case KEY_RIGHT:
button = ((key == KEY_LEFT ? --button : ++button) < 0)
? 1 : (button > 1 ? 0 : button);
print_buttons(dialog, height, width, button);
wrefresh(dialog);
break;
case ' ':
case '\n':
delwin(dialog);
return button;
case ESC:
break;
}
}
delwin(dialog);
return -1; /* ESC pressed */
} }