* xfns.c (create_frame_xic): Pass XNStatusAttributes to XCreateIC
only if xic_style calls for it. This change allows Emacs to work
- with ibus. Also, don't leak resources if create_frame_xic fails.
+ with ibus. Also, don't leak resources if create_frame_xic fails,
+ and stop caching xic_style across different displays.
++ (supported_xim_styles): Make const.
++ (best_xim_style): Remove first parameter: it's always just
++ supported_xim_styles. Change to look at supported_xim_styles
++ directly.
2014-03-23 Daniel Colascione <dancol@dancol.org>
#ifdef HAVE_X_I18N
static XFontSet xic_create_xfontset (struct frame *);
--static XIMStyle best_xim_style (XIMStyles *, XIMStyles *);
++static XIMStyle best_xim_style (XIMStyles *);
/* Supported XIM styles, ordered by preference. */
--static XIMStyle supported_xim_styles[] =
++static const XIMStyle supported_xim_styles[] =
{
XIMPreeditPosition | XIMStatusArea,
XIMPreeditPosition | XIMStatusNothing,
input method XIM. */
static XIMStyle
--best_xim_style (XIMStyles *user, XIMStyles *xim)
++best_xim_style (XIMStyles *xim)
{
int i, j;
++ int nr_supported =
++ sizeof (supported_xim_styles) / sizeof (supported_xim_styles[0]);
-- for (i = 0; i < user->count_styles; ++i)
++ for (i = 0; i < nr_supported; ++i)
for (j = 0; j < xim->count_styles; ++j)
-- if (user->supported_styles[i] == xim->supported_styles[j])
-- return user->supported_styles[i];
++ if (supported_xim_styles[i] == xim->supported_styles[j])
++ return supported_xim_styles[i];
/* Return the default style. */
return XIMPreeditNothing | XIMStatusNothing;
XVaNestedList preedit_attr = NULL;
XRectangle s_area;
XPoint spot;
-- XIMStyles supported_list;
+ XIMStyle xic_style;
if (FRAME_XIC (f))
- return;
-
- /* Create X fontset. */
- xfs = xic_create_xfontset (f);
- FRAME_XIC_FONTSET (f) = xfs;
+ goto out;
xim = FRAME_X_XIM (f);
- if (xim)
+ if (!xim)
+ goto out;
+
+ /* Determine XIC style. */
- supported_list.count_styles = (sizeof supported_xim_styles
- / sizeof supported_xim_styles[0]);
- supported_list.supported_styles = supported_xim_styles;
- xic_style = best_xim_style (&supported_list, FRAME_X_XIM_STYLES (f));
++ xic_style = best_xim_style (FRAME_X_XIM_STYLES (f));
+
+ /* Create X fontset. */
+ if (xic_style & (XIMPreeditPosition | XIMStatusArea))
{
- spot.x = 0; spot.y = 1;
+ xfs = xic_create_xfontset (f);
+ if (!xfs)
+ goto out;
- /* Determine XIC style. */
- if (xic_style == 0)
- {
- supported_list.count_styles = (sizeof supported_xim_styles
- / sizeof supported_xim_styles[0]);
- supported_list.supported_styles = supported_xim_styles;
- xic_style = best_xim_style (&supported_list,
- FRAME_X_XIM_STYLES (f));
- }
+ FRAME_XIC_FONTSET (f) = xfs;
+ }
+ if (xic_style & XIMPreeditPosition)
+ {
+ spot.x = 0; spot.y = 1;
preedit_attr = XVaCreateNestedList (0,
XNFontSet, xfs,
XNForeground,