Be more paranoid about ShmCompletion events
Unfortunately HP ships a buggy X server on their thin clients
that send out extra, bogus ShmCompletion events. This screws up our
logic so we need to filter them out. Fortunately they are sent with
an invalid drawable id, so simply verify that.
diff --git a/vncviewer/X11PixelBuffer.cxx b/vncviewer/X11PixelBuffer.cxx
index 046676e..3c41490 100644
--- a/vncviewer/X11PixelBuffer.cxx
+++ b/vncviewer/X11PixelBuffer.cxx
@@ -101,7 +101,7 @@
X11PixelBuffer::X11PixelBuffer(int width, int height) :
PlatformPixelBuffer(display_pf(), width, height, NULL, 0),
- shminfo(NULL), xim(NULL), pendingPutImage(0)
+ shminfo(NULL), xim(NULL), pendingPutImage(0), pendingDrawable(0)
{
// Might not be open at this point
fl_open_display();
@@ -146,6 +146,8 @@
if (shminfo) {
XShmPutImage(fl_display, fl_window, fl_gc, xim, src_x, src_y, x, y, w, h, True);
pendingPutImage++;
+ assert((pendingPutImage == 1) || (pendingDrawable == fl_window));
+ pendingDrawable = fl_window;
} else {
XPutImage(fl_display, fl_window, fl_gc, xim, src_x, src_y, x, y, w, h);
}
@@ -255,10 +257,18 @@
shmevent = (XShmCompletionEvent*)event;
+ if (shmevent->send_event)
+ return 0;
+
for (iter = shmList.begin();iter != shmList.end();++iter) {
if (shmevent->shmseg != (*iter)->shminfo->shmseg)
continue;
+ /* HP has a buggy X server on their thin clients that sends bogus
+ * extra events with an incorrect drawable id */
+ if (shmevent->drawable != (*iter)->pendingDrawable)
+ continue;
+
(*iter)->pendingPutImage--;
assert((*iter)->pendingPutImage >= 0);