From 4ea1e3209f9603dd431f9fb3abee8f4098ae27f1 Mon Sep 17 00:00:00 2001 From: jenglish Date: Fri, 20 Jan 2006 18:58:55 +0000 Subject: XIM fixes [See #905830, patch tk84-xim-fixes.patch]. + Revert 2005-12-05 patch disabling XIM when SCIM in use; + Make sure all X events get passed to XFilterEvent, including those without a corresponding Tk window. --- ChangeLog | 7 +++++++ generic/tkEvent.c | 8 +++++--- unix/tkUnixEvent.c | 42 ++++++++++++------------------------------ 3 files changed, 24 insertions(+), 33 deletions(-) diff --git a/ChangeLog b/ChangeLog index d26e6da..fc019f6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-01-20 Joe English + * generic/tkEvent.c, unix/tkUnixEvent.c: XIM fixes + [See #905830, patch tk84-xim-fixes.patch]. + + Revert 2005-12-05 patch disabling XIM when SCIM in use; + + Make sure all X events get passed to XFilterEvent, + including those without a corresponding Tk window. + 2006-01-13 Anton Kovalenko * generic/tkUndo.c (TkUndoSetDepth): Don't free diff --git a/generic/tkEvent.c b/generic/tkEvent.c index b9527f3..80609bd 100644 --- a/generic/tkEvent.c +++ b/generic/tkEvent.c @@ -12,7 +12,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.31 2005/11/04 11:52:50 dkf Exp $ + * RCS: @(#) $Id: tkEvent.c,v 1.32 2006/01/20 18:58:55 jenglish Exp $ */ #include "tkPort.h" @@ -449,8 +449,10 @@ InvokeInputMethods( XSetICFocus(winPtr->inputContext); } } - if (XFilterEvent(eventPtr, None)) { - return 1; + if (eventPtr->type == KeyPress || eventPtr->type == KeyRelease) { + if (XFilterEvent(eventPtr, None)) { + return 1; + } } } return 0; diff --git a/unix/tkUnixEvent.c b/unix/tkUnixEvent.c index d312997..500b447 100644 --- a/unix/tkUnixEvent.c +++ b/unix/tkUnixEvent.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkUnixEvent.c,v 1.19 2005/12/07 17:32:52 hobbs Exp $ + * RCS: @(#) $Id: tkUnixEvent.c,v 1.20 2006/01/20 18:58:55 jenglish Exp $ */ #include "tkInt.h" @@ -334,19 +334,22 @@ static void TransferXEventsToTcl( Display *display) { - int numFound; XEvent event; - numFound = QLength(display); - /* - * Transfer events from the X event queue to the Tk event queue. + * Transfer events from the X event queue to the Tk event queue + * after XIM event filtering. KeyPress and KeyRelease events + * are filtered in Tk_HandleEvent instead of here, so that Tk's + * focus management code can redirect them. */ - - while (numFound > 0) { + while (QLength(display) > 0) { XNextEvent(display, &event); + if (event.type != KeyPress && event.type != KeyRelease) { + if (XFilterEvent(&event, None)) { + continue; + } + } Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); - numFound--; } } @@ -636,31 +639,10 @@ OpenIM( { unsigned short i; XIMStyles *stylePtr; - char *modifiers; - modifiers = XSetLocaleModifiers(""); - if (modifiers == NULL) { + if (XSetLocaleModifiers("") == NULL) { goto error; } -#if 1 - /* - * This is a temporary hack that can be taken back out again - * once Tk has learned how to deal with SCIM - */ - while ((modifiers = strchr(modifiers, '@')) != NULL) { - if (strncmp(modifiers, "@im=", 4) == 0) { - /* The first "@im=" entry wins */ - const char *scim = "@im=SCIM"; - if (strncmp(modifiers, scim, strlen(scim)) == 0) { - /* If it is SCIM, we override it */ - if (XSetLocaleModifiers("@im=local") == NULL) { - goto error; - } - } - break; - } - } -#endif dispPtr->inputMethod = XOpenIM(dispPtr->display, NULL, NULL, NULL); if (dispPtr->inputMethod == NULL) { -- cgit v0.12