summaryrefslogtreecommitdiffstats
path: root/generic/tkEvent.c
diff options
context:
space:
mode:
authorhobbs <hobbs>2002-04-05 08:41:07 (GMT)
committerhobbs <hobbs>2002-04-05 08:41:07 (GMT)
commit152c3ff975fe90f65cf10f081e7741aea3e0a6dc (patch)
tree406c959ae617e1855a29d8b178868bad86dcf996 /generic/tkEvent.c
parent6f886ef6c778f6cc74c677cafddae7680fc5e548 (diff)
downloadtk-152c3ff975fe90f65cf10f081e7741aea3e0a6dc.zip
tk-152c3ff975fe90f65cf10f081e7741aea3e0a6dc.tar.gz
tk-152c3ff975fe90f65cf10f081e7741aea3e0a6dc.tar.bz2
* generic/tkInt.h: added TK_XIM_SPOT #define (default 1).
Added XFontSet attribute to TkDisplay when TK_XIM_SPOT is true. * generic/tkEvent.c (Tk_HandleEvent): made sure inputContexts are not getting created on DestroyNotify events (for dead windows). Added over-the-spot support if TK_XIM_SPOT is defined (default). The is the nicer XIM behavior, but uses a bit more memory.
Diffstat (limited to 'generic/tkEvent.c')
-rw-r--r--generic/tkEvent.c55
1 files changed, 44 insertions, 11 deletions
diff --git a/generic/tkEvent.c b/generic/tkEvent.c
index 366ba86..9ad96d1 100644
--- a/generic/tkEvent.c
+++ b/generic/tkEvent.c
@@ -11,7 +11,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkEvent.c,v 1.8 2000/06/03 08:58:16 hobbs Exp $
+ * RCS: @(#) $Id: tkEvent.c,v 1.9 2002/04/05 08:41:07 hobbs Exp $
*/
#include "tkPort.h"
@@ -749,18 +749,51 @@ Tk_HandleEvent(eventPtr)
* Pass the event to the input method(s), if there are any, and
* discard the event if the input method(s) insist. Create the
* input context for the window if it hasn't already been done
- * (XFilterEvent needs this context).
+ * (XFilterEvent needs this context). XIM is only ever enabled on
+ * Unix, but this hasn't been factored out of the generic code yet.
*/
- if (winPtr->dispPtr->useInputMethods) {
- if (!(winPtr->flags & TK_CHECKED_IC)) {
- if (winPtr->dispPtr->inputMethod != NULL) {
- winPtr->inputContext = XCreateIC(
- winPtr->dispPtr->inputMethod, XNInputStyle,
- XIMPreeditNothing|XIMStatusNothing,
- XNClientWindow, winPtr->window,
- XNFocusWindow, winPtr->window, NULL);
- }
+ dispPtr = winPtr->dispPtr;
+ if ((dispPtr->useInputMethods)) {
+ if (!(winPtr->flags & (TK_CHECKED_IC|TK_ALREADY_DEAD))) {
winPtr->flags |= TK_CHECKED_IC;
+ if (dispPtr->inputMethod != NULL) {
+#if TK_XIM_SPOT
+ XVaNestedList preedit_attr;
+ XPoint spot = {0, 0};
+
+ if (dispPtr->inputXfs == NULL) {
+ /*
+ * We only need to create one XFontSet
+ */
+ char **missing_list;
+ int missing_count;
+ char *def_string;
+
+ dispPtr->inputXfs = XCreateFontSet(dispPtr->display,
+ "-*-*-*-R-Normal--14-130-75-75-*-*",
+ &missing_list, &missing_count, &def_string);
+ if (missing_count > 0) {
+ XFreeStringList(missing_list);
+ }
+ }
+
+ preedit_attr = XVaCreateNestedList(0, XNSpotLocation, &spot,
+ XNFontSet, dispPtr->inputXfs, NULL);
+ winPtr->inputContext = XCreateIC(dispPtr->inputMethod,
+ XNInputStyle, XIMPreeditPosition | XIMStatusNothing,
+ XNClientWindow, winPtr->window,
+ XNFocusWindow, winPtr->window,
+ XNPreeditAttributes, preedit_attr,
+ NULL);
+ XFree(preedit_attr);
+#else
+ winPtr->inputContext = XCreateIC(dispPtr->inputMethod,
+ XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
+ XNClientWindow, winPtr->window,
+ XNFocusWindow, winPtr->window,
+ NULL);
+#endif
+ }
}
if (XFilterEvent(eventPtr, None)) {
goto done;