]> git.eshelyaron.com Git - emacs.git/commitdiff
* xterm.c (xim_initialize): Always pass a copy of resource name
authorDmitry Antipov <dmantipov@yandex.ru>
Thu, 6 Mar 2014 11:18:22 +0000 (15:18 +0400)
committerDmitry Antipov <dmantipov@yandex.ru>
Thu, 6 Mar 2014 11:18:22 +0000 (15:18 +0400)
to XRegisterIMInstantiateCallback and eassert whether return
value is True.  Passing copy is important because Xlib doesn't
make its own copy and resource name argument usually points to
SSDATA (Vx_resource_name), which may be changed from Lisp.
(xim_close_display): For XUnregisterIMInstantiateCallback,
always eassert return value and pass exactly the same values
as were used for XRegisterIMInstantiateCallback.  Otherwise
XUnregisterIMInstantiateCallback will always fail.  See Xlib
sources to check why if you are interested.

src/ChangeLog
src/xterm.c

index 29b6078b0375640bf477f4ea3bb87b6b00863721..8f9d7f555a308ee132510d13b345392b2209c785 100644 (file)
@@ -1,3 +1,16 @@
+2014-03-06  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       * xterm.c (xim_initialize): Always pass a copy of resource name
+       to XRegisterIMInstantiateCallback and eassert whether return
+       value is True.  Passing copy is important because Xlib doesn't
+       make its own copy and resource name argument usually points to
+       SSDATA (Vx_resource_name), which may be changed from Lisp.
+       (xim_close_display): For XUnregisterIMInstantiateCallback,
+       always eassert return value and pass exactly the same values
+       as were used for XRegisterIMInstantiateCallback.  Otherwise
+       XUnregisterIMInstantiateCallback will always fail.  See Xlib
+       sources to check why if you are interested.
+
 2014-03-05  Martin Rudalics  <rudalics@gmx.at>
 
        * dispnew.c (change_frame_size_1): Add new_lines instead of
index 71b5126f34067c8177332a3054f8a52ca24cefbe..bf5456b5f8ba79a3ebc575bbeb00dd4a9b0872a3 100644 (file)
@@ -7955,17 +7955,18 @@ xim_initialize (struct x_display_info *dpyinfo, char *resource_name)
     {
 #ifdef HAVE_X11R6_XIM
       struct xim_inst_t *xim_inst = xmalloc (sizeof *xim_inst);
+      Bool ret;
 
       dpyinfo->xim_callback_data = xim_inst;
       xim_inst->dpyinfo = dpyinfo;
       xim_inst->resource_name = xstrdup (resource_name);
-      XRegisterIMInstantiateCallback (dpyinfo->display, dpyinfo->xrdb,
-                                     resource_name, emacs_class,
-                                     xim_instantiate_callback,
-                                     /* This is XPointer in XFree86
-                                        but (XPointer *) on Tru64, at
-                                        least, hence the configure test.  */
-                                     (XRegisterIMInstantiateCallback_arg6) xim_inst);
+      ret = XRegisterIMInstantiateCallback
+       (dpyinfo->display, dpyinfo->xrdb, xim_inst->resource_name,
+        emacs_class, xim_instantiate_callback,
+        /* This is XPointer in XFree86 but (XPointer *)
+           on Tru64, at least, hence the configure test.  */
+        (XRegisterIMInstantiateCallback_arg6) xim_inst);
+      eassert (ret == True);
 #else /* not HAVE_X11R6_XIM */
       xim_open_dpy (dpyinfo, resource_name);
 #endif /* not HAVE_X11R6_XIM */
@@ -7983,12 +7984,18 @@ xim_close_dpy (struct x_display_info *dpyinfo)
   if (use_xim)
     {
 #ifdef HAVE_X11R6_XIM
+      struct xim_inst_t *xim_inst = dpyinfo->xim_callback_data;
+      
       if (dpyinfo->display)
-       XUnregisterIMInstantiateCallback (dpyinfo->display, dpyinfo->xrdb,
-                                         NULL, emacs_class,
-                                         xim_instantiate_callback, NULL);
-      xfree (dpyinfo->xim_callback_data->resource_name);
-      xfree (dpyinfo->xim_callback_data);
+       {
+         Bool ret = XUnregisterIMInstantiateCallback
+           (dpyinfo->display, dpyinfo->xrdb, xim_inst->resource_name,
+            emacs_class, xim_instantiate_callback,
+            (XRegisterIMInstantiateCallback_arg6) xim_inst);
+         eassert (ret == True);
+       }
+      xfree (xim_inst->resource_name);
+      xfree (xim_inst);
 #endif /* HAVE_X11R6_XIM */
       if (dpyinfo->display)
        XCloseIM (dpyinfo->xim);