diff options
author | paul <paul@FreeBSD.org> | 1995-01-30 02:41:29 +0000 |
---|---|---|
committer | paul <paul@FreeBSD.org> | 1995-01-30 02:41:29 +0000 |
commit | 98c415953eb41239c522e21c5aca1ba36b063de6 (patch) | |
tree | 8104cfa8a2d39c88da1d4853f45a7db056097f1d /lib/libforms | |
parent | f5db704703c49558a7005edc04f345907a1aee24 (diff) | |
download | FreeBSD-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.frm | 13 | ||||
-rw-r--r-- | lib/libforms/forms.c | 85 | ||||
-rw-r--r-- | lib/libforms/forms.h | 49 | ||||
-rw-r--r-- | lib/libforms/internal.h | 24 |
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 *); |