aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChoe Hwanjin <choe.hwanjin@gmail.com>2011-10-13 07:58:02 +0900
committerUlrich Sibiller <uli42@gmx.de>2016-10-19 21:40:25 +0200
commit1871ff031211a842601821735cae7a6d7600ca05 (patch)
treef34652d5295ce2833369486f4545312566620636
parent7efa7da59e27ad72e7f1b554f85804b82977cbef (diff)
downloadnx-libs-1871ff031211a842601821735cae7a6d7600ca05.tar.gz
nx-libs-1871ff031211a842601821735cae7a6d7600ca05.tar.bz2
nx-libs-1871ff031211a842601821735cae7a6d7600ca05.zip
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 <choe.hwanjin@gmail.com> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com> Backported-to-NX-by: Ulrich Sibiller <uli42@gmx.de>
-rw-r--r--nx-X11/lib/X11/XimintP.h40
-rw-r--r--nx-X11/lib/X11/imDefFlt.c16
-rw-r--r--nx-X11/lib/X11/imDefIc.c4
-rw-r--r--nx-X11/lib/X11/imDefLkup.c12
-rw-r--r--nx-X11/lib/X11/imExten.c2
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;
}