Tk Source Code

Artifact [efc69a2a]
Login

Artifact efc69a2a3cbad3d8e3905a5f4d942481806627d0b37ef80298397acf7aaa9383:

Attachment "unixrfont.diff" to ticket [3767882e] added by chw 2020-04-08 22:05:35.
Index: unix/tkUnixRFont.c
==================================================================
--- unix/tkUnixRFont.c
+++ unix/tkUnixRFont.c
@@ -252,10 +252,27 @@
  * Results:
  * 	On error, frees fontPtr and returns NULL, otherwise returns fontPtr.
  *
  *---------------------------------------------------------------------------
  */
+
+static void
+FinishedWithFont(
+    UnixFtFont *fontPtr);
+
+static int
+InitFontErrorProc(
+    ClientData clientData,
+    XErrorEvent *errorPtr)
+{
+    int *errorFlagPtr = (int *) clientData;
+
+    if (errorFlagPtr != NULL) {
+	*errorFlagPtr = 1;
+    }
+    return 0;
+}
 
 static UnixFtFont *
 InitFont(
     Tk_Window tkwin,
     FcPattern *pattern,
@@ -263,11 +280,12 @@
 {
     FcFontSet *set;
     FcCharSet *charset;
     FcResult result;
     XftFont *ftFont;
-    int i, iWidth;
+    int i, iWidth, errorFlag;
+    Tk_ErrorHandler handler;
 
     if (!fontPtr) {
 	fontPtr = ckalloc(sizeof(UnixFtFont));
     }
 
@@ -316,12 +334,20 @@
      * Fill in platform-specific fields of TkFont.
      */
 
     ftFont = GetFont(fontPtr, 0, 0.0);
     fontPtr->font.fid = XLoadFont(Tk_Display(tkwin), "fixed");
+    handler = Tk_CreateErrorHandler(Tk_Display(tkwin),
+		    -1, -1, -1, InitFontErrorProc, (ClientData) &errorFlag);
+    errorFlag = 0;
     GetTkFontAttributes(ftFont, &fontPtr->font.fa);
     GetTkFontMetrics(ftFont, &fontPtr->font.fm);
+    if (errorFlag) {
+	FinishedWithFont(fontPtr);
+	ckfree(fontPtr);
+	return NULL;
+    }
 
     /*
      * Fontconfig can't report any information about the position or thickness
      * of underlines or overstrikes. Thus, we use some defaults that are
      * hacked around from backup defaults in tkUnixFont.c, which are in turn
@@ -342,11 +368,19 @@
 
     {
 	TkFont *fPtr = &fontPtr->font;
 
 	fPtr->underlinePos = fPtr->fm.descent / 2;
+	handler = Tk_CreateErrorHandler(Tk_Display(tkwin),
+			-1, -1, -1, InitFontErrorProc, (ClientData) &errorFlag);
+	errorFlag = 0;
 	Tk_MeasureChars((Tk_Font) fPtr, "I", 1, -1, 0, &iWidth);
+	if (errorFlag) {
+	    FinishedWithFont(fontPtr);
+	    ckfree(fontPtr);
+	    return NULL;
+	}
 	fPtr->underlineHeight = iWidth / 3;
 	if (fPtr->underlineHeight == 0) {
 	    fPtr->underlineHeight = 1;
 	}
 	if (fPtr->underlineHeight + fPtr->underlinePos > fPtr->fm.descent) {