Commit b1c5f1c6 authored by Sam Ravnborg's avatar Sam Ravnborg

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: default avatarSam Ravnborg <sam@ravnborg.org>
parent b286e392
...@@ -29,87 +29,83 @@ static int list_width, check_x, item_x, checkflag; ...@@ -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 {
} wattrset(win, menubox_border_attr);
else { waddch(win, ACS_HLINE);
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);
}
} }
/* /*
* 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) ...@@ -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);
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]);
}
} /* Initializes status */
} for (i = 0; i < item_no; i++) {
} else status[i] = !strcasecmp(items[i * 3 + 2], "on");
fprintf (stderr, "%s", items[(scroll + choice) * 3]); if ((!choice && status[i])
delwin (dialog); || !strcasecmp(items[i * 3 + 2], "selected"))
free (status); choice = i + 1;
return button; }
case 'X': if (choice)
case 'x': choice--;
key = ESC;
case ESC: max_choice = MIN(list_height, item_no);
break;
/* 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);
} }
/* Now, update everything... */ print_arrows(dialog, choice, item_no, scroll,
doupdate (); 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);
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();
}
delwin (dialog); delwin(dialog);
free (status); free(status);
return -1; /* ESC pressed */ return -1; /* ESC pressed */
} }
...@@ -18,7 +18,6 @@ ...@@ -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
* *
......
...@@ -42,7 +42,7 @@ ...@@ -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 @@ ...@@ -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; ...@@ -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 init_dialog (void); void end_dialog(void);
void end_dialog (void); void attr_clear(WINDOW * win, int height, int width, chtype attr);
void attr_clear (WINDOW * win, int height, int width, chtype attr); void dialog_clear(void);
void dialog_clear (void); void color_setup(void);
void color_setup (void); void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x);
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 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,
void draw_box (WINDOW * win, int y, int x, int height, int width, chtype box, chtype border);
chtype border); void draw_shadow(WINDOW * win, int y, int x, int height, int width);
void draw_shadow (WINDOW * win, int y, int x, int height, int width);
int first_alpha(const char *string, const char *exempt);
int first_alpha (const char *string, const char *exempt); int dialog_yesno(const char *title, const char *prompt, int height, int width);
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 dialog_msgbox (const char *title, const char *prompt, int height, int width, int pause);
int width, int pause); int dialog_textbox(const char *title, const char *file, int height, int width);
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 dialog_menu (const char *title, const char *prompt, int height, int width, int menu_height, const char *choice, int item_no,
int menu_height, const char *choice, int item_no, const char *const *items);
const char * const * items); int dialog_checklist(const char *title, const char *prompt, int height,
int dialog_checklist (const char *title, const char *prompt, int height, int width, int list_height, int item_no,
int width, int list_height, int item_no, const char *const *items, int flag);
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, ...@@ -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
......
...@@ -26,215 +26,231 @@ char dialog_input_result[MAX_LEN + 1]; ...@@ -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);
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) {
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, 3);
print_autowrap (dialog, prompt, width - 2, 1, 3);
/* Draw the input field box */
/* Draw the input field box */ box_width = width - 6;
box_width = width - 6; getyx(dialog, y, x);
getyx (dialog, y, x); box_y = y + 2;
box_y = y + 2; box_x = (width - box_width) / 2;
box_x = (width - box_width) / 2; draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2,
draw_box (dialog, y + 1, box_x - 1, 3, box_width + 2, border_attr, dialog_attr);
border_attr, dialog_attr);
print_buttons(dialog, height, width, 0);
print_buttons(dialog, height, width, 0);
/* Set up the initial value */
/* Set up the initial value */ wmove(dialog, box_y, box_x);
wmove (dialog, box_y, box_x); wattrset(dialog, inputbox_attr);
wattrset (dialog, inputbox_attr);
if (!init)
if (!init) instr[0] = '\0';
instr[0] = '\0'; else
else strcpy(instr, init);
strcpy (instr, init);
input_x = strlen(instr);
input_x = strlen (instr);
if (input_x >= box_width) {
if (input_x >= box_width) { scroll = input_x - box_width + 1;
scroll = input_x - box_width + 1; input_x = box_width - 1;
input_x = box_width - 1; for (i = 0; i < box_width - 1; i++)
for (i = 0; i < box_width - 1; i++) waddch(dialog, instr[scroll + i]);
waddch (dialog, instr[scroll + i]); } else
} else waddstr(dialog, instr);
waddstr (dialog, instr);
wmove(dialog, box_y, box_x + input_x);
wmove (dialog, box_y, box_x + input_x);
wrefresh(dialog);
wrefresh (dialog);
while (key != ESC) {
while (key != ESC) { key = wgetch(dialog);
key = wgetch (dialog);
if (button == -1) { /* Input box selected */
if (button == -1) { /* Input box selected */ switch (key) {
switch (key) { case TAB:
case TAB: case KEY_UP:
case KEY_UP: case KEY_DOWN:
case KEY_DOWN: break;
break; case KEY_LEFT:
case KEY_LEFT: continue;
continue; case KEY_RIGHT:
case KEY_RIGHT: continue;
continue; case KEY_BACKSPACE:
case KEY_BACKSPACE: case 127:
case 127: if (input_x || scroll) {
if (input_x || scroll) { wattrset(dialog, inputbox_attr);
wattrset (dialog, inputbox_attr); if (!input_x) {
if (!input_x) { scroll =
scroll = scroll < box_width - 1 ? scroll <
0 : scroll - (box_width - 1); box_width - 1 ? 0 : scroll -
wmove (dialog, box_y, box_x); (box_width - 1);
for (i = 0; i < box_width; i++) wmove(dialog, box_y, box_x);
waddch (dialog, instr[scroll + input_x + i] ? for (i = 0; i < box_width; i++)
instr[scroll + input_x + i] : ' '); waddch(dialog,
input_x = strlen (instr) - scroll; instr[scroll +
} else input_x +
input_x--; i] ?
instr[scroll + input_x] = '\0'; instr[scroll +
mvwaddch (dialog, box_y, input_x + box_x, ' '); input_x +
wmove (dialog, box_y, input_x + box_x); i] : ' ');
wrefresh (dialog); input_x =
strlen(instr) - scroll;
} else
input_x--;
instr[scroll + input_x] = '\0';
mvwaddch(dialog, box_y, input_x + box_x,
' ');
wmove(dialog, box_y, input_x + box_x);
wrefresh(dialog);
}
continue;
default:
if (key < 0x100 && isprint(key)) {
if (scroll + input_x < MAX_LEN) {
wattrset(dialog, inputbox_attr);
instr[scroll + input_x] = key;
instr[scroll + input_x + 1] =
'\0';
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;
}
}
} }
continue; switch (key) {
default: case 'O':
if (key < 0x100 && isprint (key)) { case 'o':
if (scroll + input_x < MAX_LEN) { delwin(dialog);
wattrset (dialog, inputbox_attr); return 0;
instr[scroll + input_x] = key; case 'H':
instr[scroll + input_x + 1] = '\0'; case 'h':
if (input_x == box_width - 1) { delwin(dialog);
scroll++; return 1;
wmove (dialog, box_y, box_x); case KEY_UP:
for (i = 0; i < box_width - 1; i++) case KEY_LEFT:
waddch (dialog, instr[scroll + i]); switch (button) {
} else { case -1:
wmove (dialog, box_y, input_x++ + box_x); button = 1; /* Indicates "Cancel" button is selected */
waddch (dialog, key); 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;
} }
wrefresh (dialog); break;
} else case TAB:
flash (); /* Alarm user about overflow */ case KEY_DOWN:
continue; 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 */
} }
...@@ -21,30 +21,29 @@ ...@@ -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; ...@@ -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);
init_dialog ();
retval = (*(modePtr->jumper)) (title, argc - offset, argv + offset); if (opt_clear) { /* clear screen before exit */
attr_clear(stdscr, LINES, COLS, screen_attr);
if (opt_clear) { /* clear screen before exit */ refresh();
attr_clear (stdscr, LINES, COLS, screen_attr); }
refresh (); end_dialog();
}
end_dialog(); exit(retval);
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) ...@@ -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);
} }
...@@ -64,382 +64,420 @@ static int menu_width, item_x; ...@@ -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 {
} wattrset(win, menubox_border_attr);
else { waddch(win, ACS_HLINE);
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);
} 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 */
x = (COLS - width) / 2; /* center dialog box on screen */
y = (LINES - height) / 2; x = (COLS - width) / 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);
keypad(dialog, TRUE);
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
wattrset (dialog, border_attr); draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
mvwaddch (dialog, height - 3, 0, ACS_LTEE); wattrset(dialog, border_attr);
for (i = 0; i < width - 2; i++) mvwaddch(dialog, height - 3, 0, ACS_LTEE);
waddch (dialog, ACS_HLINE); for (i = 0; i < width - 2; i++)
wattrset (dialog, dialog_attr); waddch(dialog, ACS_HLINE);
wbkgdset (dialog, dialog_attr & A_COLOR); wattrset(dialog, dialog_attr);
waddch (dialog, ACS_RTEE); wbkgdset(dialog, dialog_attr & A_COLOR);
waddch(dialog, ACS_RTEE);
if (title != NULL && strlen(title) >= width-2 ) {
/* truncate long title -- mec */ if (title != NULL && strlen(title) >= width - 2) {
char * title2 = malloc(width-2+1); /* truncate long title -- mec */
memcpy( title2, title, width-2 ); char *title2 = malloc(width - 2 + 1);
title2[width-2] = '\0'; memcpy(title2, title, width - 2);
title = title2; 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);
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 (title != NULL) {
if (choice >= item_no-max_choice/2) wattrset(dialog, title_attr);
scroll = first_item = item_no-max_choice; mvwaddch(dialog, 0, (width - strlen(title)) / 2 - 1, ' ');
else waddstr(dialog, (char *)title);
scroll = first_item = choice - max_choice/2; waddch(dialog, ' ');
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++) { 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;
}
if (i < max_choice || /* Print the menu */
key == KEY_UP || key == KEY_DOWN || for (i = 0; i < max_choice; i++) {
key == '-' || key == '+' || print_item(menu, items[(first_item + i) * 2 + 1], i,
key == KEY_PPAGE || key == KEY_NPAGE) { i == choice,
(items[(first_item + i) * 2][0] != ':'));
print_item (menu, items[(scroll+choice)*2+1], choice, FALSE, }
(items[(scroll+choice)*2][0] != ':'));
wnoutrefresh(menu);
if (key == KEY_UP || key == '-') {
if (choice < 2 && scroll) { print_arrows(dialog, item_no, scroll,
/* Scroll menu down */ box_y, box_x + item_x + 1, menu_height);
scrollok (menu, TRUE);
wscrl (menu, -1); print_buttons(dialog, height, width, 0);
scrollok (menu, FALSE); wmove(menu, choice, item_x + 1);
wrefresh(menu);
scroll--;
while (key != ESC) {
print_item (menu, items[scroll * 2 + 1], 0, FALSE, key = wgetch(menu);
(items[scroll*2][0] != ':'));
} else if (key < 256 && isalpha(key))
choice = MAX(choice - 1, 0); key = tolower(key);
} else if (key == KEY_DOWN || key == '+') { if (strchr("ynmh", key))
i = max_choice;
print_item (menu, items[(scroll+choice)*2+1], choice, FALSE, else {
(items[(scroll+choice)*2][0] != ':')); for (i = choice + 1; i < max_choice; i++) {
j = first_alpha(items[(scroll + i) * 2 + 1],
if ((choice > max_choice-3) && "YyNnMmHh");
(scroll + max_choice < item_no) if (key ==
) { tolower(items[(scroll + i) * 2 + 1][j]))
/* Scroll menu up */ break;
scrollok (menu, TRUE); }
wscrl (menu, 1); if (i == max_choice)
scrollok (menu, FALSE); for (i = 0; i < max_choice; i++) {
j = first_alpha(items
scroll++; [(scroll + i) * 2 + 1],
"YyNnMmHh");
print_item (menu, items[(scroll+max_choice-1)*2+1], if (key ==
max_choice-1, FALSE, tolower(items[(scroll + i) * 2 + 1]
(items[(scroll+max_choice-1)*2][0] != ':')); [j]))
} else break;
choice = MIN(choice+1, max_choice-1); }
}
} else if (key == KEY_PPAGE) {
scrollok (menu, TRUE); if (i < max_choice ||
for (i=0; (i < max_choice); i++) { key == KEY_UP || key == KEY_DOWN ||
if (scroll > 0) { key == '-' || key == '+' ||
wscrl (menu, -1); key == KEY_PPAGE || key == KEY_NPAGE) {
scroll--;
print_item (menu, items[scroll * 2 + 1], 0, FALSE, print_item(menu, items[(scroll + choice) * 2 + 1],
(items[scroll*2][0] != ':')); choice, FALSE,
} else { (items[(scroll + choice) * 2][0] != ':'));
if (choice > 0)
choice--; if (key == KEY_UP || key == '-') {
} if (choice < 2 && scroll) {
} /* Scroll menu down */
scrollok (menu, FALSE); scrollok(menu, TRUE);
wscrl(menu, -1);
} else if (key == KEY_NPAGE) { scrollok(menu, FALSE);
for (i=0; (i < max_choice); i++) {
if (scroll+max_choice < item_no) { scroll--;
scrollok (menu, TRUE);
wscrl (menu, 1); print_item(menu, items[scroll * 2 + 1],
scrollok (menu, FALSE); 0, FALSE,
scroll++; (items[scroll * 2][0] !=
print_item (menu, items[(scroll+max_choice-1)*2+1], ':'));
max_choice-1, FALSE, } else
(items[(scroll+max_choice-1)*2][0] != ':')); choice = MAX(choice - 1, 0);
} else {
if (choice+1 < max_choice) } else if (key == KEY_DOWN || key == '+') {
choice++;
} print_item(menu,
} items[(scroll + choice) * 2 + 1],
choice, FALSE,
} else (items[(scroll + choice) * 2][0] !=
choice = i; ':'));
print_item (menu, items[(scroll+choice)*2+1], choice, TRUE, if ((choice > max_choice - 3) &&
(items[(scroll+choice)*2][0] != ':')); (scroll + max_choice < item_no)
) {
print_arrows(dialog, item_no, scroll, /* Scroll menu up */
box_y, box_x+item_x+1, menu_height); scrollok(menu, TRUE);
wscrl(menu, 1);
wnoutrefresh (dialog); scrollok(menu, FALSE);
wrefresh (menu);
scroll++;
continue; /* wait for another key press */
} print_item(menu,
items[(scroll + max_choice -
switch (key) { 1) * 2 + 1],
case KEY_LEFT: max_choice - 1, FALSE,
case TAB: (items
case KEY_RIGHT: [(scroll + max_choice -
button = ((key == KEY_LEFT ? --button : ++button) < 0) 1) * 2][0] != ':'));
? 2 : (button > 2 ? 0 : button); } else
choice =
print_buttons(dialog, height, width, button); MIN(choice + 1, max_choice - 1);
wrefresh (menu);
break; } else if (key == KEY_PPAGE) {
case ' ': scrollok(menu, TRUE);
case 's': for (i = 0; (i < max_choice); i++) {
case 'y': if (scroll > 0) {
case 'n': wscrl(menu, -1);
case 'm': scroll--;
case '/': print_item(menu,
/* save scroll info */ items[scroll * 2 +
if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) { 1], 0, FALSE,
fprintf(f,"%d\n",scroll); (items[scroll * 2][0]
fclose(f); != ':'));
} } else {
delwin (dialog); if (choice > 0)
fprintf(stderr, "%s\n", items[(scroll + choice) * 2]); choice--;
switch (key) { }
case 's': return 3; }
case 'y': return 3; scrollok(menu, FALSE);
case 'n': return 4;
case 'm': return 5; } else if (key == KEY_NPAGE) {
case ' ': return 6; for (i = 0; (i < max_choice); i++) {
case '/': return 7; if (scroll + max_choice < item_no) {
} scrollok(menu, TRUE);
return 0; wscrl(menu, 1);
case 'h': scrollok(menu, FALSE);
case '?': scroll++;
button = 2; print_item(menu,
case '\n': items[(scroll +
delwin (dialog); max_choice -
if (button == 2) 1) * 2 + 1],
fprintf(stderr, "%s \"%s\"\n", max_choice - 1,
items[(scroll + choice) * 2], FALSE,
items[(scroll + choice) * 2 + 1] + (items
first_alpha(items[(scroll + choice) * 2 + 1],"")); [(scroll +
else max_choice -
fprintf(stderr, "%s\n", items[(scroll + choice) * 2]); 1) * 2][0] !=
':'));
remove("lxdialog.scrltmp"); } else {
return button; if (choice + 1 < max_choice)
case 'e': choice++;
case 'x': }
key = ESC; }
case ESC:
break; } 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); delwin(dialog);
remove("lxdialog.scrltmp"); remove("lxdialog.scrltmp");
return -1; /* ESC pressed */ return -1; /* ESC pressed */
} }
...@@ -26,60 +26,59 @@ ...@@ -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;
} }
...@@ -21,11 +21,11 @@ ...@@ -21,11 +21,11 @@
#include "dialog.h" #include "dialog.h"
static void back_lines (int n); static void back_lines(int n);
static void print_page (WINDOW * win, int height, int width); static void print_page(WINDOW * win, int height, int width);
static void print_line (WINDOW * win, int row, int width); static void print_line(WINDOW * win, int row, int width);
static char *get_line (void); static char *get_line(void);
static void print_position (WINDOW * win, int height, int width); static void print_position(WINDOW * win, int height, int width);
static int hscroll, fd, file_size, bytes_read; static int hscroll, fd, file_size, bytes_read;
static int begin_reached = 1, end_reached, page_length; static int begin_reached = 1, end_reached, page_length;
...@@ -34,450 +34,466 @@ static char *buf, *page; ...@@ -34,450 +34,466 @@ static char *buf, *page;
/* /*
* Display text from a file in a dialog box. * Display text from a file in a dialog box.
*/ */
int int dialog_textbox(const char *title, const char *file, int height, int width)
dialog_textbox (const char *title, const char *file, int height, int width)
{ {
int i, x, y, cur_x, cur_y, fpos, key = 0; int i, x, y, cur_x, cur_y, fpos, key = 0;
int passed_end; int passed_end;
char search_term[MAX_LEN + 1]; char search_term[MAX_LEN + 1];
WINDOW *dialog, *text; WINDOW *dialog, *text;
search_term[0] = '\0'; /* no search term entered yet */ search_term[0] = '\0'; /* no search term entered yet */
/* Open input file for reading */ /* Open input file for reading */
if ((fd = open (file, O_RDONLY)) == -1) { if ((fd = open(file, O_RDONLY)) == -1) {
endwin (); endwin();
fprintf (stderr, fprintf(stderr,
"\nCan't open input file in dialog_textbox().\n"); "\nCan't open input file in dialog_textbox().\n");
exit (-1); exit(-1);
} }
/* Get file size. Actually, 'file_size' is the real file size - 1, /* Get file size. Actually, 'file_size' is the real file size - 1,
since it's only the last byte offset from the beginning */ since it's only the last byte offset from the beginning */
if ((file_size = lseek (fd, 0, SEEK_END)) == -1) { if ((file_size = lseek(fd, 0, SEEK_END)) == -1) {
endwin (); endwin();
fprintf (stderr, "\nError getting file size in dialog_textbox().\n"); fprintf(stderr,
exit (-1); "\nError getting file size in dialog_textbox().\n");
} exit(-1);
/* Restore file pointer to beginning of file after getting file size */ }
if (lseek (fd, 0, SEEK_SET) == -1) { /* Restore file pointer to beginning of file after getting file size */
endwin (); if (lseek(fd, 0, SEEK_SET) == -1) {
fprintf (stderr, "\nError moving file pointer in dialog_textbox().\n"); endwin();
exit (-1); fprintf(stderr,
} "\nError moving file pointer in dialog_textbox().\n");
/* Allocate space for read buffer */ exit(-1);
if ((buf = malloc (BUF_SIZE + 1)) == NULL) { }
endwin (); /* Allocate space for read buffer */
fprintf (stderr, "\nCan't allocate memory in dialog_textbox().\n"); if ((buf = malloc(BUF_SIZE + 1)) == NULL) {
exit (-1); endwin();
} fprintf(stderr,
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { "\nCan't allocate memory in dialog_textbox().\n");
endwin (); exit(-1);
fprintf (stderr, "\nError reading file in dialog_textbox().\n"); }
exit (-1); if ((bytes_read = read(fd, buf, BUF_SIZE)) == -1) {
} endwin();
buf[bytes_read] = '\0'; /* mark end of valid data */ fprintf(stderr, "\nError reading file in dialog_textbox().\n");
page = buf; /* page is pointer to start of page to be displayed */ exit(-1);
}
/* center dialog box on screen */ buf[bytes_read] = '\0'; /* mark end of valid data */
x = (COLS - width) / 2; page = buf; /* page is pointer to start of page to be displayed */
y = (LINES - height) / 2;
/* center dialog box on screen */
x = (COLS - width) / 2;
draw_shadow (stdscr, y, x, height, width); y = (LINES - height) / 2;
dialog = newwin (height, width, y, x); draw_shadow(stdscr, y, x, height, width);
keypad (dialog, TRUE);
dialog = newwin(height, width, y, x);
/* Create window for text region, used for scrolling text */ keypad(dialog, TRUE);
text = subwin (dialog, height - 4, width - 2, y + 1, x + 1);
wattrset (text, dialog_attr); /* Create window for text region, used for scrolling text */
wbkgdset (text, dialog_attr & A_COLOR); text = subwin(dialog, height - 4, width - 2, y + 1, x + 1);
wattrset(text, dialog_attr);
keypad (text, TRUE); wbkgdset(text, dialog_attr & A_COLOR);
/* register the new window, along with its borders */ keypad(text, TRUE);
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
/* register the new window, along with its borders */
wattrset (dialog, border_attr); draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
mvwaddch (dialog, height-3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) wattrset(dialog, border_attr);
waddch (dialog, ACS_HLINE); mvwaddch(dialog, height - 3, 0, ACS_LTEE);
wattrset (dialog, dialog_attr); for (i = 0; i < width - 2; i++)
wbkgdset (dialog, dialog_attr & A_COLOR); waddch(dialog, ACS_HLINE);
waddch (dialog, ACS_RTEE); wattrset(dialog, dialog_attr);
wbkgdset(dialog, dialog_attr & A_COLOR);
if (title != NULL && strlen(title) >= width-2 ) { waddch(dialog, ACS_RTEE);
/* truncate long title -- mec */
char * title2 = malloc(width-2+1); if (title != NULL && strlen(title) >= width - 2) {
memcpy( title2, title, width-2 ); /* truncate long title -- mec */
title2[width-2] = '\0'; char *title2 = malloc(width - 2 + 1);
title = title2; 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, ' ');
}
print_button (dialog, " Exit ", height - 2, width / 2 - 4, TRUE);
wnoutrefresh (dialog);
getyx (dialog, cur_y, cur_x); /* Save cursor position */
/* Print first page of text */
attr_clear (text, height - 4, width - 2, dialog_attr);
print_page (text, height - 4, width - 2);
print_position (dialog, height, width);
wmove (dialog, cur_y, cur_x); /* Restore cursor position */
wrefresh (dialog);
while ((key != ESC) && (key != '\n')) {
key = wgetch (dialog);
switch (key) {
case 'E': /* Exit */
case 'e':
case 'X':
case 'x':
delwin (dialog);
free (buf);
close (fd);
return 0;
case 'g': /* First page */
case KEY_HOME:
if (!begin_reached) {
begin_reached = 1;
/* First page not in buffer? */
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
endwin ();
fprintf (stderr,
"\nError moving file pointer in dialog_textbox().\n");
exit (-1);
}
if (fpos > bytes_read) { /* Yes, we have to read it in */
if (lseek (fd, 0, SEEK_SET) == -1) {
endwin ();
fprintf (stderr, "\nError moving file pointer in "
"dialog_textbox().\n");
exit (-1);
}
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
endwin ();
fprintf (stderr,
"\nError reading file in dialog_textbox().\n");
exit (-1);
}
buf[bytes_read] = '\0';
}
page = buf;
print_page (text, height - 4, width - 2);
print_position (dialog, height, width);
wmove (dialog, cur_y, cur_x); /* Restore cursor position */
wrefresh (dialog);
}
break;
case 'G': /* Last page */
case KEY_END:
end_reached = 1;
/* Last page not in buffer? */
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
endwin ();
fprintf (stderr,
"\nError moving file pointer in dialog_textbox().\n");
exit (-1);
}
if (fpos < file_size) { /* Yes, we have to read it in */
if (lseek (fd, -BUF_SIZE, SEEK_END) == -1) {
endwin ();
fprintf (stderr,
"\nError moving file pointer in dialog_textbox().\n");
exit (-1);
}
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
endwin ();
fprintf (stderr,
"\nError reading file in dialog_textbox().\n");
exit (-1);
}
buf[bytes_read] = '\0';
}
page = buf + bytes_read;
back_lines (height - 4);
print_page (text, height - 4, width - 2);
print_position (dialog, height, width);
wmove (dialog, cur_y, cur_x); /* Restore cursor position */
wrefresh (dialog);
break;
case 'K': /* Previous line */
case 'k':
case KEY_UP:
if (!begin_reached) {
back_lines (page_length + 1);
/* We don't call print_page() here but use scrolling to ensure
faster screen update. However, 'end_reached' and
'page_length' should still be updated, and 'page' should
point to start of next page. This is done by calling
get_line() in the following 'for' loop. */
scrollok (text, TRUE);
wscrl (text, -1); /* Scroll text region down one line */
scrollok (text, FALSE);
page_length = 0;
passed_end = 0;
for (i = 0; i < height - 4; i++) {
if (!i) {
/* print first line of page */
print_line (text, 0, width - 2);
wnoutrefresh (text);
} else
/* Called to update 'end_reached' and 'page' */
get_line ();
if (!passed_end)
page_length++;
if (end_reached && !passed_end)
passed_end = 1;
}
print_position (dialog, height, width); if (title != NULL) {
wmove (dialog, cur_y, cur_x); /* Restore cursor position */ wattrset(dialog, title_attr);
wrefresh (dialog); mvwaddch(dialog, 0, (width - strlen(title)) / 2 - 1, ' ');
} waddstr(dialog, (char *)title);
break; waddch(dialog, ' ');
case 'B': /* Previous page */ }
case 'b': print_button(dialog, " Exit ", height - 2, width / 2 - 4, TRUE);
case KEY_PPAGE: wnoutrefresh(dialog);
if (begin_reached) getyx(dialog, cur_y, cur_x); /* Save cursor position */
break;
back_lines (page_length + height - 4); /* Print first page of text */
print_page (text, height - 4, width - 2); attr_clear(text, height - 4, width - 2, dialog_attr);
print_position (dialog, height, width); print_page(text, height - 4, width - 2);
wmove (dialog, cur_y, cur_x); print_position(dialog, height, width);
wrefresh (dialog); wmove(dialog, cur_y, cur_x); /* Restore cursor position */
break; wrefresh(dialog);
case 'J': /* Next line */
case 'j': while ((key != ESC) && (key != '\n')) {
case KEY_DOWN: key = wgetch(dialog);
if (!end_reached) { switch (key) {
begin_reached = 0; case 'E': /* Exit */
scrollok (text, TRUE); case 'e':
scroll (text); /* Scroll text region up one line */ case 'X':
scrollok (text, FALSE); case 'x':
print_line (text, height - 5, width - 2); delwin(dialog);
wnoutrefresh (text); free(buf);
print_position (dialog, height, width); close(fd);
wmove (dialog, cur_y, cur_x); /* Restore cursor position */ return 0;
wrefresh (dialog); case 'g': /* First page */
} case KEY_HOME:
break; if (!begin_reached) {
case KEY_NPAGE: /* Next page */ begin_reached = 1;
case ' ': /* First page not in buffer? */
if (end_reached) if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
break; endwin();
fprintf(stderr,
begin_reached = 0; "\nError moving file pointer in dialog_textbox().\n");
print_page (text, height - 4, width - 2); exit(-1);
print_position (dialog, height, width); }
wmove (dialog, cur_y, cur_x); if (fpos > bytes_read) { /* Yes, we have to read it in */
wrefresh (dialog); if (lseek(fd, 0, SEEK_SET) == -1) {
break; endwin();
case '0': /* Beginning of line */ fprintf(stderr,
case 'H': /* Scroll left */ "\nError moving file pointer in "
case 'h': "dialog_textbox().\n");
case KEY_LEFT: exit(-1);
if (hscroll <= 0) }
break; if ((bytes_read =
read(fd, buf, BUF_SIZE)) == -1) {
if (key == '0') endwin();
hscroll = 0; fprintf(stderr,
else "\nError reading file in dialog_textbox().\n");
hscroll--; exit(-1);
/* Reprint current page to scroll horizontally */ }
back_lines (page_length); buf[bytes_read] = '\0';
print_page (text, height - 4, width - 2); }
wmove (dialog, cur_y, cur_x); page = buf;
wrefresh (dialog); print_page(text, height - 4, width - 2);
break; print_position(dialog, height, width);
case 'L': /* Scroll right */ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
case 'l': wrefresh(dialog);
case KEY_RIGHT: }
if (hscroll >= MAX_LEN) break;
break; case 'G': /* Last page */
hscroll++; case KEY_END:
/* Reprint current page to scroll horizontally */
back_lines (page_length); end_reached = 1;
print_page (text, height - 4, width - 2); /* Last page not in buffer? */
wmove (dialog, cur_y, cur_x); if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
wrefresh (dialog); endwin();
break; fprintf(stderr,
case ESC: "\nError moving file pointer in dialog_textbox().\n");
break; exit(-1);
}
if (fpos < file_size) { /* Yes, we have to read it in */
if (lseek(fd, -BUF_SIZE, SEEK_END) == -1) {
endwin();
fprintf(stderr,
"\nError moving file pointer in dialog_textbox().\n");
exit(-1);
}
if ((bytes_read =
read(fd, buf, BUF_SIZE)) == -1) {
endwin();
fprintf(stderr,
"\nError reading file in dialog_textbox().\n");
exit(-1);
}
buf[bytes_read] = '\0';
}
page = buf + bytes_read;
back_lines(height - 4);
print_page(text, height - 4, width - 2);
print_position(dialog, height, width);
wmove(dialog, cur_y, cur_x); /* Restore cursor position */
wrefresh(dialog);
break;
case 'K': /* Previous line */
case 'k':
case KEY_UP:
if (!begin_reached) {
back_lines(page_length + 1);
/* We don't call print_page() here but use scrolling to ensure
faster screen update. However, 'end_reached' and
'page_length' should still be updated, and 'page' should
point to start of next page. This is done by calling
get_line() in the following 'for' loop. */
scrollok(text, TRUE);
wscrl(text, -1); /* Scroll text region down one line */
scrollok(text, FALSE);
page_length = 0;
passed_end = 0;
for (i = 0; i < height - 4; i++) {
if (!i) {
/* print first line of page */
print_line(text, 0, width - 2);
wnoutrefresh(text);
} else
/* Called to update 'end_reached' and 'page' */
get_line();
if (!passed_end)
page_length++;
if (end_reached && !passed_end)
passed_end = 1;
}
print_position(dialog, height, width);
wmove(dialog, cur_y, cur_x); /* Restore cursor position */
wrefresh(dialog);
}
break;
case 'B': /* Previous page */
case 'b':
case KEY_PPAGE:
if (begin_reached)
break;
back_lines(page_length + height - 4);
print_page(text, height - 4, width - 2);
print_position(dialog, height, width);
wmove(dialog, cur_y, cur_x);
wrefresh(dialog);
break;
case 'J': /* Next line */
case 'j':
case KEY_DOWN:
if (!end_reached) {
begin_reached = 0;
scrollok(text, TRUE);
scroll(text); /* Scroll text region up one line */
scrollok(text, FALSE);
print_line(text, height - 5, width - 2);
wnoutrefresh(text);
print_position(dialog, height, width);
wmove(dialog, cur_y, cur_x); /* Restore cursor position */
wrefresh(dialog);
}
break;
case KEY_NPAGE: /* Next page */
case ' ':
if (end_reached)
break;
begin_reached = 0;
print_page(text, height - 4, width - 2);
print_position(dialog, height, width);
wmove(dialog, cur_y, cur_x);
wrefresh(dialog);
break;
case '0': /* Beginning of line */
case 'H': /* Scroll left */
case 'h':
case KEY_LEFT:
if (hscroll <= 0)
break;
if (key == '0')
hscroll = 0;
else
hscroll--;
/* Reprint current page to scroll horizontally */
back_lines(page_length);
print_page(text, height - 4, width - 2);
wmove(dialog, cur_y, cur_x);
wrefresh(dialog);
break;
case 'L': /* Scroll right */
case 'l':
case KEY_RIGHT:
if (hscroll >= MAX_LEN)
break;
hscroll++;
/* Reprint current page to scroll horizontally */
back_lines(page_length);
print_page(text, height - 4, width - 2);
wmove(dialog, cur_y, cur_x);
wrefresh(dialog);
break;
case ESC:
break;
}
} }
}
delwin (dialog); delwin(dialog);
free (buf); free(buf);
close (fd); close(fd);
return -1; /* ESC pressed */ return -1; /* ESC pressed */
} }
/* /*
* Go back 'n' lines in text file. Called by dialog_textbox(). * Go back 'n' lines in text file. Called by dialog_textbox().
* 'page' will be updated to point to the desired line in 'buf'. * 'page' will be updated to point to the desired line in 'buf'.
*/ */
static void static void back_lines(int n)
back_lines (int n)
{ {
int i, fpos; int i, fpos;
begin_reached = 0; begin_reached = 0;
/* We have to distinguish between end_reached and !end_reached /* We have to distinguish between end_reached and !end_reached
since at end of file, the line is not ended by a '\n'. since at end of file, the line is not ended by a '\n'.
The code inside 'if' basically does a '--page' to move one The code inside 'if' basically does a '--page' to move one
character backward so as to skip '\n' of the previous line */ character backward so as to skip '\n' of the previous line */
if (!end_reached) { if (!end_reached) {
/* Either beginning of buffer or beginning of file reached? */ /* Either beginning of buffer or beginning of file reached? */
if (page == buf) { if (page == buf) {
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
endwin (); endwin();
fprintf (stderr, "\nError moving file pointer in " fprintf(stderr,
"back_lines().\n"); "\nError moving file pointer in "
exit (-1); "back_lines().\n");
} exit(-1);
if (fpos > bytes_read) { /* Not beginning of file yet */ }
/* We've reached beginning of buffer, but not beginning of if (fpos > bytes_read) { /* Not beginning of file yet */
file yet, so read previous part of file into buffer. /* We've reached beginning of buffer, but not beginning of
Note that we only move backward for BUF_SIZE/2 bytes, file yet, so read previous part of file into buffer.
but not BUF_SIZE bytes to avoid re-reading again in Note that we only move backward for BUF_SIZE/2 bytes,
print_page() later */ but not BUF_SIZE bytes to avoid re-reading again in
/* Really possible to move backward BUF_SIZE/2 bytes? */ print_page() later */
if (fpos < BUF_SIZE / 2 + bytes_read) { /* Really possible to move backward BUF_SIZE/2 bytes? */
/* No, move less then */ if (fpos < BUF_SIZE / 2 + bytes_read) {
if (lseek (fd, 0, SEEK_SET) == -1) { /* No, move less then */
endwin (); if (lseek(fd, 0, SEEK_SET) == -1) {
fprintf (stderr, "\nError moving file pointer in " endwin();
"back_lines().\n"); fprintf(stderr,
exit (-1); "\nError moving file pointer in "
} "back_lines().\n");
page = buf + fpos - bytes_read; exit(-1);
} else { /* Move backward BUF_SIZE/2 bytes */ }
if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR) page = buf + fpos - bytes_read;
== -1) { } else { /* Move backward BUF_SIZE/2 bytes */
endwin (); if (lseek
fprintf (stderr, "\nError moving file pointer " (fd, -(BUF_SIZE / 2 + bytes_read),
"in back_lines().\n"); SEEK_CUR)
exit (-1); == -1) {
} endwin();
page = buf + BUF_SIZE / 2; fprintf(stderr,
"\nError moving file pointer "
"in back_lines().\n");
exit(-1);
}
page = buf + BUF_SIZE / 2;
}
if ((bytes_read =
read(fd, buf, BUF_SIZE)) == -1) {
endwin();
fprintf(stderr,
"\nError reading file in back_lines().\n");
exit(-1);
}
buf[bytes_read] = '\0';
} else { /* Beginning of file reached */
begin_reached = 1;
return;
}
} }
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { if (*(--page) != '\n') { /* '--page' here */
endwin (); /* Something's wrong... */
fprintf (stderr, "\nError reading file in back_lines().\n"); endwin();
exit (-1); fprintf(stderr, "\nInternal error in back_lines().\n");
exit(-1);
} }
buf[bytes_read] = '\0';
} else { /* Beginning of file reached */
begin_reached = 1;
return;
}
}
if (*(--page) != '\n') { /* '--page' here */
/* Something's wrong... */
endwin ();
fprintf (stderr, "\nInternal error in back_lines().\n");
exit (-1);
} }
} /* Go back 'n' lines */
/* Go back 'n' lines */ for (i = 0; i < n; i++)
for (i = 0; i < n; i++) do {
do { if (page == buf) {
if (page == buf) { if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { endwin();
endwin (); fprintf(stderr,
fprintf (stderr, "\nError moving file pointer in back_lines().\n");
"\nError moving file pointer in back_lines().\n"); exit(-1);
exit (-1); }
} if (fpos > bytes_read) {
if (fpos > bytes_read) { /* Really possible to move backward BUF_SIZE/2 bytes? */
/* Really possible to move backward BUF_SIZE/2 bytes? */ if (fpos < BUF_SIZE / 2 + bytes_read) {
if (fpos < BUF_SIZE / 2 + bytes_read) { /* No, move less then */
/* No, move less then */ if (lseek(fd, 0, SEEK_SET) ==
if (lseek (fd, 0, SEEK_SET) == -1) { -1) {
endwin (); endwin();
fprintf (stderr, "\nError moving file pointer " fprintf(stderr,
"in back_lines().\n"); "\nError moving file pointer "
exit (-1); "in back_lines().\n");
} exit(-1);
page = buf + fpos - bytes_read; }
} else { /* Move backward BUF_SIZE/2 bytes */ page = buf + fpos - bytes_read;
if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), } else { /* Move backward BUF_SIZE/2 bytes */
SEEK_CUR) == -1) { if (lseek
endwin (); (fd,
fprintf (stderr, "\nError moving file pointer" -(BUF_SIZE / 2 +
" in back_lines().\n"); bytes_read),
exit (-1); SEEK_CUR) == -1) {
endwin();
fprintf(stderr,
"\nError moving file pointer"
" in back_lines().\n");
exit(-1);
}
page = buf + BUF_SIZE / 2;
}
if ((bytes_read =
read(fd, buf, BUF_SIZE)) == -1) {
endwin();
fprintf(stderr,
"\nError reading file in "
"back_lines().\n");
exit(-1);
}
buf[bytes_read] = '\0';
} else { /* Beginning of file reached */
begin_reached = 1;
return;
}
} }
page = buf + BUF_SIZE / 2; } while (*(--page) != '\n');
} page++;
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
endwin ();
fprintf (stderr, "\nError reading file in "
"back_lines().\n");
exit (-1);
}
buf[bytes_read] = '\0';
} else { /* Beginning of file reached */
begin_reached = 1;
return;
}
}
} while (*(--page) != '\n');
page++;
} }
/* /*
* Print a new page of text. Called by dialog_textbox(). * Print a new page of text. Called by dialog_textbox().
*/ */
static void static void print_page(WINDOW * win, int height, int width)
print_page (WINDOW * win, int height, int width)
{ {
int i, passed_end = 0; int i, passed_end = 0;
page_length = 0; page_length = 0;
for (i = 0; i < height; i++) { for (i = 0; i < height; i++) {
print_line (win, i, width); print_line(win, i, width);
if (!passed_end) if (!passed_end)
page_length++; page_length++;
if (end_reached && !passed_end) if (end_reached && !passed_end)
passed_end = 1; passed_end = 1;
} }
wnoutrefresh (win); wnoutrefresh(win);
} }
/* /*
* Print a new line of text. Called by dialog_textbox() and print_page(). * Print a new line of text. Called by dialog_textbox() and print_page().
*/ */
static void static void print_line(WINDOW * win, int row, int width)
print_line (WINDOW * win, int row, int width)
{ {
int y, x; int y, x;
char *line; char *line;
line = get_line (); line = get_line();
line += MIN (strlen (line), hscroll); /* Scroll horizontally */ line += MIN(strlen(line), hscroll); /* Scroll horizontally */
wmove (win, row, 0); /* move cursor to correct line */ wmove(win, row, 0); /* move cursor to correct line */
waddch (win, ' '); waddch(win, ' ');
waddnstr (win, line, MIN (strlen (line), width - 2)); waddnstr(win, line, MIN(strlen(line), width - 2));
getyx (win, y, x); getyx(win, y, x);
/* Clear 'residue' of previous line */ /* Clear 'residue' of previous line */
#if OLD_NCURSES #if OLD_NCURSES
{ {
int i; int i;
for (i = 0; i < width - x; i++) for (i = 0; i < width - x; i++)
waddch (win, ' '); waddch(win, ' ');
} }
#else #else
wclrtoeol(win); wclrtoeol(win);
#endif #endif
} }
...@@ -486,71 +502,73 @@ print_line (WINDOW * win, int row, int width) ...@@ -486,71 +502,73 @@ print_line (WINDOW * win, int row, int width)
* 'page' should point to start of current line before calling, and will be * 'page' should point to start of current line before calling, and will be
* updated to point to start of next line. * updated to point to start of next line.
*/ */
static char * static char *get_line(void)
get_line (void)
{ {
int i = 0, fpos; int i = 0, fpos;
static char line[MAX_LEN + 1]; static char line[MAX_LEN + 1];
end_reached = 0; end_reached = 0;
while (*page != '\n') { while (*page != '\n') {
if (*page == '\0') { if (*page == '\0') {
/* Either end of file or end of buffer reached */ /* Either end of file or end of buffer reached */
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
endwin (); endwin();
fprintf (stderr, "\nError moving file pointer in " fprintf(stderr,
"get_line().\n"); "\nError moving file pointer in "
exit (-1); "get_line().\n");
} exit(-1);
if (fpos < file_size) { /* Not end of file yet */ }
/* We've reached end of buffer, but not end of file yet, if (fpos < file_size) { /* Not end of file yet */
so read next part of file into buffer */ /* We've reached end of buffer, but not end of file yet,
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { so read next part of file into buffer */
endwin (); if ((bytes_read =
fprintf (stderr, "\nError reading file in get_line().\n"); read(fd, buf, BUF_SIZE)) == -1) {
exit (-1); endwin();
fprintf(stderr,
"\nError reading file in get_line().\n");
exit(-1);
}
buf[bytes_read] = '\0';
page = buf;
} else {
if (!end_reached)
end_reached = 1;
break;
}
} else if (i < MAX_LEN)
line[i++] = *(page++);
else {
/* Truncate lines longer than MAX_LEN characters */
if (i == MAX_LEN)
line[i++] = '\0';
page++;
} }
buf[bytes_read] = '\0';
page = buf;
} else {
if (!end_reached)
end_reached = 1;
break;
}
} else if (i < MAX_LEN)
line[i++] = *(page++);
else {
/* Truncate lines longer than MAX_LEN characters */
if (i == MAX_LEN)
line[i++] = '\0';
page++;
} }
} if (i <= MAX_LEN)
if (i <= MAX_LEN) line[i] = '\0';
line[i] = '\0'; if (!end_reached)
if (!end_reached) page++; /* move pass '\n' */
page++; /* move pass '\n' */
return line; return line;
} }
/* /*
* Print current position * Print current position
*/ */
static void static void print_position(WINDOW * win, int height, int width)
print_position (WINDOW * win, int height, int width)
{ {
int fpos, percent; int fpos, percent;
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { if ((fpos = lseek(fd, 0, SEEK_CUR)) == -1) {
endwin (); endwin();
fprintf (stderr, "\nError moving file pointer in print_position().\n"); fprintf(stderr,
exit (-1); "\nError moving file pointer in print_position().\n");
} exit(-1);
wattrset (win, position_indicator_attr); }
wbkgdset (win, position_indicator_attr & A_COLOR); wattrset(win, position_indicator_attr);
percent = !file_size ? wbkgdset(win, position_indicator_attr & A_COLOR);
100 : ((fpos - bytes_read + page - buf) * 100) / file_size; percent = !file_size ?
wmove (win, height - 3, width - 9); 100 : ((fpos - bytes_read + page - buf) * 100) / file_size;
wprintw (win, "(%3d%%)", percent); wmove(win, height - 3, width - 9);
wprintw(win, "(%3d%%)", percent);
} }
...@@ -21,7 +21,6 @@ ...@@ -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; ...@@ -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 * Remove newlines
*/ */
for(i=0; i<prompt_len; i++) { for (i = 0; i < prompt_len; i++) {
if(tempstr[i] == '\n') tempstr[i] = ' '; if (tempstr[i] == '\n')
} tempstr[i] = ' ';
}
if (prompt_len <= width - x * 2) { /* If prompt is short */
wmove (win, y, (width - prompt_len) / 2); if (prompt_len <= width - x * 2) { /* If prompt is short */
waddstr (win, tempstr); wmove(win, y, (width - prompt_len) / 2);
} else { waddstr(win, tempstr);
cur_x = x; } else {
cur_y = y;
newl = 1;
word = tempstr;
while (word && *word) {
sp = index(word, ' ');
if (sp)
*sp++ = 0;
/* Wrap to next line if either the word does not fit,
or it is the first word of a new sentence, and it is
short, and the next word does not fit. */
room = width - cur_x;
wlen = strlen(word);
if (wlen > room ||
(newl && wlen < 4 && sp && wlen+1+strlen(sp) > room
&& (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) {
cur_y++;
cur_x = x; cur_x = x;
} cur_y = y;
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; newl = 1;
} else word = tempstr;
newl = 0; while (word && *word) {
word = sp; sp = index(word, ' ');
if (sp)
*sp++ = 0;
/* Wrap to next line if either the word does not fit,
or it is the first word of a new sentence, and it is
short, and the next word does not fit. */
room = width - cur_x;
wlen = strlen(word);
if (wlen > room ||
(newl && wlen < 4 && sp
&& wlen + 1 + strlen(sp) > room
&& (!(sp2 = index(sp, ' '))
|| wlen + 1 + (sp2 - sp) > room))) {
cur_y++;
cur_x = x;
}
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;
} }
......
...@@ -24,95 +24,93 @@ ...@@ -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 */
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment