# HG changeset patch # User Kenichi Handa # Date 1149819323 0 # Node ID d6abf23444387c0ca7fa7575054d394ab8ace9ca # Parent d63258b13d84fef58cd74d614b0a875e64bdde78 (xftfont_open): Make the font name fontconfig's style. Add BLOCK_INPUT and UNBLOCK_INPUT. (xftfont_close): Free font->font.name if not NULL. diff -r d63258b13d84 -r d6abf2344438 src/xftfont.c --- a/src/xftfont.c Fri Jun 09 02:15:05 2006 +0000 +++ b/src/xftfont.c Fri Jun 09 02:15:23 2006 +0000 @@ -197,13 +197,14 @@ Display *display = FRAME_X_DISPLAY (f); Lisp_Object val; FcPattern *pattern, *pat; - FcChar8 *file; + FcChar8 *file, *name; XFontStruct *xfont; struct xftfont_info *xftfont_info; struct font *font; double size = 0; XftFont *xftfont; int spacing; + int len; val = AREF (entity, FONT_EXTRA_INDEX); if (XTYPE (val) != Lisp_Misc @@ -216,20 +217,36 @@ size = XINT (AREF (entity, FONT_SIZE_INDEX)); if (size == 0) size = pixel_size; + if (FcPatternGetString (pattern, FC_FILE, 1, &name) != FcResultMatch) + { + int isize = size; + + name = malloc (strlen ((char *) file) + 30); + if (! name) + return NULL; + sprintf (name, ":file=%s:pixelsize=%d", (char *) file, isize); + } + pat = FcPatternCreate (); FcPatternAddString (pat, FC_FILE, file); FcPatternAddDouble (pat, FC_PIXEL_SIZE, pixel_size); FcPatternAddBool (pat, FC_ANTIALIAS, FcTrue); + + BLOCK_INPUT; xftfont = XftFontOpenPattern (display, pat); /* We should not destroy PAT here because it is kept in XFTFONT and destroyed automatically when XFTFONT is closed. */ if (! xftfont) - return NULL; + { + UNBLOCK_INPUT; + return NULL; + } xftfont_info = malloc (sizeof (struct xftfont_info)); if (! xftfont_info) { XftFontClose (display, xftfont); + UNBLOCK_INPUT; return NULL; } xfont = malloc (sizeof (XFontStruct)); @@ -237,6 +254,7 @@ { XftFontClose (display, xftfont); free (xftfont_info); + UNBLOCK_INPUT; return NULL; } xftfont_info->display = display; @@ -248,7 +266,7 @@ font->entity = entity; font->pixel_size = size; font->driver = &xftfont_driver; - font->font.name = font->font.full_name = NULL; + font->font.full_name = font->font.name = (char *) name; font->file_name = (char *) file; font->font.size = xftfont->max_advance_width; font->ascent = xftfont->ascent; @@ -279,6 +297,7 @@ XftTextExtents8 (display, xftfont, ascii_printable + 1, 94, &extents); font->font.average_width = (font->font.space_width + extents.xOff) / 95; } + UNBLOCK_INPUT; /* Unfortunately Xft doesn't provide a way to get minimum char width. So, we use space_width instead. */ @@ -333,6 +352,8 @@ XftUnlockFace (xftfont_info->xftfont); XftFontClose (xftfont_info->display, xftfont_info->xftfont); + if (font->font.name) + free (font->font.name); free (font); FRAME_X_DISPLAY_INFO (f)->n_fonts--; }