X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/2ab329f3b5d52a39f0a45c3d9c129f1c19560142..4ec52e2f8c1697994618b4bdfd013659f6defb1b:/src/xfont.c diff --git a/src/xfont.c b/src/xfont.c index 1f2fd13f1b..d4d6ee7c10 100644 --- a/src/xfont.c +++ b/src/xfont.c @@ -1,5 +1,5 @@ /* xfont.c -- X core font driver. - Copyright (C) 2006-2012 Free Software Foundation, Inc. + Copyright (C) 2006-2013 Free Software Foundation, Inc. Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 National Institute of Advanced Industrial Science and Technology (AIST) Registration Number H13PRO009 @@ -114,19 +114,19 @@ xfont_get_pcm (XFontStruct *xfont, XChar2b *char2b) ? NULL : pcm); } -static Lisp_Object xfont_get_cache (FRAME_PTR); -static Lisp_Object xfont_list (Lisp_Object, Lisp_Object); -static Lisp_Object xfont_match (Lisp_Object, Lisp_Object); -static Lisp_Object xfont_list_family (Lisp_Object); -static Lisp_Object xfont_open (FRAME_PTR, Lisp_Object, int); -static void xfont_close (FRAME_PTR, struct font *); -static int xfont_prepare_face (FRAME_PTR, struct face *); +static Lisp_Object xfont_get_cache (struct frame *); +static Lisp_Object xfont_list (struct frame *, Lisp_Object); +static Lisp_Object xfont_match (struct frame *, Lisp_Object); +static Lisp_Object xfont_list_family (struct frame *); +static Lisp_Object xfont_open (struct frame *, Lisp_Object, int); +static void xfont_close (struct font *); +static int xfont_prepare_face (struct frame *, struct face *); static int xfont_has_char (Lisp_Object, int); static unsigned xfont_encode_char (struct font *, int); static int xfont_text_extents (struct font *, unsigned *, int, struct font_metrics *); static int xfont_draw (struct glyph_string *, int, int, int, int, bool); -static int xfont_check (FRAME_PTR, struct font *); +static int xfont_check (struct frame *, struct font *); struct font_driver xfont_driver = { @@ -152,9 +152,9 @@ struct font_driver xfont_driver = }; static Lisp_Object -xfont_get_cache (FRAME_PTR f) +xfont_get_cache (struct frame *f) { - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); return (dpyinfo->name_list_element); } @@ -295,9 +295,9 @@ xfont_supported_scripts (Display *display, char *fontname, Lisp_Object props, /* Two special cases to avoid opening rather big fonts. */ if (EQ (AREF (props, 2), Qja)) - return Fcons (intern ("kana"), Fcons (intern ("han"), Qnil)); + return list2 (intern ("kana"), intern ("han")); if (EQ (AREF (props, 2), Qko)) - return Fcons (intern ("hangul"), Qnil); + return list1 (intern ("hangul")); scripts = Fgethash (props, xfont_scripts_cache, Qt); if (EQ (scripts, Qt)) { @@ -362,7 +362,7 @@ xfont_list_pattern (Display *display, const char *pattern, } } - BLOCK_INPUT; + block_input (); x_catch_errors (display); for (limit = 512; ; limit *= 2) @@ -479,17 +479,16 @@ xfont_list_pattern (Display *display, const char *pattern, } x_uncatch_errors (); - UNBLOCK_INPUT; + unblock_input (); FONT_ADD_LOG ("xfont-list", build_string (pattern), list); return list; } static Lisp_Object -xfont_list (Lisp_Object frame, Lisp_Object spec) +xfont_list (struct frame *f, Lisp_Object spec) { - FRAME_PTR f = XFRAME (frame); - Display *display = FRAME_X_DISPLAY_INFO (f)->display; + Display *display = FRAME_DISPLAY_INFO (f)->display; Lisp_Object registry, list, val, extra, script; int len; /* Large enough to contain the longest XLFD (255 bytes) in UTF-8. */ @@ -565,10 +564,9 @@ xfont_list (Lisp_Object frame, Lisp_Object spec) } static Lisp_Object -xfont_match (Lisp_Object frame, Lisp_Object spec) +xfont_match (struct frame *f, Lisp_Object spec) { - FRAME_PTR f = XFRAME (frame); - Display *display = FRAME_X_DISPLAY_INFO (f)->display; + Display *display = FRAME_DISPLAY_INFO (f)->display; Lisp_Object extra, val, entity; char name[512]; XFontStruct *xfont; @@ -588,16 +586,14 @@ xfont_match (Lisp_Object frame, Lisp_Object spec) if (xfont_encode_coding_xlfd (name) < 0) return Qnil; - BLOCK_INPUT; + block_input (); entity = Qnil; xfont = XLoadQueryFont (display, name); if (xfont) { if (XGetFontProperty (xfont, XA_FONT, &value)) { - char *s; - - s = (char *) XGetAtomName (display, (Atom) value); + char *s = XGetAtomName (display, (Atom) value); /* If DXPC (a Differential X Protocol Compressor) Ver.3.7 is running, XGetAtomName will return null @@ -615,24 +611,23 @@ xfont_match (Lisp_Object frame, Lisp_Object spec) } XFreeFont (display, xfont); } - UNBLOCK_INPUT; + unblock_input (); FONT_ADD_LOG ("xfont-match", spec, entity); return entity; } static Lisp_Object -xfont_list_family (Lisp_Object frame) +xfont_list_family (struct frame *f) { - FRAME_PTR f = XFRAME (frame); - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); char **names; int num_fonts, i; Lisp_Object list; char *last_family IF_LINT (= 0); int last_len; - BLOCK_INPUT; + block_input (); x_catch_errors (dpyinfo->display); names = XListFonts (dpyinfo->display, "-*-*-*-*-*-*-*-*-*-*-*-*-*-*", 0x8000, &num_fonts); @@ -673,15 +668,15 @@ xfont_list_family (Lisp_Object frame) XFreeFontNames (names); x_uncatch_errors (); - UNBLOCK_INPUT; + unblock_input (); return list; } static Lisp_Object -xfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) +xfont_open (struct frame *f, Lisp_Object entity, int pixel_size) { - Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); Display *display = dpyinfo->display; char name[512]; int len; @@ -717,7 +712,7 @@ xfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) return Qnil; } - BLOCK_INPUT; + block_input (); x_catch_errors (display); xfont = XLoadQueryFont (display, name); if (x_had_errors_p (display)) @@ -763,7 +758,7 @@ xfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) char *p0, *p; int dashes = 0; - p0 = p = (char *) XGetAtomName (FRAME_X_DISPLAY (f), (Atom) value); + p0 = p = XGetAtomName (FRAME_X_DISPLAY (f), (Atom) value); /* Count the number of dashes in the "full name". If it is too few, this isn't really the font's full name, so don't use it. @@ -784,7 +779,7 @@ xfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) XFree (p0); } x_uncatch_errors (); - UNBLOCK_INPUT; + unblock_input (); if (! xfont) { @@ -866,7 +861,7 @@ xfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) } } - BLOCK_INPUT; + block_input (); font->underline_thickness = (XGetFontProperty (xfont, XA_UNDERLINE_THICKNESS, &value) ? (long) value : 0); @@ -882,7 +877,7 @@ xfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) font->default_ascent = (XGetFontProperty (xfont, dpyinfo->Xatom_MULE_DEFAULT_ASCENT, &value) ? (long) value : 0); - UNBLOCK_INPUT; + unblock_input (); if (NILP (fullname)) fullname = AREF (font_object, FONT_NAME_INDEX); @@ -895,20 +890,26 @@ xfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) } static void -xfont_close (FRAME_PTR f, struct font *font) +xfont_close (struct font *font) { - BLOCK_INPUT; - XFreeFont (FRAME_X_DISPLAY (f), ((struct xfont_info *) font)->xfont); - UNBLOCK_INPUT; + struct xfont_info *xfi = (struct xfont_info *) font; + + if (xfi->xfont) + { + block_input (); + XFreeFont (xfi->display, xfi->xfont); + unblock_input (); + xfi->xfont = NULL; + } } static int -xfont_prepare_face (FRAME_PTR f, struct face *face) +xfont_prepare_face (struct frame *f, struct face *face) { - BLOCK_INPUT; + block_input (); XSetFont (FRAME_X_DISPLAY (f), face->gc, ((struct xfont_info *) face->font)->xfont->fid); - UNBLOCK_INPUT; + unblock_input (); return 0; } @@ -1028,9 +1029,9 @@ xfont_draw (struct glyph_string *s, int from, int to, int x, int y, if (s->gc != s->face->gc) { - BLOCK_INPUT; + block_input (); XSetFont (s->display, gc, xfont->fid); - UNBLOCK_INPUT; + unblock_input (); } if (xfont->min_byte1 == 0 && xfont->max_byte1 == 0) @@ -1039,7 +1040,7 @@ xfont_draw (struct glyph_string *s, int from, int to, int x, int y, char *str = SAFE_ALLOCA (len); for (i = 0; i < len ; i++) str[i] = XCHAR2B_BYTE2 (s->char2b + from + i); - BLOCK_INPUT; + block_input (); if (with_background) { if (s->padding_p) @@ -1060,12 +1061,12 @@ xfont_draw (struct glyph_string *s, int from, int to, int x, int y, XDrawString (FRAME_X_DISPLAY (s->f), FRAME_X_WINDOW (s->f), gc, x, y, str, len); } - UNBLOCK_INPUT; + unblock_input (); SAFE_FREE (); return s->nchars; } - BLOCK_INPUT; + block_input (); if (with_background) { if (s->padding_p) @@ -1086,13 +1087,13 @@ xfont_draw (struct glyph_string *s, int from, int to, int x, int y, XDrawString16 (FRAME_X_DISPLAY (s->f), FRAME_X_WINDOW (s->f), gc, x, y, s->char2b + from, len); } - UNBLOCK_INPUT; + unblock_input (); return len; } static int -xfont_check (FRAME_PTR f, struct font *font) +xfont_check (struct frame *f, struct font *font) { struct xfont_info *xfont = (struct xfont_info *) font;