aboutsummaryrefslogtreecommitdiff
path: root/nx-X11
diff options
context:
space:
mode:
authorUlrich Sibiller <uli42@gmx.de>2016-06-24 21:22:01 +0200
committerUlrich Sibiller <uli42@gmx.de>2016-06-24 21:30:02 +0200
commit5ee04c24c5b7cafc7ed01ae586b5910be73271ff (patch)
tree5e596ec83c786375bab97b0695cd7cf124b0bd66 /nx-X11
parent17f3e3bc5157eeb6018ddaa6d862ca94f4b02b2b (diff)
downloadnx-libs-5ee04c24c5b7cafc7ed01ae586b5910be73271ff.tar.gz
nx-libs-5ee04c24c5b7cafc7ed01ae586b5910be73271ff.tar.bz2
nx-libs-5ee04c24c5b7cafc7ed01ae586b5910be73271ff.zip
libX11: Extend Event functions to handle IOErrors
To allow for suspend/resume NX has changed _XReadEvents() and _XIOError(). _XIOError() does not simply exit but returns. And _XReadEvents() returns after _XIOError(). But as the original _XReadEvents() is supposed to block until at least one event is there calling functions are not prepared for situations where no event is available. These calling functions have to check that condition., Some of the calling functions already had that check but the UnlockDisplay() call was missing. Fixes https://github.com/ArcticaProject/nx-libs/issues/118
Diffstat (limited to 'nx-X11')
-rw-r--r--nx-X11/lib/X11/IfEvent.c1
-rw-r--r--nx-X11/lib/X11/MaskEvent.c1
-rw-r--r--nx-X11/lib/X11/NextEvent.c6
-rw-r--r--nx-X11/lib/X11/PeekEvent.c6
-rw-r--r--nx-X11/lib/X11/PeekIfEv.c1
-rw-r--r--nx-X11/lib/X11/WinEvent.c6
6 files changed, 21 insertions, 0 deletions
diff --git a/nx-X11/lib/X11/IfEvent.c b/nx-X11/lib/X11/IfEvent.c
index a7c0cb188..9cf07f56d 100644
--- a/nx-X11/lib/X11/IfEvent.c
+++ b/nx-X11/lib/X11/IfEvent.c
@@ -73,6 +73,7 @@ XIfEvent (dpy, event, predicate, arg)
prev = NULL;
#ifdef NX_TRANS_SOCKET
if (_XGetIOError(dpy)) {
+ UnlockDisplay(dpy);
return 0;
}
#endif
diff --git a/nx-X11/lib/X11/MaskEvent.c b/nx-X11/lib/X11/MaskEvent.c
index c48a960d2..a46766685 100644
--- a/nx-X11/lib/X11/MaskEvent.c
+++ b/nx-X11/lib/X11/MaskEvent.c
@@ -77,6 +77,7 @@ XMaskEvent (dpy, mask, event)
prev = NULL;
#ifdef NX_TRANS_SOCKET
if (_XGetIOError(dpy)) {
+ UnlockDisplay(dpy);
return 0;
}
#endif
diff --git a/nx-X11/lib/X11/NextEvent.c b/nx-X11/lib/X11/NextEvent.c
index 1c9080651..71d84223e 100644
--- a/nx-X11/lib/X11/NextEvent.c
+++ b/nx-X11/lib/X11/NextEvent.c
@@ -48,6 +48,12 @@ XNextEvent (dpy, event)
if (dpy->head == NULL)
_XReadEvents(dpy);
+#ifdef NX_TRANS_SOCKET
+ if (_XGetIOError(dpy)) {
+ UnlockDisplay(dpy);
+ return 0;
+ }
+#endif
qelt = dpy->head;
*event = qelt->event;
_XDeq(dpy, NULL, qelt);
diff --git a/nx-X11/lib/X11/PeekEvent.c b/nx-X11/lib/X11/PeekEvent.c
index b89c6c95e..b8d755f0a 100644
--- a/nx-X11/lib/X11/PeekEvent.c
+++ b/nx-X11/lib/X11/PeekEvent.c
@@ -46,6 +46,12 @@ XPeekEvent (dpy, event)
LockDisplay(dpy);
if (dpy->head == NULL)
_XReadEvents(dpy);
+#ifdef NX_TRANS_SOCKET
+ if (_XGetIOError(dpy)) {
+ UnlockDisplay(dpy);
+ return 1;
+ }
+#endif
*event = (dpy->head)->event;
UnlockDisplay(dpy);
return 1;
diff --git a/nx-X11/lib/X11/PeekIfEv.c b/nx-X11/lib/X11/PeekIfEv.c
index a8da27932..93a725b49 100644
--- a/nx-X11/lib/X11/PeekIfEv.c
+++ b/nx-X11/lib/X11/PeekIfEv.c
@@ -73,6 +73,7 @@ XPeekIfEvent (dpy, event, predicate, arg)
prev = NULL;
#ifdef NX_TRANS_SOCKET
if (_XGetIOError(dpy)) {
+ UnlockDisplay(dpy);
return 0;
}
#endif
diff --git a/nx-X11/lib/X11/WinEvent.c b/nx-X11/lib/X11/WinEvent.c
index 67e825cb5..961fcf74b 100644
--- a/nx-X11/lib/X11/WinEvent.c
+++ b/nx-X11/lib/X11/WinEvent.c
@@ -79,5 +79,11 @@ XWindowEvent (dpy, w, mask, event)
if (prev && prev->qserial_num != qe_serial)
/* another thread has snatched this event */
prev = NULL;
+#ifdef NX_TRANS_SOCKET
+ if (_XGetIOError(dpy)) {
+ UnlockDisplay(dpy);
+ return 0;
+ }
+#endif
}
}