[PATCH] XIM: Make Xim handle NEED_SYNC_REPLY flag

Choe Hwanjin choe.hwanjin at gmail.com
Sun Oct 9 07:31:49 PDT 2011


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



More information about the xorg-devel mailing list