summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/xterm/MANIFEST2
-rw-r--r--app/xterm/NEWS27
-rw-r--r--app/xterm/button.c18
-rw-r--r--app/xterm/charproc.c11
-rw-r--r--app/xterm/doublechr.c6
-rw-r--r--app/xterm/fontutils.c272
-rw-r--r--app/xterm/fontutils.h6
-rw-r--r--app/xterm/main.c99
-rw-r--r--app/xterm/misc.c9
-rw-r--r--app/xterm/package/debian/changelog6
-rw-r--r--app/xterm/package/freebsd/Makefile4
-rw-r--r--app/xterm/package/pkgsrc/Makefile2
-rw-r--r--app/xterm/package/xterm.spec4
-rw-r--r--app/xterm/screen.c4
-rw-r--r--app/xterm/version.h6
-rw-r--r--app/xterm/xterm.appdata.xml2
-rw-r--r--app/xterm/xterm.h4
-rw-r--r--app/xterm/xterm.log.html21
18 files changed, 266 insertions, 237 deletions
diff --git a/app/xterm/MANIFEST b/app/xterm/MANIFEST
index da49b7225..fe3a6c2cf 100644
--- a/app/xterm/MANIFEST
+++ b/app/xterm/MANIFEST
@@ -1,4 +1,4 @@
-MANIFEST for xterm, version xterm-374
+MANIFEST for xterm, version xterm-375
--------------------------------------------------------------------------------
MANIFEST this file
256colres.h resource-definitions for 256-color mode
diff --git a/app/xterm/NEWS b/app/xterm/NEWS
index fc2ea323a..940fa612a 100644
--- a/app/xterm/NEWS
+++ b/app/xterm/NEWS
@@ -1,24 +1,13 @@
The NEWS file was generated from xterm.log.html, which serves as the changelog
for xterm.
--------------------------------------------------------------------------------
- Patch #374 - 2022/10/10
+ Patch #375 - 2022/10/23
- * eliminate use of grep aliases from vttests scripts.
- * amend discussion of DECSDM versus Sixel Scrolling in ctlseqs.ms
- (reports by Hayaki Saito, Ben Wong).
- * change default for sixelScrolling resource to better match
- VT330/VT340 DECSDM setting (patch by Ben Wong).
- * fix some gcc and coverity warnings.
- * improve memory usage for OSC 52 (report by David Leadbeater).
- * fix regression in xterm-373 change adding resources
- xftTrackMemUsage to xftMaxGlyphMemory, which did not first cache
- the server's resource-settings (report/testcase by Gabor Hauzer, as
- well as Debian #1021243).
- * fix regression in xterm-373 change for status-line vs alternate
- screen (report by Rajeev V. Pillai).
- * configure script improvements:
- + modify CF_XOPEN_SOURCE to handle more special cases of Linux
- (reports by Adam Sampson, Sven Joachim).
- + modify checks for egrep/fgrep aliases to work around warning
- messages from GNU grep 3.8
+ * improve error-recovery when setting a bitmap font for the VT100
+ window, e.g., in case OSC 50 failed, restoring the most recent
+ valid font so that a subsequent OSC 50 reports this correctly
+ (report by David Leadbeater).
+ * exclude MC_XDG_OPEN from environment variables trimmed on startup
+ (report by Gabor Hauzer).
+ * check for null pointer in isSelect() (report by Column Paget).
diff --git a/app/xterm/button.c b/app/xterm/button.c
index fae8fbd9b..382759aec 100644
--- a/app/xterm/button.c
+++ b/app/xterm/button.c
@@ -1,4 +1,4 @@
-/* $XTermId: button.c,v 1.642 2022/10/06 16:52:06 tom Exp $ */
+/* $XTermId: button.c,v 1.645 2022/10/23 22:59:52 tom Exp $ */
/*
* Copyright 1999-2021,2022 by Thomas E. Dickey
@@ -2012,7 +2012,7 @@ _SelectionTargets(Widget w)
return result;
}
-#define isSELECT(value) (!strcmp(value, "SELECT"))
+#define isSELECT(value) (!strcmp(NonNull(value), "SELECT"))
static int
DefaultSelection(TScreen *screen)
@@ -2051,13 +2051,8 @@ void
UnmapSelections(XtermWidget xw)
{
TScreen *screen = TScreenOf(xw);
- Cardinal n;
- if (screen->mappedSelect) {
- for (n = 0; screen->mappedSelect[n] != 0; ++n)
- free((void *) screen->mappedSelect[n]);
- FreeAndNull(screen->mappedSelect);
- }
+ FreeAndNull(screen->mappedSelect);
}
/*
@@ -2093,14 +2088,11 @@ MapSelections(XtermWidget xw, String *params, Cardinal num_params)
if ((result = TypeMallocN(String, num_params + 1)) != 0) {
result[num_params] = 0;
for (j = 0; j < num_params; ++j) {
- result[j] = x_strdup((isSELECT(params[j])
+ result[j] = (String) (isSELECT(params[j])
? mapTo
- : params[j]));
+ : params[j]);
if (result[j] == 0) {
UnmapSelections(xw);
- while (j != 0) {
- free((void *) result[--j]);
- }
FreeAndNull(result);
break;
}
diff --git a/app/xterm/charproc.c b/app/xterm/charproc.c
index a570707bf..4b0d7be31 100644
--- a/app/xterm/charproc.c
+++ b/app/xterm/charproc.c
@@ -1,4 +1,4 @@
-/* $XTermId: charproc.c,v 1.1906 2022/10/10 15:42:50 tom Exp $ */
+/* $XTermId: charproc.c,v 1.1908 2022/10/23 20:34:18 tom Exp $ */
/*
* Copyright 1999-2021,2022 by Thomas E. Dickey
@@ -13662,7 +13662,6 @@ DoSetSelectedFont(Widget w,
Bell(xw, XkbBI_MinorError, 0);
} else {
Boolean failed = False;
- int oldFont = TScreenOf(xw)->menu_font_number;
char *save = TScreenOf(xw)->SelectFontName();
char *val;
char *test;
@@ -13707,10 +13706,6 @@ DoSetSelectedFont(Widget w,
failed = True;
}
if (failed) {
- (void) xtermLoadFont(xw,
- xtermFontName(TScreenOf(xw)->MenuFontName(oldFont)),
- True,
- oldFont);
Bell(xw, XkbBI_MinorError, 0);
}
free(used);
@@ -13719,7 +13714,7 @@ DoSetSelectedFont(Widget w,
}
}
-void
+Bool
FindFontSelection(XtermWidget xw, const char *atom_name, Bool justprobe)
{
TScreen *screen = TScreenOf(xw);
@@ -13759,7 +13754,7 @@ FindFontSelection(XtermWidget xw, const char *atom_name, Bool justprobe)
DoSetSelectedFont, NULL,
XtLastTimestampProcessed(XtDisplay(xw)));
}
- return;
+ return (screen->SelectFontName() != NULL) ? True : False;
}
Bool
diff --git a/app/xterm/doublechr.c b/app/xterm/doublechr.c
index 3b5bcd33e..3e348dd66 100644
--- a/app/xterm/doublechr.c
+++ b/app/xterm/doublechr.c
@@ -1,4 +1,4 @@
-/* $XTermId: doublechr.c,v 1.107 2022/05/05 22:23:43 tom Exp $ */
+/* $XTermId: doublechr.c,v 1.108 2022/10/23 14:46:14 tom Exp $ */
/*
* Copyright 1997-2021,2022 by Thomas E. Dickey
@@ -295,7 +295,7 @@ xterm_DoubleGC(XTermDraw * params, GC old_gc, int *inxp)
temp.flags = (params->attr_flags & BOLD);
temp.warn = fwResource;
- if (!xtermOpenFont(params->xw, name, &temp, False)) {
+ if (!xtermOpenFont(params->xw, name, &temp, NULL, False)) {
XTermDraw local = *params;
char *nname;
@@ -304,7 +304,7 @@ xterm_DoubleGC(XTermDraw * params, GC old_gc, int *inxp)
nname = xtermSpecialFont(&local);
if (nname != 0) {
found = (Boolean) xtermOpenFont(params->xw, nname, &temp,
- False);
+ NULL, False);
free(nname);
}
} else {
diff --git a/app/xterm/fontutils.c b/app/xterm/fontutils.c
index 1ac797bd3..7395a4e04 100644
--- a/app/xterm/fontutils.c
+++ b/app/xterm/fontutils.c
@@ -1,4 +1,4 @@
-/* $XTermId: fontutils.c,v 1.743 2022/10/06 23:48:16 tom Exp $ */
+/* $XTermId: fontutils.c,v 1.750 2022/10/23 22:55:11 tom Exp $ */
/*
* Copyright 1998-2021,2022 by Thomas E. Dickey
@@ -102,9 +102,9 @@
}
#define FREE_FNAME(field) \
- if (fonts == 0 || myfonts.field != fonts->field) { \
- FREE_STRING(myfonts.field); \
- myfonts.field = 0; \
+ if (fonts == 0 || new_fnames.field != fonts->field) { \
+ FREE_STRING(new_fnames.field); \
+ new_fnames.field = 0; \
}
/*
@@ -599,7 +599,7 @@ open_italic_font(XtermWidget xw, int n, FontNameProperties *fp, XTermFonts * dat
if ((name = italic_font_name(fp, slant[pass])) != 0) {
TRACE(("open_italic_font %s %s\n",
whichFontEnum((VTFontEnum) n), name));
- if (xtermOpenFont(xw, name, data, False)) {
+ if (xtermOpenFont(xw, name, data, NULL, False)) {
result = (data->fs != 0);
#if OPT_REPORT_FONTS
if (resource.reportFonts) {
@@ -1063,20 +1063,26 @@ xtermLoadQueryFont(XtermWidget xw, const char *name)
}
/*
- * Open the given font and verify that it is non-empty. Return a null on
+ * Open the given font and verify that it is non-empty. Return false on
* failure.
*/
Bool
xtermOpenFont(XtermWidget xw,
const char *name,
XTermFonts * result,
+ XTermFonts * current,
Bool force)
{
Bool code = False;
TRACE(("xtermOpenFont %d:%d '%s'\n",
result->warn, xw->misc.fontWarnings, NonNull(name)));
+
if (!IsEmpty(name)) {
+ Bool existing = (current != NULL
+ && current->fs != NULL
+ && current->fn != NULL);
+
if ((result->fs = xtermLoadQueryFont(xw, name)) != 0) {
code = True;
if (EmptyFont(result->fs)) {
@@ -1095,9 +1101,13 @@ xtermOpenFont(XtermWidget xw,
} else {
TRACE(("xtermOpenFont: cannot load font '%s'\n", name));
}
- if (force) {
+ if (existing) {
+ TRACE(("...continue using font '%s'\n", current->fn));
+ result->fn = x_strdup(current->fn);
+ result->fs = current->fs;
+ } else if (force) {
NoFontWarning(result);
- code = xtermOpenFont(xw, DEFFONT, result, True);
+ code = xtermOpenFont(xw, DEFFONT, result, NULL, True);
}
}
}
@@ -1349,6 +1359,7 @@ static Bool
loadNormFP(XtermWidget xw,
char **nameOutP,
XTermFonts * infoOut,
+ XTermFonts * current,
int fontnum)
{
Bool status = True;
@@ -1358,7 +1369,7 @@ loadNormFP(XtermWidget xw,
if (!xtermOpenFont(xw,
*nameOutP,
infoOut,
- (fontnum == fontMenu_default))) {
+ current, (fontnum == fontMenu_default))) {
/*
* If we are opening the default font, and it happens to be missing,
* force that to the compiled-in default font, e.g., "fixed". If we
@@ -1393,10 +1404,10 @@ loadBoldFP(XtermWidget xw,
if (fp != 0) {
NoFontWarning(infoOut);
*nameOutP = bold_font_name(fp, fp->average_width);
- if (!xtermOpenFont(xw, *nameOutP, infoOut, False)) {
+ if (!xtermOpenFont(xw, *nameOutP, infoOut, NULL, False)) {
free(*nameOutP);
*nameOutP = bold_font_name(fp, -1);
- xtermOpenFont(xw, *nameOutP, infoOut, False);
+ xtermOpenFont(xw, *nameOutP, infoOut, NULL, False);
}
TRACE(("...derived bold '%s'\n", NonNull(*nameOutP)));
}
@@ -1414,7 +1425,7 @@ loadBoldFP(XtermWidget xw,
TRACE(("...did not get a matching bold font\n"));
}
free(normal);
- } else if (!xtermOpenFont(xw, *nameOutP, infoOut, False)) {
+ } else if (!xtermOpenFont(xw, *nameOutP, infoOut, NULL, False)) {
xtermCopyFontInfo(infoOut, infoRef);
TRACE(("...cannot load bold font '%s'\n", NonNull(*nameOutP)));
} else {
@@ -1468,7 +1479,7 @@ loadWideFP(XtermWidget xw,
}
if (check_fontname(*nameOutP)) {
- if (xtermOpenFont(xw, *nameOutP, infoOut, False)
+ if (xtermOpenFont(xw, *nameOutP, infoOut, NULL, False)
&& is_derived_font_name(*nameOutP)
&& EmptyFont(infoOut->fs)) {
xtermCloseFont2(xw, infoOut - fWide, fWide);
@@ -1521,7 +1532,7 @@ loadWBoldFP(XtermWidget xw,
if (check_fontname(*nameOutP)) {
- if (xtermOpenFont(xw, *nameOutP, infoOut, False)
+ if (xtermOpenFont(xw, *nameOutP, infoOut, NULL, False)
&& is_derived_font_name(*nameOutP)
&& !compatibleWideCounts(wideInfoRef->fs, infoOut->fs)) {
xtermCloseFont2(xw, infoOut - fWBold, fWBold);
@@ -1574,6 +1585,10 @@ loadWBoldFP(XtermWidget xw,
}
#endif
+/*
+ * Load a given bitmap font, along with the bold/wide variants.
+ * Returns nonzero on success.
+ */
int
xtermLoadFont(XtermWidget xw,
const VTFontNames * fonts,
@@ -1583,33 +1598,37 @@ xtermLoadFont(XtermWidget xw,
TScreen *screen = TScreenOf(xw);
VTwin *win = WhichVWin(screen);
- VTFontNames myfonts;
- XTermFonts fnts[fMAX];
+ VTFontNames new_fnames;
+ XTermFonts new_fonts[fMAX];
+ XTermFonts old_fonts[fMAX];
char *tmpname = NULL;
Boolean proportional = False;
+ Boolean recovered;
+ int code = 0;
- memset(&myfonts, 0, sizeof(myfonts));
- memset(fnts, 0, sizeof(fnts));
+ memset(&new_fnames, 0, sizeof(new_fnames));
+ memset(new_fonts, 0, sizeof(new_fonts));
+ memcpy(&old_fonts, screen->fnts, sizeof(old_fonts));
if (fonts != 0)
- myfonts = *fonts;
- if (!check_fontname(myfonts.f_n))
- return 0;
+ new_fnames = *fonts;
+ if (!check_fontname(new_fnames.f_n))
+ return code;
if (fontnum == fontMenu_fontescape
- && myfonts.f_n != screen->MenuFontName(fontnum)) {
- if ((tmpname = x_strdup(myfonts.f_n)) == 0)
- return 0;
+ && new_fnames.f_n != screen->MenuFontName(fontnum)) {
+ if ((tmpname = x_strdup(new_fnames.f_n)) == 0)
+ return code;
}
- TRACE(("Begin Cgs - xtermLoadFont(%s)\n", myfonts.f_n));
+ TRACE(("Begin Cgs - xtermLoadFont(%s)\n", new_fnames.f_n));
releaseWindowGCs(xw, win);
#define DbgResource(name, field, index) \
TRACE(("xtermLoadFont #%d "name" %s%s\n", \
fontnum, \
- (fnts[index].warn == fwResource) ? "*" : " ", \
- NonNull(myfonts.field)))
+ (new_fonts[index].warn == fwResource) ? "*" : " ", \
+ NonNull(new_fnames.field)))
DbgResource("normal", f_n, fNorm);
DbgResource("bold ", f_b, fBold);
#if OPT_WIDE_CHARS
@@ -1618,16 +1637,17 @@ xtermLoadFont(XtermWidget xw,
#endif
if (!loadNormFP(xw,
- &myfonts.f_n,
- &fnts[fNorm],
+ &new_fnames.f_n,
+ &new_fonts[fNorm],
+ &old_fonts[fNorm],
fontnum))
goto bad;
if (!loadBoldFP(xw,
- &myfonts.f_b,
- &fnts[fBold],
- myfonts.f_n,
- &fnts[fNorm],
+ &new_fnames.f_b,
+ &new_fonts[fBold],
+ new_fnames.f_n,
+ &new_fonts[fNorm],
fontnum))
goto bad;
@@ -1639,20 +1659,20 @@ xtermLoadFont(XtermWidget xw,
if_OPT_WIDE_CHARS(screen, {
if (!loadWideFP(xw,
- &myfonts.f_w,
- &fnts[fWide],
- myfonts.f_n,
- &fnts[fNorm],
+ &new_fnames.f_w,
+ &new_fonts[fWide],
+ new_fnames.f_n,
+ &new_fonts[fNorm],
fontnum))
goto bad;
if (!loadWBoldFP(xw,
- &myfonts.f_wb,
- &fnts[fWBold],
- myfonts.f_w,
- &fnts[fWide],
- myfonts.f_b,
- &fnts[fBold],
+ &new_fnames.f_wb,
+ &new_fonts[fWBold],
+ new_fnames.f_w,
+ &new_fonts[fWide],
+ new_fnames.f_b,
+ &new_fonts[fBold],
fontnum))
goto bad;
@@ -1662,30 +1682,30 @@ xtermLoadFont(XtermWidget xw,
* Normal/bold fonts should be the same width. Also, the min/max
* values should be the same.
*/
- if (fnts[fNorm].fs != 0
- && fnts[fBold].fs != 0
- && (!is_fixed_font(fnts[fNorm].fs)
- || !is_fixed_font(fnts[fBold].fs)
- || differing_widths(fnts[fNorm].fs, fnts[fBold].fs))) {
+ if (new_fonts[fNorm].fs != 0
+ && new_fonts[fBold].fs != 0
+ && (!is_fixed_font(new_fonts[fNorm].fs)
+ || !is_fixed_font(new_fonts[fBold].fs)
+ || differing_widths(new_fonts[fNorm].fs, new_fonts[fBold].fs))) {
TRACE(("Proportional font! normal %d/%d, bold %d/%d\n",
- fnts[fNorm].fs->min_bounds.width,
- fnts[fNorm].fs->max_bounds.width,
- fnts[fBold].fs->min_bounds.width,
- fnts[fBold].fs->max_bounds.width));
+ new_fonts[fNorm].fs->min_bounds.width,
+ new_fonts[fNorm].fs->max_bounds.width,
+ new_fonts[fBold].fs->min_bounds.width,
+ new_fonts[fBold].fs->max_bounds.width));
proportional = True;
}
if_OPT_WIDE_CHARS(screen, {
- if (fnts[fWide].fs != 0
- && fnts[fWBold].fs != 0
- && (!is_fixed_font(fnts[fWide].fs)
- || !is_fixed_font(fnts[fWBold].fs)
- || differing_widths(fnts[fWide].fs, fnts[fWBold].fs))) {
+ if (new_fonts[fWide].fs != 0
+ && new_fonts[fWBold].fs != 0
+ && (!is_fixed_font(new_fonts[fWide].fs)
+ || !is_fixed_font(new_fonts[fWBold].fs)
+ || differing_widths(new_fonts[fWide].fs, new_fonts[fWBold].fs))) {
TRACE(("Proportional font! wide %d/%d, wide bold %d/%d\n",
- fnts[fWide].fs->min_bounds.width,
- fnts[fWide].fs->max_bounds.width,
- fnts[fWBold].fs->min_bounds.width,
- fnts[fWBold].fs->max_bounds.width));
+ new_fonts[fWide].fs->min_bounds.width,
+ new_fonts[fWide].fs->max_bounds.width,
+ new_fonts[fWBold].fs->min_bounds.width,
+ new_fonts[fWBold].fs->max_bounds.width));
proportional = True;
}
});
@@ -1704,13 +1724,13 @@ xtermLoadFont(XtermWidget xw,
screen->ifnts_ok = False;
#endif
- xtermCopyFontInfo(GetNormalFont(screen, fNorm), &fnts[fNorm]);
- xtermCopyFontInfo(GetNormalFont(screen, fBold), &fnts[fBold]);
+ xtermCopyFontInfo(GetNormalFont(screen, fNorm), &new_fonts[fNorm]);
+ xtermCopyFontInfo(GetNormalFont(screen, fBold), &new_fonts[fBold]);
#if OPT_WIDE_CHARS
- xtermCopyFontInfo(GetNormalFont(screen, fWide), &fnts[fWide]);
- if (fnts[fWBold].fs == NULL)
- xtermCopyFontInfo(GetNormalFont(screen, fWide), &fnts[fWide]);
- xtermCopyFontInfo(GetNormalFont(screen, fWBold), &fnts[fWBold]);
+ xtermCopyFontInfo(GetNormalFont(screen, fWide), &new_fonts[fWide]);
+ if (new_fonts[fWBold].fs == NULL)
+ xtermCopyFontInfo(GetNormalFont(screen, fWide), &new_fonts[fWide]);
+ xtermCopyFontInfo(GetNormalFont(screen, fWBold), &new_fonts[fWBold]);
#endif
xtermUpdateFontGCs(xw, getNormalFont);
@@ -1741,7 +1761,7 @@ xtermLoadFont(XtermWidget xw,
unsigned ch;
#if OPT_TRACE
-#define TRACE_MISS(index) show_font_misses(#index, &fnts[index])
+#define TRACE_MISS(index) show_font_misses(#index, &new_fonts[index])
TRACE_MISS(fNorm);
TRACE_MISS(fBold);
#if OPT_WIDE_CHARS
@@ -1758,8 +1778,8 @@ xtermLoadFont(XtermWidget xw,
if ((n != UCS_REPL)
&& (n != ch)
&& (screen->fnt_boxes & 2)) {
- if (xtermMissingChar(n, &fnts[fNorm]) ||
- xtermMissingChar(n, &fnts[fBold])) {
+ if (xtermMissingChar(n, &new_fonts[fNorm]) ||
+ xtermMissingChar(n, &new_fonts[fBold])) {
UIntClr(screen->fnt_boxes, 2);
TRACE(("missing graphics character #%d, U+%04X\n",
ch, n));
@@ -1771,12 +1791,12 @@ xtermLoadFont(XtermWidget xw,
#endif
for (ch = 1; ch < 32; ch++) {
- if (xtermMissingChar(ch, &fnts[fNorm])) {
+ if (xtermMissingChar(ch, &new_fonts[fNorm])) {
TRACE(("missing normal char #%d\n", ch));
UIntClr(screen->fnt_boxes, 1);
break;
}
- if (xtermMissingChar(ch, &fnts[fBold])) {
+ if (xtermMissingChar(ch, &new_fonts[fBold])) {
TRACE(("missing bold char #%d\n", ch));
UIntClr(screen->fnt_boxes, 1);
break;
@@ -1793,8 +1813,8 @@ xtermLoadFont(XtermWidget xw,
screen->enbolden = screen->bold_mode;
} else {
screen->enbolden = screen->bold_mode
- && ((fnts[fNorm].fs == fnts[fBold].fs)
- || same_font_name(myfonts.f_n, myfonts.f_b));
+ && ((new_fonts[fNorm].fs == new_fonts[fBold].fs)
+ || same_font_name(new_fnames.f_n, new_fnames.f_b));
}
TRACE(("Will %suse 1-pixel offset/overstrike to simulate bold\n",
screen->enbolden ? "" : "not "));
@@ -1810,7 +1830,7 @@ xtermLoadFont(XtermWidget xw,
update_font_escape();
}
#if OPT_SHIFT_FONTS
- screen->menu_font_sizes[fontnum] = FontSize(fnts[fNorm].fs);
+ screen->menu_font_sizes[fontnum] = FontSize(new_fonts[fNorm].fs);
#endif
}
set_cursor_gcs(xw);
@@ -1825,20 +1845,21 @@ xtermLoadFont(XtermWidget xw,
FREE_FNAME(f_w);
FREE_FNAME(f_wb);
#endif
- if (fnts[fNorm].fn == fnts[fBold].fn) {
- free(fnts[fNorm].fn);
+ if (new_fonts[fNorm].fn == new_fonts[fBold].fn) {
+ free(new_fonts[fNorm].fn);
} else {
- free(fnts[fNorm].fn);
- free(fnts[fBold].fn);
+ free(new_fonts[fNorm].fn);
+ free(new_fonts[fBold].fn);
}
#if OPT_WIDE_CHARS
- free(fnts[fWide].fn);
- free(fnts[fWBold].fn);
+ free(new_fonts[fWide].fn);
+ free(new_fonts[fWBold].fn);
#endif
xtermSetWinSize(xw);
return 1;
bad:
+ recovered = False;
free(tmpname);
#if OPT_RENDERFONT
@@ -1848,15 +1869,15 @@ xtermLoadFont(XtermWidget xw,
SetItemSensitivity(fontMenuEntries[fontnum].widget, True);
#endif
Bell(xw, XkbBI_MinorError, 0);
- myfonts.f_n = screen->MenuFontName(old_fontnum);
- return xtermLoadFont(xw, &myfonts, doresize, old_fontnum);
- } else if (x_strcasecmp(myfonts.f_n, DEFFONT)) {
- int code;
-
- myfonts.f_n = x_strdup(DEFFONT);
- TRACE(("...recovering for TrueType fonts\n"));
- code = xtermLoadFont(xw, &myfonts, doresize, fontnum);
- if (code) {
+ new_fnames.f_n = screen->MenuFontName(old_fontnum);
+ if (xtermLoadFont(xw, &new_fnames, doresize, old_fontnum))
+ recovered = True;
+ } else if (x_strcasecmp(new_fnames.f_n, DEFFONT)
+ && x_strcasecmp(new_fnames.f_n, old_fonts[fNorm].fn)) {
+ new_fnames.f_n = x_strdup(old_fonts[fNorm].fn);
+ TRACE(("...recovering from failed font-load\n"));
+ if (xtermLoadFont(xw, &new_fnames, doresize, fontnum)) {
+ recovered = True;
if (fontnum != fontMenu_fontsel) {
SetItemSensitivity(fontMenuEntries[fontnum].widget,
UsingRenderFont(xw));
@@ -1865,15 +1886,15 @@ xtermLoadFont(XtermWidget xw,
FontHeight(screen),
FontWidth(screen)));
}
- return code;
}
#endif
-
- releaseWindowGCs(xw, win);
-
- xtermCloseFonts(xw, fnts);
- TRACE(("Fail Cgs - xtermLoadFont\n"));
- return 0;
+ if (!recovered) {
+ releaseWindowGCs(xw, win);
+ xtermCloseFonts(xw, new_fonts);
+ TRACE(("Fail Cgs - xtermLoadFont\n"));
+ code = 0;
+ }
+ return code;
}
#if OPT_WIDE_ATTRS
@@ -1921,7 +1942,7 @@ xtermLoadItalics(XtermWidget xw)
} else {
xtermOpenFont(xw,
getNormalFont(screen, n)->fn,
- data, False);
+ data, NULL, False);
}
}
}
@@ -4357,9 +4378,7 @@ findXftGlyph(XtermWidget xw, XTermXftFonts *fontData, unsigned wc)
FcPatternDestroy(myPattern);
fontData->fs_size = (unsigned) fontData->fontset->nfont;
- }
-
- {
+ } {
XftFont *check;
Cardinal empty = fontData->fs_size;
@@ -4505,6 +4524,8 @@ xtermXftMissing(XtermWidget xw,
}
} while ((base = FcCharSetNextPage(font->charset, map,
&nextPage)) != FC_CHARSET_DONE);
+ (void) added;
+ (void) actual;
TRACE(("xtermXftMissing U+%04X #%-3d %6u added vs %6u of %6ld %s\n",
wc,
font_map->depth,
@@ -4677,7 +4698,7 @@ lookupOneFontSize(XtermWidget xw, int fontnum)
memset(&fnt, 0, sizeof(fnt));
screen->menu_font_sizes[fontnum] = -1;
- if (xtermOpenFont(xw, screen->MenuFontName(fontnum), &fnt, True)) {
+ if (xtermOpenFont(xw, screen->MenuFontName(fontnum), &fnt, NULL, True)) {
if (fontnum <= fontMenu_lastBuiltin
|| strcmp(fnt.fn, DEFFONT)) {
screen->menu_font_sizes[fontnum] = FontSize(fnt.fs);
@@ -5093,13 +5114,14 @@ HandleSetFont(Widget w,
}
}
-void
+Bool
SetVTFont(XtermWidget xw,
int which,
Bool doresize,
const VTFontNames * fonts)
{
TScreen *screen = TScreenOf(xw);
+ Bool result = False;
TRACE(("SetVTFont(which=%d, f_n=%s, f_b=%s)\n", which,
(fonts && fonts->f_n) ? fonts->f_n : "<null>",
@@ -5108,34 +5130,31 @@ SetVTFont(XtermWidget xw,
if (IsIcon(screen)) {
Bell(xw, XkbBI_MinorError, 0);
} else if (which >= 0 && which < NMENUFONTS) {
- VTFontNames myfonts;
+ VTFontNames new_fnames;
- memset(&myfonts, 0, sizeof(myfonts));
+ memset(&new_fnames, 0, sizeof(new_fnames));
if (fonts != 0)
- myfonts = *fonts;
+ new_fnames = *fonts;
if (which == fontMenu_fontsel) { /* go get the selection */
- FindFontSelection(xw, myfonts.f_n, False);
+ result = FindFontSelection(xw, new_fnames.f_n, False);
} else {
- int oldFont = screen->menu_font_number;
-
#define USE_CACHED(field, name) \
- if (myfonts.field == 0) { \
- myfonts.field = x_strdup(screen->menu_font_names[which][name]); \
- TRACE(("set myfonts." #field " from menu_font_names[%d][" #name "] %s\n", \
- which, NonNull(myfonts.field))); \
+ if (new_fnames.field == NULL) { \
+ new_fnames.field = x_strdup(screen->menu_font_names[which][name]); \
+ TRACE(("set new_fnames." #field " from menu_font_names[%d][" #name "] %s\n", \
+ which, NonNull(new_fnames.field))); \
} else { \
- TRACE(("set myfonts." #field " reused\n")); \
+ TRACE(("set new_fnames." #field " reused\n")); \
}
#define SAVE_FNAME(field, name) \
- if (myfonts.field != 0) { \
- if (screen->menu_font_names[which][name] == 0 \
- || strcmp(screen->menu_font_names[which][name], myfonts.field)) { \
- TRACE(("updating menu_font_names[%d][" #name "] to \"%s\"\n", \
- which, myfonts.field)); \
- FREE_STRING(screen->menu_font_names[which][name]); \
- screen->menu_font_names[which][name] = x_strdup(myfonts.field); \
- } \
+ if (new_fnames.field != NULL \
+ && (screen->menu_font_names[which][name] == NULL \
+ || strcmp(screen->menu_font_names[which][name], new_fnames.field))) { \
+ TRACE(("updating menu_font_names[%d][" #name "] to \"%s\"\n", \
+ which, new_fnames.field)); \
+ FREE_STRING(screen->menu_font_names[which][name]); \
+ screen->menu_font_names[which][name] = x_strdup(new_fnames.field); \
}
USE_CACHED(f_n, fNorm);
@@ -5145,7 +5164,7 @@ SetVTFont(XtermWidget xw,
USE_CACHED(f_wb, fWBold);
#endif
if (xtermLoadFont(xw,
- &myfonts,
+ &new_fnames,
doresize, which)) {
/*
* If successful, save the data so that a subsequent query via
@@ -5157,10 +5176,8 @@ SetVTFont(XtermWidget xw,
SAVE_FNAME(f_w, fWide);
SAVE_FNAME(f_wb, fWBold);
#endif
+ result = True;
} else {
- (void) xtermLoadFont(xw,
- xtermFontName(screen->MenuFontName(oldFont)),
- doresize, oldFont);
Bell(xw, XkbBI_MinorError, 0);
}
FREE_FNAME(f_n);
@@ -5173,7 +5190,8 @@ SetVTFont(XtermWidget xw,
} else {
Bell(xw, XkbBI_MinorError, 0);
}
- return;
+ TRACE(("...SetVTFont: %d\n", result));
+ return result;
}
#if OPT_RENDERFONT
diff --git a/app/xterm/fontutils.h b/app/xterm/fontutils.h
index a9c4da785..68326bc2b 100644
--- a/app/xterm/fontutils.h
+++ b/app/xterm/fontutils.h
@@ -1,4 +1,4 @@
-/* $XTermId: fontutils.h,v 1.140 2022/05/05 22:24:02 tom Exp $ */
+/* $XTermId: fontutils.h,v 1.142 2022/10/23 14:47:45 tom Exp $ */
/*
* Copyright 1998-2021,2022 by Thomas E. Dickey
@@ -37,7 +37,7 @@
/* *INDENT-OFF* */
extern Bool xtermLoadDefaultFonts (XtermWidget /* xw */);
-extern Bool xtermOpenFont (XtermWidget /* xw */, const char */* name */, XTermFonts * /* result */, Bool /* force */);
+extern Bool xtermOpenFont (XtermWidget /* xw */, const char */* name */, XTermFonts * /* result */, XTermFonts * /* current */, Bool /* force */);
extern XFontStruct * xtermLoadQueryFont(XtermWidget /* xw */, const char * /*name */);
extern XTermFonts * getDoubleFont (TScreen * /* screen */, int /* which */);
extern XTermFonts * getItalicFont (TScreen * /* screen */, int /* which */);
@@ -51,7 +51,7 @@ extern int lookupRelativeFontSize (XtermWidget /* xw */, int /* old */, int /* r
extern int xtermGetFont (const char * /* param */);
extern int xtermLoadFont (XtermWidget /* xw */, const VTFontNames */* fonts */, Bool /* doresize */, int /* fontnum */);
extern void HandleSetFont PROTO_XT_ACTIONS_ARGS;
-extern void SetVTFont (XtermWidget /* xw */, int /* i */, Bool /* doresize */, const VTFontNames */* fonts */);
+extern Bool SetVTFont (XtermWidget /* xw */, int /* i */, Bool /* doresize */, const VTFontNames */* fonts */);
extern void allocFontList (XtermWidget /* xw */, const char * /* name */, XtermFontNames * /* target */, VTFontEnum /* which */, const char * /* source */, Bool /* ttf */);
extern void copyFontList (char *** /* targetp */, char ** /* source */);
extern void initFontLists (XtermWidget /* xw */);
diff --git a/app/xterm/main.c b/app/xterm/main.c
index 275c1818d..f5bd60c6d 100644
--- a/app/xterm/main.c
+++ b/app/xterm/main.c
@@ -1,4 +1,4 @@
-/* $XTermId: main.c,v 1.889 2022/07/13 07:57:08 Brendan.O.Dea Exp $ */
+/* $XTermId: main.c,v 1.891 2022/10/21 23:02:38 tom Exp $ */
/*
* Copyright 2002-2021,2022 by Thomas E. Dickey
@@ -3756,62 +3756,73 @@ resetShell(char *oldPath)
static void
xtermTrimEnv(void)
{
-#define DATA(wild,name) { wild, #name }
+#define KEEP(wild,name) { 0, wild, #name }
+#define TRIM(wild,name) { 1, wild, #name }
/* *INDENT-OFF* */
- static struct {
+ static const struct {
+ int trim;
int wild;
const char *name;
} table[] = {
- DATA(0, COLUMNS),
- DATA(0, DEFAULT_COLORS),
- DATA(0, DESKTOP_STARTUP_ID),
- DATA(0, LINES),
- DATA(0, SHLVL), /* ksh, bash */
- DATA(0, STY), /* screen */
- DATA(0, TERMCAP),
- DATA(0, TMUX),
- DATA(0, TMUX_PANE),
- DATA(0, WCWIDTH_CJK_LEGACY),
- DATA(0, WINDOW), /* screen */
- DATA(0, XCURSOR_PATH),
- DATA(1, COLORFGBG),
- DATA(1, COLORTERM),
- DATA(1, GIO_LAUNCHED_),
- DATA(1, ITERM2_),
- DATA(1, MC_),
- DATA(1, MINTTY_),
- DATA(1, PUTTY),
- DATA(1, RXVT_),
- DATA(1, TERM_),
- DATA(1, URXVT_),
- DATA(1, VTE_),
- DATA(1, XTERM_),
+ TRIM(0, COLUMNS),
+ TRIM(0, DEFAULT_COLORS),
+ TRIM(0, DESKTOP_STARTUP_ID),
+ TRIM(0, LINES),
+ TRIM(0, SHLVL), /* ksh, bash */
+ TRIM(0, STY), /* screen */
+ TRIM(0, TERMCAP),
+ TRIM(0, TMUX),
+ TRIM(0, TMUX_PANE),
+ TRIM(0, WCWIDTH_CJK_LEGACY),
+ TRIM(0, WINDOW), /* screen */
+ TRIM(0, XCURSOR_PATH),
+ KEEP(0, MC_XDG_OPEN),
+ TRIM(1, COLORFGBG),
+ TRIM(1, COLORTERM),
+ TRIM(1, GIO_LAUNCHED_),
+ TRIM(1, ITERM2_),
+ TRIM(1, MC_),
+ TRIM(1, MINTTY_),
+ TRIM(1, PUTTY),
+ TRIM(1, RXVT_),
+ TRIM(1, TERM_),
+ TRIM(1, URXVT_),
+ TRIM(1, VTE_),
+ TRIM(1, XTERM_),
};
-#undef DATA
+#undef TRIM
/* *INDENT-ON* */
- Cardinal n;
-
- for (n = 0; n < XtNumber(table); ++n) {
- int s;
- if (table[n].wild) {
- size_t srclen = strlen(table[n].name);
- for (s = 0; environ[s] != NULL; ++s) {
- size_t dstlen = strlen(environ[s]);
- if (dstlen > srclen) {
- char *dstend = strchr(environ[s], '=');
+ Cardinal j, k;
+
+ for (j = 0; environ[j] != NULL; ++j) {
+ char *equals = strchr(environ[j], '=');
+ size_t dstlen = strlen(environ[j]);
+
+ if (equals == NULL)
+ equals = (environ[j] + dstlen);
+ else
+ dstlen = (size_t) (equals - environ[j]);
+
+ for (k = 0; k < XtNumber(table); ++k) {
+ size_t srclen = strlen(table[k].name);
+ if (table[k].wild) {
+ if (dstlen >= srclen &&
+ !strncmp(environ[j], table[k].name, srclen)) {
char *my_var;
- if (dstend != NULL &&
- (dstlen = (size_t) (dstend - environ[s])) >= srclen &&
- !strncmp(table[n].name, environ[s], srclen) &&
- (my_var = x_strdup(environ[s])) != NULL) {
+ if (table[k].trim &&
+ (my_var = x_strdup(environ[j])) != NULL) {
my_var[dstlen] = '\0';
xtermUnsetenv(my_var);
free(my_var);
}
+ break;
}
+ } else if (dstlen == srclen &&
+ !strncmp(environ[j], table[k].name, srclen)) {
+ if (table[k].trim)
+ xtermUnsetenv(table[k].name);
+ break;
}
- } else if (getenv(table[n].name) != NULL) {
- xtermUnsetenv(table[n].name);
}
}
}
diff --git a/app/xterm/misc.c b/app/xterm/misc.c
index 58b9f8dab..660e16e7e 100644
--- a/app/xterm/misc.c
+++ b/app/xterm/misc.c
@@ -1,4 +1,4 @@
-/* $XTermId: misc.c,v 1.1028 2022/10/06 22:24:07 tom Exp $ */
+/* $XTermId: misc.c,v 1.1030 2022/10/23 22:56:44 tom Exp $ */
/*
* Copyright 1999-2021,2022 by Thomas E. Dickey
@@ -3955,9 +3955,9 @@ ChangeFontRequest(XtermWidget xw, String buf)
{
memset(&fonts, 0, sizeof(fonts));
fonts.f_n = name;
- SetVTFont(xw, num, True, &fonts);
- if (num == screen->menu_font_number &&
- num != fontMenu_fontescape) {
+ if (SetVTFont(xw, num, True, &fonts)
+ && num == screen->menu_font_number
+ && num != fontMenu_fontescape) {
screen->EscapeFontName() = x_strdup(name);
}
}
@@ -6436,7 +6436,6 @@ xtermSetenv(const char *var, const char *value)
found = envindex;
environ[found + 1] = NULL;
- environ = environ;
}
environ[found] = malloc(2 + len + strlen(value));
diff --git a/app/xterm/package/debian/changelog b/app/xterm/package/debian/changelog
index 29966537f..a923cc24a 100644
--- a/app/xterm/package/debian/changelog
+++ b/app/xterm/package/debian/changelog
@@ -1,3 +1,9 @@
+xterm-dev (375) unstable; urgency=low
+
+ * maintenance updates
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Thu, 20 Oct 2022 20:45:30 -0400
+
xterm-dev (374) unstable; urgency=low
* maintenance updates
diff --git a/app/xterm/package/freebsd/Makefile b/app/xterm/package/freebsd/Makefile
index b8ab1790e..19eacde1c 100644
--- a/app/xterm/package/freebsd/Makefile
+++ b/app/xterm/package/freebsd/Makefile
@@ -1,4 +1,4 @@
-# $XTermId: Makefile,v 1.95 2022/09/27 08:18:41 tom Exp $
+# $XTermId: Makefile,v 1.96 2022/10/21 00:45:30 tom Exp $
# $FreeBSD: head/x11/xterm/Makefile 492827 2019-02-13 06:43:36Z ehaupt $
# This is adapted from the FreeBSD port, installing as "xterm-dev" with
@@ -7,7 +7,7 @@
# and "make makesum".
PORTNAME= xterm
-PORTVERSION= 374
+PORTVERSION= 375
CATEGORIES= x11
MASTER_SITES= ftp://ftp.invisible-island.net/xterm/:src1 \
https://invisible-mirror.net/archives/xterm/:src1
diff --git a/app/xterm/package/pkgsrc/Makefile b/app/xterm/package/pkgsrc/Makefile
index bed75dcb8..2218df69d 100644
--- a/app/xterm/package/pkgsrc/Makefile
+++ b/app/xterm/package/pkgsrc/Makefile
@@ -1,6 +1,6 @@
# $NetBSD: Makefile,v 1.117 2018/03/12 11:18:00 wiz Exp $
-DISTNAME= xterm-374
+DISTNAME= xterm-375
PKGREVISION= 1
CATEGORIES= x11
MASTER_SITES= ftp://ftp.invisible-island.net/xterm/
diff --git a/app/xterm/package/xterm.spec b/app/xterm/package/xterm.spec
index 2de0a002e..4b0b9c3ac 100644
--- a/app/xterm/package/xterm.spec
+++ b/app/xterm/package/xterm.spec
@@ -1,11 +1,11 @@
-# $XTermId: xterm.spec,v 1.151 2022/09/27 08:18:41 tom Exp $
+# $XTermId: xterm.spec,v 1.152 2022/10/21 00:45:30 tom Exp $
Summary: X terminal emulator (development version)
%global my_middle xterm
%global my_suffix -dev
%global fullname %{my_middle}%{my_suffix}
%global my_class XTermDev
Name: %{fullname}
-Version: 374
+Version: 375
Release: 1
License: X11
Group: User Interface/X
diff --git a/app/xterm/screen.c b/app/xterm/screen.c
index b95a882aa..e78b9608a 100644
--- a/app/xterm/screen.c
+++ b/app/xterm/screen.c
@@ -1,4 +1,4 @@
-/* $XTermId: screen.c,v 1.626 2022/09/19 23:08:41 tom Exp $ */
+/* $XTermId: screen.c,v 1.627 2022/10/23 22:57:40 tom Exp $ */
/*
* Copyright 1999-2021,2022 by Thomas E. Dickey
@@ -1454,7 +1454,7 @@ ScrnRefresh(XtermWidget xw,
maxrow += StatusLineRows;
}
#endif
-
+ (void) recurse;
++recurse;
if (screen->cursorp.col >= leftcol
diff --git a/app/xterm/version.h b/app/xterm/version.h
index 8d2a332c3..de838e883 100644
--- a/app/xterm/version.h
+++ b/app/xterm/version.h
@@ -1,4 +1,4 @@
-/* $XTermId: version.h,v 1.527 2022/10/10 16:31:27 tom Exp $ */
+/* $XTermId: version.h,v 1.529 2022/10/24 00:25:39 tom Exp $ */
/*
* Copyright 1998-2021,2022 by Thomas E. Dickey
@@ -38,8 +38,8 @@
* version of X to which this version of xterm has been built. The resulting
* number in parentheses is my patch number (Thomas E. Dickey).
*/
-#define XTERM_PATCH 374
-#define XTERM_DATE 2022-10-10
+#define XTERM_PATCH 375
+#define XTERM_DATE 2022-10-23
#ifndef __vendorversion__
#define __vendorversion__ "XTerm/OpenBSD"
diff --git a/app/xterm/xterm.appdata.xml b/app/xterm/xterm.appdata.xml
index fa7b633dd..7b296cadc 100644
--- a/app/xterm/xterm.appdata.xml
+++ b/app/xterm/xterm.appdata.xml
@@ -35,7 +35,7 @@
<keyword>terminal</keyword>
</keywords>
<releases>
- <release version="374" date="2022-10-10"/>
+ <release version="375" date="2022-10-23"/>
</releases>
<url type="homepage">https://invisible-island.net/xterm/</url>
<update_contact>dickey@invisible-island.net</update_contact>
diff --git a/app/xterm/xterm.h b/app/xterm/xterm.h
index b3f1d45c9..4b0eee5f4 100644
--- a/app/xterm/xterm.h
+++ b/app/xterm/xterm.h
@@ -1,4 +1,4 @@
-/* $XTermId: xterm.h,v 1.918 2022/10/06 19:48:28 tom Exp $ */
+/* $XTermId: xterm.h,v 1.919 2022/10/23 13:37:56 tom Exp $ */
/*
* Copyright 1999-2021,2022 by Thomas E. Dickey
@@ -1009,7 +1009,7 @@ extern Bool CheckBufPtrs (TScreen * /* screen */);
extern Bool set_cursor_gcs (XtermWidget /* xw */);
extern char * vt100ResourceToString (XtermWidget /* xw */, const char * /* name */);
extern int VTInit (XtermWidget /* xw */);
-extern void FindFontSelection (XtermWidget /* xw */, const char * /* atom_name */, Bool /* justprobe */);
+extern Bool FindFontSelection (XtermWidget /* xw */, const char * /* atom_name */, Bool /* justprobe */);
extern void HideCursor (XtermWidget /* xw */);
extern void RestartBlinking(XtermWidget /* xw */);
extern void ShowCursor (XtermWidget /* xw */);
diff --git a/app/xterm/xterm.log.html b/app/xterm/xterm.log.html
index 86adab8c1..ce3f3913b 100644
--- a/app/xterm/xterm.log.html
+++ b/app/xterm/xterm.log.html
@@ -30,7 +30,7 @@
* sale, use or other dealings in this Software without prior written *
* authorization. *
*****************************************************************************
- $XTermId: xterm.log.html,v 1.2447 2022/10/11 00:04:21 tom Exp $
+ $XTermId: xterm.log.html,v 1.2453 2022/10/24 00:25:20 tom Exp $
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
@@ -70,6 +70,8 @@
CHANGELOG</a>).</p>
<ul>
+ <li><a href="#xterm_375">Patch #375 - 2022/10/23</a></li>
+
<li><a href="#xterm_374">Patch #374 - 2022/10/10</a></li>
<li><a href="#xterm_373">Patch #373 - 2022/09/25</a></li>
@@ -1026,6 +1028,23 @@
<li><a href="#xterm_01">Patch #1 - 1996/1/6</a></li>
</ul>
+ <h1><a name="xterm_375" id="xterm_375">Patch #375 -
+ 2022/10/23</a></h1>
+
+ <ul>
+ <li>improve error-recovery when setting a bitmap font for the
+ VT100 window, e.g., in case <em>OSC&nbsp;50</em> failed,
+ restoring the most recent valid font so that a subsequent
+ <em>OSC&nbsp;50</em> reports this correctly (report by David
+ Leadbeater).</li>
+
+ <li>exclude <code>MC_XDG_OPEN</code> from environment variables
+ trimmed on startup (report by Gabor Hauzer).</li>
+
+ <li>check for null pointer in <code>isSelect()</code> (report
+ by Column Paget).</li>
+ </ul>
+
<h1><a name="xterm_374" id="xterm_374">Patch #374 -
2022/10/10</a></h1>