mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-27 04:05:10 +00:00
Implemented height field for text fields so they can now be more than
one line long. Fixed a bug in the input field with cursor positioning at the end of the field. Make the print_status function available to apps so they can print status messages. Updated the example for the new fib parser.
This commit is contained in:
parent
463e33c94b
commit
8c490a36b0
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=6087
|
@ -2,7 +2,7 @@ LIB = forms
|
|||
|
||||
SRCS = forms.c
|
||||
|
||||
CFLAGS += -I. -I${.CURDIR} -Wall
|
||||
CFLAGS += -I. -I${.CURDIR} -Wall -g
|
||||
|
||||
beforeinstall:
|
||||
@(cd ${.CURDIR}; cmp -s forms.h ${DESTDIR}/usr/include/forms.h || \
|
||||
|
|
|
@ -3,7 +3,7 @@ NOMAN = yet
|
|||
|
||||
SRCS = example.c frm.tab.h
|
||||
|
||||
CFLAGS =
|
||||
CFLAGS = -g -static
|
||||
|
||||
.if exists(${.CURDIR}/../obj)
|
||||
FORMDIR=${.CURDIR}/../obj
|
||||
|
|
|
@ -49,6 +49,7 @@ main()
|
|||
}
|
||||
keypad(example.window, TRUE);
|
||||
|
||||
print_status("This is the status line");
|
||||
while (!(res = update_form(&example)));
|
||||
|
||||
wclear(example.window);
|
||||
|
|
|
@ -1,103 +1,55 @@
|
|||
Colors example {
|
||||
Colours example {
|
||||
pair = red, yellow
|
||||
pair = blue, white
|
||||
}
|
||||
|
||||
Field Title {
|
||||
attributes = COLOR_PAIR(2)
|
||||
text = "A Simple Demo"
|
||||
}
|
||||
field1 { attributes = A_BLINK|A_BOLD text = "This text is bold and flashy" }
|
||||
|
||||
Field field1 {
|
||||
attributes = A_BLINK|A_BOLD
|
||||
text = "This text is bold and flashy"
|
||||
}
|
||||
|
||||
Field field2 {
|
||||
field2 {
|
||||
height = 2
|
||||
width = 22
|
||||
text = "This is an input field with a default"
|
||||
}
|
||||
|
||||
Field field3 {
|
||||
field3 {
|
||||
width = 10
|
||||
default = "This is a default entry"
|
||||
limit = 30
|
||||
}
|
||||
|
||||
Field field4 {
|
||||
text = "This is a labelled input field"
|
||||
}
|
||||
field4 { text = "This is a labelled input field" }
|
||||
|
||||
Field field5 {
|
||||
label = "A temp. label"
|
||||
}
|
||||
field5 { label = "A temp. label" }
|
||||
|
||||
Field field6 {
|
||||
text = "Some options to choose from: "
|
||||
}
|
||||
field6 { text = "Some options to choose from: " }
|
||||
|
||||
Field field7 {
|
||||
selected = 0
|
||||
options = "Choose", "another", "of", "these"
|
||||
}
|
||||
field7 { selected = 0 options = "Choose", "another", "of", "these" }
|
||||
|
||||
Field field8 {
|
||||
width = 6
|
||||
action = "EXIT"
|
||||
function = exit_form
|
||||
}
|
||||
field8 { width = 6 action = "EXIT" function = exit_form }
|
||||
|
||||
Field field9 {
|
||||
field9 {
|
||||
attributes = COLOR_PAIR(1)
|
||||
highlight = COLOR_PAIR(1)|A_BOLD
|
||||
action = "CANCEL"
|
||||
function = cancel_form
|
||||
}
|
||||
|
||||
Link input1 as field3 {
|
||||
next = input2
|
||||
down = input2
|
||||
}
|
||||
|
||||
Link input2 as field5 {
|
||||
next = menu1
|
||||
up = input1
|
||||
down = menu1
|
||||
}
|
||||
|
||||
Link menu1 as field7 {
|
||||
next = quit
|
||||
up = input2
|
||||
down = quit
|
||||
}
|
||||
|
||||
Link quit as field8 {
|
||||
up = menu1
|
||||
right = cancel
|
||||
}
|
||||
|
||||
Link cancel as field9 {
|
||||
up = input1
|
||||
down = input1
|
||||
left = quit
|
||||
right = input1
|
||||
}
|
||||
|
||||
Form example at 0,0 {
|
||||
height = 24
|
||||
height = 25
|
||||
width = 80
|
||||
colortable = example
|
||||
attributes = COLOR_PAIR(1)
|
||||
|
||||
Field Title at 0,30
|
||||
Title {attributes = COLOR_PAIR(2) text = "A Simple Demo"} at 0,30
|
||||
|
||||
Field field1 at 3,23
|
||||
Field field2 at 7, 2
|
||||
Field field4 at 11, 2
|
||||
Field field6 at 15, 2
|
||||
field1 at 3,23
|
||||
field2 at 7, 2
|
||||
field4 at 11, 2
|
||||
field6 at 15, 2
|
||||
|
||||
Field input1 at 7,45
|
||||
Field input2 at 11,45
|
||||
Field menu1 at 15,45
|
||||
Field quit at 20,20
|
||||
Field cancel at 20,43
|
||||
input1 {field3} at 7,45, next=input2, up=input2, down=input2
|
||||
input2 {field5} at 11,45, next=menu1, up=input1, down=menu1
|
||||
menu1 {field7} at 15,45, next=quit, up=input2, down=quit
|
||||
quit {field8} at 20,20, up=menu1, right=cancel
|
||||
cancel {field9} at 20,43, up=input1, down=input1, left=quit, right=input1
|
||||
}
|
||||
|
|
|
@ -74,6 +74,11 @@ initfrm(struct form *form)
|
|||
cbreak();
|
||||
noecho();
|
||||
|
||||
if (!form->height)
|
||||
form->height = LINES;
|
||||
if (!form->width)
|
||||
form->width = COLS;
|
||||
|
||||
form->window = newwin(form->height, form->width, form->y, form->x);
|
||||
if (!form->window) {
|
||||
print_status("Couldn't open window, closing form");
|
||||
|
@ -137,8 +142,6 @@ endfrm(struct form *form)
|
|||
int
|
||||
update_form(struct form *form)
|
||||
{
|
||||
int selattr;
|
||||
|
||||
show_form(form);
|
||||
|
||||
if (form->current_field == -1)
|
||||
|
@ -207,7 +210,7 @@ disp_text(struct form *form, int index)
|
|||
|
||||
struct field *field = &form->field[index];
|
||||
|
||||
if (print_string(form->window, field->y, field->x,
|
||||
if (print_string(form->window, field->y, field->x, field->height,
|
||||
field->width, field->field.text->text) == ERR)
|
||||
print_status("Illegal scroll in print_string");
|
||||
}
|
||||
|
@ -219,11 +222,11 @@ disp_input(struct form *form, int index)
|
|||
struct field *field = &form->field[index];
|
||||
|
||||
if (field->field.input->lbl_flag) {
|
||||
if (print_string(form->window, field->y, field->x,
|
||||
if (print_string(form->window, field->y, field->x, field->height,
|
||||
field->width, field->field.input->label) == ERR)
|
||||
print_status("Illegal scroll in print_string");
|
||||
} else
|
||||
if (print_string(form->window, field->y, field->x,
|
||||
if (print_string(form->window, field->y, field->x, field->height,
|
||||
field->width, field->field.input->input) == ERR)
|
||||
print_status("Illegal scroll in print_string");
|
||||
}
|
||||
|
@ -233,7 +236,7 @@ disp_menu(struct form *form, int index)
|
|||
{
|
||||
struct field *field = &form->field[index];
|
||||
|
||||
if (print_string(form->window, field->y, field->x,
|
||||
if (print_string(form->window, field->y, field->x, field->height,
|
||||
field->width,
|
||||
field->field.menu->options[field->field.menu->selected]) == ERR)
|
||||
print_status("Illegal scroll in print_string");
|
||||
|
@ -244,7 +247,7 @@ disp_action(struct form *form, int index)
|
|||
{
|
||||
struct field *field = &form->field[index];
|
||||
|
||||
if (print_string(form->window, field->y, field->x,
|
||||
if (print_string(form->window, field->y, field->x, field->height,
|
||||
field->width,
|
||||
field->field.action->text) == ERR)
|
||||
print_status("Illegal scroll in print_string");
|
||||
|
@ -342,9 +345,10 @@ next_field(struct form *form, int ch)
|
|||
|
||||
static int
|
||||
print_string(WINDOW *window, int y, int x,
|
||||
int width, char *string)
|
||||
int height, int fwidth, char *string)
|
||||
{
|
||||
int len;
|
||||
int width;
|
||||
|
||||
if (!string)
|
||||
len = -1;
|
||||
|
@ -353,18 +357,24 @@ print_string(WINDOW *window, int y, int x,
|
|||
|
||||
if (wmove(window, y, x) == ERR)
|
||||
return (ERR);
|
||||
while (width--) {
|
||||
if (len-- > 0) {
|
||||
if (waddch(window, *string++) == ERR)
|
||||
return (ERR);
|
||||
} else
|
||||
if (waddch(window, ' ') == ERR)
|
||||
return (ERR);
|
||||
while (height--) {
|
||||
width = fwidth;
|
||||
while (width--) {
|
||||
if (len-- > 0) {
|
||||
if (waddch(window, *string++) == ERR)
|
||||
return (ERR);
|
||||
} else
|
||||
if (waddch(window, ' ') == ERR)
|
||||
return (ERR);
|
||||
}
|
||||
if (wmove(window, ++y, x) == ERR)
|
||||
return (ERR);
|
||||
|
||||
}
|
||||
return (OK);
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
print_status(char *msg)
|
||||
{
|
||||
if (wmove(stdscr, LINES-1, 0) == ERR) {
|
||||
|
@ -410,7 +420,7 @@ field_input(struct form *form)
|
|||
ch = wgetch(form->window);
|
||||
if (next_field(form, ch)) {
|
||||
print_string(form->window, field->y, field->x,
|
||||
field->width,
|
||||
field->height, field->width,
|
||||
field->field.input->input+DISPOFF);
|
||||
return;
|
||||
}
|
||||
|
@ -456,7 +466,7 @@ field_input(struct form *form)
|
|||
beep();
|
||||
else {
|
||||
++abspos;
|
||||
if (cursor++ == field->width) {
|
||||
if (++cursor == field->width) {
|
||||
++disp_off;
|
||||
--cursor;
|
||||
}
|
||||
|
@ -473,7 +483,7 @@ field_input(struct form *form)
|
|||
} else {
|
||||
beep();
|
||||
}
|
||||
print_string(form->window, field->y, field->x,
|
||||
print_string(form->window, field->y, field->x, field->height,
|
||||
field->width, field->field.input->input+disp_off);
|
||||
}
|
||||
/* Not Reached */
|
||||
|
|
|
@ -94,6 +94,7 @@ struct field {
|
|||
int type;
|
||||
int y;
|
||||
int x;
|
||||
int height;
|
||||
int width;
|
||||
int attr;
|
||||
int selattr;
|
||||
|
@ -122,3 +123,4 @@ int initfrm(struct form *);
|
|||
void endfrm(struct form *);
|
||||
void exit_form(void);
|
||||
void cancel_form(void);
|
||||
void print_status(char *);
|
||||
|
|
|
@ -34,6 +34,5 @@ static void disp_input(struct form *, int);
|
|||
static void field_menu(struct form *);
|
||||
static void field_input(struct form *);
|
||||
static void field_action(struct form *);
|
||||
static int print_string(WINDOW *, int, int, int, char *);
|
||||
static void print_status(char *);
|
||||
static int print_string(WINDOW *, int, int, int, int, char *);
|
||||
static int next_field(struct form *form, int);
|
||||
|
|
Loading…
Reference in a new issue