The XIC is of each frame, by each frame, for each frame.
The exceptions are:
1. Activate XICs on poor frames when the XIM is back.
- 2. Deactivate all the XICs when the XIM go down.
+ 2. Deactivate all the XICs when the XIM goes down.
- Methods:
+ Implementation:
- Register a callback for an XIM when the X device is being initialized.
XIM_init_device (d) { XRegisterIMInstantiateCallback (); }
In IMDestroyCallback:
DEVICE_FRAME_LOOP (...) { FRAME_X_XIC (f) = NULL; }
- - Re-enable XIC for all the frames which doesn't have XIC when the XIM
+ - Re-enable XIC for all the frames which don't have XIC when the XIM
is back.
In IMInstantiateCallback:
DEVICE_FRAME_LOOP (...) { XIM_init_frame (f); }
#include <config.h>
#include "lisp.h"
#include <X11/Xlocale.h> /* More portable than <locale.h> ? */
+#include <X11/Xlib.h>
#include "frame.h"
#include "device.h"
#include "window.h"
#include "EmacsFrame.h"
#include "events.h"
-#ifdef THIS_IS_X11R6
-#include <X11/IntrinsicP.h>
-#endif
-
-#ifndef XIM_XLIB
-#error XIM_XLIB is not defined??
+#if !defined (XIM_XLIB) && !defined (USE_XFONTSET)
+#error neither XIM_XLIB nor USE_XFONTSET is defined??
#endif
Lisp_Object Qxim_xlib;
#define xim_warn1(fmt, str) warn_when_safe (Qxim_xlib, Qwarning, fmt, str);
#define xim_info(str) warn_when_safe (Qxim_xlib, Qinfo, str);
+#ifdef XIM_XLIB /* XIM_XLIB specific */
/* Get/Set IC values for just one attribute */
#ifdef DEBUG_XEMACS
#define XIC_Value(Get_Set, xic, name, attr, value) \
"XIMPreeditNone|XIMStatusNothing\n"
"XIMPreeditNone|XIMStatusNone";
-static Boolean xim_initted = False;
-
static XIMStyle best_style (XIMStyles *user, XIMStyles *xim);
+#endif /* XIM_XLIB only */
+
+/* This function is documented, but no prototype in the header files */
+EXTERN_C char * XSetIMValues(XIM, ...);
void
Initialize_Locale (void)
}
}
-#ifdef THIS_IS_X11R6 /* Callbacks for IM are supported from X11R6 or later. */
+#ifdef XIM_XLIB /* starting XIM specific codes */
+
+/* Callbacks for IM are supported from X11R6 or later. */
+#ifdef HAVE_XREGISTERIMINSTANTIATECALLBACK
+
+static Boolean xim_initted = False;
+
/* Called from when XIM is destroying.
Clear all the XIC when the XIM was destroying... */
static void
DEVICE_X_XIM (d) = xim = XOpenIM (dpy, XtDatabase (dpy), name, class);
/* destroy callback for im */
- ximcallback.callback = IMDestroyCallback;
+ ximcallback.callback = (XIMProc) IMDestroyCallback;
ximcallback.client_data = (XPointer) d;
XSetIMValues (xim, XNDestroyCallback, &ximcallback, NULL);
}
}
return;
}
-#endif /* if THIS_IS_X11R6 */
+#endif /* HAVE_XREGISTERIMINSTANTIATECALLBACK */
/* Initialize XIM for X device.
Register the use of XIM using XRegisterIMInstantiateCallback. */
void
XIM_init_device (struct device *d)
{
-#ifdef THIS_IS_X11R6
+#ifdef HAVE_XREGISTERIMINSTANTIATECALLBACK /* X11R6+ */
DEVICE_X_XIM (d) = NULL;
XRegisterIMInstantiateCallback (DEVICE_X_DISPLAY (d), NULL, NULL, NULL,
- IMInstantiateCallback, (XPointer) d);
+#ifdef XREGISTERIMINSTANTIATECALLBACK_NONSTANDARD_PROTOTYPE
+ /* The sixth parameter is of type
+ XPointer in XFree86 but (XPointer *)
+ on most other X11's. */
+ (XIDProc) IMInstantiateCallback,
+ (XPointer) d
+#else /* X Consortium prototype */
+ (XIMProc) IMInstantiateCallback,
+ (XPointer *) d
+#endif /* XREGISTERIMINSTANTIATECALLBACK_NONSTANDARD_PROTOTYPE */
+ );
return;
-#else
+#else /* pre-X11R6 */
Display *dpy = DEVICE_X_DISPLAY (d);
char *name, *class;
XIM xim;
XGetIMValues (xim, XNQueryInputStyle, &DEVICE_X_XIM_STYLES (d), NULL);
return;
}
-#endif
+#endif /* HAVE_XREGISTERIMINSTANTIATECALLBACK */
}
XSetICFocus (xic);
-#ifdef THIS_IS_X11R6
+#ifdef HAVE_XREGISTERIMINSTANTIATECALLBACK
/* when frame is going to be destroyed (closed) */
XtAddCallback (FRAME_X_TEXT_WIDGET(f), XNDestroyCallback,
XIM_delete_frame, (XtPointer)f);
void
XIM_SetGeometry (struct frame *f)
{
- XIC xic = FRAME_X_XIC (f);
- XIMStyle style = FRAME_X_XIC_STYLE (f);
+ XIC xic;
+ XIMStyle style;
XRectangle area;
- if (!xic || !f)
+ if (!f)
+ return;
+
+ xic = FRAME_X_XIC (f);
+ if (!xic)
return;
+ style = FRAME_X_XIC_STYLE (f);
if (style & XIMStatusArea)
{
/* Place Status Area in bottom right corner */
case XLookupChars:
break;
default:
- abort ();
+ ABORT ();
}
new_event.type = ClientMessage;
}
}
#endif
+#endif /* XIM_XLIB only */
#if 0
/* Get a fontset for IM to use */