summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--generic/tkEvent.c8
-rw-r--r--unix/tkUnixEvent.c42
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 <jenglish@users.sourceforge.net>
+ * 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 <a_kovalenko@users.sourceforge.net>
* 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) {