[PATCH] XIM: Make Xim handle NEED_SYNC_REPLY flag
Jeremy Huddleston
jeremyhu at apple.com
Tue Oct 11 10:14:11 PDT 2011
Choe, I'm a bit confused here. This looks like an older version of your patch from:
https://bugs.freedesktop.org/attachment.cgi?id=13405
Bernd provided an updated version
https://bugs.freedesktop.org/attachment.cgi?id=21093
which took into account changes in libX11
http://cgit.freedesktop.org/xorg/lib/libX11/diff/?id=1a1a42a3ca1dfaf42f1094936b71c140fc030fcb
Those consolidated changes had issues:
https://bugs.freedesktop.org/show_bug.cgi?id=7869#c25
The patch that I wanted to see sent to the list for review was the one actually used by SuSE:
https://bugzillafiles.novell.org/attachment.cgi?id=276799
I'll send a followup with the SuSE patch.
On Oct 9, 2011, at 07:31, Choe Hwanjin wrote:
> 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 <choe.hwanjin at gmail.com>
> ---
> modules/im/ximcp/imDefFlt.c | 12 ++++++------
> modules/im/ximcp/imDefIc.c | 4 ----
> modules/im/ximcp/imDefLkup.c | 12 ++++--------
> modules/im/ximcp/imExten.c | 2 +-
> src/xlibi18n/XimintP.h | 40 ++++++++++++++++------------------------
> 5 files changed, 27 insertions(+), 43 deletions(-)
>
> diff --git a/modules/im/ximcp/imDefFlt.c b/modules/im/ximcp/imDefFlt.c
> index ee304c8..0eb1797 100644
> --- a/modules/im/ximcp/imDefFlt.c
> +++ b/modules/im/ximcp/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;
> }
> @@ -144,9 +144,9 @@ _XimProtoKeypressFilter(
> Xim im = (Xim)ic->core.im;
> #endif
>
> - if (IS_FABLICATED(ic)) {
> + if (IS_FABRICATED(ic->core.im)) {
> _XimPendingFilter(ic);
> - UNMARK_FABLICATED(ic);
> + UNMARK_FABRICATED(ic->core.im);
> return NOTFILTERD;
> }
>
> @@ -207,9 +207,9 @@ _XimProtoKeyreleaseFilter(
> Xim im = (Xim)ic->core.im;
> #endif
>
> - if (IS_FABLICATED(ic)) {
> + if (IS_FABRICATED(ic->core.im)) {
> _XimPendingFilter(ic);
> - UNMARK_FABLICATED(ic);
> + UNMARK_FABRICATED(ic->core.im);
> return NOTFILTERD;
> }
>
> diff --git a/modules/im/ximcp/imDefIc.c b/modules/im/ximcp/imDefIc.c
> index a962c1b..a06f6a7 100644
> --- a/modules/im/ximcp/imDefIc.c
> +++ b/modules/im/ximcp/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/modules/im/ximcp/imDefLkup.c b/modules/im/ximcp/imDefLkup.c
> index 996d36a..cf75919 100644
> --- a/modules/im/ximcp/imDefLkup.c
> +++ b/modules/im/ximcp/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;
> }
>
> @@ -708,7 +704,7 @@ _XimCommitRecv(
>
> (void)_XimRespSyncReply(ic, flag);
>
> - MARK_FABLICATED(ic);
> + MARK_FABRICATED(im);
>
> ev.type = KeyPress;
> ev.send_event = False;
> diff --git a/modules/im/ximcp/imExten.c b/modules/im/ximcp/imExten.c
> index 946d780..65e59bc 100644
> --- a/modules/im/ximcp/imExten.c
> +++ b/modules/im/ximcp/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;
> }
> diff --git a/src/xlibi18n/XimintP.h b/src/xlibi18n/XimintP.h
> index 0e384ab..14a7e6d 100644
> --- a/src/xlibi18n/XimintP.h
> +++ b/src/xlibi18n/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
> */
> --
> 1.7.5.4
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list