summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <sandmann@redhat.com>2008-02-24 20:03:35 -0500
committerAdam Jackson <ajax@redhat.com>2008-02-24 20:03:35 -0500
commit1a1a42a3ca1dfaf42f1094936b71c140fc030fcb (patch)
treedfc1334c8ad93b55e8821d5601cc827e0e965516
parente02e4ccafcaf3eb8993152dfcbfbee0240ea2db2 (diff)
downloadxorg-lib-libX11-1a1a42a3ca1dfaf42f1094936b71c140fc030fcb.tar.gz
XIM: Fix a hand when switching input context.
Red Hat bug #201284.
-rw-r--r--modules/im/ximcp/imDefIc.c4
-rw-r--r--modules/im/ximcp/imDefLkup.c9
-rw-r--r--src/xlibi18n/XimintP.h8
3 files changed, 19 insertions, 2 deletions
diff --git a/modules/im/ximcp/imDefIc.c b/modules/im/ximcp/imDefIc.c
index cb30ac23..c04744bb 100644
--- a/modules/im/ximcp/imDefIc.c
+++ b/modules/im/ximcp/imDefIc.c
@@ -949,6 +949,8 @@ _XimProtoSetFocus(
(void)_XimWrite(im, len, (XPointer)buf);
_XimFlush(im);
+ MARK_FOCUSED(ic);
+
_XimRegisterFilter(ic);
return;
}
@@ -994,6 +996,8 @@ _XimProtoUnsetFocus(
(void)_XimWrite(im, len, (XPointer)buf);
_XimFlush(im);
+ UNMARK_FOCUSED(ic);
+
_XimUnregisterFilter(ic);
return;
}
diff --git a/modules/im/ximcp/imDefLkup.c b/modules/im/ximcp/imDefLkup.c
index 157b076d..66e4add4 100644
--- a/modules/im/ximcp/imDefLkup.c
+++ b/modules/im/ximcp/imDefLkup.c
@@ -216,8 +216,13 @@ _XimRespSyncReply(
Xic ic,
BITMASK16 mode)
{
- if (mode & XimSYNCHRONUS) /* SYNC Request */
- MARK_NEED_SYNC_REPLY(ic);
+ if (mode & XimSYNCHRONUS) /* SYNC Request */ {
+ if (IS_FOCUSED(ic))
+ MARK_NEED_SYNC_REPLY(ic);
+ else
+ _XimProcSyncReply(ic->core.im, ic);
+ }
+
return True;
}
diff --git a/src/xlibi18n/XimintP.h b/src/xlibi18n/XimintP.h
index f10d9baa..d36abdc6 100644
--- a/src/xlibi18n/XimintP.h
+++ b/src/xlibi18n/XimintP.h
@@ -244,6 +244,7 @@ typedef struct _XicProtoPrivateRec {
#define IC_CONNECTED (1L)
#define FABLICATED (1L << 1)
#define NEED_SYNC_REPLY (1L << 2)
+#define FOCUSED (1L << 3)
/*
* macro for the flag of XICPrivateRec
@@ -269,6 +270,13 @@ typedef struct _XicProtoPrivateRec {
#define UNMARK_NEED_SYNC_REPLY(ic) \
(((Xic)ic)->private.proto.flag &= ~NEED_SYNC_REPLY)
+#define IS_FOCUSED(ic) \
+ (((Xic)ic)->private.proto.flag & FOCUSED)
+#define MARK_FOCUSED(ic) \
+ (((Xic)ic)->private.proto.flag |= FOCUSED)
+#define UNMARK_FOCUSED(ic) \
+ (((Xic)ic)->private.proto.flag &= ~FOCUSED)
+
/*
* macro for the filter_event_mask of XICPrivateRec
*/