From 1871ff031211a842601821735cae7a6d7600ca05 Mon Sep 17 00:00:00 2001 From: Choe Hwanjin Date: Thu, 13 Oct 2011 07:58:02 +0900 Subject: XIM: Make Xim handle NEED_SYNC_REPLY flag NEED_SYNC_REPLY flag should be in Xim not in Xic. Because the focused Xic can be changed before sending sync reply. After focused Xic changed, the new Xic doesn't have NEED_SYNC_REPLY flag enabled, so libX11 doesn't send XIM_SYNC_REPLY packet. This patch adds sync reply flag to Xim and removes sync reply from Xic. Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=7869 Signed-off-by: Choe Hwanjin Reviewed-by: Jeremy Huddleston Backported-to-NX-by: Ulrich Sibiller --- nx-X11/lib/X11/XimintP.h | 40 ++++++++++++++++------------------------ nx-X11/lib/X11/imDefFlt.c | 16 ++++++---------- nx-X11/lib/X11/imDefIc.c | 4 ---- nx-X11/lib/X11/imDefLkup.c | 12 ++++-------- nx-X11/lib/X11/imExten.c | 2 +- 5 files changed, 27 insertions(+), 47 deletions(-) diff --git a/nx-X11/lib/X11/XimintP.h b/nx-X11/lib/X11/XimintP.h index 89b7c214f..55257545e 100644 --- a/nx-X11/lib/X11/XimintP.h +++ b/nx-X11/lib/X11/XimintP.h @@ -161,6 +161,8 @@ typedef struct _XimProtoPrivateRec { #define DELAYBINDABLE (1L << 3) #define RECONNECTABLE (1L << 4) #endif /* XIM_CONNECTABLE */ +#define FABRICATED (1L << 5) +#define NEED_SYNC_REPLY (1L << 6) /* * macro for the flag of XIMPrivateRec @@ -199,6 +201,20 @@ typedef struct _XimProtoPrivateRec { (((Xim)im)->private.proto.flag &= ~(DELAYBINDABLE|RECONNECTABLE)) #endif /* XIM_CONNECTABLE */ +#define IS_FABRICATED(im) \ + (((Xim)im)->private.proto.flag & FABRICATED) +#define MARK_FABRICATED(im) \ + (((Xim)im)->private.proto.flag |= FABRICATED) +#define UNMARK_FABRICATED(im) \ + (((Xim)im)->private.proto.flag &= ~FABRICATED) + +#define IS_NEED_SYNC_REPLY(im) \ + (((Xim)im)->private.proto.flag & NEED_SYNC_REPLY) +#define MARK_NEED_SYNC_REPLY(im) \ + (((Xim)im)->private.proto.flag |= NEED_SYNC_REPLY) +#define UNMARK_NEED_SYNC_REPLY(im) \ + (((Xim)im)->private.proto.flag &= ~NEED_SYNC_REPLY) + /* * bit mask for the register_filter_event of XIMPrivateRec/XICPrivateRec */ @@ -259,9 +275,6 @@ typedef struct _XicProtoPrivateRec { * bit mask for the flag of XICPrivateRec */ #define IC_CONNECTED (1L) -#define FABLICATED (1L << 1) -#define NEED_SYNC_REPLY (1L << 2) -#define FOCUSED (1L << 3) /* * macro for the flag of XICPrivateRec @@ -273,27 +286,6 @@ typedef struct _XicProtoPrivateRec { #define UNMARK_IC_CONNECTED(ic) \ (((Xic)ic)->private.proto.flag &= ~IC_CONNECTED) -#define IS_FABLICATED(ic) \ - (((Xic)ic)->private.proto.flag & FABLICATED) -#define MARK_FABLICATED(ic) \ - (((Xic)ic)->private.proto.flag |= FABLICATED) -#define UNMARK_FABLICATED(ic) \ - (((Xic)ic)->private.proto.flag &= ~FABLICATED) - -#define IS_NEED_SYNC_REPLY(ic) \ - (((Xic)ic)->private.proto.flag & NEED_SYNC_REPLY) -#define MARK_NEED_SYNC_REPLY(ic) \ - (((Xic)ic)->private.proto.flag |= NEED_SYNC_REPLY) -#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 */ diff --git a/nx-X11/lib/X11/imDefFlt.c b/nx-X11/lib/X11/imDefFlt.c index 9717aa2c3..6259fb7f7 100644 --- a/nx-X11/lib/X11/imDefFlt.c +++ b/nx-X11/lib/X11/imDefFlt.c @@ -128,9 +128,9 @@ _XimPendingFilter( { Xim im = (Xim)ic->core.im; - if (IS_NEED_SYNC_REPLY(ic)) { + if (IS_NEED_SYNC_REPLY(im)) { (void)_XimProcSyncReply(im, ic); - UNMARK_NEED_SYNC_REPLY(ic); + UNMARK_NEED_SYNC_REPLY(im); } return; } @@ -140,13 +140,11 @@ _XimProtoKeypressFilter( Xic ic, XKeyEvent *ev) { -#ifdef XIM_CONNECTABLE Xim im = (Xim)ic->core.im; -#endif - if (IS_FABLICATED(ic)) { + if (IS_FABRICATED(im)) { _XimPendingFilter(ic); - UNMARK_FABLICATED(ic); + UNMARK_FABRICATED(im); return NOTFILTERD; } @@ -203,13 +201,11 @@ _XimProtoKeyreleaseFilter( Xic ic, XKeyEvent *ev) { -#ifdef XIM_CONNECTABLE Xim im = (Xim)ic->core.im; -#endif - if (IS_FABLICATED(ic)) { + if (IS_FABRICATED(im)) { _XimPendingFilter(ic); - UNMARK_FABLICATED(ic); + UNMARK_FABRICATED(im); return NOTFILTERD; } diff --git a/nx-X11/lib/X11/imDefIc.c b/nx-X11/lib/X11/imDefIc.c index 85029ad1f..dab0e3c75 100644 --- a/nx-X11/lib/X11/imDefIc.c +++ b/nx-X11/lib/X11/imDefIc.c @@ -968,8 +968,6 @@ _XimProtoSetFocus( (void)_XimWrite(im, len, (XPointer)buf); _XimFlush(im); - MARK_FOCUSED(ic); - _XimRegisterFilter(ic); return; } @@ -1015,8 +1013,6 @@ _XimProtoUnsetFocus( (void)_XimWrite(im, len, (XPointer)buf); _XimFlush(im); - UNMARK_FOCUSED(ic); - _XimUnregisterFilter(ic); return; } diff --git a/nx-X11/lib/X11/imDefLkup.c b/nx-X11/lib/X11/imDefLkup.c index d1c3a6567..e2b1e05bc 100644 --- a/nx-X11/lib/X11/imDefLkup.c +++ b/nx-X11/lib/X11/imDefLkup.c @@ -213,12 +213,8 @@ _XimRespSyncReply( Xic ic, BITMASK16 mode) { - if (mode & XimSYNCHRONUS) /* SYNC Request */ { - if (IS_FOCUSED(ic)) - MARK_NEED_SYNC_REPLY(ic); - else - _XimProcSyncReply((Xim)ic->core.im, ic); - } + if (mode & XimSYNCHRONUS) /* SYNC Request */ + MARK_NEED_SYNC_REPLY(ic->core.im); return True; } @@ -356,7 +352,7 @@ _XimProcEvent( ev->xany.serial |= serial << 16; ev->xany.send_event = False; ev->xany.display = d; - MARK_FABLICATED(ic); + MARK_FABRICATED(ic->core.im); return; } @@ -706,7 +702,7 @@ _XimCommitRecv( (void)_XimRespSyncReply(ic, flag); - MARK_FABLICATED(ic); + MARK_FABRICATED(im); ev.type = KeyPress; ev.send_event = False; diff --git a/nx-X11/lib/X11/imExten.c b/nx-X11/lib/X11/imExten.c index 3ffe7f891..c7b9ed11e 100644 --- a/nx-X11/lib/X11/imExten.c +++ b/nx-X11/lib/X11/imExten.c @@ -159,7 +159,7 @@ _XimProcExtForwardKeyEvent( XPutBackEvent(im->core.display, &ev); _XimRespSyncReply(ic, buf_s[0]); - MARK_FABLICATED(ic); + MARK_FABRICATED(im); return True; } -- cgit v1.2.3