aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/xfns.c139
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
1962char xic_defaut_fontset[] = "-*-*-*-r-normal--14-*-*-*-*-*-*-*";
1963
1964char *
1965xic_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
1962static XFontSet 2044static XFontSet
1963xic_create_xfontset (f, base_fontname) 2045xic_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)