diff options
| author | Kenichi Handa | 2006-11-29 08:15:39 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2006-11-29 08:15:39 +0000 |
| commit | a32f056c3ebf502e570bc2f834fa01fbbee9dda9 (patch) | |
| tree | 5cd11dfb04dba8355864cc537dd66415f889a084 /src | |
| parent | 0e80c3731e8175ba1033fcfa440ee00e577abb23 (diff) | |
| download | emacs-a32f056c3ebf502e570bc2f834fa01fbbee9dda9.tar.gz emacs-a32f056c3ebf502e570bc2f834fa01fbbee9dda9.zip | |
(xic_create_xfontset2) [USE_FONT_BACKEND]: New function.
(create_frame_xic) [USE_FONT_BACKEND]: Call xic_create_xfontset2.
(xic_set_xfontset) [USE_FONT_BACKEND]: Likewise.
Diffstat (limited to 'src')
| -rw-r--r-- | src/xfns.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/xfns.c b/src/xfns.c index 0825f770c63..559d8e5c031 100644 --- a/src/xfns.c +++ b/src/xfns.c | |||
| @@ -1938,6 +1938,7 @@ hack_wm_protocols (f, widget) | |||
| 1938 | #ifdef HAVE_X_I18N | 1938 | #ifdef HAVE_X_I18N |
| 1939 | 1939 | ||
| 1940 | static XFontSet xic_create_xfontset P_ ((struct frame *, char *)); | 1940 | static XFontSet xic_create_xfontset P_ ((struct frame *, char *)); |
| 1941 | static XFontSet xic_create_xfontset2 P_ ((struct frame *)); | ||
| 1941 | static XIMStyle best_xim_style P_ ((XIMStyles *, XIMStyles *)); | 1942 | static XIMStyle best_xim_style P_ ((XIMStyles *, XIMStyles *)); |
| 1942 | 1943 | ||
| 1943 | 1944 | ||
| @@ -2172,6 +2173,86 @@ xic_create_xfontset (f, base_fontname) | |||
| 2172 | return xfs; | 2173 | return xfs; |
| 2173 | } | 2174 | } |
| 2174 | 2175 | ||
| 2176 | #ifdef USE_FONT_BACKEND | ||
| 2177 | static XFontSet | ||
| 2178 | xic_create_xfontset2 (f) | ||
| 2179 | struct frame *f; | ||
| 2180 | { | ||
| 2181 | XFontSet xfs = NULL; | ||
| 2182 | struct font *font = FRAME_FONT_OBJECT (f); | ||
| 2183 | int pixel_size = font->pixel_size; | ||
| 2184 | Lisp_Object rest, frame; | ||
| 2185 | |||
| 2186 | /* See if there is another frame already using same fontset. */ | ||
| 2187 | FOR_EACH_FRAME (rest, frame) | ||
| 2188 | { | ||
| 2189 | struct frame *cf = XFRAME (frame); | ||
| 2190 | |||
| 2191 | if (cf != f && FRAME_LIVE_P (f) && FRAME_X_P (cf) | ||
| 2192 | && FRAME_X_DISPLAY_INFO (cf) == FRAME_X_DISPLAY_INFO (f) | ||
| 2193 | && FRAME_FONT_OBJECT (f) | ||
| 2194 | && FRAME_FONT_OBJECT (f)->pixel_size == pixel_size) | ||
| 2195 | { | ||
| 2196 | xfs = FRAME_XIC_FONTSET (cf); | ||
| 2197 | break; | ||
| 2198 | } | ||
| 2199 | } | ||
| 2200 | |||
| 2201 | if (! xfs) | ||
| 2202 | { | ||
| 2203 | char buf[256]; | ||
| 2204 | char **missing_list; | ||
| 2205 | int missing_count; | ||
| 2206 | char *def_string; | ||
| 2207 | char *xlfd_format = "-*-*-medium-r-normal--%d-*-*-*-*-*"; | ||
| 2208 | |||
| 2209 | sprintf (buf, xlfd_format, pixel_size); | ||
| 2210 | missing_list = NULL; | ||
| 2211 | xfs = XCreateFontSet (FRAME_X_DISPLAY (f), buf, | ||
| 2212 | &missing_list, &missing_count, &def_string); | ||
| 2213 | if (missing_list) | ||
| 2214 | XFreeStringList (missing_list); | ||
| 2215 | if (! xfs) | ||
| 2216 | { | ||
| 2217 | /* List of pixel sizes most likely available. Find one that | ||
| 2218 | is closest to pixel_size. */ | ||
| 2219 | int sizes[] = {0, 8, 10, 11, 12, 14, 17, 18, 20, 24, 26, 34, 0}; | ||
| 2220 | int *smaller, *larger; | ||
| 2221 | |||
| 2222 | for (smaller = sizes; smaller[1]; smaller++) | ||
| 2223 | if (smaller[1] >= pixel_size) | ||
| 2224 | break; | ||
| 2225 | larger = smaller + 1; | ||
| 2226 | if (*larger == pixel_size) | ||
| 2227 | larger++; | ||
| 2228 | while (*smaller || *larger) | ||
| 2229 | { | ||
| 2230 | int this_size; | ||
| 2231 | |||
| 2232 | if (! *larger) | ||
| 2233 | this_size = *smaller--; | ||
| 2234 | else if (! *smaller) | ||
| 2235 | this_size = *larger++; | ||
| 2236 | else if (pixel_size - *smaller < *larger - pixel_size) | ||
| 2237 | this_size = *smaller--; | ||
| 2238 | else | ||
| 2239 | this_size = *larger++; | ||
| 2240 | sprintf (buf, xlfd_format, this_size); | ||
| 2241 | missing_list = NULL; | ||
| 2242 | xfs = XCreateFontSet (FRAME_X_DISPLAY (f), buf, | ||
| 2243 | &missing_list, &missing_count, &def_string); | ||
| 2244 | if (missing_list) | ||
| 2245 | XFreeStringList (missing_list); | ||
| 2246 | if (xfs) | ||
| 2247 | break; | ||
| 2248 | } | ||
| 2249 | } | ||
| 2250 | } | ||
| 2251 | |||
| 2252 | return xfs; | ||
| 2253 | } | ||
| 2254 | #endif /* USE_FONT_BACKEND */ | ||
| 2255 | |||
| 2175 | /* Free the X fontset of frame F if it is the last frame using it. */ | 2256 | /* Free the X fontset of frame F if it is the last frame using it. */ |
| 2176 | 2257 | ||
| 2177 | void | 2258 | void |
| @@ -2244,6 +2325,11 @@ create_frame_xic (f) | |||
| 2244 | return; | 2325 | return; |
| 2245 | 2326 | ||
| 2246 | /* Create X fontset. */ | 2327 | /* Create X fontset. */ |
| 2328 | #ifdef USE_FONT_BACKEND | ||
| 2329 | if (enable_font_backend) | ||
| 2330 | xfs = xic_create_xfontset2 (f); | ||
| 2331 | else | ||
| 2332 | #endif | ||
| 2247 | xfs = xic_create_xfontset | 2333 | xfs = xic_create_xfontset |
| 2248 | (f, (FRAME_FONTSET (f) < 0) ? NULL | 2334 | (f, (FRAME_FONTSET (f) < 0) ? NULL |
| 2249 | : (char *) SDATA (fontset_ascii (FRAME_FONTSET (f)))); | 2335 | : (char *) SDATA (fontset_ascii (FRAME_FONTSET (f)))); |
| @@ -2402,6 +2488,11 @@ xic_set_xfontset (f, base_fontname) | |||
| 2402 | 2488 | ||
| 2403 | xic_free_xfontset (f); | 2489 | xic_free_xfontset (f); |
| 2404 | 2490 | ||
| 2491 | #ifdef USE_FONT_BACKEND | ||
| 2492 | if (enable_font_backend) | ||
| 2493 | xfs = xic_create_xfontset2 (f); | ||
| 2494 | else | ||
| 2495 | #endif | ||
| 2405 | xfs = xic_create_xfontset (f, base_fontname); | 2496 | xfs = xic_create_xfontset (f, base_fontname); |
| 2406 | 2497 | ||
| 2407 | attr = XVaCreateNestedList (0, XNFontSet, xfs, NULL); | 2498 | attr = XVaCreateNestedList (0, XNFontSet, xfs, NULL); |