diff options
| author | Stefan Monnier | 2005-03-12 23:25:42 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2005-03-12 23:25:42 +0000 |
| commit | bb07fa293e5360ce4c6fb6856d75b383bf72211d (patch) | |
| tree | 959a7ab1037f71555a490329d8761dd735c9f613 /src | |
| parent | 3fdfb09c1c320351dcf3fc3d93cbf08181e714b6 (diff) | |
| download | emacs-bb07fa293e5360ce4c6fb6856d75b383bf72211d.tar.gz emacs-bb07fa293e5360ce4c6fb6856d75b383bf72211d.zip | |
(xic_defaut_fontset): New constant.
(xic_create_fontsetname): New function.
Extracted from create_frame_xic. Try to generate a slightly better fontset.
(xic_create_xfontset): Use it.
(create_frame_xic): Simplify.
Diffstat (limited to 'src')
| -rw-r--r-- | src/xfns.c | 139 |
1 files changed, 95 insertions, 44 deletions
diff --git a/src/xfns.c b/src/xfns.c index 816b107cef3..9e8732faba8 100644 --- a/src/xfns.c +++ b/src/xfns.c | |||
| @@ -1959,6 +1959,88 @@ static XIMStyle supported_xim_styles[] = | |||
| 1959 | 1959 | ||
| 1960 | /* Create an X fontset on frame F with base font name BASE_FONTNAME. */ | 1960 | /* Create an X fontset on frame F with base font name BASE_FONTNAME. */ |
| 1961 | 1961 | ||
| 1962 | char xic_defaut_fontset[] = "-*-*-*-r-normal--14-*-*-*-*-*-*-*"; | ||
| 1963 | |||
| 1964 | char * | ||
| 1965 | xic_create_fontsetname (base_fontname) | ||
| 1966 | char *base_fontname; | ||
| 1967 | { | ||
| 1968 | /* Make a fontset name from the base font name. */ | ||
| 1969 | if (xic_defaut_fontset == base_fontname) | ||
| 1970 | /* There is no base font name, use the default. */ | ||
| 1971 | return base_fontname; | ||
| 1972 | else | ||
| 1973 | { | ||
| 1974 | /* Make a fontset name from the base font name. | ||
| 1975 | The font set will be made of the following elements: | ||
| 1976 | - the base font. | ||
| 1977 | - the base font where the charset spec is replaced by -*-*. | ||
| 1978 | - the same but with the family also replaced with -*-*-. */ | ||
| 1979 | char *p = base_fontname; | ||
| 1980 | char *fontsetname; | ||
| 1981 | int i; | ||
| 1982 | |||
| 1983 | for (i = 0; *p; p++) | ||
| 1984 | if (*p == '-') i++; | ||
| 1985 | if (i != 14) | ||
| 1986 | { /* As the font name doesn't conform to XLFD, we can't | ||
| 1987 | modify it to generalize it to allcs and allfamilies. | ||
| 1988 | Use the specified font plus the default. */ | ||
| 1989 | int len = strlen (base_fontname) + strlen (xic_defaut_fontset) + 2; | ||
| 1990 | fontsetname = xmalloc (len); | ||
| 1991 | bzero (fontsetname, len); | ||
| 1992 | strcpy (fontsetname, base_fontname); | ||
| 1993 | strcat (fontsetname, ","); | ||
| 1994 | strcat (fontsetname, xic_defaut_fontset); | ||
| 1995 | } | ||
| 1996 | else | ||
| 1997 | { | ||
| 1998 | int len; | ||
| 1999 | char *p1 = NULL; | ||
| 2000 | char *font_allcs = NULL; | ||
| 2001 | char *font_allfamilies = NULL; | ||
| 2002 | char *allcs = "*-*-*-*-*-*-*"; | ||
| 2003 | char *allfamilies = "-*-*-"; | ||
| 2004 | |||
| 2005 | for (i = 0, p = base_fontname; i < 8; p++) | ||
| 2006 | { | ||
| 2007 | if (*p == '-') | ||
| 2008 | { | ||
| 2009 | i++; | ||
| 2010 | if (i == 3) | ||
| 2011 | p1 = p + 1; | ||
| 2012 | } | ||
| 2013 | } | ||
| 2014 | /* Build the font spec that matches all charsets. */ | ||
| 2015 | len = p - base_fontname + strlen (allcs) + 1; | ||
| 2016 | font_allcs = (char *) alloca (len); | ||
| 2017 | bzero (font_allcs, len); | ||
| 2018 | bcopy (base_fontname, font_allcs, p - base_fontname); | ||
| 2019 | strcat (font_allcs, allcs); | ||
| 2020 | |||
| 2021 | /* Build the font spec that matches all families. */ | ||
| 2022 | len = p - p1 + strlen (allcs) + strlen (allfamilies) + 1; | ||
| 2023 | font_allfamilies = (char *) alloca (len); | ||
| 2024 | bzero (font_allfamilies, len); | ||
| 2025 | strcpy (font_allfamilies, allfamilies); | ||
| 2026 | bcopy (p1, font_allfamilies + (strlen (allfamilies)), p - p1); | ||
| 2027 | strcat (font_allfamilies, allcs); | ||
| 2028 | |||
| 2029 | /* Build the actual font set name. */ | ||
| 2030 | len = strlen (base_fontname) + strlen (font_allcs) | ||
| 2031 | + strlen (font_allfamilies) + 3; | ||
| 2032 | fontsetname = xmalloc (len); | ||
| 2033 | bzero (fontsetname, len); | ||
| 2034 | strcpy (fontsetname, base_fontname); | ||
| 2035 | strcat (fontsetname, ","); | ||
| 2036 | strcat (fontsetname, font_allcs); | ||
| 2037 | strcat (fontsetname, ","); | ||
| 2038 | strcat (fontsetname, font_allfamilies); | ||
| 2039 | } | ||
| 2040 | return fontsetname; | ||
| 2041 | } | ||
| 2042 | } | ||
| 2043 | |||
| 1962 | static XFontSet | 2044 | static XFontSet |
| 1963 | xic_create_xfontset (f, base_fontname) | 2045 | xic_create_xfontset (f, base_fontname) |
| 1964 | struct frame *f; | 2046 | struct frame *f; |
| @@ -1970,6 +2052,9 @@ xic_create_xfontset (f, base_fontname) | |||
| 1970 | char *def_string; | 2052 | char *def_string; |
| 1971 | Lisp_Object rest, frame; | 2053 | Lisp_Object rest, frame; |
| 1972 | 2054 | ||
| 2055 | if (!base_fontname) | ||
| 2056 | base_fontname = xic_defaut_fontset; | ||
| 2057 | |||
| 1973 | /* See if there is another frame already using same fontset. */ | 2058 | /* See if there is another frame already using same fontset. */ |
| 1974 | FOR_EACH_FRAME (rest, frame) | 2059 | FOR_EACH_FRAME (rest, frame) |
| 1975 | { | 2060 | { |
| @@ -1986,12 +2071,16 @@ xic_create_xfontset (f, base_fontname) | |||
| 1986 | 2071 | ||
| 1987 | if (!xfs) | 2072 | if (!xfs) |
| 1988 | { | 2073 | { |
| 2074 | char *fontsetname = xic_create_fontsetname (base_fontname); | ||
| 2075 | |||
| 1989 | /* New fontset. */ | 2076 | /* New fontset. */ |
| 1990 | xfs = XCreateFontSet (FRAME_X_DISPLAY (f), | 2077 | xfs = XCreateFontSet (FRAME_X_DISPLAY (f), |
| 1991 | base_fontname, &missing_list, | 2078 | fontsetname, &missing_list, |
| 1992 | &missing_count, &def_string); | 2079 | &missing_count, &def_string); |
| 1993 | if (missing_list) | 2080 | if (missing_list) |
| 1994 | XFreeStringList (missing_list); | 2081 | XFreeStringList (missing_list); |
| 2082 | if (fontsetname != base_fontname) | ||
| 2083 | xfree (fontsetname); | ||
| 1995 | } | 2084 | } |
| 1996 | 2085 | ||
| 1997 | if (FRAME_XIC_BASE_FONTNAME (f)) | 2086 | if (FRAME_XIC_BASE_FONTNAME (f)) |
| @@ -2073,6 +2162,11 @@ create_frame_xic (f) | |||
| 2073 | if (FRAME_XIC (f)) | 2162 | if (FRAME_XIC (f)) |
| 2074 | return; | 2163 | return; |
| 2075 | 2164 | ||
| 2165 | /* Create X fontset. */ | ||
| 2166 | xfs = xic_create_xfontset | ||
| 2167 | (f, (FRAME_FONTSET (f) < 0) ? NULL | ||
| 2168 | : (char *) SDATA (fontset_ascii (FRAME_FONTSET (f)))); | ||
| 2169 | |||
| 2076 | xim = FRAME_X_XIM (f); | 2170 | xim = FRAME_X_XIM (f); |
| 2077 | if (xim) | 2171 | if (xim) |
| 2078 | { | 2172 | { |
| @@ -2080,52 +2174,9 @@ create_frame_xic (f) | |||
| 2080 | XPoint spot; | 2174 | XPoint spot; |
| 2081 | XVaNestedList preedit_attr; | 2175 | XVaNestedList preedit_attr; |
| 2082 | XVaNestedList status_attr; | 2176 | XVaNestedList status_attr; |
| 2083 | char *base_fontname; | ||
| 2084 | int fontset; | ||
| 2085 | 2177 | ||
| 2086 | s_area.x = 0; s_area.y = 0; s_area.width = 1; s_area.height = 1; | 2178 | s_area.x = 0; s_area.y = 0; s_area.width = 1; s_area.height = 1; |
| 2087 | spot.x = 0; spot.y = 1; | 2179 | spot.x = 0; spot.y = 1; |
| 2088 | /* Create X fontset. */ | ||
| 2089 | fontset = FRAME_FONTSET (f); | ||
| 2090 | if (fontset < 0) | ||
| 2091 | base_fontname = "-*-*-*-r-normal--14-*-*-*-*-*-*-*"; | ||
| 2092 | else | ||
| 2093 | { | ||
| 2094 | /* Determine the base fontname from the ASCII font name of | ||
| 2095 | FONTSET. */ | ||
| 2096 | char *ascii_font = (char *) SDATA (fontset_ascii (fontset)); | ||
| 2097 | char *p = ascii_font; | ||
| 2098 | int i; | ||
| 2099 | |||
| 2100 | for (i = 0; *p; p++) | ||
| 2101 | if (*p == '-') i++; | ||
| 2102 | if (i != 14) | ||
| 2103 | /* As the font name doesn't conform to XLFD, we can't | ||
| 2104 | modify it to get a suitable base fontname for the | ||
| 2105 | frame. */ | ||
| 2106 | base_fontname = "-*-*-*-r-normal--14-*-*-*-*-*-*-*"; | ||
| 2107 | else | ||
| 2108 | { | ||
| 2109 | int len = strlen (ascii_font) + 1; | ||
| 2110 | char *p1 = NULL; | ||
| 2111 | |||
| 2112 | for (i = 0, p = ascii_font; i < 8; p++) | ||
| 2113 | { | ||
| 2114 | if (*p == '-') | ||
| 2115 | { | ||
| 2116 | i++; | ||
| 2117 | if (i == 3) | ||
| 2118 | p1 = p + 1; | ||
| 2119 | } | ||
| 2120 | } | ||
| 2121 | base_fontname = (char *) alloca (len); | ||
| 2122 | bzero (base_fontname, len); | ||
| 2123 | strcpy (base_fontname, "-*-*-"); | ||
| 2124 | bcopy (p1, base_fontname + 5, p - p1); | ||
| 2125 | strcat (base_fontname, "*-*-*-*-*-*-*"); | ||
| 2126 | } | ||
| 2127 | } | ||
| 2128 | xfs = xic_create_xfontset (f, base_fontname); | ||
| 2129 | 2180 | ||
| 2130 | /* Determine XIC style. */ | 2181 | /* Determine XIC style. */ |
| 2131 | if (xic_style == 0) | 2182 | if (xic_style == 0) |