summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Colascione <dancol@dancol.org>2014-03-23 03:56:30 -0700
committerDaniel Colascione <dancol@dancol.org>2014-03-23 03:56:30 -0700
commitdf3964ce56e2ceb4aa528098db5dada1a9222954 (patch)
treee25a429c6de8e3f81f7d59e30fd50e0f27ef2b9d
parentb27a404396a312f13f3cc9318a427a3a87d33a6c (diff)
downloademacs-df3964ce56e2ceb4aa528098db5dada1a9222954.tar.gz
Improve XIC fix
-rw-r--r--src/ChangeLog5
-rw-r--r--src/xfns.c102
2 files changed, 65 insertions, 42 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index e468197c968..509875d87ea 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,7 +1,8 @@
2014-03-23 Daniel Colascione <dancol@dancol.org>
- * xfns.c (create_frame_xic): If XCreateIC fails, try again without
- XNStatusAttributes; works around flaky XIM modules, apparently.
+ * 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.
2014-03-23 Daniel Colascione <dancol@dancol.org>
diff --git a/src/xfns.c b/src/xfns.c
index de92baa3ce6..7f4fc365833 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -1964,27 +1964,27 @@ create_frame_xic (struct frame *f)
XIM xim;
XIC xic = NULL;
XFontSet xfs = NULL;
+ XVaNestedList status_attr = NULL;
+ XVaNestedList preedit_attr = NULL;
+ XRectangle s_area;
+ XPoint spot;
+ XIMStyles supported_list;
if (FRAME_XIC (f))
return;
/* Create X fontset. */
xfs = xic_create_xfontset (f);
+ FRAME_XIC_FONTSET (f) = xfs;
+
xim = FRAME_X_XIM (f);
if (xim)
{
- XRectangle s_area;
- XPoint spot;
- XVaNestedList preedit_attr;
- XVaNestedList status_attr;
-
- s_area.x = 0; s_area.y = 0; s_area.width = 1; s_area.height = 1;
spot.x = 0; spot.y = 1;
/* Determine XIC style. */
if (xic_style == 0)
{
- XIMStyles supported_list;
supported_list.count_styles = (sizeof supported_xim_styles
/ sizeof supported_xim_styles[0]);
supported_list.supported_styles = supported_xim_styles;
@@ -2003,41 +2003,63 @@ create_frame_xic (struct frame *f)
: NULL),
&spot,
NULL);
- status_attr = XVaCreateNestedList (0,
- XNArea,
- &s_area,
- XNFontSet,
- xfs,
- XNForeground,
- FRAME_FOREGROUND_PIXEL (f),
- XNBackground,
- FRAME_BACKGROUND_PIXEL (f),
- NULL);
-
- xic = XCreateIC (xim,
- XNInputStyle, xic_style,
- XNClientWindow, FRAME_X_WINDOW (f),
- XNFocusWindow, FRAME_X_WINDOW (f),
- XNStatusAttributes, status_attr,
- XNPreeditAttributes, preedit_attr,
- NULL);
-
- /* Some input methods don't support a status pixel. */
- if (xic == NULL)
- xic = XCreateIC (xim,
- XNInputStyle, xic_style,
- XNClientWindow, FRAME_X_WINDOW (f),
- XNFocusWindow, FRAME_X_WINDOW (f),
- XNPreeditAttributes, preedit_attr,
- NULL);
-
- XFree (preedit_attr);
- XFree (status_attr);
+
+ 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)
+ goto out;
+
+ FRAME_XIC (f) = xic;
+ FRAME_XIC_STYLE (f) = xic_style;
+ xfs = NULL; /* Don't free below. */
}
- FRAME_XIC (f) = xic;
- FRAME_XIC_STYLE (f) = xic_style;
- FRAME_XIC_FONTSET (f) = xfs;
+ out:
+
+ if (xfs)
+ free_frame_xic (f);
+
+ if (preedit_attr)
+ XFree (preedit_attr);
+
+ if (status_attr)
+ XFree (status_attr);
}