diff options
-rw-r--r-- | modules/im/ximcp/imDefIc.c | 4 | ||||
-rw-r--r-- | modules/im/ximcp/imDefLkup.c | 9 | ||||
-rw-r--r-- | src/xlibi18n/XimintP.h | 8 |
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 */ |