summaryrefslogtreecommitdiffstats
path: root/gnu
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1994-10-21 15:42:30 +0000
committerache <ache@FreeBSD.org>1994-10-21 15:42:30 +0000
commite52bf400dfc0a15bee44756c5fe29eea0db4ead7 (patch)
tree6503b6077d40b4494c59a45e8886872a4b4da787 /gnu
parent2cae2759f0170518aa68553a2bec3dfebf9f1faf (diff)
downloadFreeBSD-src-e52bf400dfc0a15bee44756c5fe29eea0db4ead7.zip
FreeBSD-src-e52bf400dfc0a15bee44756c5fe29eea0db4ead7.tar.gz
Implement line_edit() function (full line editor) which may called
externally. Rewrite inputbox/textbox to use this function.
Diffstat (limited to 'gnu')
-rw-r--r--gnu/lib/libdialog/Makefile4
-rw-r--r--gnu/lib/libdialog/dialog.h1
-rw-r--r--gnu/lib/libdialog/inputbox.c134
-rw-r--r--gnu/lib/libdialog/lineedit.c168
-rw-r--r--gnu/lib/libdialog/textbox.c48
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;
}
}
OpenPOWER on IntegriCloud