From df3964ce56e2ceb4aa528098db5dada1a9222954 Mon Sep 17 00:00:00 2001 From: Daniel Colascione Date: Sun, 23 Mar 2014 03:56:30 -0700 Subject: [PATCH] Improve XIC fix --- src/ChangeLog | 5 ++- src/xfns.c | 102 ++++++++++++++++++++++++++++++-------------------- 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 - * 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 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); } -- 2.39.5