diff options
-rw-r--r-- | app/xterm/MANIFEST | 2 | ||||
-rw-r--r-- | app/xterm/NEWS | 27 | ||||
-rw-r--r-- | app/xterm/button.c | 18 | ||||
-rw-r--r-- | app/xterm/charproc.c | 11 | ||||
-rw-r--r-- | app/xterm/doublechr.c | 6 | ||||
-rw-r--r-- | app/xterm/fontutils.c | 272 | ||||
-rw-r--r-- | app/xterm/fontutils.h | 6 | ||||
-rw-r--r-- | app/xterm/main.c | 99 | ||||
-rw-r--r-- | app/xterm/misc.c | 9 | ||||
-rw-r--r-- | app/xterm/package/debian/changelog | 6 | ||||
-rw-r--r-- | app/xterm/package/freebsd/Makefile | 4 | ||||
-rw-r--r-- | app/xterm/package/pkgsrc/Makefile | 2 | ||||
-rw-r--r-- | app/xterm/package/xterm.spec | 4 | ||||
-rw-r--r-- | app/xterm/screen.c | 4 | ||||
-rw-r--r-- | app/xterm/version.h | 6 | ||||
-rw-r--r-- | app/xterm/xterm.appdata.xml | 2 | ||||
-rw-r--r-- | app/xterm/xterm.h | 4 | ||||
-rw-r--r-- | app/xterm/xterm.log.html | 21 |
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 50</em> failed, + restoring the most recent valid font so that a subsequent + <em>OSC 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> |