1*4882a593SmuzhiyunFrom 787636674918873a091e7a4ef5977263ba982322 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: "Thomas E. Dickey" <dickey@invisible-island.net> 3*4882a593SmuzhiyunDate: Sun, 23 Oct 2022 22:59:52 +0000 4*4882a593SmuzhiyunSubject: [PATCH] snapshot of project "xterm", label xterm-374c 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunUpstream-Status: https://github.com/ThomasDickey/xterm-snapshots/commit/787636674918873a091e7a4ef5977263ba982322 7*4882a593SmuzhiyunCVE: CVE-2022-45063 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunSigned-off-by: Siddharth Doshi <sdoshi@mvista.com> 10*4882a593Smuzhiyun--- 11*4882a593Smuzhiyun button.c | 14 +-- 12*4882a593Smuzhiyun charproc.c | 9 +- 13*4882a593Smuzhiyun doublechr.c | 4 +- 14*4882a593Smuzhiyun fontutils.c | 266 ++++++++++++++++++++++++++----------------------- 15*4882a593Smuzhiyun fontutils.h | 4 +- 16*4882a593Smuzhiyun misc.c | 7 +- 17*4882a593Smuzhiyun screen.c | 2 +- 18*4882a593Smuzhiyun xterm.h | 2 +- 19*4882a593Smuzhiyun xterm.log.html | 6 ++ 20*4882a593Smuzhiyun 9 files changed, 163 insertions(+), 151 deletions(-) 21*4882a593Smuzhiyun 22*4882a593Smuzhiyundiff --git a/button.c b/button.c 23*4882a593Smuzhiyunindex f10092a..0bbf76e 100644 24*4882a593Smuzhiyun--- a/button.c 25*4882a593Smuzhiyun+++ b/button.c 26*4882a593Smuzhiyun@@ -2051,13 +2051,8 @@ void 27*4882a593Smuzhiyun UnmapSelections(XtermWidget xw) 28*4882a593Smuzhiyun { 29*4882a593Smuzhiyun TScreen *screen = TScreenOf(xw); 30*4882a593Smuzhiyun- Cardinal n; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun- if (screen->mappedSelect) { 33*4882a593Smuzhiyun- for (n = 0; screen->mappedSelect[n] != 0; ++n) 34*4882a593Smuzhiyun- free((void *) screen->mappedSelect[n]); 35*4882a593Smuzhiyun- FreeAndNull(screen->mappedSelect); 36*4882a593Smuzhiyun- } 37*4882a593Smuzhiyun+ FreeAndNull(screen->mappedSelect); 38*4882a593Smuzhiyun } 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /* 41*4882a593Smuzhiyun@@ -2093,14 +2088,11 @@ MapSelections(XtermWidget xw, String *params, Cardinal num_params) 42*4882a593Smuzhiyun if ((result = TypeMallocN(String, num_params + 1)) != 0) { 43*4882a593Smuzhiyun result[num_params] = 0; 44*4882a593Smuzhiyun for (j = 0; j < num_params; ++j) { 45*4882a593Smuzhiyun- result[j] = x_strdup((isSELECT(params[j]) 46*4882a593Smuzhiyun+ result[j] = (String) (isSELECT(params[j]) 47*4882a593Smuzhiyun ? mapTo 48*4882a593Smuzhiyun- : params[j])); 49*4882a593Smuzhiyun+ : params[j]); 50*4882a593Smuzhiyun if (result[j] == 0) { 51*4882a593Smuzhiyun UnmapSelections(xw); 52*4882a593Smuzhiyun- while (j != 0) { 53*4882a593Smuzhiyun- free((void *) result[--j]); 54*4882a593Smuzhiyun- } 55*4882a593Smuzhiyun FreeAndNull(result); 56*4882a593Smuzhiyun break; 57*4882a593Smuzhiyun } 58*4882a593Smuzhiyundiff --git a/charproc.c b/charproc.c 59*4882a593Smuzhiyunindex 2a3c69a..91cbcea 100644 60*4882a593Smuzhiyun--- a/charproc.c 61*4882a593Smuzhiyun+++ b/charproc.c 62*4882a593Smuzhiyun@@ -13605,7 +13605,6 @@ DoSetSelectedFont(Widget w, 63*4882a593Smuzhiyun Bell(xw, XkbBI_MinorError, 0); 64*4882a593Smuzhiyun } else { 65*4882a593Smuzhiyun Boolean failed = False; 66*4882a593Smuzhiyun- int oldFont = TScreenOf(xw)->menu_font_number; 67*4882a593Smuzhiyun char *save = TScreenOf(xw)->SelectFontName(); 68*4882a593Smuzhiyun char *val; 69*4882a593Smuzhiyun char *test; 70*4882a593Smuzhiyun@@ -13650,10 +13649,6 @@ DoSetSelectedFont(Widget w, 71*4882a593Smuzhiyun failed = True; 72*4882a593Smuzhiyun } 73*4882a593Smuzhiyun if (failed) { 74*4882a593Smuzhiyun- (void) xtermLoadFont(xw, 75*4882a593Smuzhiyun- xtermFontName(TScreenOf(xw)->MenuFontName(oldFont)), 76*4882a593Smuzhiyun- True, 77*4882a593Smuzhiyun- oldFont); 78*4882a593Smuzhiyun Bell(xw, XkbBI_MinorError, 0); 79*4882a593Smuzhiyun } 80*4882a593Smuzhiyun free(used); 81*4882a593Smuzhiyun@@ -13662,7 +13657,7 @@ DoSetSelectedFont(Widget w, 82*4882a593Smuzhiyun } 83*4882a593Smuzhiyun } 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun-void 86*4882a593Smuzhiyun+Bool 87*4882a593Smuzhiyun FindFontSelection(XtermWidget xw, const char *atom_name, Bool justprobe) 88*4882a593Smuzhiyun { 89*4882a593Smuzhiyun TScreen *screen = TScreenOf(xw); 90*4882a593Smuzhiyun@@ -13702,7 +13697,7 @@ FindFontSelection(XtermWidget xw, const char *atom_name, Bool justprobe) 91*4882a593Smuzhiyun DoSetSelectedFont, NULL, 92*4882a593Smuzhiyun XtLastTimestampProcessed(XtDisplay(xw))); 93*4882a593Smuzhiyun } 94*4882a593Smuzhiyun- return; 95*4882a593Smuzhiyun+ return (screen->SelectFontName() != NULL) ? True : False; 96*4882a593Smuzhiyun } 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun Bool 99*4882a593Smuzhiyundiff --git a/doublechr.c b/doublechr.c 100*4882a593Smuzhiyunindex a802e32..6416849 100644 101*4882a593Smuzhiyun--- a/doublechr.c 102*4882a593Smuzhiyun+++ b/doublechr.c 103*4882a593Smuzhiyun@@ -295,7 +295,7 @@ xterm_DoubleGC(XTermDraw * params, GC old_gc, int *inxp) 104*4882a593Smuzhiyun temp.flags = (params->attr_flags & BOLD); 105*4882a593Smuzhiyun temp.warn = fwResource; 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun- if (!xtermOpenFont(params->xw, name, &temp, False)) { 108*4882a593Smuzhiyun+ if (!xtermOpenFont(params->xw, name, &temp, NULL, False)) { 109*4882a593Smuzhiyun XTermDraw local = *params; 110*4882a593Smuzhiyun char *nname; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun@@ -304,7 +304,7 @@ xterm_DoubleGC(XTermDraw * params, GC old_gc, int *inxp) 113*4882a593Smuzhiyun nname = xtermSpecialFont(&local); 114*4882a593Smuzhiyun if (nname != 0) { 115*4882a593Smuzhiyun found = (Boolean) xtermOpenFont(params->xw, nname, &temp, 116*4882a593Smuzhiyun- False); 117*4882a593Smuzhiyun+ NULL, False); 118*4882a593Smuzhiyun free(nname); 119*4882a593Smuzhiyun } 120*4882a593Smuzhiyun } else { 121*4882a593Smuzhiyundiff --git a/fontutils.c b/fontutils.c 122*4882a593Smuzhiyunindex 1646b4b..71f4ec2 100644 123*4882a593Smuzhiyun--- a/fontutils.c 124*4882a593Smuzhiyun+++ b/fontutils.c 125*4882a593Smuzhiyun@@ -92,9 +92,9 @@ 126*4882a593Smuzhiyun } 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #define FREE_FNAME(field) \ 129*4882a593Smuzhiyun- if (fonts == 0 || myfonts.field != fonts->field) { \ 130*4882a593Smuzhiyun- FREE_STRING(myfonts.field); \ 131*4882a593Smuzhiyun- myfonts.field = 0; \ 132*4882a593Smuzhiyun+ if (fonts == 0 || new_fnames.field != fonts->field) { \ 133*4882a593Smuzhiyun+ FREE_STRING(new_fnames.field); \ 134*4882a593Smuzhiyun+ new_fnames.field = 0; \ 135*4882a593Smuzhiyun } 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /* 138*4882a593Smuzhiyun@@ -573,7 +573,7 @@ open_italic_font(XtermWidget xw, int n, FontNameProperties *fp, XTermFonts * dat 139*4882a593Smuzhiyun if ((name = italic_font_name(fp, slant[pass])) != 0) { 140*4882a593Smuzhiyun TRACE(("open_italic_font %s %s\n", 141*4882a593Smuzhiyun whichFontEnum((VTFontEnum) n), name)); 142*4882a593Smuzhiyun- if (xtermOpenFont(xw, name, data, False)) { 143*4882a593Smuzhiyun+ if (xtermOpenFont(xw, name, data, NULL, False)) { 144*4882a593Smuzhiyun result = (data->fs != 0); 145*4882a593Smuzhiyun #if OPT_REPORT_FONTS 146*4882a593Smuzhiyun if (resource.reportFonts) { 147*4882a593Smuzhiyun@@ -1037,20 +1037,26 @@ xtermLoadQueryFont(XtermWidget xw, const char *name) 148*4882a593Smuzhiyun } 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /* 151*4882a593Smuzhiyun- * Open the given font and verify that it is non-empty. Return a null on 152*4882a593Smuzhiyun+ * Open the given font and verify that it is non-empty. Return false on 153*4882a593Smuzhiyun * failure. 154*4882a593Smuzhiyun */ 155*4882a593Smuzhiyun Bool 156*4882a593Smuzhiyun xtermOpenFont(XtermWidget xw, 157*4882a593Smuzhiyun const char *name, 158*4882a593Smuzhiyun XTermFonts * result, 159*4882a593Smuzhiyun+ XTermFonts * current, 160*4882a593Smuzhiyun Bool force) 161*4882a593Smuzhiyun { 162*4882a593Smuzhiyun Bool code = False; 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun TRACE(("xtermOpenFont %d:%d '%s'\n", 165*4882a593Smuzhiyun result->warn, xw->misc.fontWarnings, NonNull(name))); 166*4882a593Smuzhiyun+ 167*4882a593Smuzhiyun if (!IsEmpty(name)) { 168*4882a593Smuzhiyun+ Bool existing = (current != NULL 169*4882a593Smuzhiyun+ && current->fs != NULL 170*4882a593Smuzhiyun+ && current->fn != NULL); 171*4882a593Smuzhiyun+ 172*4882a593Smuzhiyun if ((result->fs = xtermLoadQueryFont(xw, name)) != 0) { 173*4882a593Smuzhiyun code = True; 174*4882a593Smuzhiyun if (EmptyFont(result->fs)) { 175*4882a593Smuzhiyun@@ -1069,9 +1075,13 @@ xtermOpenFont(XtermWidget xw, 176*4882a593Smuzhiyun } else { 177*4882a593Smuzhiyun TRACE(("xtermOpenFont: cannot load font '%s'\n", name)); 178*4882a593Smuzhiyun } 179*4882a593Smuzhiyun- if (force) { 180*4882a593Smuzhiyun+ if (existing) { 181*4882a593Smuzhiyun+ TRACE(("...continue using font '%s'\n", current->fn)); 182*4882a593Smuzhiyun+ result->fn = x_strdup(current->fn); 183*4882a593Smuzhiyun+ result->fs = current->fs; 184*4882a593Smuzhiyun+ } else if (force) { 185*4882a593Smuzhiyun NoFontWarning(result); 186*4882a593Smuzhiyun- code = xtermOpenFont(xw, DEFFONT, result, True); 187*4882a593Smuzhiyun+ code = xtermOpenFont(xw, DEFFONT, result, NULL, True); 188*4882a593Smuzhiyun } 189*4882a593Smuzhiyun } 190*4882a593Smuzhiyun } 191*4882a593Smuzhiyun@@ -1321,6 +1331,7 @@ static Bool 192*4882a593Smuzhiyun loadNormFP(XtermWidget xw, 193*4882a593Smuzhiyun char **nameOutP, 194*4882a593Smuzhiyun XTermFonts * infoOut, 195*4882a593Smuzhiyun+ XTermFonts * current, 196*4882a593Smuzhiyun int fontnum) 197*4882a593Smuzhiyun { 198*4882a593Smuzhiyun Bool status = True; 199*4882a593Smuzhiyun@@ -1330,7 +1341,7 @@ loadNormFP(XtermWidget xw, 200*4882a593Smuzhiyun if (!xtermOpenFont(xw, 201*4882a593Smuzhiyun *nameOutP, 202*4882a593Smuzhiyun infoOut, 203*4882a593Smuzhiyun- (fontnum == fontMenu_default))) { 204*4882a593Smuzhiyun+ current, (fontnum == fontMenu_default))) { 205*4882a593Smuzhiyun /* 206*4882a593Smuzhiyun * If we are opening the default font, and it happens to be missing, 207*4882a593Smuzhiyun * force that to the compiled-in default font, e.g., "fixed". If we 208*4882a593Smuzhiyun@@ -1365,10 +1376,10 @@ loadBoldFP(XtermWidget xw, 209*4882a593Smuzhiyun if (fp != 0) { 210*4882a593Smuzhiyun NoFontWarning(infoOut); 211*4882a593Smuzhiyun *nameOutP = bold_font_name(fp, fp->average_width); 212*4882a593Smuzhiyun- if (!xtermOpenFont(xw, *nameOutP, infoOut, False)) { 213*4882a593Smuzhiyun+ if (!xtermOpenFont(xw, *nameOutP, infoOut, NULL, False)) { 214*4882a593Smuzhiyun free(*nameOutP); 215*4882a593Smuzhiyun *nameOutP = bold_font_name(fp, -1); 216*4882a593Smuzhiyun- xtermOpenFont(xw, *nameOutP, infoOut, False); 217*4882a593Smuzhiyun+ xtermOpenFont(xw, *nameOutP, infoOut, NULL, False); 218*4882a593Smuzhiyun } 219*4882a593Smuzhiyun TRACE(("...derived bold '%s'\n", NonNull(*nameOutP))); 220*4882a593Smuzhiyun } 221*4882a593Smuzhiyun@@ -1386,7 +1397,7 @@ loadBoldFP(XtermWidget xw, 222*4882a593Smuzhiyun TRACE(("...did not get a matching bold font\n")); 223*4882a593Smuzhiyun } 224*4882a593Smuzhiyun free(normal); 225*4882a593Smuzhiyun- } else if (!xtermOpenFont(xw, *nameOutP, infoOut, False)) { 226*4882a593Smuzhiyun+ } else if (!xtermOpenFont(xw, *nameOutP, infoOut, NULL, False)) { 227*4882a593Smuzhiyun xtermCopyFontInfo(infoOut, infoRef); 228*4882a593Smuzhiyun TRACE(("...cannot load bold font '%s'\n", NonNull(*nameOutP))); 229*4882a593Smuzhiyun } else { 230*4882a593Smuzhiyun@@ -1440,7 +1451,7 @@ loadWideFP(XtermWidget xw, 231*4882a593Smuzhiyun } 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun if (check_fontname(*nameOutP)) { 234*4882a593Smuzhiyun- if (xtermOpenFont(xw, *nameOutP, infoOut, False) 235*4882a593Smuzhiyun+ if (xtermOpenFont(xw, *nameOutP, infoOut, NULL, False) 236*4882a593Smuzhiyun && is_derived_font_name(*nameOutP) 237*4882a593Smuzhiyun && EmptyFont(infoOut->fs)) { 238*4882a593Smuzhiyun xtermCloseFont2(xw, infoOut - fWide, fWide); 239*4882a593Smuzhiyun@@ -1493,7 +1504,7 @@ loadWBoldFP(XtermWidget xw, 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun if (check_fontname(*nameOutP)) { 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun- if (xtermOpenFont(xw, *nameOutP, infoOut, False) 244*4882a593Smuzhiyun+ if (xtermOpenFont(xw, *nameOutP, infoOut, NULL, False) 245*4882a593Smuzhiyun && is_derived_font_name(*nameOutP) 246*4882a593Smuzhiyun && !compatibleWideCounts(wideInfoRef->fs, infoOut->fs)) { 247*4882a593Smuzhiyun xtermCloseFont2(xw, infoOut - fWBold, fWBold); 248*4882a593Smuzhiyun@@ -1546,6 +1557,10 @@ loadWBoldFP(XtermWidget xw, 249*4882a593Smuzhiyun } 250*4882a593Smuzhiyun #endif 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun+/* 253*4882a593Smuzhiyun+ * Load a given bitmap font, along with the bold/wide variants. 254*4882a593Smuzhiyun+ * Returns nonzero on success. 255*4882a593Smuzhiyun+ */ 256*4882a593Smuzhiyun int 257*4882a593Smuzhiyun xtermLoadFont(XtermWidget xw, 258*4882a593Smuzhiyun const VTFontNames * fonts, 259*4882a593Smuzhiyun@@ -1555,33 +1570,37 @@ xtermLoadFont(XtermWidget xw, 260*4882a593Smuzhiyun TScreen *screen = TScreenOf(xw); 261*4882a593Smuzhiyun VTwin *win = WhichVWin(screen); 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun- VTFontNames myfonts; 264*4882a593Smuzhiyun- XTermFonts fnts[fMAX]; 265*4882a593Smuzhiyun+ VTFontNames new_fnames; 266*4882a593Smuzhiyun+ XTermFonts new_fonts[fMAX]; 267*4882a593Smuzhiyun+ XTermFonts old_fonts[fMAX]; 268*4882a593Smuzhiyun char *tmpname = NULL; 269*4882a593Smuzhiyun Boolean proportional = False; 270*4882a593Smuzhiyun+ Boolean recovered; 271*4882a593Smuzhiyun+ int code = 0; 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun- memset(&myfonts, 0, sizeof(myfonts)); 274*4882a593Smuzhiyun- memset(fnts, 0, sizeof(fnts)); 275*4882a593Smuzhiyun+ memset(&new_fnames, 0, sizeof(new_fnames)); 276*4882a593Smuzhiyun+ memset(new_fonts, 0, sizeof(new_fonts)); 277*4882a593Smuzhiyun+ memcpy(&old_fonts, screen->fnts, sizeof(old_fonts)); 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun if (fonts != 0) 280*4882a593Smuzhiyun- myfonts = *fonts; 281*4882a593Smuzhiyun- if (!check_fontname(myfonts.f_n)) 282*4882a593Smuzhiyun- return 0; 283*4882a593Smuzhiyun+ new_fnames = *fonts; 284*4882a593Smuzhiyun+ if (!check_fontname(new_fnames.f_n)) 285*4882a593Smuzhiyun+ return code; 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun if (fontnum == fontMenu_fontescape 288*4882a593Smuzhiyun- && myfonts.f_n != screen->MenuFontName(fontnum)) { 289*4882a593Smuzhiyun- if ((tmpname = x_strdup(myfonts.f_n)) == 0) 290*4882a593Smuzhiyun- return 0; 291*4882a593Smuzhiyun+ && new_fnames.f_n != screen->MenuFontName(fontnum)) { 292*4882a593Smuzhiyun+ if ((tmpname = x_strdup(new_fnames.f_n)) == 0) 293*4882a593Smuzhiyun+ return code; 294*4882a593Smuzhiyun } 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun- TRACE(("Begin Cgs - xtermLoadFont(%s)\n", myfonts.f_n)); 297*4882a593Smuzhiyun+ TRACE(("Begin Cgs - xtermLoadFont(%s)\n", new_fnames.f_n)); 298*4882a593Smuzhiyun releaseWindowGCs(xw, win); 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun #define DbgResource(name, field, index) \ 301*4882a593Smuzhiyun TRACE(("xtermLoadFont #%d "name" %s%s\n", \ 302*4882a593Smuzhiyun fontnum, \ 303*4882a593Smuzhiyun- (fnts[index].warn == fwResource) ? "*" : " ", \ 304*4882a593Smuzhiyun- NonNull(myfonts.field))) 305*4882a593Smuzhiyun+ (new_fonts[index].warn == fwResource) ? "*" : " ", \ 306*4882a593Smuzhiyun+ NonNull(new_fnames.field))) 307*4882a593Smuzhiyun DbgResource("normal", f_n, fNorm); 308*4882a593Smuzhiyun DbgResource("bold ", f_b, fBold); 309*4882a593Smuzhiyun #if OPT_WIDE_CHARS 310*4882a593Smuzhiyun@@ -1590,16 +1609,17 @@ xtermLoadFont(XtermWidget xw, 311*4882a593Smuzhiyun #endif 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun if (!loadNormFP(xw, 314*4882a593Smuzhiyun- &myfonts.f_n, 315*4882a593Smuzhiyun- &fnts[fNorm], 316*4882a593Smuzhiyun+ &new_fnames.f_n, 317*4882a593Smuzhiyun+ &new_fonts[fNorm], 318*4882a593Smuzhiyun+ &old_fonts[fNorm], 319*4882a593Smuzhiyun fontnum)) 320*4882a593Smuzhiyun goto bad; 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun if (!loadBoldFP(xw, 323*4882a593Smuzhiyun- &myfonts.f_b, 324*4882a593Smuzhiyun- &fnts[fBold], 325*4882a593Smuzhiyun- myfonts.f_n, 326*4882a593Smuzhiyun- &fnts[fNorm], 327*4882a593Smuzhiyun+ &new_fnames.f_b, 328*4882a593Smuzhiyun+ &new_fonts[fBold], 329*4882a593Smuzhiyun+ new_fnames.f_n, 330*4882a593Smuzhiyun+ &new_fonts[fNorm], 331*4882a593Smuzhiyun fontnum)) 332*4882a593Smuzhiyun goto bad; 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun@@ -1611,20 +1631,20 @@ xtermLoadFont(XtermWidget xw, 335*4882a593Smuzhiyun if_OPT_WIDE_CHARS(screen, { 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun if (!loadWideFP(xw, 338*4882a593Smuzhiyun- &myfonts.f_w, 339*4882a593Smuzhiyun- &fnts[fWide], 340*4882a593Smuzhiyun- myfonts.f_n, 341*4882a593Smuzhiyun- &fnts[fNorm], 342*4882a593Smuzhiyun+ &new_fnames.f_w, 343*4882a593Smuzhiyun+ &new_fonts[fWide], 344*4882a593Smuzhiyun+ new_fnames.f_n, 345*4882a593Smuzhiyun+ &new_fonts[fNorm], 346*4882a593Smuzhiyun fontnum)) 347*4882a593Smuzhiyun goto bad; 348*4882a593Smuzhiyun 349*4882a593Smuzhiyun if (!loadWBoldFP(xw, 350*4882a593Smuzhiyun- &myfonts.f_wb, 351*4882a593Smuzhiyun- &fnts[fWBold], 352*4882a593Smuzhiyun- myfonts.f_w, 353*4882a593Smuzhiyun- &fnts[fWide], 354*4882a593Smuzhiyun- myfonts.f_b, 355*4882a593Smuzhiyun- &fnts[fBold], 356*4882a593Smuzhiyun+ &new_fnames.f_wb, 357*4882a593Smuzhiyun+ &new_fonts[fWBold], 358*4882a593Smuzhiyun+ new_fnames.f_w, 359*4882a593Smuzhiyun+ &new_fonts[fWide], 360*4882a593Smuzhiyun+ new_fnames.f_b, 361*4882a593Smuzhiyun+ &new_fonts[fBold], 362*4882a593Smuzhiyun fontnum)) 363*4882a593Smuzhiyun goto bad; 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun@@ -1634,30 +1654,30 @@ xtermLoadFont(XtermWidget xw, 366*4882a593Smuzhiyun * Normal/bold fonts should be the same width. Also, the min/max 367*4882a593Smuzhiyun * values should be the same. 368*4882a593Smuzhiyun */ 369*4882a593Smuzhiyun- if (fnts[fNorm].fs != 0 370*4882a593Smuzhiyun- && fnts[fBold].fs != 0 371*4882a593Smuzhiyun- && (!is_fixed_font(fnts[fNorm].fs) 372*4882a593Smuzhiyun- || !is_fixed_font(fnts[fBold].fs) 373*4882a593Smuzhiyun- || differing_widths(fnts[fNorm].fs, fnts[fBold].fs))) { 374*4882a593Smuzhiyun+ if (new_fonts[fNorm].fs != 0 375*4882a593Smuzhiyun+ && new_fonts[fBold].fs != 0 376*4882a593Smuzhiyun+ && (!is_fixed_font(new_fonts[fNorm].fs) 377*4882a593Smuzhiyun+ || !is_fixed_font(new_fonts[fBold].fs) 378*4882a593Smuzhiyun+ || differing_widths(new_fonts[fNorm].fs, new_fonts[fBold].fs))) { 379*4882a593Smuzhiyun TRACE(("Proportional font! normal %d/%d, bold %d/%d\n", 380*4882a593Smuzhiyun- fnts[fNorm].fs->min_bounds.width, 381*4882a593Smuzhiyun- fnts[fNorm].fs->max_bounds.width, 382*4882a593Smuzhiyun- fnts[fBold].fs->min_bounds.width, 383*4882a593Smuzhiyun- fnts[fBold].fs->max_bounds.width)); 384*4882a593Smuzhiyun+ new_fonts[fNorm].fs->min_bounds.width, 385*4882a593Smuzhiyun+ new_fonts[fNorm].fs->max_bounds.width, 386*4882a593Smuzhiyun+ new_fonts[fBold].fs->min_bounds.width, 387*4882a593Smuzhiyun+ new_fonts[fBold].fs->max_bounds.width)); 388*4882a593Smuzhiyun proportional = True; 389*4882a593Smuzhiyun } 390*4882a593Smuzhiyun 391*4882a593Smuzhiyun if_OPT_WIDE_CHARS(screen, { 392*4882a593Smuzhiyun- if (fnts[fWide].fs != 0 393*4882a593Smuzhiyun- && fnts[fWBold].fs != 0 394*4882a593Smuzhiyun- && (!is_fixed_font(fnts[fWide].fs) 395*4882a593Smuzhiyun- || !is_fixed_font(fnts[fWBold].fs) 396*4882a593Smuzhiyun- || differing_widths(fnts[fWide].fs, fnts[fWBold].fs))) { 397*4882a593Smuzhiyun+ if (new_fonts[fWide].fs != 0 398*4882a593Smuzhiyun+ && new_fonts[fWBold].fs != 0 399*4882a593Smuzhiyun+ && (!is_fixed_font(new_fonts[fWide].fs) 400*4882a593Smuzhiyun+ || !is_fixed_font(new_fonts[fWBold].fs) 401*4882a593Smuzhiyun+ || differing_widths(new_fonts[fWide].fs, new_fonts[fWBold].fs))) { 402*4882a593Smuzhiyun TRACE(("Proportional font! wide %d/%d, wide bold %d/%d\n", 403*4882a593Smuzhiyun- fnts[fWide].fs->min_bounds.width, 404*4882a593Smuzhiyun- fnts[fWide].fs->max_bounds.width, 405*4882a593Smuzhiyun- fnts[fWBold].fs->min_bounds.width, 406*4882a593Smuzhiyun- fnts[fWBold].fs->max_bounds.width)); 407*4882a593Smuzhiyun+ new_fonts[fWide].fs->min_bounds.width, 408*4882a593Smuzhiyun+ new_fonts[fWide].fs->max_bounds.width, 409*4882a593Smuzhiyun+ new_fonts[fWBold].fs->min_bounds.width, 410*4882a593Smuzhiyun+ new_fonts[fWBold].fs->max_bounds.width)); 411*4882a593Smuzhiyun proportional = True; 412*4882a593Smuzhiyun } 413*4882a593Smuzhiyun }); 414*4882a593Smuzhiyun@@ -1676,13 +1696,13 @@ xtermLoadFont(XtermWidget xw, 415*4882a593Smuzhiyun screen->ifnts_ok = False; 416*4882a593Smuzhiyun #endif 417*4882a593Smuzhiyun 418*4882a593Smuzhiyun- xtermCopyFontInfo(GetNormalFont(screen, fNorm), &fnts[fNorm]); 419*4882a593Smuzhiyun- xtermCopyFontInfo(GetNormalFont(screen, fBold), &fnts[fBold]); 420*4882a593Smuzhiyun+ xtermCopyFontInfo(GetNormalFont(screen, fNorm), &new_fonts[fNorm]); 421*4882a593Smuzhiyun+ xtermCopyFontInfo(GetNormalFont(screen, fBold), &new_fonts[fBold]); 422*4882a593Smuzhiyun #if OPT_WIDE_CHARS 423*4882a593Smuzhiyun- xtermCopyFontInfo(GetNormalFont(screen, fWide), &fnts[fWide]); 424*4882a593Smuzhiyun- if (fnts[fWBold].fs == NULL) 425*4882a593Smuzhiyun- xtermCopyFontInfo(GetNormalFont(screen, fWide), &fnts[fWide]); 426*4882a593Smuzhiyun- xtermCopyFontInfo(GetNormalFont(screen, fWBold), &fnts[fWBold]); 427*4882a593Smuzhiyun+ xtermCopyFontInfo(GetNormalFont(screen, fWide), &new_fonts[fWide]); 428*4882a593Smuzhiyun+ if (new_fonts[fWBold].fs == NULL) 429*4882a593Smuzhiyun+ xtermCopyFontInfo(GetNormalFont(screen, fWide), &new_fonts[fWide]); 430*4882a593Smuzhiyun+ xtermCopyFontInfo(GetNormalFont(screen, fWBold), &new_fonts[fWBold]); 431*4882a593Smuzhiyun #endif 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun xtermUpdateFontGCs(xw, getNormalFont); 434*4882a593Smuzhiyun@@ -1713,7 +1733,7 @@ xtermLoadFont(XtermWidget xw, 435*4882a593Smuzhiyun unsigned ch; 436*4882a593Smuzhiyun 437*4882a593Smuzhiyun #if OPT_TRACE 438*4882a593Smuzhiyun-#define TRACE_MISS(index) show_font_misses(#index, &fnts[index]) 439*4882a593Smuzhiyun+#define TRACE_MISS(index) show_font_misses(#index, &new_fonts[index]) 440*4882a593Smuzhiyun TRACE_MISS(fNorm); 441*4882a593Smuzhiyun TRACE_MISS(fBold); 442*4882a593Smuzhiyun #if OPT_WIDE_CHARS 443*4882a593Smuzhiyun@@ -1730,8 +1750,8 @@ xtermLoadFont(XtermWidget xw, 444*4882a593Smuzhiyun if ((n != UCS_REPL) 445*4882a593Smuzhiyun && (n != ch) 446*4882a593Smuzhiyun && (screen->fnt_boxes & 2)) { 447*4882a593Smuzhiyun- if (xtermMissingChar(n, &fnts[fNorm]) || 448*4882a593Smuzhiyun- xtermMissingChar(n, &fnts[fBold])) { 449*4882a593Smuzhiyun+ if (xtermMissingChar(n, &new_fonts[fNorm]) || 450*4882a593Smuzhiyun+ xtermMissingChar(n, &new_fonts[fBold])) { 451*4882a593Smuzhiyun UIntClr(screen->fnt_boxes, 2); 452*4882a593Smuzhiyun TRACE(("missing graphics character #%d, U+%04X\n", 453*4882a593Smuzhiyun ch, n)); 454*4882a593Smuzhiyun@@ -1743,12 +1763,12 @@ xtermLoadFont(XtermWidget xw, 455*4882a593Smuzhiyun #endif 456*4882a593Smuzhiyun 457*4882a593Smuzhiyun for (ch = 1; ch < 32; ch++) { 458*4882a593Smuzhiyun- if (xtermMissingChar(ch, &fnts[fNorm])) { 459*4882a593Smuzhiyun+ if (xtermMissingChar(ch, &new_fonts[fNorm])) { 460*4882a593Smuzhiyun TRACE(("missing normal char #%d\n", ch)); 461*4882a593Smuzhiyun UIntClr(screen->fnt_boxes, 1); 462*4882a593Smuzhiyun break; 463*4882a593Smuzhiyun } 464*4882a593Smuzhiyun- if (xtermMissingChar(ch, &fnts[fBold])) { 465*4882a593Smuzhiyun+ if (xtermMissingChar(ch, &new_fonts[fBold])) { 466*4882a593Smuzhiyun TRACE(("missing bold char #%d\n", ch)); 467*4882a593Smuzhiyun UIntClr(screen->fnt_boxes, 1); 468*4882a593Smuzhiyun break; 469*4882a593Smuzhiyun@@ -1765,8 +1785,8 @@ xtermLoadFont(XtermWidget xw, 470*4882a593Smuzhiyun screen->enbolden = screen->bold_mode; 471*4882a593Smuzhiyun } else { 472*4882a593Smuzhiyun screen->enbolden = screen->bold_mode 473*4882a593Smuzhiyun- && ((fnts[fNorm].fs == fnts[fBold].fs) 474*4882a593Smuzhiyun- || same_font_name(myfonts.f_n, myfonts.f_b)); 475*4882a593Smuzhiyun+ && ((new_fonts[fNorm].fs == new_fonts[fBold].fs) 476*4882a593Smuzhiyun+ || same_font_name(new_fnames.f_n, new_fnames.f_b)); 477*4882a593Smuzhiyun } 478*4882a593Smuzhiyun TRACE(("Will %suse 1-pixel offset/overstrike to simulate bold\n", 479*4882a593Smuzhiyun screen->enbolden ? "" : "not ")); 480*4882a593Smuzhiyun@@ -1782,7 +1802,7 @@ xtermLoadFont(XtermWidget xw, 481*4882a593Smuzhiyun update_font_escape(); 482*4882a593Smuzhiyun } 483*4882a593Smuzhiyun #if OPT_SHIFT_FONTS 484*4882a593Smuzhiyun- screen->menu_font_sizes[fontnum] = FontSize(fnts[fNorm].fs); 485*4882a593Smuzhiyun+ screen->menu_font_sizes[fontnum] = FontSize(new_fonts[fNorm].fs); 486*4882a593Smuzhiyun #endif 487*4882a593Smuzhiyun } 488*4882a593Smuzhiyun set_cursor_gcs(xw); 489*4882a593Smuzhiyun@@ -1797,20 +1817,21 @@ xtermLoadFont(XtermWidget xw, 490*4882a593Smuzhiyun FREE_FNAME(f_w); 491*4882a593Smuzhiyun FREE_FNAME(f_wb); 492*4882a593Smuzhiyun #endif 493*4882a593Smuzhiyun- if (fnts[fNorm].fn == fnts[fBold].fn) { 494*4882a593Smuzhiyun- free(fnts[fNorm].fn); 495*4882a593Smuzhiyun+ if (new_fonts[fNorm].fn == new_fonts[fBold].fn) { 496*4882a593Smuzhiyun+ free(new_fonts[fNorm].fn); 497*4882a593Smuzhiyun } else { 498*4882a593Smuzhiyun- free(fnts[fNorm].fn); 499*4882a593Smuzhiyun- free(fnts[fBold].fn); 500*4882a593Smuzhiyun+ free(new_fonts[fNorm].fn); 501*4882a593Smuzhiyun+ free(new_fonts[fBold].fn); 502*4882a593Smuzhiyun } 503*4882a593Smuzhiyun #if OPT_WIDE_CHARS 504*4882a593Smuzhiyun- free(fnts[fWide].fn); 505*4882a593Smuzhiyun- free(fnts[fWBold].fn); 506*4882a593Smuzhiyun+ free(new_fonts[fWide].fn); 507*4882a593Smuzhiyun+ free(new_fonts[fWBold].fn); 508*4882a593Smuzhiyun #endif 509*4882a593Smuzhiyun xtermSetWinSize(xw); 510*4882a593Smuzhiyun return 1; 511*4882a593Smuzhiyun 512*4882a593Smuzhiyun bad: 513*4882a593Smuzhiyun+ recovered = False; 514*4882a593Smuzhiyun free(tmpname); 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun #if OPT_RENDERFONT 517*4882a593Smuzhiyun@@ -1820,15 +1841,15 @@ xtermLoadFont(XtermWidget xw, 518*4882a593Smuzhiyun SetItemSensitivity(fontMenuEntries[fontnum].widget, True); 519*4882a593Smuzhiyun #endif 520*4882a593Smuzhiyun Bell(xw, XkbBI_MinorError, 0); 521*4882a593Smuzhiyun- myfonts.f_n = screen->MenuFontName(old_fontnum); 522*4882a593Smuzhiyun- return xtermLoadFont(xw, &myfonts, doresize, old_fontnum); 523*4882a593Smuzhiyun- } else if (x_strcasecmp(myfonts.f_n, DEFFONT)) { 524*4882a593Smuzhiyun- int code; 525*4882a593Smuzhiyun- 526*4882a593Smuzhiyun- myfonts.f_n = x_strdup(DEFFONT); 527*4882a593Smuzhiyun- TRACE(("...recovering for TrueType fonts\n")); 528*4882a593Smuzhiyun- code = xtermLoadFont(xw, &myfonts, doresize, fontnum); 529*4882a593Smuzhiyun- if (code) { 530*4882a593Smuzhiyun+ new_fnames.f_n = screen->MenuFontName(old_fontnum); 531*4882a593Smuzhiyun+ if (xtermLoadFont(xw, &new_fnames, doresize, old_fontnum)) 532*4882a593Smuzhiyun+ recovered = True; 533*4882a593Smuzhiyun+ } else if (x_strcasecmp(new_fnames.f_n, DEFFONT) 534*4882a593Smuzhiyun+ && x_strcasecmp(new_fnames.f_n, old_fonts[fNorm].fn)) { 535*4882a593Smuzhiyun+ new_fnames.f_n = x_strdup(old_fonts[fNorm].fn); 536*4882a593Smuzhiyun+ TRACE(("...recovering from failed font-load\n")); 537*4882a593Smuzhiyun+ if (xtermLoadFont(xw, &new_fnames, doresize, fontnum)) { 538*4882a593Smuzhiyun+ recovered = True; 539*4882a593Smuzhiyun if (fontnum != fontMenu_fontsel) { 540*4882a593Smuzhiyun SetItemSensitivity(fontMenuEntries[fontnum].widget, 541*4882a593Smuzhiyun UsingRenderFont(xw)); 542*4882a593Smuzhiyun@@ -1837,15 +1858,15 @@ xtermLoadFont(XtermWidget xw, 543*4882a593Smuzhiyun FontHeight(screen), 544*4882a593Smuzhiyun FontWidth(screen))); 545*4882a593Smuzhiyun } 546*4882a593Smuzhiyun- return code; 547*4882a593Smuzhiyun } 548*4882a593Smuzhiyun #endif 549*4882a593Smuzhiyun- 550*4882a593Smuzhiyun- releaseWindowGCs(xw, win); 551*4882a593Smuzhiyun- 552*4882a593Smuzhiyun- xtermCloseFonts(xw, fnts); 553*4882a593Smuzhiyun- TRACE(("Fail Cgs - xtermLoadFont\n")); 554*4882a593Smuzhiyun- return 0; 555*4882a593Smuzhiyun+ if (!recovered) { 556*4882a593Smuzhiyun+ releaseWindowGCs(xw, win); 557*4882a593Smuzhiyun+ xtermCloseFonts(xw, new_fonts); 558*4882a593Smuzhiyun+ TRACE(("Fail Cgs - xtermLoadFont\n")); 559*4882a593Smuzhiyun+ code = 0; 560*4882a593Smuzhiyun+ } 561*4882a593Smuzhiyun+ return code; 562*4882a593Smuzhiyun } 563*4882a593Smuzhiyun 564*4882a593Smuzhiyun #if OPT_WIDE_ATTRS 565*4882a593Smuzhiyun@@ -1893,7 +1914,7 @@ xtermLoadItalics(XtermWidget xw) 566*4882a593Smuzhiyun } else { 567*4882a593Smuzhiyun xtermOpenFont(xw, 568*4882a593Smuzhiyun getNormalFont(screen, n)->fn, 569*4882a593Smuzhiyun- data, False); 570*4882a593Smuzhiyun+ data, NULL, False); 571*4882a593Smuzhiyun } 572*4882a593Smuzhiyun } 573*4882a593Smuzhiyun } 574*4882a593Smuzhiyun@@ -4250,6 +4271,8 @@ findXftGlyph(XtermWidget xw, XftFont *given, unsigned wc) 575*4882a593Smuzhiyun } 576*4882a593Smuzhiyun #endif 577*4882a593Smuzhiyun if (foundXftGlyph(xw, check, wc)) { 578*4882a593Smuzhiyun+ (void) added; 579*4882a593Smuzhiyun+ (void) actual; 580*4882a593Smuzhiyun markXftOpened(xw, which, n, wc); 581*4882a593Smuzhiyun reportXftFonts(xw, check, "fallback", tag, myReport); 582*4882a593Smuzhiyun result = check; 583*4882a593Smuzhiyun@@ -4451,7 +4474,7 @@ lookupOneFontSize(XtermWidget xw, int fontnum) 584*4882a593Smuzhiyun 585*4882a593Smuzhiyun memset(&fnt, 0, sizeof(fnt)); 586*4882a593Smuzhiyun screen->menu_font_sizes[fontnum] = -1; 587*4882a593Smuzhiyun- if (xtermOpenFont(xw, screen->MenuFontName(fontnum), &fnt, True)) { 588*4882a593Smuzhiyun+ if (xtermOpenFont(xw, screen->MenuFontName(fontnum), &fnt, NULL, True)) { 589*4882a593Smuzhiyun if (fontnum <= fontMenu_lastBuiltin 590*4882a593Smuzhiyun || strcmp(fnt.fn, DEFFONT)) { 591*4882a593Smuzhiyun screen->menu_font_sizes[fontnum] = FontSize(fnt.fs); 592*4882a593Smuzhiyun@@ -4864,13 +4887,14 @@ HandleSetFont(Widget w, 593*4882a593Smuzhiyun } 594*4882a593Smuzhiyun } 595*4882a593Smuzhiyun 596*4882a593Smuzhiyun-void 597*4882a593Smuzhiyun+Bool 598*4882a593Smuzhiyun SetVTFont(XtermWidget xw, 599*4882a593Smuzhiyun int which, 600*4882a593Smuzhiyun Bool doresize, 601*4882a593Smuzhiyun const VTFontNames * fonts) 602*4882a593Smuzhiyun { 603*4882a593Smuzhiyun TScreen *screen = TScreenOf(xw); 604*4882a593Smuzhiyun+ Bool result = False; 605*4882a593Smuzhiyun 606*4882a593Smuzhiyun TRACE(("SetVTFont(which=%d, f_n=%s, f_b=%s)\n", which, 607*4882a593Smuzhiyun (fonts && fonts->f_n) ? fonts->f_n : "<null>", 608*4882a593Smuzhiyun@@ -4879,34 +4903,31 @@ SetVTFont(XtermWidget xw, 609*4882a593Smuzhiyun if (IsIcon(screen)) { 610*4882a593Smuzhiyun Bell(xw, XkbBI_MinorError, 0); 611*4882a593Smuzhiyun } else if (which >= 0 && which < NMENUFONTS) { 612*4882a593Smuzhiyun- VTFontNames myfonts; 613*4882a593Smuzhiyun+ VTFontNames new_fnames; 614*4882a593Smuzhiyun 615*4882a593Smuzhiyun- memset(&myfonts, 0, sizeof(myfonts)); 616*4882a593Smuzhiyun+ memset(&new_fnames, 0, sizeof(new_fnames)); 617*4882a593Smuzhiyun if (fonts != 0) 618*4882a593Smuzhiyun- myfonts = *fonts; 619*4882a593Smuzhiyun+ new_fnames = *fonts; 620*4882a593Smuzhiyun 621*4882a593Smuzhiyun if (which == fontMenu_fontsel) { /* go get the selection */ 622*4882a593Smuzhiyun- FindFontSelection(xw, myfonts.f_n, False); 623*4882a593Smuzhiyun+ result = FindFontSelection(xw, new_fnames.f_n, False); 624*4882a593Smuzhiyun } else { 625*4882a593Smuzhiyun- int oldFont = screen->menu_font_number; 626*4882a593Smuzhiyun- 627*4882a593Smuzhiyun #define USE_CACHED(field, name) \ 628*4882a593Smuzhiyun- if (myfonts.field == 0) { \ 629*4882a593Smuzhiyun- myfonts.field = x_strdup(screen->menu_font_names[which][name]); \ 630*4882a593Smuzhiyun- TRACE(("set myfonts." #field " from menu_font_names[%d][" #name "] %s\n", \ 631*4882a593Smuzhiyun- which, NonNull(myfonts.field))); \ 632*4882a593Smuzhiyun+ if (new_fnames.field == NULL) { \ 633*4882a593Smuzhiyun+ new_fnames.field = x_strdup(screen->menu_font_names[which][name]); \ 634*4882a593Smuzhiyun+ TRACE(("set new_fnames." #field " from menu_font_names[%d][" #name "] %s\n", \ 635*4882a593Smuzhiyun+ which, NonNull(new_fnames.field))); \ 636*4882a593Smuzhiyun } else { \ 637*4882a593Smuzhiyun- TRACE(("set myfonts." #field " reused\n")); \ 638*4882a593Smuzhiyun+ TRACE(("set new_fnames." #field " reused\n")); \ 639*4882a593Smuzhiyun } 640*4882a593Smuzhiyun #define SAVE_FNAME(field, name) \ 641*4882a593Smuzhiyun- if (myfonts.field != 0) { \ 642*4882a593Smuzhiyun- if (screen->menu_font_names[which][name] == 0 \ 643*4882a593Smuzhiyun- || strcmp(screen->menu_font_names[which][name], myfonts.field)) { \ 644*4882a593Smuzhiyun- TRACE(("updating menu_font_names[%d][" #name "] to \"%s\"\n", \ 645*4882a593Smuzhiyun- which, myfonts.field)); \ 646*4882a593Smuzhiyun- FREE_STRING(screen->menu_font_names[which][name]); \ 647*4882a593Smuzhiyun- screen->menu_font_names[which][name] = x_strdup(myfonts.field); \ 648*4882a593Smuzhiyun- } \ 649*4882a593Smuzhiyun+ if (new_fnames.field != NULL \ 650*4882a593Smuzhiyun+ && (screen->menu_font_names[which][name] == NULL \ 651*4882a593Smuzhiyun+ || strcmp(screen->menu_font_names[which][name], new_fnames.field))) { \ 652*4882a593Smuzhiyun+ TRACE(("updating menu_font_names[%d][" #name "] to \"%s\"\n", \ 653*4882a593Smuzhiyun+ which, new_fnames.field)); \ 654*4882a593Smuzhiyun+ FREE_STRING(screen->menu_font_names[which][name]); \ 655*4882a593Smuzhiyun+ screen->menu_font_names[which][name] = x_strdup(new_fnames.field); \ 656*4882a593Smuzhiyun } 657*4882a593Smuzhiyun 658*4882a593Smuzhiyun USE_CACHED(f_n, fNorm); 659*4882a593Smuzhiyun@@ -4916,7 +4937,7 @@ SetVTFont(XtermWidget xw, 660*4882a593Smuzhiyun USE_CACHED(f_wb, fWBold); 661*4882a593Smuzhiyun #endif 662*4882a593Smuzhiyun if (xtermLoadFont(xw, 663*4882a593Smuzhiyun- &myfonts, 664*4882a593Smuzhiyun+ &new_fnames, 665*4882a593Smuzhiyun doresize, which)) { 666*4882a593Smuzhiyun /* 667*4882a593Smuzhiyun * If successful, save the data so that a subsequent query via 668*4882a593Smuzhiyun@@ -4928,10 +4949,8 @@ SetVTFont(XtermWidget xw, 669*4882a593Smuzhiyun SAVE_FNAME(f_w, fWide); 670*4882a593Smuzhiyun SAVE_FNAME(f_wb, fWBold); 671*4882a593Smuzhiyun #endif 672*4882a593Smuzhiyun+ result = True; 673*4882a593Smuzhiyun } else { 674*4882a593Smuzhiyun- (void) xtermLoadFont(xw, 675*4882a593Smuzhiyun- xtermFontName(screen->MenuFontName(oldFont)), 676*4882a593Smuzhiyun- doresize, oldFont); 677*4882a593Smuzhiyun Bell(xw, XkbBI_MinorError, 0); 678*4882a593Smuzhiyun } 679*4882a593Smuzhiyun FREE_FNAME(f_n); 680*4882a593Smuzhiyun@@ -4944,7 +4963,8 @@ SetVTFont(XtermWidget xw, 681*4882a593Smuzhiyun } else { 682*4882a593Smuzhiyun Bell(xw, XkbBI_MinorError, 0); 683*4882a593Smuzhiyun } 684*4882a593Smuzhiyun- return; 685*4882a593Smuzhiyun+ TRACE(("...SetVTFont: %d\n", result)); 686*4882a593Smuzhiyun+ return result; 687*4882a593Smuzhiyun } 688*4882a593Smuzhiyun 689*4882a593Smuzhiyun #if OPT_RENDERFONT 690*4882a593Smuzhiyundiff --git a/fontutils.h b/fontutils.h 691*4882a593Smuzhiyunindex 2267f24..5b3afe0 100644 692*4882a593Smuzhiyun--- a/fontutils.h 693*4882a593Smuzhiyun+++ b/fontutils.h 694*4882a593Smuzhiyun@@ -37,7 +37,7 @@ 695*4882a593Smuzhiyun /* *INDENT-OFF* */ 696*4882a593Smuzhiyun 697*4882a593Smuzhiyun extern Bool xtermLoadDefaultFonts (XtermWidget /* xw */); 698*4882a593Smuzhiyun-extern Bool xtermOpenFont (XtermWidget /* xw */, const char */* name */, XTermFonts * /* result */, Bool /* force */); 699*4882a593Smuzhiyun+extern Bool xtermOpenFont (XtermWidget /* xw */, const char */* name */, XTermFonts * /* result */, XTermFonts * /* current */, Bool /* force */); 700*4882a593Smuzhiyun extern XFontStruct * xtermLoadQueryFont(XtermWidget /* xw */, const char * /*name */); 701*4882a593Smuzhiyun extern XTermFonts * getDoubleFont (TScreen * /* screen */, int /* which */); 702*4882a593Smuzhiyun extern XTermFonts * getItalicFont (TScreen * /* screen */, int /* which */); 703*4882a593Smuzhiyun@@ -51,7 +51,7 @@ extern int lookupRelativeFontSize (XtermWidget /* xw */, int /* old */, int /* r 704*4882a593Smuzhiyun extern int xtermGetFont (const char * /* param */); 705*4882a593Smuzhiyun extern int xtermLoadFont (XtermWidget /* xw */, const VTFontNames */* fonts */, Bool /* doresize */, int /* fontnum */); 706*4882a593Smuzhiyun extern void HandleSetFont PROTO_XT_ACTIONS_ARGS; 707*4882a593Smuzhiyun-extern void SetVTFont (XtermWidget /* xw */, int /* i */, Bool /* doresize */, const VTFontNames */* fonts */); 708*4882a593Smuzhiyun+extern Bool SetVTFont (XtermWidget /* xw */, int /* i */, Bool /* doresize */, const VTFontNames */* fonts */); 709*4882a593Smuzhiyun extern void allocFontList (XtermWidget /* xw */, const char * /* name */, XtermFontNames * /* target */, VTFontEnum /* which */, const char * /* source */, Bool /* ttf */); 710*4882a593Smuzhiyun extern void copyFontList (char *** /* targetp */, char ** /* source */); 711*4882a593Smuzhiyun extern void initFontLists (XtermWidget /* xw */); 712*4882a593Smuzhiyundiff --git a/misc.c b/misc.c 713*4882a593Smuzhiyunindex cbb2679..aafbb08 100644 714*4882a593Smuzhiyun--- a/misc.c 715*4882a593Smuzhiyun+++ b/misc.c 716*4882a593Smuzhiyun@@ -3941,9 +3941,9 @@ ChangeFontRequest(XtermWidget xw, String buf) 717*4882a593Smuzhiyun { 718*4882a593Smuzhiyun memset(&fonts, 0, sizeof(fonts)); 719*4882a593Smuzhiyun fonts.f_n = name; 720*4882a593Smuzhiyun- SetVTFont(xw, num, True, &fonts); 721*4882a593Smuzhiyun- if (num == screen->menu_font_number && 722*4882a593Smuzhiyun- num != fontMenu_fontescape) { 723*4882a593Smuzhiyun+ if (SetVTFont(xw, num, True, &fonts) 724*4882a593Smuzhiyun+ && num == screen->menu_font_number 725*4882a593Smuzhiyun+ && num != fontMenu_fontescape) { 726*4882a593Smuzhiyun screen->EscapeFontName() = x_strdup(name); 727*4882a593Smuzhiyun } 728*4882a593Smuzhiyun } 729*4882a593Smuzhiyun@@ -6422,7 +6422,6 @@ xtermSetenv(const char *var, const char *value) 730*4882a593Smuzhiyun 731*4882a593Smuzhiyun found = envindex; 732*4882a593Smuzhiyun environ[found + 1] = NULL; 733*4882a593Smuzhiyun- environ = environ; 734*4882a593Smuzhiyun } 735*4882a593Smuzhiyun 736*4882a593Smuzhiyun environ[found] = malloc(2 + len + strlen(value)); 737*4882a593Smuzhiyundiff --git a/screen.c b/screen.c 738*4882a593Smuzhiyunindex 93e36b3..f82ee44 100644 739*4882a593Smuzhiyun--- a/screen.c 740*4882a593Smuzhiyun+++ b/screen.c 741*4882a593Smuzhiyun@@ -1454,7 +1454,7 @@ ScrnRefresh(XtermWidget xw, 742*4882a593Smuzhiyun maxrow += StatusLineRows; 743*4882a593Smuzhiyun } 744*4882a593Smuzhiyun #endif 745*4882a593Smuzhiyun- 746*4882a593Smuzhiyun+ (void) recurse; 747*4882a593Smuzhiyun ++recurse; 748*4882a593Smuzhiyun 749*4882a593Smuzhiyun if (screen->cursorp.col >= leftcol 750*4882a593Smuzhiyundiff --git a/xterm.h b/xterm.h 751*4882a593Smuzhiyunindex e6bd123..c4fe811 100644 752*4882a593Smuzhiyun--- a/xterm.h 753*4882a593Smuzhiyun+++ b/xterm.h 754*4882a593Smuzhiyun@@ -999,7 +999,7 @@ extern Bool CheckBufPtrs (TScreen * /* screen */); 755*4882a593Smuzhiyun extern Bool set_cursor_gcs (XtermWidget /* xw */); 756*4882a593Smuzhiyun extern char * vt100ResourceToString (XtermWidget /* xw */, const char * /* name */); 757*4882a593Smuzhiyun extern int VTInit (XtermWidget /* xw */); 758*4882a593Smuzhiyun-extern void FindFontSelection (XtermWidget /* xw */, const char * /* atom_name */, Bool /* justprobe */); 759*4882a593Smuzhiyun+extern Bool FindFontSelection (XtermWidget /* xw */, const char * /* atom_name */, Bool /* justprobe */); 760*4882a593Smuzhiyun extern void HideCursor (XtermWidget /* xw */); 761*4882a593Smuzhiyun extern void RestartBlinking(XtermWidget /* xw */); 762*4882a593Smuzhiyun extern void ShowCursor (XtermWidget /* xw */); 763*4882a593Smuzhiyundiff --git a/xterm.log.html b/xterm.log.html 764*4882a593Smuzhiyunindex 03324b1..0f28658 100644 765*4882a593Smuzhiyun--- a/xterm.log.html 766*4882a593Smuzhiyun+++ b/xterm.log.html 767*4882a593Smuzhiyun@@ -1026,6 +1026,12 @@ 768*4882a593Smuzhiyun 2022/03/09</a></h1> 769*4882a593Smuzhiyun 770*4882a593Smuzhiyun <ul> 771*4882a593Smuzhiyun+ <li>improve error-recovery when setting a bitmap font for the 772*4882a593Smuzhiyun+ VT100 window, e.g., in case <em>OSC 50</em> failed, 773*4882a593Smuzhiyun+ restoring the most recent valid font so that a subsequent 774*4882a593Smuzhiyun+ <em>OSC 50</em> reports this correctly (report by David 775*4882a593Smuzhiyun+ Leadbeater).</li> 776*4882a593Smuzhiyun+ 777*4882a593Smuzhiyun <li>amend allocation/freeing of scrollback lines, eliminating 778*4882a593Smuzhiyun an adjustment for status-line added in <a href= 779*4882a593Smuzhiyun "#xterm_371">patch #371</a> (report/testcase by Rajeev V. 780*4882a593Smuzhiyun-- 781*4882a593Smuzhiyun2.25.1 782*4882a593Smuzhiyun 783