tty menu coloring

There was a report during beta testing that menu lines which were
displayed in color showed the whole line in color, unless/until an
item was selected or unselected, in which case the '-', '+', or '#'
was rendered in monochrome.  The suggestion then was to redraw the
selection character in color, but I went the other way.  Menu
entries will render the selector letter and selection indicator in
monochrome all the time, and only the text of the menu entry will
honor menucolors.
This commit is contained in:
PatR
2016-03-21 18:26:48 -07:00
parent 3353ad1114
commit 98b5f581bb
2 changed files with 67 additions and 37 deletions

View File

@@ -205,6 +205,7 @@ tty: responding with <return> or <enter> during role, race, &c selection
behaved same as <escape> to quit; now it will pick [random] instead
tty: rename struct variable 'filter' (role.c) and function 'winch()' (wintty.c)
to avoid conflicts with <curses.h>
tty: skip selector letter and selection indicator (-,+,#) during menu coloring
unix/X11: in top level Makefile, some commented out definitions of VARDATND
misspelled pilemark.xbm (as pilemark.xpm)
unix: options file with CR+LF line ends and an invalid option line resulted in

View File

@@ -152,14 +152,15 @@ STATIC_DCL void FDECL(erase_menu_or_text,
STATIC_DCL void FDECL(free_window_info, (struct WinDesc *, BOOLEAN_P));
STATIC_DCL void FDECL(dmore, (struct WinDesc *, const char *));
STATIC_DCL void FDECL(set_item_state, (winid, int, tty_menu_item *));
STATIC_DCL void FDECL(set_all_on_page,
(winid, tty_menu_item *, tty_menu_item *));
STATIC_DCL void FDECL(unset_all_on_page,
(winid, tty_menu_item *, tty_menu_item *));
STATIC_DCL void FDECL(invert_all_on_page,
(winid, tty_menu_item *, tty_menu_item *, CHAR_P));
STATIC_DCL void FDECL(invert_all,
(winid, tty_menu_item *, tty_menu_item *, CHAR_P));
STATIC_DCL void FDECL(set_all_on_page, (winid, tty_menu_item *,
tty_menu_item *));
STATIC_DCL void FDECL(unset_all_on_page, (winid, tty_menu_item *,
tty_menu_item *));
STATIC_DCL void FDECL(invert_all_on_page, (winid, tty_menu_item *,
tty_menu_item *, CHAR_P));
STATIC_DCL void FDECL(invert_all, (winid, tty_menu_item *,
tty_menu_item *, CHAR_P));
STATIC_DCL void FDECL(toggle_menu_attr, (BOOLEAN_P, int, int));
STATIC_DCL void FDECL(process_menu_window, (winid, struct WinDesc *));
STATIC_DCL void FDECL(process_text_window, (winid, struct WinDesc *));
STATIC_DCL tty_menu_item *FDECL(reverse, (tty_menu_item *));
@@ -1697,6 +1698,31 @@ char acc; /* group accelerator, 0 => all */
}
}
/* support menucolor in addition to caller-supplied attribute */
STATIC_OVL void
toggle_menu_attr(on, color, attr)
boolean on;
int color, attr;
{
if (on) {
term_start_attr(attr);
#ifdef TEXTCOLOR
if (color != NO_COLOR)
term_start_color(color);
#endif
} else {
#ifdef TEXTCOLOR
if (color != NO_COLOR)
term_end_color();
#endif
term_end_attr(attr);
}
#ifndef TEXTCOLOR
nhUse(color);
#endif
}
STATIC_OVL void
process_menu_window(window, cw)
winid window;
@@ -1704,7 +1730,7 @@ struct WinDesc *cw;
{
tty_menu_item *page_start, *page_end, *curr;
long count;
int n, curr_page, page_lines, resp_len;
int n, attr_n, curr_page, page_lines, resp_len;
boolean finished, counting, reset_count;
char *cp, *rp, resp[QBUFSZ], gacc[QBUFSZ], *msave, *morestr, really_morc;
#define MENU_EXPLICIT_CHOICE 0x7f /* pseudo menu manipulation char */
@@ -1775,8 +1801,8 @@ struct WinDesc *cw;
page_end = cw->plist[curr_page + 1];
for (page_lines = 0, curr = page_start; curr != page_end;
page_lines++, curr = curr->next) {
int color = NO_COLOR, attr = ATR_NONE;
boolean menucolr = FALSE;
int attr, color = NO_COLOR;
if (curr->selector)
*rp++ = curr->selector;
@@ -1786,6 +1812,21 @@ struct WinDesc *cw;
(void) putchar(' ');
++ttyDisplay->curx;
if (!iflags.use_menu_color
|| !get_menu_coloring(curr->str, &color, &attr))
attr = curr->attr;
/* which character to start attribute highlighting;
whole line for headers and such, after the selector
character and space and selection indicator for menu
lines (including fake ones that simulate grayed-out
entries, so we don't rely on curr->identifier here) */
attr_n = 0; /* whole line */
if (curr->str[0] && curr->str[1] && curr->str[2]
&& curr->str[1] == ' ' && index("-+#", curr->str[2]))
attr_n = 2 + 1; /* after selection indicator */
/*
* Don't use xputs() because (1) under unix it calls
* tputstr() which will interpret a '*' as some kind
@@ -1793,27 +1834,20 @@ struct WinDesc *cw;
* actually output the character. We're faster doing
* this.
*/
if (iflags.use_menu_color
&& (menucolr = get_menu_coloring(curr->str, &color,
&attr))) {
term_start_attr(attr);
#ifdef TEXTCOLOR
if (color != NO_COLOR)
term_start_color(color);
#endif
} else
term_start_attr(curr->attr);
for (n = 0, cp = curr->str;
*cp &&
#ifndef WIN32CON
*cp
&& (int) ++ttyDisplay->curx < (int) ttyDisplay->cols;
cp++, n++)
(int) ++ttyDisplay->curx < (int) ttyDisplay->cols;
#else
*cp
&& (int) ttyDisplay->curx < (int) ttyDisplay->cols;
cp++, n++, ttyDisplay->curx++)
(int) ttyDisplay->curx < (int) ttyDisplay->cols;
ttyDisplay->curx++,
#endif
if (n == 2 && curr->identifier.a_void != 0
cp++, n++) {
if (n == attr_n && (color != NO_COLOR
|| attr != ATR_NONE))
toggle_menu_attr(TRUE, color, attr);
if (n == 2
&& curr->identifier.a_void != 0
&& curr->selected) {
if (curr->count == -1L)
(void) putchar('+'); /* all selected */
@@ -1821,15 +1855,10 @@ struct WinDesc *cw;
(void) putchar('#'); /* count selected */
} else
(void) putchar(*cp);
if (iflags.use_menu_color && menucolr) {
#ifdef TEXTCOLOR
if (color != NO_COLOR)
term_end_color();
#endif
term_end_attr(attr);
} else
term_end_attr(curr->attr);
}
} /* for *cp */
if (n > attr_n && (color != NO_COLOR || attr != ATR_NONE))
toggle_menu_attr(FALSE, color, attr);
} /* if npages > 0 */
} else {
page_start = 0;
page_end = 0;