diff options
-rw-r--r-- | gnu/lib/libdialog/Makefile | 4 | ||||
-rw-r--r-- | gnu/lib/libdialog/dialog.h | 1 | ||||
-rw-r--r-- | gnu/lib/libdialog/inputbox.c | 134 | ||||
-rw-r--r-- | gnu/lib/libdialog/lineedit.c | 168 | ||||
-rw-r--r-- | gnu/lib/libdialog/textbox.c | 48 |
5 files changed, 184 insertions, 171 deletions
diff --git a/gnu/lib/libdialog/Makefile b/gnu/lib/libdialog/Makefile index ebf74eb..701936d 100644 --- a/gnu/lib/libdialog/Makefile +++ b/gnu/lib/libdialog/Makefile @@ -1,9 +1,9 @@ # Makefile for libdialog -# $Id: Makefile,v 1.2 1994/10/12 01:54:38 ache Exp $ +# $Id: Makefile,v 1.3 1994/10/20 21:56:34 ache Exp $ LIB= dialog SRCS= kernel.c rc.c checklist.c inputbox.c menubox.c msgbox.c \ - radiolist.c textbox.c yesno.c + lineedit.c radiolist.c textbox.c yesno.c CFLAGS+= -Wall -Wstrict-prototypes -DLOCALE diff --git a/gnu/lib/libdialog/dialog.h b/gnu/lib/libdialog/dialog.h index f7e6fec..2490d42 100644 --- a/gnu/lib/libdialog/dialog.h +++ b/gnu/lib/libdialog/dialog.h @@ -41,6 +41,7 @@ extern bool use_shadow; void draw_shadow(WINDOW *win, int y, int x, int height, int width); #endif void draw_box(WINDOW *win, int y, int x, int height, int width, chtype box, chtype border); +int line_edit(WINDOW* dialog, int box_y, int box_x, int box_width, chtype attrs, int first, unsigned char *result); void dialog_create_rc(unsigned char *filename); int dialog_yesno(unsigned char *title, unsigned char *prompt, int height, int width); diff --git a/gnu/lib/libdialog/inputbox.c b/gnu/lib/libdialog/inputbox.c index 35fd527..5bf6fcc 100644 --- a/gnu/lib/libdialog/inputbox.c +++ b/gnu/lib/libdialog/inputbox.c @@ -28,8 +28,8 @@ */ int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int width, unsigned char *result) { - int i, x, y, box_y, box_x, box_width, - input_x = 0, scroll = 0, key = 0, button = -1; + int i, x, y, box_y, box_x, box_width, first, + key = 0, button = -1; unsigned char instr[MAX_LEN+1]; WINDOW *dialog; @@ -37,8 +37,6 @@ int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int x = (COLS - width)/2; y = (LINES - height)/2; - memset(instr, 0, sizeof(instr)); - #ifdef HAVE_NCURSES if (use_shadow) draw_shadow(stdscr, y, x, height, width); @@ -80,127 +78,15 @@ int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int print_button(dialog, "Cancel", y, x+14, FALSE); print_button(dialog, " OK ", y, x, TRUE); - wmove(dialog, box_y, box_x); - wrefresh(dialog); + first = 1; while (key != ESC) { - key = wgetch(dialog); if (button == -1) { /* Input box selected */ - switch (key) { - case TAB: - case KEY_BTAB: - case KEY_UP: - case KEY_DOWN: - break; - case KEY_HOME: - input_x = scroll = 0; - wmove(dialog, box_y, box_x); - for (i = 0; i < box_width; i++) - waddch(dialog, instr[i] ? instr[i] : ' '); - wmove(dialog, box_y, box_x); - wrefresh(dialog); - continue; - case KEY_END: - for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) - instr[i] = '\0'; - i++; - input_x = i % box_width; - scroll = i - input_x; - wmove(dialog, box_y, box_x); - for (i = 0; i < box_width; i++) - waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' '); - wmove(dialog, box_y, input_x + box_x); - wrefresh(dialog); - continue; - case KEY_LEFT: - if (input_x || scroll) { - wattrset(dialog, inputbox_attr); - if (!input_x) { - int oldscroll = scroll; - scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1); - wmove(dialog, box_y, box_x); - for (i = 0; i < box_width; i++) - waddch(dialog, instr[scroll+input_x+i] ? instr[scroll+input_x+i] : ' '); - input_x = oldscroll - 1 - scroll; - } - else - input_x--; - wmove(dialog, box_y, input_x + box_x); - wrefresh(dialog); - } - continue; - case KEY_RIGHT: - if (scroll+input_x < MAX_LEN) { - wattrset(dialog, inputbox_attr); - if (!instr[scroll+input_x]) - instr[scroll+input_x] = ' '; - if (input_x == box_width-1) { - scroll++; - wmove(dialog, box_y, box_x); - for (i = 0; i < box_width; i++) - waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' '); - wmove(dialog, box_y, box_x + box_width - 1); - } - else { - wmove(dialog, box_y, input_x + box_x); - waddch(dialog, instr[scroll+input_x]); - input_x++; - } - wrefresh(dialog); - } else - flash(); /* Alarm user about overflow */ - continue; - case KEY_BACKSPACE: - case KEY_DC: - if (input_x || scroll) { - i = strlen(instr); - memmove(instr+scroll+input_x-1, instr+scroll+input_x, i-scroll+input_x+1); - wattrset(dialog, inputbox_attr); - if (!input_x) { - int oldscroll = scroll; - scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1); - wmove(dialog, box_y, box_x); - for (i = 0; i < box_width; i++) - waddch(dialog, instr[scroll+input_x+i] ? instr[scroll+input_x+i] : ' '); - input_x = oldscroll - 1 - scroll; - } - else - input_x--; - wmove(dialog, box_y, input_x + box_x); - for (i = input_x; i < box_width; i++) - waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' '); - wmove(dialog, box_y, input_x + box_x); - wrefresh(dialog); - } - continue; - default: - if (key < 0x100 && isprint(key)) { - for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) - instr[i] = '\0'; - i++; - if (i < MAX_LEN) { - memmove(instr+scroll+input_x+1, instr+scroll+input_x, i-scroll+input_x); - wattrset(dialog, inputbox_attr); - instr[scroll+input_x] = key; - if (input_x == box_width-1) { - scroll++; - wmove(dialog, box_y, box_x); - for (i = 0; i < box_width-1; i++) - waddch(dialog, instr[scroll+i]); - } - else { - wmove(dialog, box_y, input_x + box_x); - for (i = input_x; i < box_width; i++) - waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' '); - wmove(dialog, box_y, ++input_x + box_x); - } - wrefresh(dialog); - } else - flash(); /* Alarm user about overflow */ - continue; - } - } + key = line_edit(dialog, box_y, box_x, box_width, dialog_attr, first, instr); + first = 0; } + else + key = wgetch(dialog); switch (key) { case 'O': @@ -226,8 +112,6 @@ int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int button = -1; /* Indicates input box is selected */ print_button(dialog, "Cancel", y, x+14, FALSE); print_button(dialog, " OK ", y, x, TRUE); - wmove(dialog, box_y, box_x + input_x); - wrefresh(dialog); break; case 1: button = 0; /* Indicates "OK" button is selected */ @@ -257,16 +141,12 @@ int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int button = -1; /* Indicates input box is selected */ print_button(dialog, "Cancel", y, x+14, FALSE); print_button(dialog, " OK ", y, x, TRUE); - wmove(dialog, box_y, box_x + input_x); - wrefresh(dialog); break; } break; case ' ': case '\n': delwin(dialog); - for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) - instr[i] = '\0'; if (button < 1) strcpy(result, instr); return (button == -1 ? 0 : button); diff --git a/gnu/lib/libdialog/lineedit.c b/gnu/lib/libdialog/lineedit.c new file mode 100644 index 0000000..138aa41 --- /dev/null +++ b/gnu/lib/libdialog/lineedit.c @@ -0,0 +1,168 @@ +/* + * inputbox.c -- implements the input box + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#include <dialog.h> +#include "dialog.priv.h" + + +/* + * Line editor + */ +int line_edit(WINDOW* dialog, int box_y, int box_x, int box_width, chtype attr, int first, unsigned char *result) +{ + int i, key; + static int input_x, scroll; + static unsigned char instr[MAX_LEN+1]; + + if (first) { + keypad(dialog, TRUE); + memset(instr, 0, sizeof(instr)); + input_x = scroll = 0; + } + + wattrset(dialog, attr); + wmove(dialog, box_y, box_x + input_x); + wrefresh(dialog); + for (;;) { + key = wgetch(dialog); + switch (key) { + case TAB: + case KEY_BTAB: + case KEY_UP: + case KEY_DOWN: + case ESC: + case '\n': + for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) + instr[i] = '\0'; + goto ret; + case KEY_HOME: + input_x = scroll = 0; + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) + waddch(dialog, instr[i] ? instr[i] : ' '); + wmove(dialog, box_y, box_x); + wrefresh(dialog); + continue; + case KEY_END: + for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) + instr[i] = '\0'; + i++; + input_x = i % box_width; + scroll = i - input_x; + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) + waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' '); + wmove(dialog, box_y, input_x + box_x); + wrefresh(dialog); + continue; + case KEY_LEFT: + if (input_x || scroll) { + wattrset(dialog, inputbox_attr); + if (!input_x) { + int oldscroll = scroll; + scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1); + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) + waddch(dialog, instr[scroll+input_x+i] ? instr[scroll+input_x+i] : ' '); + input_x = oldscroll - 1 - scroll; + } + else + input_x--; + wmove(dialog, box_y, input_x + box_x); + wrefresh(dialog); + } + continue; + case KEY_RIGHT: + if (scroll+input_x < MAX_LEN) { + wattrset(dialog, inputbox_attr); + if (!instr[scroll+input_x]) + instr[scroll+input_x] = ' '; + if (input_x == box_width-1) { + scroll++; + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) + waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' '); + wmove(dialog, box_y, box_x + box_width - 1); + } + else { + wmove(dialog, box_y, input_x + box_x); + waddch(dialog, instr[scroll+input_x]); + input_x++; + } + wrefresh(dialog); + } else + flash(); /* Alarm user about overflow */ + continue; + case KEY_BACKSPACE: + case KEY_DC: + if (input_x || scroll) { + i = strlen(instr); + memmove(instr+scroll+input_x-1, instr+scroll+input_x, i-scroll+input_x+1); + wattrset(dialog, inputbox_attr); + if (!input_x) { + int oldscroll = scroll; + scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1); + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) + waddch(dialog, instr[scroll+input_x+i] ? instr[scroll+input_x+i] : ' '); + input_x = oldscroll - 1 - scroll; + } + else + input_x--; + wmove(dialog, box_y, input_x + box_x); + for (i = input_x; i < box_width; i++) + waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' '); + wmove(dialog, box_y, input_x + box_x); + wrefresh(dialog); + } + continue; + default: + if (key < 0x100 && isprint(key)) { + for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) + instr[i] = '\0'; + i++; + if (i < MAX_LEN) { + memmove(instr+scroll+input_x+1, instr+scroll+input_x, i-scroll+input_x); + wattrset(dialog, inputbox_attr); + instr[scroll+input_x] = key; + if (input_x == box_width-1) { + scroll++; + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width-1; i++) + waddch(dialog, instr[scroll+i]); + } + else { + wmove(dialog, box_y, input_x + box_x); + for (i = input_x; i < box_width; i++) + waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' '); + wmove(dialog, box_y, ++input_x + box_x); + } + wrefresh(dialog); + } else + flash(); /* Alarm user about overflow */ + continue; + } + } + } +ret: + strcpy(result, instr); + return key; +} diff --git a/gnu/lib/libdialog/textbox.c b/gnu/lib/libdialog/textbox.c index ebfe67f..1e4ccd9 100644 --- a/gnu/lib/libdialog/textbox.c +++ b/gnu/lib/libdialog/textbox.c @@ -618,7 +618,7 @@ static unsigned char *get_line(void) */ static int get_search_term(WINDOW *win, unsigned char *search_term, int height, int width) { - int i, x, y, input_x = 0, scroll = 0, key = 0, + int x, y, key = 0, first, box_height = 3, box_width = 30; x = (width - box_width)/2; @@ -633,55 +633,19 @@ static int get_search_term(WINDOW *win, unsigned char *search_term, int height, waddstr(win, " Search "); box_width -= 2; - wmove(win, y+1, x+1); - wrefresh(win); search_term[0] = '\0'; - wattrset(win, searchbox_attr); + + first = 1; while (key != ESC) { - key = wgetch(win); + key = line_edit(win, y+1, x+1, box_width, searchbox_attr, first, search_term); + first = 0; switch (key) { case '\n': if (search_term[0] != '\0') return 0; break; - case KEY_BACKSPACE: - if (input_x || scroll) { - if (!input_x) { - scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1); - wmove(win, y+1, x+1); - for (i = 0; i < box_width; i++) - waddch(win, search_term[scroll+input_x+i] ? - search_term[scroll+input_x+i] : ' '); - input_x = strlen(search_term) - scroll; - } - else - input_x--; - search_term[scroll+input_x] = '\0'; - wmove(win, y+1, input_x + x+1); - waddch(win, ' '); - wmove(win, y+1, input_x + x+1); - wrefresh(win); - } - break; case ESC: - break; - default: - if (isprint(key)) - if (scroll+input_x < MAX_LEN) { - search_term[scroll+input_x] = key; - search_term[scroll+input_x+1] = '\0'; - if (input_x == box_width-1) { - scroll++; - wmove(win, y+1, x+1); - for (i = 0; i < box_width-1; i++) - waddch(win, search_term[scroll+i]); - } - else { - wmove(win, y+1, input_x++ + x+1); - waddch(win, key); - } - wrefresh(win); - } + break; } } |