From: Daniel Colascione Date: Sun, 23 Mar 2014 11:45:17 +0000 (-0700) Subject: Further improve XIM init X-Git-Tag: emacs-25.0.90~2640^2~344^2 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=577b2ffd2d787506261ed758b086fb4257116dba;p=emacs.git Further improve XIM init --- 577b2ffd2d787506261ed758b086fb4257116dba diff --cc src/ChangeLog index 509875d87ea,951c4b7887f..dc07ba0b320 --- a/src/ChangeLog +++ b/src/ChangeLog @@@ -2,7 -2,8 +2,12 @@@ * 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 diff --cc src/xfns.c index 7f4fc365833,c29a17138f3..692504ef762 --- a/src/xfns.c +++ b/src/xfns.c @@@ -1641,12 -1641,12 +1641,12 @@@ hack_wm_protocols (struct frame *f, Wid #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, @@@ -1941,14 -1941,14 +1941,16 @@@ xic_free_xfontset (struct frame *f 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; @@@ -1968,30 -1966,35 +1968,31 @@@ create_frame_xic (struct frame *f 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,