summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gnu/lib/libdialog/TESTS/Makefile4
-rw-r--r--gnu/lib/libdialog/TESTS/input2.c46
-rw-r--r--gnu/lib/libdialog/dialog.h7
-rw-r--r--gnu/lib/libdialog/inputbox.c2
-rw-r--r--gnu/lib/libdialog/kernel.c3
-rw-r--r--gnu/lib/libdialog/lineedit.c30
-rw-r--r--gnu/lib/libdialog/textbox.c2
-rw-r--r--gnu/lib/libdialog/ui_objects.c24
-rw-r--r--gnu/lib/libdialog/ui_objects.h1
9 files changed, 94 insertions, 25 deletions
diff --git a/gnu/lib/libdialog/TESTS/Makefile b/gnu/lib/libdialog/TESTS/Makefile
index 98ec3d2..302acb6 100644
--- a/gnu/lib/libdialog/TESTS/Makefile
+++ b/gnu/lib/libdialog/TESTS/Makefile
@@ -1,9 +1,9 @@
# Really quick and evil Makefile for building all the tests. I wish that bmake was friendlier to
# the concept of multiple progs/libs in the same directory.
-# $Id: Makefile,v 1.2 1996/01/01 03:45:21 jkh Exp $
+# $Id: Makefile,v 1.3 1996/04/07 03:34:35 jkh Exp $
PROGS= msg yesno prgbox gauge dselect fselect text menu1 menu2 menu3 \
- input1 check1 check2 check3 radio1 radio2 radio3
+ input1 input2 check1 check2 check3 radio1 radio2 radio3
CFLAGS+= -Wall -Wstrict-prototypes
LDFLAGS += -ldialog -lncurses -lmytinfo
diff --git a/gnu/lib/libdialog/TESTS/input2.c b/gnu/lib/libdialog/TESTS/input2.c
new file mode 100644
index 0000000..c20e484
--- /dev/null
+++ b/gnu/lib/libdialog/TESTS/input2.c
@@ -0,0 +1,46 @@
+/*
+ * small test-driver for new dialog functionality
+ *
+ * Copyright (c) 1995, Jordan Hubbard
+ *
+ * All rights reserved.
+ *
+ * This source code may be used, modified, copied, distributed, and
+ * sold, in both source and binary form provided that the above
+ * copyright and these terms are retained, verbatim, as the first
+ * lines of this file. Under no circumstances is the author
+ * responsible for the proper functioning of the software nor does
+ * the author assume any responsibility for damages incurred with
+ * its use.
+ *
+ * $Id: input1.c,v 1.1 1996/01/01 03:45:25 jkh Exp $
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <dialog.h>
+
+/* Kick it off, James! */
+int
+main(int argc, unsigned char *argv[])
+{
+ int retval;
+ unsigned char result[128];
+
+ init_dialog();
+
+ result[0]='\0';
+ DialogInputAttrs |= DITEM_NO_ECHO;
+ retval = dialog_inputbox("this is dialog_inputbox() in action, test #2 (no echo)",
+ "Enter something really secret below, please.",
+ -1, -1, result);
+ DialogInputAttrs &= DITEM_NO_ECHO;
+ dialog_clear();
+ fprintf(stderr, "returned value for dialog_inputbox was %d (%s)\n", retval, result);
+
+ end_dialog();
+ return 0;
+}
diff --git a/gnu/lib/libdialog/dialog.h b/gnu/lib/libdialog/dialog.h
index 37f05af..dace69e 100644
--- a/gnu/lib/libdialog/dialog.h
+++ b/gnu/lib/libdialog/dialog.h
@@ -50,6 +50,9 @@
#define DITEM_RESTORE (1 << 19)
#define DITEM_CONTINUE (1 << 20)
+/* Attributes as used by entry fields right now */
+#define DITEM_NO_ECHO 0x0001
+
/* negative offsets for buttons in item lists, if specified */
#define OK_BUTTON -2
@@ -77,7 +80,7 @@ typedef struct _dmenu_item {
#define FALSE (0)
#endif
-extern int DialogX, DialogY;
+extern int DialogX, DialogY, DialogInputAttrs;
/*
* Attribute names
@@ -122,7 +125,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 flen, int box_width, chtype attrs, int first, unsigned char *result);
+int line_edit(WINDOW *dialog, int box_y, int box_x, int flen, int box_width, chtype attrs, int first, unsigned char *result, int attr_mask);
int strheight(const char *p);
int strwidth(const char *p);
diff --git a/gnu/lib/libdialog/inputbox.c b/gnu/lib/libdialog/inputbox.c
index fc9a40c..1f61ed5 100644
--- a/gnu/lib/libdialog/inputbox.c
+++ b/gnu/lib/libdialog/inputbox.c
@@ -106,7 +106,7 @@ int dialog_inputbox(unsigned char *title, unsigned char *prompt, int height, int
while (key != ESC) {
if (button == -1) { /* Input box selected */
- key = line_edit(dialog, box_y, box_x, -1, box_width, inputbox_attr, first, instr);
+ key = line_edit(dialog, box_y, box_x, -1, box_width, inputbox_attr, first, instr, DialogInputAttrs);
first = 0;
}
else
diff --git a/gnu/lib/libdialog/kernel.c b/gnu/lib/libdialog/kernel.c
index 7a67af6..c30e478 100644
--- a/gnu/lib/libdialog/kernel.c
+++ b/gnu/lib/libdialog/kernel.c
@@ -90,6 +90,9 @@
*/
int DialogX, DialogY;
+/* This "secret" global allows you to change the behavior of an input field */
+int DialogInputAttrs;
+
/*
* Do some initialization for dialog
*/
diff --git a/gnu/lib/libdialog/lineedit.c b/gnu/lib/libdialog/lineedit.c
index 8c33e8b..7bfe0e0 100644
--- a/gnu/lib/libdialog/lineedit.c
+++ b/gnu/lib/libdialog/lineedit.c
@@ -24,12 +24,12 @@
#include <dialog.h>
#include "dialog.priv.h"
-static void redraw_field(WINDOW *dialog, int box_y, int box_x, int flen, int box_width, unsigned char instr[], int input_x, int scroll, chtype attr, chtype old_attr, int fexit);
+static void redraw_field(WINDOW *dialog, int box_y, int box_x, int flen, int box_width, unsigned char instr[], int input_x, int scroll, chtype attr, chtype old_attr, int fexit, int attr_mask);
/*
* Line editor
*/
-int line_edit(WINDOW* dialog, int box_y, int box_x, int flen, int box_width, chtype attr, int first, unsigned char *result)
+int line_edit(WINDOW* dialog, int box_y, int box_x, int flen, int box_width, chtype attr, int first, unsigned char *result, int attr_mask)
{
int i, key;
chtype old_attr;
@@ -53,7 +53,7 @@ int line_edit(WINDOW* dialog, int box_y, int box_x, int flen, int box_width, cht
/* scroll = i - input_x;*/
scroll = (i > box_width) ? i - box_width + 1: 0;
}
- redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE);
+ redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask);
for (;;) {
wattrset(dialog, attr);
@@ -86,12 +86,12 @@ int line_edit(WINDOW* dialog, int box_y, int box_x, int flen, int box_width, cht
case '\013':
case KEY_EOL:
memset(instr + scroll + input_x, '\0', sizeof(instr) - scroll - input_x);
- redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE);
+ redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask);
continue;
case '\001':
case KEY_HOME:
input_x = scroll = 0;
- redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE);
+ redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask);
continue;
case '\005':
case KEY_END:
@@ -100,7 +100,7 @@ int line_edit(WINDOW* dialog, int box_y, int box_x, int flen, int box_width, cht
i++;
input_x = i % box_width;
scroll = i - input_x;
- redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE);
+ redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask);
continue;
case '\002':
case KEY_LEFT:
@@ -109,7 +109,7 @@ int line_edit(WINDOW* dialog, int box_y, int box_x, int flen, int box_width, cht
int oldscroll = scroll;
scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1);
input_x = oldscroll - 1 - scroll;
- redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE);
+ redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask);
} else {
input_x--;
wmove(dialog, box_y, input_x + box_x);
@@ -126,7 +126,7 @@ int line_edit(WINDOW* dialog, int box_y, int box_x, int flen, int box_width, cht
instr[scroll+input_x] = ' ';
if (input_x == box_width-1) {
scroll++;
- redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE);
+ redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask);
}
else {
wmove(dialog, box_y, input_x + box_x);
@@ -149,7 +149,7 @@ int line_edit(WINDOW* dialog, int box_y, int box_x, int flen, int box_width, cht
input_x = oldscroll - 1 - scroll;
} else
input_x--;
- redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE);
+ redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask);
} else
beep();
continue;
@@ -163,7 +163,7 @@ int line_edit(WINDOW* dialog, int box_y, int box_x, int flen, int box_width, cht
continue;
}
memmove(instr+scroll+input_x, instr+scroll+input_x+1, i-(scroll+input_x));
- redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE);
+ redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask);
continue;
default:
if (CCEQ(key, erase_char))
@@ -182,7 +182,7 @@ int line_edit(WINDOW* dialog, int box_y, int box_x, int flen, int box_width, cht
scroll++;
else
input_x++;
- redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE);
+ redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask);
} else
beep(); /* Alarm user about overflow */
continue;
@@ -190,14 +190,14 @@ int line_edit(WINDOW* dialog, int box_y, int box_x, int flen, int box_width, cht
}
}
ret:
- redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, TRUE);
+ redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, TRUE, attr_mask);
wrefresh(dialog);
strcpy(result, instr);
return key;
}
static void
-redraw_field(WINDOW *dialog, int box_y, int box_x, int flen, int box_width, unsigned char instr[], int input_x, int scroll, chtype attr, chtype old_attr, int fexit)
+redraw_field(WINDOW *dialog, int box_y, int box_x, int flen, int box_width, unsigned char instr[], int input_x, int scroll, chtype attr, chtype old_attr, int fexit, int attr_mask)
{
int i, fix_len;
@@ -205,9 +205,9 @@ redraw_field(WINDOW *dialog, int box_y, int box_x, int flen, int box_width, unsi
wmove(dialog, box_y, box_x);
fix_len = flen >= 0 ? MIN(flen-scroll,box_width) : box_width;
for (i = 0; i < fix_len; i++)
- waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' ');
+ waddch(dialog, instr[scroll+i] ? ((attr_mask & DITEM_NO_ECHO) ? '*' : instr[scroll+i]) : ' ');
wattrset(dialog, old_attr);
for ( ; i < box_width; i++)
- waddch(dialog, instr[scroll+i] ? instr[scroll+i] : ' ');
+ waddch(dialog, instr[scroll+i] ? ((attr_mask & DITEM_NO_ECHO) ? '*' : instr[scroll+i]) : ' ');
wmove(dialog, box_y, input_x + box_x);
}
diff --git a/gnu/lib/libdialog/textbox.c b/gnu/lib/libdialog/textbox.c
index ec0013b..0e8aaea 100644
--- a/gnu/lib/libdialog/textbox.c
+++ b/gnu/lib/libdialog/textbox.c
@@ -657,7 +657,7 @@ static int get_search_term(WINDOW *win, unsigned char *search_term, int height,
first = 1;
while (key != ESC) {
- key = line_edit(win, y+1, x+1, -1, box_width-2, searchbox_attr, first, search_term);
+ key = line_edit(win, y+1, x+1, -1, box_width-2, searchbox_attr, first, search_term, 0);
first = 0;
switch (key) {
case '\n':
diff --git a/gnu/lib/libdialog/ui_objects.c b/gnu/lib/libdialog/ui_objects.c
index e1ef014..8c178c6 100644
--- a/gnu/lib/libdialog/ui_objects.c
+++ b/gnu/lib/libdialog/ui_objects.c
@@ -29,7 +29,6 @@
#define ESC 27
-
/***********************************************************************
*
* Obj routines
@@ -239,6 +238,22 @@ DelObj(ComposeObj *Obj)
*
***********************************************************************/
+static void
+outstr(WINDOW *win, char *str, int attrs)
+{
+ if (attrs & DITEM_NO_ECHO) {
+ char *cpy;
+ int n = strlen(str);
+
+ cpy = alloca(n + 1);
+ memset(cpy, '*', n);
+ cpy[n] = '\0';
+ waddstr(win, cpy);
+ }
+ else
+ waddstr(win, str);
+}
+
void
RefreshStringObj(StringObj *so)
/*
@@ -256,9 +271,9 @@ RefreshStringObj(StringObj *so)
wmove(so->win, so->y+2, so->x+1);
if (strlen(so->s) > so->w-2) {
strncpy(tmp, (char *) so->s + strlen(so->s) - so->w + 2, so->w - 1);
- waddstr(so->win, tmp);
+ outstr(so->win, tmp, so->attr_mask);
} else {
- waddstr(so->win, so->s);
+ outstr(so->win, so->s, so->attr_mask);
}
return;
@@ -292,6 +307,7 @@ NewStringObj(WINDOW *win, char *title, char *s, int y, int x, int w, int len)
so->w = w;
so->len = len;
so->win = win;
+ so->attr_mask = DialogInputAttrs; /* Grossly use a global to avoid changing API */
/* Draw it on the screen */
RefreshStringObj(so);
@@ -310,7 +326,7 @@ SelectStringObj(StringObj *so)
strcpy(tmp, so->s);
key = line_edit(so->win, so->y+2, so->x+1,
- so->len, so->w-2, inputbox_attr, TRUE, tmp);
+ so->len, so->w-2, inputbox_attr, TRUE, tmp, so->attr_mask);
if ((key == '\n') || (key == '\r') || (key == '\t') || key == (KEY_BTAB) ) {
strcpy(so->s, tmp);
}
diff --git a/gnu/lib/libdialog/ui_objects.h b/gnu/lib/libdialog/ui_objects.h
index db9a12c..b30feb8 100644
--- a/gnu/lib/libdialog/ui_objects.h
+++ b/gnu/lib/libdialog/ui_objects.h
@@ -53,6 +53,7 @@ typedef struct {
int x, y, w, len; /* the (y, x) position of the upperleft */
/* corner and the width <w> of the display */
/* and length <len> of the field */
+ int attr_mask; /* special attributes */
} StringObj;
typedef struct {
OpenPOWER on IntegriCloud