kconfig/lxdialog: refactor color support

Clean up and refactor color support. All color support are now
in util.c including color definitions.
In the process introduced a global variable named 'dlg' which is
used all over to set color - thats the reason why all files are changed.

Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
This commit is contained in:
Sam Ravnborg 2006-07-24 21:40:46 +02:00 committed by Sam Ravnborg
parent bf60362566
commit 98e5a1579e
10 changed files with 251 additions and 363 deletions

View file

@ -34,18 +34,19 @@ static void print_item(WINDOW * win, const char *item, int status, int choice,
int i; int i;
/* Clear 'residue' of last item */ /* Clear 'residue' of last item */
wattrset(win, menubox_attr); wattrset(win, dlg.menubox.atr);
wmove(win, choice, 0); wmove(win, choice, 0);
for (i = 0; i < list_width; i++) for (i = 0; i < list_width; i++)
waddch(win, ' '); waddch(win, ' ');
wmove(win, choice, check_x); wmove(win, choice, check_x);
wattrset(win, selected ? check_selected_attr : check_attr); wattrset(win, selected ? dlg.check_selected.atr
: dlg.check.atr);
wprintw(win, "(%c)", status ? 'X' : ' '); wprintw(win, "(%c)", status ? 'X' : ' ');
wattrset(win, selected ? tag_selected_attr : tag_attr); wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr);
mvwaddch(win, choice, item_x, item[0]); mvwaddch(win, choice, item_x, item[0]);
wattrset(win, selected ? item_selected_attr : item_attr); wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
waddstr(win, (char *)item + 1); waddstr(win, (char *)item + 1);
if (selected) { if (selected) {
wmove(win, choice, check_x + 1); wmove(win, choice, check_x + 1);
@ -62,11 +63,11 @@ static void print_arrows(WINDOW * win, int choice, int item_no, int scroll,
wmove(win, y, x); wmove(win, y, x);
if (scroll > 0) { if (scroll > 0) {
wattrset(win, uarrow_attr); wattrset(win, dlg.uarrow.atr);
waddch(win, ACS_UARROW); waddch(win, ACS_UARROW);
waddstr(win, "(-)"); waddstr(win, "(-)");
} else { } else {
wattrset(win, menubox_attr); wattrset(win, dlg.menubox.atr);
waddch(win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch(win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch(win, ACS_HLINE); waddch(win, ACS_HLINE);
@ -77,11 +78,11 @@ static void print_arrows(WINDOW * win, int choice, int item_no, int scroll,
wmove(win, y, x); wmove(win, y, x);
if ((height < item_no) && (scroll + choice < item_no - 1)) { if ((height < item_no) && (scroll + choice < item_no - 1)) {
wattrset(win, darrow_attr); wattrset(win, dlg.darrow.atr);
waddch(win, ACS_DARROW); waddch(win, ACS_DARROW);
waddstr(win, "(+)"); waddstr(win, "(+)");
} else { } else {
wattrset(win, menubox_border_attr); wattrset(win, dlg.menubox_border.atr);
waddch(win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch(win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch(win, ACS_HLINE); waddch(win, ACS_HLINE);
@ -145,17 +146,18 @@ int dialog_checklist(const char *title, const char *prompt, int height,
dialog = newwin(height, width, y, x); dialog = newwin(height, width, y, x);
keypad(dialog, TRUE); keypad(dialog, TRUE);
draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); draw_box(dialog, 0, 0, height, width,
wattrset(dialog, border_attr); dlg.dialog.atr, dlg.border.atr);
wattrset(dialog, dlg.border.atr);
mvwaddch(dialog, height - 3, 0, ACS_LTEE); mvwaddch(dialog, height - 3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch(dialog, ACS_HLINE); waddch(dialog, ACS_HLINE);
wattrset(dialog, dialog_attr); wattrset(dialog, dlg.dialog.atr);
waddch(dialog, ACS_RTEE); waddch(dialog, ACS_RTEE);
print_title(dialog, title, width); print_title(dialog, title, width);
wattrset(dialog, dialog_attr); wattrset(dialog, dlg.dialog.atr);
print_autowrap(dialog, prompt, width - 2, 1, 3); print_autowrap(dialog, prompt, width - 2, 1, 3);
list_width = width - 6; list_width = width - 6;
@ -170,7 +172,7 @@ int dialog_checklist(const char *title, const char *prompt, int height,
/* draw a box around the list items */ /* draw a box around the list items */
draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2,
menubox_border_attr, menubox_attr); dlg.menubox_border.atr, dlg.menubox.atr);
/* Find length of longest item in order to center checklist */ /* Find length of longest item in order to center checklist */
check_x = 0; check_x = 0;

View file

@ -1,154 +0,0 @@
/*
* colors.h -- color attribute definitions
*
* 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.
*/
/*
* Default color definitions
*
* *_FG = foreground
* *_BG = background
* *_HL = highlight?
*/
#define SCREEN_FG COLOR_CYAN
#define SCREEN_BG COLOR_BLUE
#define SCREEN_HL TRUE
#define SHADOW_FG COLOR_BLACK
#define SHADOW_BG COLOR_BLACK
#define SHADOW_HL TRUE
#define DIALOG_FG COLOR_BLACK
#define DIALOG_BG COLOR_WHITE
#define DIALOG_HL FALSE
#define TITLE_FG COLOR_YELLOW
#define TITLE_BG COLOR_WHITE
#define TITLE_HL TRUE
#define BORDER_FG COLOR_WHITE
#define BORDER_BG COLOR_WHITE
#define BORDER_HL TRUE
#define BUTTON_ACTIVE_FG COLOR_WHITE
#define BUTTON_ACTIVE_BG COLOR_BLUE
#define BUTTON_ACTIVE_HL TRUE
#define BUTTON_INACTIVE_FG COLOR_BLACK
#define BUTTON_INACTIVE_BG COLOR_WHITE
#define BUTTON_INACTIVE_HL FALSE
#define BUTTON_KEY_ACTIVE_FG COLOR_WHITE
#define BUTTON_KEY_ACTIVE_BG COLOR_BLUE
#define BUTTON_KEY_ACTIVE_HL TRUE
#define BUTTON_KEY_INACTIVE_FG COLOR_RED
#define BUTTON_KEY_INACTIVE_BG COLOR_WHITE
#define BUTTON_KEY_INACTIVE_HL FALSE
#define BUTTON_LABEL_ACTIVE_FG COLOR_YELLOW
#define BUTTON_LABEL_ACTIVE_BG COLOR_BLUE
#define BUTTON_LABEL_ACTIVE_HL TRUE
#define BUTTON_LABEL_INACTIVE_FG COLOR_BLACK
#define BUTTON_LABEL_INACTIVE_BG COLOR_WHITE
#define BUTTON_LABEL_INACTIVE_HL TRUE
#define INPUTBOX_FG COLOR_BLACK
#define INPUTBOX_BG COLOR_WHITE
#define INPUTBOX_HL FALSE
#define INPUTBOX_BORDER_FG COLOR_BLACK
#define INPUTBOX_BORDER_BG COLOR_WHITE
#define INPUTBOX_BORDER_HL FALSE
#define SEARCHBOX_FG COLOR_BLACK
#define SEARCHBOX_BG COLOR_WHITE
#define SEARCHBOX_HL FALSE
#define SEARCHBOX_TITLE_FG COLOR_YELLOW
#define SEARCHBOX_TITLE_BG COLOR_WHITE
#define SEARCHBOX_TITLE_HL TRUE
#define SEARCHBOX_BORDER_FG COLOR_WHITE
#define SEARCHBOX_BORDER_BG COLOR_WHITE
#define SEARCHBOX_BORDER_HL TRUE
#define POSITION_INDICATOR_FG COLOR_YELLOW
#define POSITION_INDICATOR_BG COLOR_WHITE
#define POSITION_INDICATOR_HL TRUE
#define MENUBOX_FG COLOR_BLACK
#define MENUBOX_BG COLOR_WHITE
#define MENUBOX_HL FALSE
#define MENUBOX_BORDER_FG COLOR_WHITE
#define MENUBOX_BORDER_BG COLOR_WHITE
#define MENUBOX_BORDER_HL TRUE
#define ITEM_FG COLOR_BLACK
#define ITEM_BG COLOR_WHITE
#define ITEM_HL FALSE
#define ITEM_SELECTED_FG COLOR_WHITE
#define ITEM_SELECTED_BG COLOR_BLUE
#define ITEM_SELECTED_HL TRUE
#define TAG_FG COLOR_YELLOW
#define TAG_BG COLOR_WHITE
#define TAG_HL TRUE
#define TAG_SELECTED_FG COLOR_YELLOW
#define TAG_SELECTED_BG COLOR_BLUE
#define TAG_SELECTED_HL TRUE
#define TAG_KEY_FG COLOR_YELLOW
#define TAG_KEY_BG COLOR_WHITE
#define TAG_KEY_HL TRUE
#define TAG_KEY_SELECTED_FG COLOR_YELLOW
#define TAG_KEY_SELECTED_BG COLOR_BLUE
#define TAG_KEY_SELECTED_HL TRUE
#define CHECK_FG COLOR_BLACK
#define CHECK_BG COLOR_WHITE
#define CHECK_HL FALSE
#define CHECK_SELECTED_FG COLOR_WHITE
#define CHECK_SELECTED_BG COLOR_BLUE
#define CHECK_SELECTED_HL TRUE
#define UARROW_FG COLOR_GREEN
#define UARROW_BG COLOR_WHITE
#define UARROW_HL TRUE
#define DARROW_FG COLOR_GREEN
#define DARROW_BG COLOR_WHITE
#define DARROW_HL TRUE
/* End of default color definitions */
#define C_ATTR(x,y) ((x ? A_BOLD : 0) | COLOR_PAIR((y)))
#define COLOR_NAME_LEN 10
#define COLOR_COUNT 8
/*
* Global variables
*/
extern int color_table[][3];

View file

@ -87,62 +87,60 @@
#endif #endif
/* /*
* Attribute names * Color definitions
*/ */
#define screen_attr attributes[0] struct dialog_color {
#define shadow_attr attributes[1] chtype atr; /* Color attribute */
#define dialog_attr attributes[2] int fg; /* foreground */
#define title_attr attributes[3] int bg; /* background */
#define border_attr attributes[4] int hl; /* highlight this item */
#define button_active_attr attributes[5] };
#define button_inactive_attr attributes[6]
#define button_key_active_attr attributes[7]
#define button_key_inactive_attr attributes[8]
#define button_label_active_attr attributes[9]
#define button_label_inactive_attr attributes[10]
#define inputbox_attr attributes[11]
#define inputbox_border_attr attributes[12]
#define searchbox_attr attributes[13]
#define searchbox_title_attr attributes[14]
#define searchbox_border_attr attributes[15]
#define position_indicator_attr attributes[16]
#define menubox_attr attributes[17]
#define menubox_border_attr attributes[18]
#define item_attr attributes[19]
#define item_selected_attr attributes[20]
#define tag_attr attributes[21]
#define tag_selected_attr attributes[22]
#define tag_key_attr attributes[23]
#define tag_key_selected_attr attributes[24]
#define check_attr attributes[25]
#define check_selected_attr attributes[26]
#define uarrow_attr attributes[27]
#define darrow_attr attributes[28]
/* number of attributes */ struct dialog_info {
#define ATTRIBUTE_COUNT 29 const char *backtitle;
struct dialog_color screen;
struct dialog_color shadow;
struct dialog_color dialog;
struct dialog_color title;
struct dialog_color border;
struct dialog_color button_active;
struct dialog_color button_inactive;
struct dialog_color button_key_active;
struct dialog_color button_key_inactive;
struct dialog_color button_label_active;
struct dialog_color button_label_inactive;
struct dialog_color inputbox;
struct dialog_color inputbox_border;
struct dialog_color searchbox;
struct dialog_color searchbox_title;
struct dialog_color searchbox_border;
struct dialog_color position_indicator;
struct dialog_color menubox;
struct dialog_color menubox_border;
struct dialog_color item;
struct dialog_color item_selected;
struct dialog_color tag;
struct dialog_color tag_selected;
struct dialog_color tag_key;
struct dialog_color tag_key_selected;
struct dialog_color check;
struct dialog_color check_selected;
struct dialog_color uarrow;
struct dialog_color darrow;
};
/* /*
* Global variables * Global variables
*/ */
extern bool use_colors; extern struct dialog_info dlg;
extern bool use_shadow;
extern chtype attributes[];
extern const char *backtitle;
/* /*
* Function prototypes * Function prototypes
*/ */
extern void create_rc(const char *filename);
extern int parse_rc(void);
void init_dialog(void); void init_dialog(void);
void end_dialog(void); void end_dialog(void);
void attr_clear(WINDOW * win, int height, int width, chtype attr); void attr_clear(WINDOW * win, int height, int width, chtype attr);
void dialog_clear(void); void dialog_clear(void);
void color_setup(void);
void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x); void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x);
void print_button(WINDOW * win, const char *label, int y, int x, int selected); void print_button(WINDOW * win, const char *label, int y, int x, int selected);
void print_title(WINDOW *dialog, const char *title, int width); void print_title(WINDOW *dialog, const char *title, int width);

View file

@ -58,17 +58,18 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width
dialog = newwin(height, width, y, x); dialog = newwin(height, width, y, x);
keypad(dialog, TRUE); keypad(dialog, TRUE);
draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); draw_box(dialog, 0, 0, height, width,
wattrset(dialog, border_attr); dlg.dialog.atr, dlg.border.atr);
wattrset(dialog, dlg.border.atr);
mvwaddch(dialog, height - 3, 0, ACS_LTEE); mvwaddch(dialog, height - 3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch(dialog, ACS_HLINE); waddch(dialog, ACS_HLINE);
wattrset(dialog, dialog_attr); wattrset(dialog, dlg.dialog.atr);
waddch(dialog, ACS_RTEE); waddch(dialog, ACS_RTEE);
print_title(dialog, title, width); print_title(dialog, title, width);
wattrset(dialog, dialog_attr); wattrset(dialog, dlg.dialog.atr);
print_autowrap(dialog, prompt, width - 2, 1, 3); print_autowrap(dialog, prompt, width - 2, 1, 3);
/* Draw the input field box */ /* Draw the input field box */
@ -76,13 +77,14 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width
getyx(dialog, y, x); getyx(dialog, y, x);
box_y = y + 2; box_y = y + 2;
box_x = (width - box_width) / 2; box_x = (width - box_width) / 2;
draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2, border_attr, dialog_attr); draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2,
dlg.border.atr, dlg.dialog.atr);
print_buttons(dialog, height, width, 0); print_buttons(dialog, height, width, 0);
/* Set up the initial value */ /* Set up the initial value */
wmove(dialog, box_y, box_x); wmove(dialog, box_y, box_x);
wattrset(dialog, inputbox_attr); wattrset(dialog, dlg.inputbox.atr);
if (!init) if (!init)
instr[0] = '\0'; instr[0] = '\0';
@ -120,7 +122,7 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width
case KEY_BACKSPACE: case KEY_BACKSPACE:
case 127: case 127:
if (input_x || scroll) { if (input_x || scroll) {
wattrset(dialog, inputbox_attr); wattrset(dialog, dlg.inputbox.atr);
if (!input_x) { if (!input_x) {
scroll = scroll < box_width - 1 ? 0 : scroll - (box_width - 1); scroll = scroll < box_width - 1 ? 0 : scroll - (box_width - 1);
wmove(dialog, box_y, box_x); wmove(dialog, box_y, box_x);
@ -140,7 +142,7 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width
default: default:
if (key < 0x100 && isprint(key)) { if (key < 0x100 && isprint(key)) {
if (scroll + input_x < MAX_LEN) { if (scroll + input_x < MAX_LEN) {
wattrset(dialog, inputbox_attr); wattrset(dialog, dlg.inputbox.atr);
instr[scroll + input_x] = key; instr[scroll + input_x] = key;
instr[scroll + input_x + 1] = '\0'; instr[scroll + input_x + 1] = '\0';
if (input_x == box_width - 1) { if (input_x == box_width - 1) {

View file

@ -78,11 +78,11 @@ int main(int argc, const char *const *argv)
offset += 2; offset += 2;
} }
} else if (!strcmp(argv[offset + 1], "--backtitle")) { } else if (!strcmp(argv[offset + 1], "--backtitle")) {
if (backtitle != NULL) { if (dlg.backtitle != NULL) {
Usage(argv[0]); Usage(argv[0]);
exit(-1); exit(-1);
} else { } else {
backtitle = argv[offset + 2]; dlg.backtitle = argv[offset + 2];
offset += 2; offset += 2;
} }
} else if (!strcmp(argv[offset + 1], "--clear")) { } else if (!strcmp(argv[offset + 1], "--clear")) {
@ -123,7 +123,7 @@ int main(int argc, const char *const *argv)
retval = (*(modePtr->jumper)) (title, argc - offset, argv + offset); retval = (*(modePtr->jumper)) (title, argc - offset, argv + offset);
if (opt_clear) { /* clear screen before exit */ if (opt_clear) { /* clear screen before exit */
attr_clear(stdscr, LINES, COLS, screen_attr); attr_clear(stdscr, LINES, COLS, dlg.screen.atr);
refresh(); refresh();
} }
end_dialog(); end_dialog();

View file

@ -74,7 +74,7 @@ static void do_print_item(WINDOW * win, const char *item, int choice,
j = first_alpha(menu_item, "YyNnMmHh"); j = first_alpha(menu_item, "YyNnMmHh");
/* Clear 'residue' of last item */ /* Clear 'residue' of last item */
wattrset(win, menubox_attr); wattrset(win, dlg.menubox.atr);
wmove(win, choice, 0); wmove(win, choice, 0);
#if OLD_NCURSES #if OLD_NCURSES
{ {
@ -85,10 +85,11 @@ static void do_print_item(WINDOW * win, const char *item, int choice,
#else #else
wclrtoeol(win); wclrtoeol(win);
#endif #endif
wattrset(win, selected ? item_selected_attr : item_attr); wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
mvwaddstr(win, choice, item_x, menu_item); mvwaddstr(win, choice, item_x, menu_item);
if (hotkey) { if (hotkey) {
wattrset(win, selected ? tag_key_selected_attr : tag_key_attr); wattrset(win, selected ? dlg.tag_key_selected.atr
: dlg.tag_key.atr);
mvwaddch(win, choice, item_x + j, menu_item[j]); mvwaddch(win, choice, item_x + j, menu_item[j]);
} }
if (selected) { if (selected) {
@ -117,11 +118,11 @@ static void print_arrows(WINDOW * win, int item_no, int scroll, int y, int x,
wmove(win, y, x); wmove(win, y, x);
if (scroll > 0) { if (scroll > 0) {
wattrset(win, uarrow_attr); wattrset(win, dlg.uarrow.atr);
waddch(win, ACS_UARROW); waddch(win, ACS_UARROW);
waddstr(win, "(-)"); waddstr(win, "(-)");
} else { } else {
wattrset(win, menubox_attr); wattrset(win, dlg.menubox.atr);
waddch(win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch(win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch(win, ACS_HLINE); waddch(win, ACS_HLINE);
@ -133,11 +134,11 @@ static void print_arrows(WINDOW * win, int item_no, int scroll, int y, int x,
wrefresh(win); wrefresh(win);
if ((height < item_no) && (scroll + height < item_no)) { if ((height < item_no) && (scroll + height < item_no)) {
wattrset(win, darrow_attr); wattrset(win, dlg.darrow.atr);
waddch(win, ACS_DARROW); waddch(win, ACS_DARROW);
waddstr(win, "(+)"); waddstr(win, "(+)");
} else { } else {
wattrset(win, menubox_border_attr); wattrset(win, dlg.menubox_border.atr);
waddch(win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch(win, ACS_HLINE); waddch(win, ACS_HLINE);
waddch(win, ACS_HLINE); waddch(win, ACS_HLINE);
@ -199,18 +200,19 @@ int dialog_menu(const char *title, const char *prompt, int height, int width,
dialog = newwin(height, width, y, x); dialog = newwin(height, width, y, x);
keypad(dialog, TRUE); keypad(dialog, TRUE);
draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); draw_box(dialog, 0, 0, height, width,
wattrset(dialog, border_attr); dlg.dialog.atr, dlg.border.atr);
wattrset(dialog, dlg.border.atr);
mvwaddch(dialog, height - 3, 0, ACS_LTEE); mvwaddch(dialog, height - 3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch(dialog, ACS_HLINE); waddch(dialog, ACS_HLINE);
wattrset(dialog, dialog_attr); wattrset(dialog, dlg.dialog.atr);
wbkgdset(dialog, dialog_attr & A_COLOR); wbkgdset(dialog, dlg.dialog.atr & A_COLOR);
waddch(dialog, ACS_RTEE); waddch(dialog, ACS_RTEE);
print_title(dialog, title, width); print_title(dialog, title, width);
wattrset(dialog, dialog_attr); wattrset(dialog, dlg.dialog.atr);
print_autowrap(dialog, prompt, width - 2, 1, 3); print_autowrap(dialog, prompt, width - 2, 1, 3);
menu_width = width - 6; menu_width = width - 6;
@ -224,7 +226,7 @@ int dialog_menu(const char *title, const char *prompt, int height, int width,
/* draw a box around the menu items */ /* draw a box around the menu items */
draw_box(dialog, box_y, box_x, menu_height + 2, menu_width + 2, draw_box(dialog, box_y, box_x, menu_height + 2, menu_width + 2,
menubox_border_attr, menubox_attr); dlg.menubox_border.atr, dlg.menubox.atr);
item_x = (menu_width - 70) / 2; item_x = (menu_width - 70) / 2;

View file

@ -40,19 +40,20 @@ int dialog_msgbox(const char *title, const char *prompt, int height, int width,
dialog = newwin(height, width, y, x); dialog = newwin(height, width, y, x);
keypad(dialog, TRUE); keypad(dialog, TRUE);
draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); draw_box(dialog, 0, 0, height, width,
dlg.dialog.atr, dlg.border.atr);
print_title(dialog, title, width); print_title(dialog, title, width);
wattrset(dialog, dialog_attr); wattrset(dialog, dlg.dialog.atr);
print_autowrap(dialog, prompt, width - 2, 1, 2); print_autowrap(dialog, prompt, width - 2, 1, 2);
if (pause) { if (pause) {
wattrset(dialog, border_attr); wattrset(dialog, dlg.border.atr);
mvwaddch(dialog, height - 3, 0, ACS_LTEE); mvwaddch(dialog, height - 3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch(dialog, ACS_HLINE); waddch(dialog, ACS_HLINE);
wattrset(dialog, dialog_attr); wattrset(dialog, dlg.dialog.atr);
waddch(dialog, ACS_RTEE); waddch(dialog, ACS_RTEE);
print_button(dialog, " Ok ", height - 2, width / 2 - 4, TRUE); print_button(dialog, " Ok ", height - 2, width / 2 - 4, TRUE);

View file

@ -87,20 +87,21 @@ int dialog_textbox(const char *title, const char *file, int height, int width)
/* Create window for text region, used for scrolling text */ /* Create window for text region, used for scrolling text */
text = subwin(dialog, height - 4, width - 2, y + 1, x + 1); text = subwin(dialog, height - 4, width - 2, y + 1, x + 1);
wattrset(text, dialog_attr); wattrset(text, dlg.dialog.atr);
wbkgdset(text, dialog_attr & A_COLOR); wbkgdset(text, dlg.dialog.atr & A_COLOR);
keypad(text, TRUE); keypad(text, TRUE);
/* register the new window, along with its borders */ /* register the new window, along with its borders */
draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); draw_box(dialog, 0, 0, height, width,
dlg.dialog.atr, dlg.border.atr);
wattrset(dialog, border_attr); wattrset(dialog, dlg.border.atr);
mvwaddch(dialog, height - 3, 0, ACS_LTEE); mvwaddch(dialog, height - 3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch(dialog, ACS_HLINE); waddch(dialog, ACS_HLINE);
wattrset(dialog, dialog_attr); wattrset(dialog, dlg.dialog.atr);
wbkgdset(dialog, dialog_attr & A_COLOR); wbkgdset(dialog, dlg.dialog.atr & A_COLOR);
waddch(dialog, ACS_RTEE); waddch(dialog, ACS_RTEE);
print_title(dialog, title, width); print_title(dialog, title, width);
@ -110,7 +111,7 @@ int dialog_textbox(const char *title, const char *file, int height, int width)
getyx(dialog, cur_y, cur_x); /* Save cursor position */ getyx(dialog, cur_y, cur_x); /* Save cursor position */
/* Print first page of text */ /* Print first page of text */
attr_clear(text, height - 4, width - 2, dialog_attr); attr_clear(text, height - 4, width - 2, dlg.dialog.atr);
print_page(text, height - 4, width - 2); print_page(text, height - 4, width - 2);
print_position(dialog, height, width); print_position(dialog, height, width);
wmove(dialog, cur_y, cur_x); /* Restore cursor position */ wmove(dialog, cur_y, cur_x); /* Restore cursor position */
@ -524,8 +525,8 @@ static void print_position(WINDOW * win, int height, int width)
fprintf(stderr, "\nError moving file pointer in print_position().\n"); fprintf(stderr, "\nError moving file pointer in print_position().\n");
exit(-1); exit(-1);
} }
wattrset(win, position_indicator_attr); wattrset(win, dlg.position_indicator.atr);
wbkgdset(win, position_indicator_attr & A_COLOR); wbkgdset(win, dlg.position_indicator.atr & A_COLOR);
percent = !file_size ? percent = !file_size ?
100 : ((fpos - bytes_read + page - buf) * 100) / file_size; 100 : ((fpos - bytes_read + page - buf) * 100) / file_size;
wmove(win, height - 3, width - 9); wmove(win, height - 3, width - 9);

View file

@ -21,85 +21,141 @@
#include "dialog.h" #include "dialog.h"
/* use colors by default? */ struct dialog_info dlg;
bool use_colors = 1;
const char *backtitle = NULL; static void set_mono_theme(void)
{
dlg.screen.atr = A_NORMAL;
dlg.shadow.atr = A_NORMAL;
dlg.dialog.atr = A_NORMAL;
dlg.title.atr = A_BOLD;
dlg.border.atr = A_NORMAL;
dlg.button_active.atr = A_REVERSE;
dlg.button_inactive.atr = A_DIM;
dlg.button_key_active.atr = A_REVERSE;
dlg.button_key_inactive.atr = A_BOLD;
dlg.button_label_active.atr = A_REVERSE;
dlg.button_label_inactive.atr = A_NORMAL;
dlg.inputbox.atr = A_NORMAL;
dlg.inputbox_border.atr = A_NORMAL;
dlg.searchbox.atr = A_NORMAL;
dlg.searchbox_title.atr = A_BOLD;
dlg.searchbox_border.atr = A_NORMAL;
dlg.position_indicator.atr = A_BOLD;
dlg.menubox.atr = A_NORMAL;
dlg.menubox_border.atr = A_NORMAL;
dlg.item.atr = A_NORMAL;
dlg.item_selected.atr = A_REVERSE;
dlg.tag.atr = A_BOLD;
dlg.tag_selected.atr = A_REVERSE;
dlg.tag_key.atr = A_BOLD;
dlg.tag_key_selected.atr = A_REVERSE;
dlg.check.atr = A_BOLD;
dlg.check_selected.atr = A_REVERSE;
dlg.uarrow.atr = A_BOLD;
dlg.darrow.atr = A_BOLD;
}
#define DLG_COLOR(dialog, f, b, h) \
do { \
dlg.dialog.fg = (f); \
dlg.dialog.bg = (b); \
dlg.dialog.hl = (h); \
} while (0)
static void set_classic_theme(void)
{
DLG_COLOR(screen, COLOR_CYAN, COLOR_BLUE, true);
DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, true);
DLG_COLOR(dialog, COLOR_BLACK, COLOR_WHITE, false);
DLG_COLOR(title, COLOR_YELLOW, COLOR_WHITE, true);
DLG_COLOR(border, COLOR_WHITE, COLOR_WHITE, true);
DLG_COLOR(button_active, COLOR_WHITE, COLOR_BLUE, true);
DLG_COLOR(button_inactive, COLOR_BLACK, COLOR_WHITE, false);
DLG_COLOR(button_key_active, COLOR_WHITE, COLOR_BLUE, true);
DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_WHITE, false);
DLG_COLOR(button_label_active, COLOR_YELLOW, COLOR_BLUE, true);
DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_WHITE, true);
DLG_COLOR(inputbox, COLOR_BLACK, COLOR_WHITE, false);
DLG_COLOR(inputbox_border, COLOR_BLACK, COLOR_WHITE, false);
DLG_COLOR(searchbox, COLOR_BLACK, COLOR_WHITE, false);
DLG_COLOR(searchbox_title, COLOR_YELLOW, COLOR_WHITE, true);
DLG_COLOR(searchbox_border, COLOR_WHITE, COLOR_WHITE, true);
DLG_COLOR(position_indicator, COLOR_YELLOW, COLOR_WHITE, true);
DLG_COLOR(menubox, COLOR_BLACK, COLOR_WHITE, false);
DLG_COLOR(menubox_border, COLOR_WHITE, COLOR_WHITE, true);
DLG_COLOR(item, COLOR_BLACK, COLOR_WHITE, false);
DLG_COLOR(item_selected, COLOR_WHITE, COLOR_BLUE, true);
DLG_COLOR(tag, COLOR_YELLOW, COLOR_WHITE, true);
DLG_COLOR(tag_selected, COLOR_YELLOW, COLOR_BLUE, true);
DLG_COLOR(tag_key, COLOR_YELLOW, COLOR_WHITE, true);
DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_BLUE, true);
DLG_COLOR(check, COLOR_BLACK, COLOR_WHITE, false);
DLG_COLOR(check_selected, COLOR_WHITE, COLOR_BLUE, true);
DLG_COLOR(uarrow, COLOR_GREEN, COLOR_WHITE, true);
DLG_COLOR(darrow, COLOR_GREEN, COLOR_WHITE, true);
}
static void init_one_color(struct dialog_color *color)
{
static int pair = 0;
pair++;
init_pair(pair, color->fg, color->bg);
if (color->hl)
color->atr = A_BOLD | COLOR_PAIR(pair);
else
color->atr = COLOR_PAIR(pair);
}
static void init_dialog_colors(void)
{
init_one_color(&dlg.screen);
init_one_color(&dlg.shadow);
init_one_color(&dlg.dialog);
init_one_color(&dlg.title);
init_one_color(&dlg.border);
init_one_color(&dlg.button_active);
init_one_color(&dlg.button_inactive);
init_one_color(&dlg.button_key_active);
init_one_color(&dlg.button_key_inactive);
init_one_color(&dlg.button_label_active);
init_one_color(&dlg.button_label_inactive);
init_one_color(&dlg.inputbox);
init_one_color(&dlg.inputbox_border);
init_one_color(&dlg.searchbox);
init_one_color(&dlg.searchbox_title);
init_one_color(&dlg.searchbox_border);
init_one_color(&dlg.position_indicator);
init_one_color(&dlg.menubox);
init_one_color(&dlg.menubox_border);
init_one_color(&dlg.item);
init_one_color(&dlg.item_selected);
init_one_color(&dlg.tag);
init_one_color(&dlg.tag_selected);
init_one_color(&dlg.tag_key);
init_one_color(&dlg.tag_key_selected);
init_one_color(&dlg.check);
init_one_color(&dlg.check_selected);
init_one_color(&dlg.uarrow);
init_one_color(&dlg.darrow);
}
/* /*
* Attribute values, default is for mono display * Setup for color display
*/ */
chtype attributes[] = { static void color_setup(void)
A_NORMAL, /* screen_attr */ {
A_NORMAL, /* shadow_attr */ if (has_colors()) { /* Terminal supports color? */
A_NORMAL, /* dialog_attr */ start_color();
A_BOLD, /* title_attr */ set_classic_theme();
A_NORMAL, /* border_attr */ init_dialog_colors();
A_REVERSE, /* button_active_attr */ }
A_DIM, /* button_inactive_attr */ else
A_REVERSE, /* button_key_active_attr */ {
A_BOLD, /* button_key_inactive_attr */ set_mono_theme();
A_REVERSE, /* button_label_active_attr */ }
A_NORMAL, /* button_label_inactive_attr */ }
A_NORMAL, /* inputbox_attr */
A_NORMAL, /* inputbox_border_attr */
A_NORMAL, /* searchbox_attr */
A_BOLD, /* searchbox_title_attr */
A_NORMAL, /* searchbox_border_attr */
A_BOLD, /* position_indicator_attr */
A_NORMAL, /* menubox_attr */
A_NORMAL, /* menubox_border_attr */
A_NORMAL, /* item_attr */
A_REVERSE, /* item_selected_attr */
A_BOLD, /* tag_attr */
A_REVERSE, /* tag_selected_attr */
A_BOLD, /* tag_key_attr */
A_REVERSE, /* tag_key_selected_attr */
A_BOLD, /* check_attr */
A_REVERSE, /* check_selected_attr */
A_BOLD, /* uarrow_attr */
A_BOLD /* darrow_attr */
};
#include "colors.h"
/*
* Table of color values
*/
int color_table[][3] = {
{SCREEN_FG, SCREEN_BG, SCREEN_HL},
{SHADOW_FG, SHADOW_BG, SHADOW_HL},
{DIALOG_FG, DIALOG_BG, DIALOG_HL},
{TITLE_FG, TITLE_BG, TITLE_HL},
{BORDER_FG, BORDER_BG, BORDER_HL},
{BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL},
{BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL},
{BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL},
{BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG,
BUTTON_KEY_INACTIVE_HL},
{BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG,
BUTTON_LABEL_ACTIVE_HL},
{BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG,
BUTTON_LABEL_INACTIVE_HL},
{INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL},
{INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL},
{SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL},
{SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL},
{SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL},
{POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL},
{MENUBOX_FG, MENUBOX_BG, MENUBOX_HL},
{MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL},
{ITEM_FG, ITEM_BG, ITEM_HL},
{ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL},
{TAG_FG, TAG_BG, TAG_HL},
{TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL},
{TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL},
{TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL},
{CHECK_FG, CHECK_BG, CHECK_HL},
{CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
{UARROW_FG, UARROW_BG, UARROW_HL},
{DARROW_FG, DARROW_BG, DARROW_HL},
}; /* color_table */
/* /*
* Set window to attribute 'attr' * Set window to attribute 'attr'
@ -119,13 +175,13 @@ void attr_clear(WINDOW * win, int height, int width, chtype attr)
void dialog_clear(void) void dialog_clear(void)
{ {
attr_clear(stdscr, LINES, COLS, screen_attr); attr_clear(stdscr, LINES, COLS, dlg.screen.atr);
/* Display background title if it exists ... - SLH */ /* Display background title if it exists ... - SLH */
if (backtitle != NULL) { if (dlg.backtitle != NULL) {
int i; int i;
wattrset(stdscr, screen_attr); wattrset(stdscr, dlg.screen.atr);
mvwaddstr(stdscr, 0, 1, (char *)backtitle); mvwaddstr(stdscr, 0, 1, (char *)dlg.backtitle);
wmove(stdscr, 1, 1); wmove(stdscr, 1, 1);
for (i = 1; i < COLS - 1; i++) for (i = 1; i < COLS - 1; i++)
waddch(stdscr, ACS_HLINE); waddch(stdscr, ACS_HLINE);
@ -142,33 +198,10 @@ void init_dialog(void)
keypad(stdscr, TRUE); keypad(stdscr, TRUE);
cbreak(); cbreak();
noecho(); noecho();
color_setup();
if (use_colors) /* Set up colors */
color_setup();
dialog_clear(); dialog_clear();
} }
/*
* Setup for color display
*/
void color_setup(void)
{
int i;
if (has_colors()) { /* Terminal supports color? */
start_color();
/* Initialize color pairs */
for (i = 0; i < ATTRIBUTE_COUNT; i++)
init_pair(i + 1, color_table[i][0], color_table[i][1]);
/* Setup color attributes */
for (i = 0; i < ATTRIBUTE_COUNT; i++)
attributes[i] = C_ATTR(color_table[i][2], i + 1);
}
}
/* /*
* End using dialog functions. * End using dialog functions.
*/ */
@ -184,7 +217,7 @@ void print_title(WINDOW *dialog, const char *title, int width)
{ {
if (title) { if (title) {
int tlen = MIN(width - 2, strlen(title)); int tlen = MIN(width - 2, strlen(title));
wattrset(dialog, title_attr); wattrset(dialog, dlg.title.atr);
mvwaddch(dialog, 0, (width - tlen) / 2 - 1, ' '); mvwaddch(dialog, 0, (width - tlen) / 2 - 1, ' ');
mvwaddnstr(dialog, 0, (width - tlen)/2, title, tlen); mvwaddnstr(dialog, 0, (width - tlen)/2, title, tlen);
waddch(dialog, ' '); waddch(dialog, ' ');
@ -264,21 +297,23 @@ void print_button(WINDOW * win, const char *label, int y, int x, int selected)
int i, temp; int i, temp;
wmove(win, y, x); wmove(win, y, x);
wattrset(win, selected ? button_active_attr : button_inactive_attr); wattrset(win, selected ? dlg.button_active.atr
: dlg.button_inactive.atr);
waddstr(win, "<"); waddstr(win, "<");
temp = strspn(label, " "); temp = strspn(label, " ");
label += temp; label += temp;
wattrset(win, selected ? button_label_active_attr wattrset(win, selected ? dlg.button_label_active.atr
: button_label_inactive_attr); : dlg.button_label_inactive.atr);
for (i = 0; i < temp; i++) for (i = 0; i < temp; i++)
waddch(win, ' '); waddch(win, ' ');
wattrset(win, selected ? button_key_active_attr wattrset(win, selected ? dlg.button_key_active.atr
: button_key_inactive_attr); : dlg.button_key_inactive.atr);
waddch(win, label[0]); waddch(win, label[0]);
wattrset(win, selected ? button_label_active_attr wattrset(win, selected ? dlg.button_label_active.atr
: button_label_inactive_attr); : dlg.button_label_inactive.atr);
waddstr(win, (char *)label + 1); waddstr(win, (char *)label + 1);
wattrset(win, selected ? button_active_attr : button_inactive_attr); wattrset(win, selected ? dlg.button_active.atr
: dlg.button_inactive.atr);
waddstr(win, ">"); waddstr(win, ">");
wmove(win, y, x + temp + 1); wmove(win, y, x + temp + 1);
} }
@ -326,7 +361,7 @@ void draw_shadow(WINDOW * win, int y, int x, int height, int width)
int i; int i;
if (has_colors()) { /* Whether terminal supports color? */ if (has_colors()) { /* Whether terminal supports color? */
wattrset(win, shadow_attr); wattrset(win, dlg.shadow.atr);
wmove(win, y + height, x + 2); wmove(win, y + height, x + 2);
for (i = 0; i < width; i++) for (i = 0; i < width; i++)
waddch(win, winch(win) & A_CHARTEXT); waddch(win, winch(win) & A_CHARTEXT);

View file

@ -53,17 +53,18 @@ int dialog_yesno(const char *title, const char *prompt, int height, int width)
dialog = newwin(height, width, y, x); dialog = newwin(height, width, y, x);
keypad(dialog, TRUE); keypad(dialog, TRUE);
draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); draw_box(dialog, 0, 0, height, width,
wattrset(dialog, border_attr); dlg.dialog.atr, dlg.border.atr);
wattrset(dialog, dlg.border.atr);
mvwaddch(dialog, height - 3, 0, ACS_LTEE); mvwaddch(dialog, height - 3, 0, ACS_LTEE);
for (i = 0; i < width - 2; i++) for (i = 0; i < width - 2; i++)
waddch(dialog, ACS_HLINE); waddch(dialog, ACS_HLINE);
wattrset(dialog, dialog_attr); wattrset(dialog, dlg.dialog.atr);
waddch(dialog, ACS_RTEE); waddch(dialog, ACS_RTEE);
print_title(dialog, title, width); print_title(dialog, title, width);
wattrset(dialog, dialog_attr); wattrset(dialog, dlg.dialog.atr);
print_autowrap(dialog, prompt, width - 2, 1, 3); print_autowrap(dialog, prompt, width - 2, 1, 3);
print_buttons(dialog, height, width, 0); print_buttons(dialog, height, width, 0);