emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r116859: Further improve XIM init


From: Daniel Colascione
Subject: [Emacs-diffs] trunk r116859: Further improve XIM init
Date: Sun, 23 Mar 2014 11:45:30 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 116859 [merge]
revision-id: address@hidden
parent: address@hidden
parent: address@hidden
committer: Daniel Colascione <address@hidden>
branch nick: trunk
timestamp: Sun 2014-03-23 04:45:17 -0700
message:
  Further improve XIM init
modified:
  src/ChangeLog                  changelog-20091113204419-o5vbwnq5f7feedwu-1438
  src/xfns.c                     xfns.c-20091113204419-o5vbwnq5f7feedwu-274
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2014-03-23 10:56:30 +0000
+++ b/src/ChangeLog     2014-03-23 11:44:21 +0000
@@ -2,7 +2,12 @@
 
        * 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.
+       (supported_xim_styles): Make const.
+       (best_xim_style): Remove first parameter: it's always just
+       supported_xim_styles.  Change to look at supported_xim_styles
+       directly.
 
 2014-03-23  Daniel Colascione  <address@hidden>
 

=== modified file 'src/xfns.c'
--- a/src/xfns.c        2014-03-23 10:56:30 +0000
+++ b/src/xfns.c        2014-03-23 11:44:21 +0000
@@ -1641,12 +1641,12 @@
 #ifdef HAVE_X_I18N
 
 static XFontSet xic_create_xfontset (struct frame *);
-static XIMStyle best_xim_style (XIMStyles *, XIMStyles *);
+static XIMStyle best_xim_style (XIMStyles *);
 
 
 /* Supported XIM styles, ordered by preference.  */
 
-static XIMStyle supported_xim_styles[] =
+static const XIMStyle supported_xim_styles[] =
 {
   XIMPreeditPosition | XIMStatusArea,
   XIMPreeditPosition | XIMStatusNothing,
@@ -1941,14 +1941,16 @@
    input method XIM.  */
 
 static XIMStyle
-best_xim_style (XIMStyles *user, XIMStyles *xim)
+best_xim_style (XIMStyles *xim)
 {
   int i, j;
+  int nr_supported =
+    sizeof (supported_xim_styles) / sizeof (supported_xim_styles[0]);
 
-  for (i = 0; i < user->count_styles; ++i)
+  for (i = 0; i < nr_supported; ++i)
     for (j = 0; j < xim->count_styles; ++j)
-      if (user->supported_styles[i] == xim->supported_styles[j])
-       return user->supported_styles[i];
+      if (supported_xim_styles[i] == xim->supported_styles[j])
+       return supported_xim_styles[i];
 
   /* Return the default style.  */
   return XIMPreeditNothing | XIMStatusNothing;
@@ -1956,8 +1958,6 @@
 
 /* Create XIC for frame F. */
 
-static XIMStyle xic_style;
-
 void
 create_frame_xic (struct frame *f)
 {
@@ -1968,30 +1968,31 @@
   XVaNestedList preedit_attr = NULL;
   XRectangle s_area;
   XPoint spot;
-  XIMStyles supported_list;
+  XIMStyle xic_style;
 
   if (FRAME_XIC (f))
-    return;
+    goto out;
+
+  xim = FRAME_X_XIM (f);
+  if (!xim)
+    goto out;
+
+  /* Determine XIC style.  */
+  xic_style = best_xim_style (FRAME_X_XIM_STYLES (f));
 
   /* Create X fontset. */
-  xfs = xic_create_xfontset (f);
-  FRAME_XIC_FONTSET (f) = xfs;
-
-  xim = FRAME_X_XIM (f);
-  if (xim)
+  if (xic_style & (XIMPreeditPosition | XIMStatusArea))
+    {
+      xfs = xic_create_xfontset (f);
+      if (!xfs)
+        goto out;
+
+      FRAME_XIC_FONTSET (f) = xfs;
+    }
+
+  if (xic_style & XIMPreeditPosition)
     {
       spot.x = 0; spot.y = 1;
-
-      /* 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));
-       }
-
       preedit_attr = XVaCreateNestedList (0,
                                          XNFontSet, xfs,
                                          XNForeground,
@@ -2006,50 +2007,62 @@
 
       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)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]