]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve XIC fix
authorDaniel Colascione <dancol@dancol.org>
Sun, 23 Mar 2014 10:56:30 +0000 (03:56 -0700)
committerDaniel Colascione <dancol@dancol.org>
Sun, 23 Mar 2014 10:56:30 +0000 (03:56 -0700)
src/ChangeLog
src/xfns.c

index e468197c9683123bf9a0665f69ab3ebea40fecd3..509875d87ea5cc26342ad81122353f101bc29254 100644 (file)
@@ -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>
 
index de92baa3ce697cd6fb41a0de8fc1f5bf5ed75812..7f4fc365833beaa1989e4fc47f1fb2eb58a13eb2 100644 (file)
@@ -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);
 }