hilite_status attributes
Take a step towards eliminating merging hilite_status rules during highlighting by creating a single rule instead of multiple ones when specifying multiple attributes for the same highlight via the 'O' command's menus. Old: (pick_one menu to pick a color) + (pick_one menu to pick an attribute) | hilite_status:title/always/red&bold (pick_one menu to pick a color) + (pick_one menu to pick an attribute) | hilite_status:title/always/red&blink New: (pick_one menu to pick a color) + (pick_any menu to pick attributes) | hilite_status:title/always/red&bold+blink At present, rule selection during highlighting still merges multiple applicable rules instead of finding the best one first, with the problems that entails. Bonus fix: a hilite_status rule for status conditions which specified "no attributes" would clear attributes for all previous condition rules rather than just the one(s) in that "no attributes" rule.
This commit is contained in:
65
src/botl.c
65
src/botl.c
@@ -2282,11 +2282,11 @@ int sidx;
|
||||
else if (a == ATR_BOLD)
|
||||
cond_hilites[HL_ATTCLR_BOLD] |= conditions_bitmask;
|
||||
else if (a == ATR_NONE) {
|
||||
cond_hilites[HL_ATTCLR_DIM] = 0UL;
|
||||
cond_hilites[HL_ATTCLR_BLINK] = 0UL;
|
||||
cond_hilites[HL_ATTCLR_ULINE] = 0UL;
|
||||
cond_hilites[HL_ATTCLR_INVERSE] = 0UL;
|
||||
cond_hilites[HL_ATTCLR_BOLD] = 0UL;
|
||||
cond_hilites[HL_ATTCLR_DIM] &= ~conditions_bitmask;
|
||||
cond_hilites[HL_ATTCLR_BLINK] &= ~conditions_bitmask;
|
||||
cond_hilites[HL_ATTCLR_ULINE] &= ~conditions_bitmask;
|
||||
cond_hilites[HL_ATTCLR_INVERSE] &= ~conditions_bitmask;
|
||||
cond_hilites[HL_ATTCLR_BOLD] &= ~conditions_bitmask;
|
||||
} else {
|
||||
int k = match_str2clr(subfields[i]);
|
||||
|
||||
@@ -2507,7 +2507,8 @@ status_hilite_linestr_gather_conditions()
|
||||
char condbuf[BUFSZ];
|
||||
char *tmpattr;
|
||||
|
||||
(void) stripchars(clrbuf, " ", clr2colorname(clr));
|
||||
(void) strNsubst(strcpy(clrbuf, clr2colorname(clr)),
|
||||
" ", "-", 0);
|
||||
tmpattr = hlattr2attrname(atr, attrbuf, BUFSZ);
|
||||
if (tmpattr)
|
||||
Sprintf(eos(clrbuf), "&%s", tmpattr);
|
||||
@@ -2608,14 +2609,10 @@ struct hilite_s *hl;
|
||||
}
|
||||
|
||||
split_clridx(hl->coloridx, &clr, &attr);
|
||||
if (clr != NO_COLOR)
|
||||
(void) stripchars(clrbuf, " ", clr2colorname(clr));
|
||||
(void) strNsubst(strcpy(clrbuf, clr2colorname(clr)), " ", "-", 0);
|
||||
if (attr != HL_UNDEF) {
|
||||
tmpattr = hlattr2attrname(attr, attrbuf, BUFSZ);
|
||||
if (tmpattr)
|
||||
Sprintf(eos(clrbuf), "%s%s",
|
||||
(clr != NO_COLOR) ? "&" : "",
|
||||
tmpattr);
|
||||
if ((tmpattr = hlattr2attrname(attr, attrbuf, BUFSZ)) != 0)
|
||||
Sprintf(eos(clrbuf), "&%s", tmpattr);
|
||||
}
|
||||
Sprintf(buf, "%s/%s/%s", initblstats[hl->fld].fldname, behavebuf, clrbuf);
|
||||
|
||||
@@ -3154,52 +3151,34 @@ choose_color:
|
||||
else
|
||||
goto choose_behavior;
|
||||
}
|
||||
|
||||
atr = query_attr(attrqry); /* FIXME: pick multiple attrs */
|
||||
atr = query_attr(attrqry);
|
||||
if (atr == -1)
|
||||
goto choose_color;
|
||||
if (atr == ATR_DIM)
|
||||
atr = HL_DIM;
|
||||
else if (atr == ATR_BLINK)
|
||||
atr = HL_BLINK;
|
||||
else if (atr == ATR_ULINE)
|
||||
atr = HL_ULINE;
|
||||
else if (atr == ATR_INVERSE)
|
||||
atr = HL_INVERSE;
|
||||
else if (atr == ATR_BOLD)
|
||||
atr = HL_BOLD;
|
||||
else if (atr == ATR_NONE)
|
||||
atr = HL_NONE;
|
||||
else
|
||||
atr = HL_UNDEF;
|
||||
|
||||
if (clr == -1)
|
||||
clr = NO_COLOR;
|
||||
|
||||
if (behavior == BL_TH_CONDITION) {
|
||||
char clrbuf[BUFSZ];
|
||||
char attrbuf[BUFSZ];
|
||||
char *tmpattr;
|
||||
|
||||
if (atr == HL_DIM)
|
||||
if (atr & HL_DIM)
|
||||
cond_hilites[HL_ATTCLR_DIM] |= cond;
|
||||
else if (atr == HL_BLINK)
|
||||
else if (atr & HL_BLINK)
|
||||
cond_hilites[HL_ATTCLR_BLINK] |= cond;
|
||||
else if (atr == HL_ULINE)
|
||||
else if (atr & HL_ULINE)
|
||||
cond_hilites[HL_ATTCLR_ULINE] |= cond;
|
||||
else if (atr == HL_INVERSE)
|
||||
else if (atr & HL_INVERSE)
|
||||
cond_hilites[HL_ATTCLR_INVERSE] |= cond;
|
||||
else if (atr == HL_BOLD)
|
||||
else if (atr & HL_BOLD)
|
||||
cond_hilites[HL_ATTCLR_BOLD] |= cond;
|
||||
else if (atr == HL_NONE) {
|
||||
cond_hilites[HL_ATTCLR_DIM] = 0UL;
|
||||
cond_hilites[HL_ATTCLR_BLINK] = 0UL;
|
||||
cond_hilites[HL_ATTCLR_ULINE] = 0UL;
|
||||
cond_hilites[HL_ATTCLR_INVERSE] = 0UL;
|
||||
cond_hilites[HL_ATTCLR_BOLD] = 0UL;
|
||||
cond_hilites[HL_ATTCLR_DIM] &= ~cond;
|
||||
cond_hilites[HL_ATTCLR_BLINK] &= ~cond;
|
||||
cond_hilites[HL_ATTCLR_ULINE] &= ~cond;
|
||||
cond_hilites[HL_ATTCLR_INVERSE] &= ~cond;
|
||||
cond_hilites[HL_ATTCLR_BOLD] &= ~cond;
|
||||
}
|
||||
cond_hilites[clr] |= cond;
|
||||
(void) stripchars(clrbuf, " ", clr2colorname(clr));
|
||||
(void) strNsubst(strcpy(clrbuf, clr2colorname(clr)), " ", "-", 0);
|
||||
tmpattr = hlattr2attrname(atr, attrbuf, BUFSZ);
|
||||
if (tmpattr)
|
||||
Sprintf(eos(clrbuf), "&%s", tmpattr);
|
||||
|
||||
@@ -1417,19 +1417,31 @@ const char *prompt;
|
||||
break;
|
||||
any.a_int = i + 1;
|
||||
add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, colornames[i].name,
|
||||
MENU_UNSELECTED);
|
||||
(colornames[i].color == NO_COLOR) ? MENU_SELECTED
|
||||
: MENU_UNSELECTED);
|
||||
}
|
||||
end_menu(tmpwin, (prompt && *prompt) ? prompt : "Pick a color");
|
||||
pick_cnt = select_menu(tmpwin, PICK_ONE, &picks);
|
||||
destroy_nhwindow(tmpwin);
|
||||
if (pick_cnt > 0) {
|
||||
i = colornames[picks->item.a_int - 1].color;
|
||||
i = colornames[picks[0].item.a_int - 1].color;
|
||||
/* pick_cnt==2: explicitly picked something other than the
|
||||
preselected entry */
|
||||
if (pick_cnt == 2 && i == NO_COLOR)
|
||||
i = colornames[picks[1].item.a_int - 1].color;
|
||||
free((genericptr_t) picks);
|
||||
return i;
|
||||
} else if (pick_cnt == 0) {
|
||||
/* pick_cnt==0: explicitly picking preselected entry toggled it off */
|
||||
return NO_COLOR;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* ask about highlighting attribute; for menu headers and menu
|
||||
coloring patterns, only one attribute at a time is allowed;
|
||||
for status highlighting, multiple attributes are allowed [overkill;
|
||||
life would be much simpler if that were restricted to one also...] */
|
||||
int
|
||||
query_attr(prompt)
|
||||
const char *prompt;
|
||||
@@ -1438,7 +1450,11 @@ const char *prompt;
|
||||
anything any;
|
||||
int i, pick_cnt;
|
||||
menu_item *picks = (menu_item *) 0;
|
||||
boolean allow_many = (prompt && !strncmpi(prompt, "Choose", 6));
|
||||
int default_attr = ATR_NONE;
|
||||
|
||||
if (prompt && strstri(prompt, "menu headings"))
|
||||
default_attr = iflags.menu_headings;
|
||||
tmpwin = create_nhwindow(NHW_MENU);
|
||||
start_menu(tmpwin);
|
||||
any = zeroany;
|
||||
@@ -1447,16 +1463,61 @@ const char *prompt;
|
||||
break;
|
||||
any.a_int = i + 1;
|
||||
add_menu(tmpwin, NO_GLYPH, &any, 0, 0, attrnames[i].attr,
|
||||
attrnames[i].name, MENU_UNSELECTED);
|
||||
attrnames[i].name,
|
||||
(attrnames[i].attr == default_attr) ? MENU_SELECTED
|
||||
: MENU_UNSELECTED);
|
||||
}
|
||||
end_menu(tmpwin, (prompt && *prompt) ? prompt : "Pick an attribute");
|
||||
pick_cnt = select_menu(tmpwin, PICK_ONE, &picks);
|
||||
pick_cnt = select_menu(tmpwin, allow_many ? PICK_ANY: PICK_ONE, &picks);
|
||||
destroy_nhwindow(tmpwin);
|
||||
if (pick_cnt > 0) {
|
||||
i = attrnames[picks->item.a_int - 1].attr;
|
||||
int j, k = 0;
|
||||
|
||||
if (allow_many) {
|
||||
/* PICK_ANY, with one preselected entry which should be
|
||||
excluded if any other choices were picked */
|
||||
for (i = 0; i < pick_cnt; ++i) {
|
||||
j = picks[i].item.a_int - 1;
|
||||
if (attrnames[j].attr != ATR_NONE || pick_cnt == 1) {
|
||||
switch (attrnames[j].attr) {
|
||||
case ATR_DIM:
|
||||
k |= HL_DIM;
|
||||
break;
|
||||
case ATR_BLINK:
|
||||
k |= HL_BLINK;
|
||||
break;
|
||||
case ATR_ULINE:
|
||||
k |= HL_ULINE;
|
||||
break;
|
||||
case ATR_INVERSE:
|
||||
k |= HL_INVERSE;
|
||||
break;
|
||||
case ATR_BOLD:
|
||||
k |= HL_BOLD;
|
||||
break;
|
||||
case ATR_NONE:
|
||||
k = HL_NONE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* PICK_ONE, but might get 0 or 2 due to preselected entry */
|
||||
j = picks[0].item.a_int - 1;
|
||||
/* pick_cnt==2: explicitly picked something other than the
|
||||
preselected entry */
|
||||
if (pick_cnt == 2 && attrnames[j].attr == default_attr)
|
||||
j = picks[1].item.a_int - 1;
|
||||
k = attrnames[j].attr;
|
||||
}
|
||||
free((genericptr_t) picks);
|
||||
return i;
|
||||
return k;
|
||||
} else if (pick_cnt == 0 && !allow_many) {
|
||||
/* PICK_ONE, preselected entry explicitly chosen */
|
||||
return default_attr;
|
||||
}
|
||||
/* either ESC to explicitly cancel (pick_cnt==-1) or
|
||||
PICK_ANY with preselected entry toggled off and nothing chosen */
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -4872,6 +4933,7 @@ boolean setinitial, setfromfile;
|
||||
const char *sattr, *sclr;
|
||||
menu_item *pick_list = (menu_item *) 0;
|
||||
struct menucoloring *tmp = menu_colorings;
|
||||
char clrbuf[QBUFSZ];
|
||||
|
||||
tmpwin = create_nhwindow(NHW_MENU);
|
||||
start_menu(tmpwin);
|
||||
@@ -4879,11 +4941,12 @@ boolean setinitial, setfromfile;
|
||||
mc_idx = 0;
|
||||
while (tmp) {
|
||||
sattr = attr2attrname(tmp->attr);
|
||||
sclr = clr2colorname(tmp->color);
|
||||
sclr = strcpy(clrbuf, clr2colorname(tmp->color));
|
||||
(void) strNsubst(clrbuf, " ", "-", 0);
|
||||
any.a_int = ++mc_idx;
|
||||
/* construct suffix */
|
||||
Sprintf(buf, "\"\"=%s%s%s", sclr,
|
||||
(tmp->attr != ATR_NONE) ? " & " : "",
|
||||
(tmp->attr != ATR_NONE) ? "&" : "",
|
||||
(tmp->attr != ATR_NONE) ? sattr : "");
|
||||
/* now main string */
|
||||
ln = sizeof buf - strlen(buf) - 1; /* length available */
|
||||
|
||||
Reference in New Issue
Block a user