Commit d2933655 authored by Daniel Colascione's avatar Daniel Colascione

Further improve create_frame_xic patch

parent df3964ce
......@@ -2,7 +2,8 @@
* 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.
2014-03-23 Daniel Colascione <dancol@dancol.org>
......
......@@ -1956,8 +1956,6 @@ best_xim_style (XIMStyles *user, XIMStyles *xim)
/* Create XIC for frame F. */
static XIMStyle xic_style;
void
create_frame_xic (struct frame *f)
{
......@@ -1969,29 +1967,34 @@ create_frame_xic (struct frame *f)
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));
/* 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,
......@@ -2006,50 +2009,62 @@ create_frame_xic (struct frame *f)
if (!preedit_attr)
goto out;
}
if (xic_style & XIMStatusArea)
{
s_area.x = 0; s_area.y = 0; s_area.width = 1; s_area.height = 1;
status_attr = XVaCreateNestedList (0,
XNArea,
&s_area,
XNFontSet,
xfs,
XNForeground,
FRAME_FOREGROUND_PIXEL (f),
XNBackground,
FRAME_BACKGROUND_PIXEL (f),
NULL);
if (!status_attr)
goto out;
xic = XCreateIC (xim,
XNInputStyle, xic_style,
XNClientWindow, FRAME_X_WINDOW (f),
XNFocusWindow, FRAME_X_WINDOW (f),
XNStatusAttributes, status_attr,
XNPreeditAttributes, preedit_attr,
NULL);
}
else
{
xic = XCreateIC (xim,
XNInputStyle, xic_style,
XNClientWindow, FRAME_X_WINDOW (f),
XNFocusWindow, FRAME_X_WINDOW (f),
XNPreeditAttributes, preedit_attr,
NULL);
}
if (!xic)
if (xic_style & XIMStatusArea)
{
s_area.x = 0; s_area.y = 0; s_area.width = 1; s_area.height = 1;
status_attr = XVaCreateNestedList (0,
XNArea,
&s_area,
XNFontSet,
xfs,
XNForeground,
FRAME_FOREGROUND_PIXEL (f),
XNBackground,
FRAME_BACKGROUND_PIXEL (f),
NULL);
if (!status_attr)
goto out;
FRAME_XIC (f) = xic;
FRAME_XIC_STYLE (f) = xic_style;
xfs = NULL; /* Don't free below. */
}
if (preedit_attr && status_attr)
xic = XCreateIC (xim,
XNInputStyle, xic_style,
XNClientWindow, FRAME_X_WINDOW (f),
XNFocusWindow, FRAME_X_WINDOW (f),
XNStatusAttributes, status_attr,
XNPreeditAttributes, preedit_attr,
NULL);
else if (preedit_attr)
xic = XCreateIC (xim,
XNInputStyle, xic_style,
XNClientWindow, FRAME_X_WINDOW (f),
XNFocusWindow, FRAME_X_WINDOW (f),
XNPreeditAttributes, preedit_attr,
NULL);
else if (status_attr)
xic = XCreateIC (xim,
XNInputStyle, xic_style,
XNClientWindow, FRAME_X_WINDOW (f),
XNFocusWindow, FRAME_X_WINDOW (f),
XNStatusAttributes, status_attr,
NULL);
else
xic = XCreateIC (xim,
XNInputStyle, xic_style,
XNClientWindow, FRAME_X_WINDOW (f),
XNFocusWindow, FRAME_X_WINDOW (f),
NULL);
if (!xic)
goto out;
FRAME_XIC (f) = xic;
FRAME_XIC_STYLE (f) = xic_style;
xfs = NULL; /* Don't free below. */
out:
if (xfs)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment