[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