petattr: Change accepted parameters, add support for tty

This commit is contained in:
Pasi Kallinen
2024-01-28 10:05:42 +02:00
parent bac8ebad34
commit fd8b2b58d1
8 changed files with 57 additions and 151 deletions
+4 -16
View File
@@ -4039,7 +4039,7 @@ The behavior of this option depends on the type of windowing you use.
In text windowing, text highlighting or inverse video is often used; In text windowing, text highlighting or inverse video is often used;
with tiles, generally displays a heart symbol near pets. with tiles, generally displays a heart symbol near pets.
.lp "" .lp ""
With the curses interface, the With the tty or curses interface, the
.op petattr .op petattr
option controls how to highlight pets and setting it will turn the option controls how to highlight pets and setting it will turn the
.op hilite_pet .op hilite_pet
@@ -4383,21 +4383,9 @@ pets on the map.
Effectively a superset of the Effectively a superset of the
.op hilite_pet .op hilite_pet
boolean option. boolean option.
Curses interface only; value is one or more of the following letters. Curses or tty interface only; value is one of
.sd none, bold, dim, underline, blink, and inverse.
.si Some of those choices might not work,
.CC n "Normal text (no highlighting)"
.CC i "Inverse video (default)"
.CC b "Bold text"
.CC u "Underlined text"
.CC k "blinKing text"
.CC d "Dim text"
.CC t "iTalic text"
.CC l "Left line indicator"
.CC r "Right line indicator"
.ei
.ed
Some of those choices might not work, particularly the final three,
depending upon terminal hardware or terminal emulation software. depending upon terminal hardware or terminal emulation software.
.lp "" .lp ""
Currently multiple highlight-style letters can be combined by simply Currently multiple highlight-style letters can be combined by simply
+4 -18
View File
@@ -4410,7 +4410,7 @@ In text windowing, text highlighting or inverse video is often used;
with tiles, generally displays a heart symbol near pets. with tiles, generally displays a heart symbol near pets.
%.lp "" %.lp ""
With the curses interface, the {\it petattr\/} With the tty or curses interface, the {\it petattr\/}
option controls how to highlight pets and setting it will turn the option controls how to highlight pets and setting it will turn the
{\it hilite\verb+_+pet\/} option on or off as warranted. {\it hilite\verb+_+pet\/} option on or off as warranted.
%.lp %.lp
@@ -4801,23 +4801,9 @@ included for {\it all\/} despite that mode normally omitting gold.
Specifies one or more text highlighting attributes to use when showing Specifies one or more text highlighting attributes to use when showing
pets on the map. pets on the map.
Effectively a superset of the {\it hilite\verb+_+pet\/} boolean option. Effectively a superset of the {\it hilite\verb+_+pet\/} boolean option.
Curses interface only; value is one or more of the following letters. Curses or tty interface only; value is one of
none, bold, dim, underline, blink, and inverse.
%.sd Some of those choices might not work,
%.si
{\tt n} --- Normal text (no highlighting)\\
{\tt i} --- Inverse video (default)\\
{\tt b} --- Bold text\\
{\tt u} --- Underlined text\\
{\tt k} --- blinKing text\\
{\tt d} --- Dim text\\
{\tt t} --- iTalic text\\
{\tt l} --- Left line indicator\\
{\tt r} --- Right line indicator\\
%.ei
%.ed
Some of those choices might not work, particularly the final three,
depending upon terminal hardware or terminal emulation software. depending upon terminal hardware or terminal emulation software.
%.lp "" %.lp ""
+2
View File
@@ -2000,6 +2000,7 @@ curses: if user's terminal was set to 'application keypad mode' (DEC VTxxx
nomenclature; set via 2 char "ESC =") and the terminfo or termcap nomenclature; set via 2 char "ESC =") and the terminfo or termcap
entry told the terminal to send 8-bit escape sequences (via 3 char entry told the terminal to send 8-bit escape sequences (via 3 char
"ESC SPC G"), nethack wasn't recognizing number pad keys "ESC SPC G"), nethack wasn't recognizing number pad keys
curses: change petattr attributes, dropping support for curses-only ones
macOS: Xcode project was failing to build if the path to the NetHack source macOS: Xcode project was failing to build if the path to the NetHack source
tree contained a space; the issue was within some shell script code tree contained a space; the issue was within some shell script code
contained within the project contained within the project
@@ -2139,6 +2140,7 @@ tty: have <return> dismiss pick-none menus instead of acting like '>' (not
only wouldn't dismiss when not on last page, wouldn't dismiss at all) only wouldn't dismiss when not on last page, wouldn't dismiss at all)
tty: menu search via ':' would clobber part of the menu with a status line tty: menu search via ':' would clobber part of the menu with a status line
refresh if the menu was tall enough to cover that refresh if the menu was tall enough to cover that
tty: add support for petattr
Unix: when user name is used as default character name, keep hyphenated value Unix: when user name is used as default character name, keep hyphenated value
intact instead stripping off dash and whatever follows as if that intact instead stripping off dash and whatever follows as if that
specified role/race/&c (worked once upon a time; broken since 3.3.0) specified role/race/&c (worked once upon a time; broken since 3.3.0)
+2 -2
View File
@@ -529,8 +529,8 @@ static int optfn_##a(int, int, boolean, char *, char *);
NHOPTC(perminv_mode, Advanced, 20, opt_in, set_in_game, NHOPTC(perminv_mode, Advanced, 20, opt_in, set_in_game,
Yes, Yes, No, Yes, NoAlias, Yes, Yes, No, Yes, NoAlias,
"what to show in persistent inventory window") "what to show in persistent inventory window")
NHOPTC(petattr, Advanced, 88, opt_in, set_in_game, /* curses only */ NHOPTC(petattr, Advanced, 88, opt_in, set_in_game, /* tty/curses only */
No, Yes, No, No, NoAlias, "attributes for highlighting pets") No, Yes, No, Yes, NoAlias, "attributes for highlighting pets")
/* pettype is ignored for some roles */ /* pettype is ignored for some roles */
NHOPTC(pettype, Advanced, 4, opt_in, set_gameview, NHOPTC(pettype, Advanced, 4, opt_in, set_gameview,
Yes, Yes, No, No, "pet", "your preferred initial pet type") Yes, Yes, No, No, "pet", "your preferred initial pet type")
+36 -27
View File
@@ -376,6 +376,7 @@ static int handler_perminv_mode(void);
static int handler_pickup_burden(void); static int handler_pickup_burden(void);
static int handler_pickup_types(void); static int handler_pickup_types(void);
static int handler_runmode(void); static int handler_runmode(void);
static int handler_petattr(void);
static int handler_sortloot(void); static int handler_sortloot(void);
static int handler_symset(int); static int handler_symset(int);
static int handler_whatis_coord(void); static int handler_whatis_coord(void);
@@ -395,10 +396,6 @@ static void wc_set_font_name(int, char *);
static int wc_set_window_colors(char *); static int wc_set_window_colors(char *);
static boolean illegal_menu_cmd_key(uchar); static boolean illegal_menu_cmd_key(uchar);
static const char *term_for_boolean(int, boolean *); static const char *term_for_boolean(int, boolean *);
#ifdef CURSES_GRAPHICS
extern int curses_read_attrs(const char *attrs);
extern char *curses_fmt_attrs(char *);
#endif
/* ask user if they want a tutorial, except if tutorial boolean option has /* ask user if they want a tutorial, except if tutorial boolean option has
been set in config - either on or off - in which case just obey that been set in config - either on or off - in which case just obey that
@@ -2950,8 +2947,8 @@ optfn_petattr(
bad_negation(allopt[optidx].name, TRUE); bad_negation(allopt[optidx].name, TRUE);
retval = optn_err; retval = optn_err;
} else if (op != empty_optstr) { } else if (op != empty_optstr) {
#ifdef CURSES_GRAPHICS #if defined(TTY_GRAPHICS) || defined(CURSES_GRAPHICS)
int itmp = curses_read_attrs(op); int itmp = match_str2attr(op, FALSE);
if (itmp == -1) { if (itmp == -1) {
config_error_add("Unknown %s parameter '%s'", config_error_add("Unknown %s parameter '%s'",
@@ -2960,9 +2957,6 @@ optfn_petattr(
} else } else
iflags.wc2_petattr = itmp; iflags.wc2_petattr = itmp;
#else #else
/* non-curses windowports will not use this flag anyway
* but the above will not compile if we don't have curses.
* Just set it to a sensible default: */
iflags.wc2_petattr = ATR_INVERSE; iflags.wc2_petattr = ATR_INVERSE;
#endif #endif
} else if (negated) { } else if (negated) {
@@ -2976,11 +2970,9 @@ optfn_petattr(
return retval; return retval;
} }
if (req == get_val || req == get_cnf_val) { if (req == get_val || req == get_cnf_val) {
#ifdef CURSES_GRAPHICS #if defined(TTY_GRAPHICS) || defined(CURSES_GRAPHICS)
if (WINDOWPORT(curses)) { if (WINDOWPORT(tty) || WINDOWPORT(curses)) {
char tmpbuf[QBUFSZ]; Strcpy(opts, attr2attrname(iflags.wc2_petattr));
Strcpy(opts, curses_fmt_attrs(tmpbuf));
} else } else
#endif #endif
if (iflags.wc2_petattr != 0) if (iflags.wc2_petattr != 0)
@@ -2990,6 +2982,9 @@ optfn_petattr(
else else
Strcpy(opts, defopt); Strcpy(opts, defopt);
} }
if (req == do_handler) {
return handler_petattr();
}
return optn_ok; return optn_ok;
} }
@@ -4987,6 +4982,19 @@ optfn_boolean(
case opt_tiled_map: case opt_tiled_map:
iflags.wc_ascii_map = negated; iflags.wc_ascii_map = negated;
break; break;
case opt_hilite_pet:
#if defined(TTY_GRAPHICS) || defined(CURSES_GRAPHICS)
if (WINDOWPORT(tty) || WINDOWPORT(curses)) {
/* if we're enabling hilite_pet and petattr isn't set,
set it to Inverse; if we're disabling, leave petattr
alone so that re-enabling will get current value back
*/
if (iflags.hilite_pet && !iflags.wc2_petattr)
iflags.wc2_petattr = ATR_INVERSE;
}
#endif
go.opt_need_redraw = TRUE;
break;
default: default:
break; break;
} }
@@ -5038,19 +5046,6 @@ optfn_boolean(
go.opt_need_redraw = TRUE; go.opt_need_redraw = TRUE;
go.opt_need_glyph_reset = TRUE; go.opt_need_glyph_reset = TRUE;
break; break;
case opt_hilite_pet:
#ifdef CURSES_GRAPHICS
if (WINDOWPORT(curses)) {
/* if we're enabling hilite_pet and petattr isn't set,
set it to Inverse; if we're disabling, leave petattr
alone so that re-enabling will get current value back
*/
if (iflags.hilite_pet && !iflags.wc2_petattr)
iflags.wc2_petattr = curses_read_attrs("I");
}
#endif
go.opt_need_redraw = TRUE;
break;
case opt_hitpointbar: case opt_hitpointbar:
if (VIA_WINDOWPORT()) { if (VIA_WINDOWPORT()) {
/* [is reassessment really needed here?] */ /* [is reassessment really needed here?] */
@@ -5752,6 +5747,20 @@ handler_runmode(void)
return optn_ok; return optn_ok;
} }
static int
handler_petattr(void)
{
int tmp = query_attr("Select pet highlight attribute", iflags.wc2_petattr);
if (tmp != -1) {
iflags.wc2_petattr = tmp;
iflags.hilite_pet = (iflags.wc2_petattr != ATR_NONE);
if (!go.opt_initial)
go.opt_need_redraw = TRUE;
}
return optn_ok;
}
static int static int
handler_sortloot(void) handler_sortloot(void)
{ {
+1 -1
View File
@@ -909,7 +909,7 @@ curses_print_glyph(
ch = glyphinfo->ttychar; ch = glyphinfo->ttychar;
color = glyphinfo->gm.sym.color; color = glyphinfo->gm.sym.color;
if ((special & MG_PET) && iflags.hilite_pet) { if ((special & MG_PET) && iflags.hilite_pet) {
attr = iflags.wc2_petattr; attr = curses_convert_attr(iflags.wc2_petattr);
} }
if ((special & MG_DETECT) && iflags.use_inverse) { if ((special & MG_DETECT) && iflags.use_inverse) {
attr = A_REVERSE; attr = A_REVERSE;
-84
View File
@@ -768,92 +768,8 @@ curses_convert_attr(int attr)
return curses_attr; return curses_attr;
} }
/* Map letter attributes from a string to bitmask. Return mask on
success (might be 0), or -1 if not found. */
int
curses_read_attrs(const char *attrs)
{
int retattr = 0;
if (!attrs || !*attrs)
return A_NORMAL;
if (strchr(attrs, 'b') || strchr(attrs, 'B'))
retattr |= A_BOLD;
if (strchr(attrs, 'i') || strchr(attrs, 'I')) /* inverse */
retattr |= A_REVERSE;
if (strchr(attrs, 'u') || strchr(attrs, 'U'))
retattr |= A_UNDERLINE;
if (strchr(attrs, 'k') || strchr(attrs, 'K'))
retattr |= A_BLINK;
if (strchr(attrs, 'd') || strchr(attrs, 'D'))
retattr |= A_DIM;
#ifdef A_ITALIC
if (strchr(attrs, 't') || strchr(attrs, 'T'))
retattr |= A_ITALIC;
#endif
#ifdef A_LEFTLINE
if (strchr(attrs, 'l') || strchr(attrs, 'L'))
retattr |= A_LEFTLINE;
#endif
#ifdef A_RIGHTLINE
if (strchr(attrs, 'r') || strchr(attrs, 'R'))
retattr |= A_RIGHTLINE;
#endif
if (retattr == 0) {
/* still default; check for none/normal */
if (strchr(attrs, 'n') || strchr(attrs, 'N'))
retattr = A_NORMAL;
else
retattr = -1; /* error */
}
return retattr;
}
/* format iflags.wc2_petattr into "+a+b..." for set bits a, b, ...
(used by core's 'O' command; return value points past leading '+') */
char *
curses_fmt_attrs(char *outbuf)
{
int attr = iflags.wc2_petattr;
outbuf[0] = '\0';
if (attr == A_NORMAL) {
Strcpy(outbuf, "+N(None)");
} else {
if (attr & A_BOLD)
Strcat(outbuf, "+B(Bold)");
if (attr & A_REVERSE)
Strcat(outbuf, "+I(Inverse)");
if (attr & A_UNDERLINE)
Strcat(outbuf, "+U(Underline)");
if (attr & A_BLINK)
Strcat(outbuf, "+K(blinK)");
if (attr & A_DIM)
Strcat(outbuf, "+D(Dim)");
#ifdef A_ITALIC
if (attr & A_ITALIC)
Strcat(outbuf, "+T(iTalic)");
#endif
#ifdef A_LEFTLINE
if (attr & A_LEFTLINE)
Strcat(outbuf, "+L(Left line)");
#endif
#ifdef A_RIGHTLINE
if (attr & A_RIGHTLINE)
Strcat(outbuf, "+R(Right line)");
#endif
}
if (!*outbuf)
Sprintf(outbuf, "+unknown [%d]", attr);
return &outbuf[1];
}
/* Convert special keys into values that NetHack can understand. /* Convert special keys into values that NetHack can understand.
Currently this is limited to arrow keys, but this may be expanded. */ Currently this is limited to arrow keys, but this may be expanded. */
int int
curses_convert_keys(int key) curses_convert_keys(int key)
{ {
+8 -3
View File
@@ -120,7 +120,7 @@ struct window_procs tty_procs = {
| WC2_RESET_STATUS | WC2_RESET_STATUS
#endif #endif
| WC2_DARKGRAY | WC2_SUPPRESS_HIST | WC2_URGENT_MESG | WC2_STATUSLINES | WC2_DARKGRAY | WC2_SUPPRESS_HIST | WC2_URGENT_MESG | WC2_STATUSLINES
| WC2_U_UTF8STR | WC2_U_UTF8STR | WC2_PETATTR
#if !defined(NO_TERMS) || defined(WIN32CON) #if !defined(NO_TERMS) || defined(WIN32CON)
| WC2_U_24BITCOLOR | WC2_U_24BITCOLOR
#endif #endif
@@ -3786,6 +3786,7 @@ tty_print_glyph(
const glyph_info *bkglyphinfo) const glyph_info *bkglyphinfo)
{ {
boolean inverse_on = FALSE, colordone = FALSE, glyphdone = FALSE; boolean inverse_on = FALSE, colordone = FALSE, glyphdone = FALSE;
boolean petattr = FALSE;
int ch, color; int ch, color;
unsigned special; unsigned special;
#ifdef ENHANCED_SYMBOLS #ifdef ENHANCED_SYMBOLS
@@ -3850,8 +3851,10 @@ tty_print_glyph(
&& bkglyphinfo && bkglyphinfo->framecolor != NO_COLOR) { && bkglyphinfo && bkglyphinfo->framecolor != NO_COLOR) {
ttyDisplay->framecolor = bkglyphinfo->framecolor; ttyDisplay->framecolor = bkglyphinfo->framecolor;
term_start_bgcolor(bkglyphinfo->framecolor); term_start_bgcolor(bkglyphinfo->framecolor);
} else if ((((special & MG_PET) != 0 && iflags.hilite_pet) } else if ((special & MG_PET) != 0 && iflags.hilite_pet) {
|| ((special & MG_OBJPILE) != 0 && iflags.hilite_pile) term_start_attr(iflags.wc2_petattr);
petattr = TRUE;
} else if ((((special & MG_OBJPILE) != 0 && iflags.hilite_pile)
|| ((special & MG_FEMALE) != 0 && wizard && iflags.wizmgender) || ((special & MG_FEMALE) != 0 && wizard && iflags.wizmgender)
|| ((special & (MG_DETECT | MG_BW_LAVA | MG_BW_ICE || ((special & (MG_DETECT | MG_BW_LAVA | MG_BW_ICE
| MG_BW_SINK | MG_BW_ENGR)) != 0)) | MG_BW_SINK | MG_BW_ENGR)) != 0))
@@ -3880,6 +3883,8 @@ tty_print_glyph(
if (inverse_on) if (inverse_on)
term_end_attr(ATR_INVERSE); term_end_attr(ATR_INVERSE);
else if (petattr)
term_end_attr(iflags.wc2_petattr);
if (iflags.use_color) { if (iflags.use_color) {
/* turn off color as well, turning off ATR_INVERSE may have done /* turn off color as well, turning off ATR_INVERSE may have done
this already and if so, we won't know the current state unless this already and if so, we won't know the current state unless