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&nbsp;50</em> failed,
773*4882a593Smuzhiyun+    restoring the most recent valid font so that a subsequent
774*4882a593Smuzhiyun+    <em>OSC&nbsp;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