From 59d18bcefa5280de1152a05d08d250cb582fab62 Mon Sep 17 00:00:00 2001 From: dkf Date: Thu, 10 Sep 2009 12:47:13 +0000 Subject: Backport of "misconfigured xft font engine" fixes. --- ChangeLog | 13 +++++++++++++ generic/tkFont.c | 15 ++++++++++++++- unix/tkUnixRFont.c | 17 +++++++++++++++-- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 534e6af..922c8ec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2009-09-10 Donal K. Fellows + + * unix/tkUnixRFont.c (InitFont): Move pattern disposal in error case + to callers so they have more options when they come to recovering from + the failure. + (TkpGetFontFromAttributes): If the default attributes don't work, try + adding a setting to turn off use of XRender. That seems to work for + some people for unexplained reasons (possibly local misconfiguration). + * generic/tkFont.c (Tk_AllocFontFromObj): Stop this function from + keeling over in a heap when the low-level font allocation fails. An + error beats a crash! (Issue reported on comp.lang.tcl by Denis + Berezhnoy.) + 2009-08-25 Donal K. Fellows * unix/tkUnixSend.c (ServerSecure): [Bug 1909931]: Added some support diff --git a/generic/tkFont.c b/generic/tkFont.c index 3839ef0..4852f14 100644 --- a/generic/tkFont.c +++ b/generic/tkFont.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkFont.c,v 1.42.2.2 2009/05/13 21:49:12 patthoyts Exp $ + * RCS: @(#) $Id: tkFont.c,v 1.42.2.3 2009/09/10 12:47:15 dkf Exp $ */ #include "tkInt.h" @@ -1194,6 +1194,19 @@ Tk_AllocFontFromObj( } } + /* + * Detect the system font engine going wrong and fail more gracefully. + */ + + if (fontPtr == NULL) { + if (isNew) { + Tcl_DeleteHashEntry(cacheHashPtr); + } + Tcl_AppendResult(interp, "failed to allocate font due to ", + "internal system font engine problem", NULL); + return NULL; + } + fontPtr->resourceRefCount = 1; fontPtr->objRefCount = 1; fontPtr->cacheHashPtr = cacheHashPtr; diff --git a/unix/tkUnixRFont.c b/unix/tkUnixRFont.c index 73e091c..b3d5ce4 100644 --- a/unix/tkUnixRFont.c +++ b/unix/tkUnixRFont.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkUnixRFont.c,v 1.24 2008/03/12 16:35:27 jenglish Exp $ + * RCS: @(#) $Id: tkUnixRFont.c,v 1.24.2.1 2009/09/10 12:47:15 dkf Exp $ */ #include "tkUnixInt.h" @@ -220,7 +220,6 @@ InitFont( set = FcFontSort(0, pattern, FcTrue, NULL, &result); if (!set) { - FcPatternDestroy(pattern); ckfree((char *)fontPtr); return NULL; } @@ -323,6 +322,7 @@ TkpGetNativeFont( fontPtr = InitFont(tkwin, pattern, NULL); if (!fontPtr) { + FcPatternDestroy(pattern); return NULL; } return &fontPtr->font; @@ -388,7 +388,20 @@ TkpGetFontFromAttributes( FinishedWithFont(fontPtr); } fontPtr = InitFont(tkwin, pattern, fontPtr); + + /* + * Hack to work around issues with weird issues with Xft/Xrender + * connection. For details, see comp.lang.tcl thread starting from + * + */ + if (!fontPtr) { + XftPatternAddBool(pattern, XFT_RENDER, FcFalse); + fontPtr = InitFont(tkwin, pattern, fontPtr); + } + + if (!fontPtr) { + FcPatternDestroy(pattern); return NULL; } return &fontPtr->font; -- cgit v0.12