summaryrefslogtreecommitdiffstats
path: root/lib/libforms
diff options
context:
space:
mode:
authorpaul <paul@FreeBSD.org>1995-01-30 02:41:29 +0000
committerpaul <paul@FreeBSD.org>1995-01-30 02:41:29 +0000
commit98c415953eb41239c522e21c5aca1ba36b063de6 (patch)
tree8104cfa8a2d39c88da1d4853f45a7db056097f1d /lib/libforms
parentf5db704703c49558a7005edc04f345907a1aee24 (diff)
downloadFreeBSD-src-98c415953eb41239c522e21c5aca1ba36b063de6.zip
FreeBSD-src-98c415953eb41239c522e21c5aca1ba36b063de6.tar.gz
Add all the necessary bits to use color if the terminal allows it.
You can now specify separate attributes for selected/not selected cases individually for each field and also an attr for the form as a whole so you can now have colored backgrounds for the form and different coloured fields etc. Update the example. Change the copyright to a BSD style one.
Diffstat (limited to 'lib/libforms')
-rw-r--r--lib/libforms/examples/example.frm13
-rw-r--r--lib/libforms/forms.c85
-rw-r--r--lib/libforms/forms.h49
-rw-r--r--lib/libforms/internal.h24
4 files changed, 118 insertions, 53 deletions
diff --git a/lib/libforms/examples/example.frm b/lib/libforms/examples/example.frm
index 542d909..942bbbf 100644
--- a/lib/libforms/examples/example.frm
+++ b/lib/libforms/examples/example.frm
@@ -1,5 +1,10 @@
+Colors example {
+ pair = red, yellow
+ pair = blue, white
+}
+
Field Title {
- attributes = A_BOLD
+ attributes = COLOR_PAIR(2)
text = "A Simple Demo"
}
@@ -37,13 +42,13 @@ Field field7 {
Field field8 {
width = 6
- attributes = A_BOLD|A_REVERSE
action = "EXIT"
function = exit_form
}
Field field9 {
- attributes = A_BOLD|A_REVERSE
+ attributes = COLOR_PAIR(1)
+ highlight = COLOR_PAIR(1)|A_BOLD
action = "CANCEL"
function = cancel_form
}
@@ -80,6 +85,8 @@ Link cancel as field9 {
Form example at 0,0 {
height = 24
width = 80
+ colortable = example
+ attributes = COLOR_PAIR(1)
Field Title at 0,30
diff --git a/lib/libforms/forms.c b/lib/libforms/forms.c
index b0b2acf..ab7b172 100644
--- a/lib/libforms/forms.c
+++ b/lib/libforms/forms.c
@@ -1,24 +1,46 @@
-/*
- * Copyright (c) 1995 Paul Richards.
+/*-
+ * Copyright (c) 1995
+ * Paul Richards. All rights reserved.
*
- * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer,
+ * verbatim and that no modifications are made prior to this
+ * point in the file.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Paul Richards.
+ * 4. The name Paul Richards may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL PAUL RICHARDS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
*
- * This software 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 this software, nor does
- * the author assume any responsibility for damages incurred with
- * its use.
*/
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <forms.h>
+#include <ncurses.h>
+
#include "internal.h"
-unsigned int keymap[] = {
+unsigned int f_keymap[] = {
KEY_UP, /* F_UP */
KEY_DOWN, /* F_DOWN */
9, /* F_RIGHT */
@@ -28,8 +50,9 @@ unsigned int keymap[] = {
KEY_RIGHT, /* F_CRIGHT */
KEY_HOME, /* F_CHOME */
KEY_END, /* F_CEND */
- 263, /* F_CBS */
- 330 /* F_CDEL */
+ 263, /* F_CBS */
+ 330, /* F_CDEL */
+ 10 /* F_ACCEPT */
};
int done=0;
@@ -39,7 +62,15 @@ initfrm(struct form *form)
{
struct field *field = &form->field[0];
+ int i;
+ if (has_colors()) {
+ start_color();
+ if (form->color_table)
+ for (i=0; form->color_table[i].f != -1; i++) {
+ init_pair(i+1, form->color_table[i].f, form->color_table[i].b);
+ }
+ }
cbreak();
noecho();
@@ -52,6 +83,7 @@ initfrm(struct form *form)
keypad(form->window, TRUE);
+
while (field->type != F_END) {
if (field->type == F_INPUT) {
field->field.input->input = malloc(field->field.input->limit);
@@ -81,6 +113,7 @@ initfrm(struct form *form)
form->no_fields++;
field = &form->field[form->no_fields];
}
+ form->current_field = form->start_field;
show_form(form);
return (OK);
}
@@ -104,12 +137,14 @@ endfrm(struct form *form)
int
update_form(struct form *form)
{
+ int selattr;
show_form(form);
if (form->current_field == -1)
return (F_CANCEL);
+ wattrset(form->window, form->field[form->current_field].selattr);
switch (form->field[form->current_field].type) {
case F_MENU:
field_menu(form);
@@ -125,6 +160,7 @@ update_form(struct form *form)
print_status("Error, current field is invalid");
return (F_CANCEL);
}
+ wattrset(form->window, 0);
return (done);
}
@@ -133,9 +169,15 @@ static void
show_form(struct form *form)
{
int i;
+ int y, x;
+
+ wattrset(form->window, form->attr);
+ for (y = 0; y < form->height; y++)
+ for (x = 0; x < form->width; x++)
+ mvwaddch(form->window, y, x, ' ');
for (i=0; i < form->no_fields; i++) {
- wattrset(form->window, 0);
+ wattrset(form->window, form->field[i].attr);
wmove(form->window, form->field[i].y, form->field[i].x);
switch (form->field[i].type) {
case F_TEXT:
@@ -155,6 +197,7 @@ show_form(struct form *form)
break;
}
}
+ wattrset(form->window, 0);
wrefresh(form->window);
}
@@ -164,8 +207,6 @@ disp_text(struct form *form, int index)
struct field *field = &form->field[index];
- wattron(form->window, field->attr);
-
if (print_string(form->window, field->y, field->x,
field->width, field->field.text->text) == ERR)
print_status("Illegal scroll in print_string");
@@ -177,8 +218,6 @@ disp_input(struct form *form, int index)
struct field *field = &form->field[index];
- wattron(form->window, field->attr);
-
if (field->field.input->lbl_flag) {
if (print_string(form->window, field->y, field->x,
field->width, field->field.input->label) == ERR)
@@ -187,7 +226,6 @@ disp_input(struct form *form, int index)
if (print_string(form->window, field->y, field->x,
field->width, field->field.input->input) == ERR)
print_status("Illegal scroll in print_string");
-
}
static void
@@ -195,8 +233,6 @@ disp_menu(struct form *form, int index)
{
struct field *field = &form->field[index];
- wattron(form->window, field->attr);
-
if (print_string(form->window, field->y, field->x,
field->width,
field->field.menu->options[field->field.menu->selected]) == ERR)
@@ -208,14 +244,10 @@ disp_action(struct form *form, int index)
{
struct field *field = &form->field[index];
-
- wattron(form->window, field->attr);
-
if (print_string(form->window, field->y, field->x,
field->width,
field->field.action->text) == ERR)
print_status("Illegal scroll in print_string");
-
}
static void
@@ -226,7 +258,6 @@ field_action(struct form *form)
int ch;
for (;;) {
- wattron(form->window, F_SELATTR);
disp_action(form, form->current_field);
wmove(form->window, field->y, field->x);
ch = wgetch(form->window);
@@ -247,7 +278,6 @@ field_menu(struct form *form)
int ch;
for (;;) {
- wattron(form->window, F_SELATTR);
disp_menu(form, form->current_field);
wmove(form->window, field->y, field->x);
switch (ch = wgetch(form->window)) {
@@ -367,7 +397,6 @@ field_input(struct form *form)
#define CURSPOS ((len < field->width) ? len : field->width)
len = strlen(field->field.input->input);
- wattron(form->window, F_SELATTR);
disp_input(form, form->current_field);
cursor = CURSPOS;
diff --git a/lib/libforms/forms.h b/lib/libforms/forms.h
index 7b1bbf4..094ca7a 100644
--- a/lib/libforms/forms.h
+++ b/lib/libforms/forms.h
@@ -1,15 +1,35 @@
-/*
- * Copyright (c) 1995 Paul Richards.
+/*-
+ * Copyright (c) 1995
+ * Paul Richards. All rights reserved.
*
- * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer,
+ * verbatim and that no modifications are made prior to this
+ * point in the file.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Paul Richards.
+ * 4. The name Paul Richards may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL PAUL RICHARDS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
*
- * This software 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 this software, nor does
- * the author assume any responsibility for damages incurred with
- * its use.
*/
#include <ncurses.h>
@@ -26,14 +46,22 @@
#define F_DONE 1
#define F_CANCEL -1
+struct col_pair {
+ int f;
+ int b;
+};
+
struct form {
int no_fields;
+ int start_field;
int current_field;
struct field *field;
int height;
int width;
int y;
int x;
+ int attr;
+ struct col_pair *color_table;
WINDOW *window;
};
@@ -68,6 +96,7 @@ struct field {
int x;
int width;
int attr;
+ int selattr;
int next;
int up;
int down;
diff --git a/lib/libforms/internal.h b/lib/libforms/internal.h
index 2a8178e..b7bdb1e 100644
--- a/lib/libforms/internal.h
+++ b/lib/libforms/internal.h
@@ -12,18 +12,18 @@
* its use.
*/
-#define F_UP keymap[0]
-#define F_DOWN keymap[1]
-#define F_RIGHT keymap[2]
-#define F_LEFT keymap[3]
-#define F_NEXT keymap[4]
-#define F_CLEFT keymap[5]
-#define F_CRIGHT keymap[6]
-#define F_CHOME keymap[7]
-#define F_CEND keymap[8]
-#define F_CBS keymap[9]
-#define F_CDEL keymap[10]
-#define F_ACCEPT F_NEXT
+#define F_UP f_keymap[0]
+#define F_DOWN f_keymap[1]
+#define F_RIGHT f_keymap[2]
+#define F_LEFT f_keymap[3]
+#define F_NEXT f_keymap[4]
+#define F_CLEFT f_keymap[5]
+#define F_CRIGHT f_keymap[6]
+#define F_CHOME f_keymap[7]
+#define F_CEND f_keymap[8]
+#define F_CBS f_keymap[9]
+#define F_CDEL f_keymap[10]
+#define F_ACCEPT f_keymap[11]
/* Private function declarations */
static void show_form(struct form *);
OpenPOWER on IntegriCloud