aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenichi Handa2006-11-29 08:15:39 +0000
committerKenichi Handa2006-11-29 08:15:39 +0000
commita32f056c3ebf502e570bc2f834fa01fbbee9dda9 (patch)
tree5cd11dfb04dba8355864cc537dd66415f889a084 /src
parent0e80c3731e8175ba1033fcfa440ee00e577abb23 (diff)
downloademacs-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.c91
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
1940static XFontSet xic_create_xfontset P_ ((struct frame *, char *)); 1940static XFontSet xic_create_xfontset P_ ((struct frame *, char *));
1941static XFontSet xic_create_xfontset2 P_ ((struct frame *));
1941static XIMStyle best_xim_style P_ ((XIMStyles *, XIMStyles *)); 1942static 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
2177static XFontSet
2178xic_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
2177void 2258void
@@ -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);