]> git.eshelyaron.com Git - emacs.git/commitdiff
Further improve create_frame_xic patch
authorDaniel Colascione <dancol@dancol.org>
Sun, 23 Mar 2014 11:35:21 +0000 (04:35 -0700)
committerDaniel Colascione <dancol@dancol.org>
Sun, 23 Mar 2014 11:35:21 +0000 (04:35 -0700)
src/ChangeLog
src/xfns.c

index 509875d87ea5cc26342ad81122353f101bc29254..951c4b7887fd9dcbef5d9435d3bceddcf7da850a 100644 (file)
@@ -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>
 
index 7f4fc365833beaa1989e4fc47f1fb2eb58a13eb2..c29a17138f319ea5214929f3454468ac6e7e5c3b 100644 (file)
@@ -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)