: blHosts(&blacklist), desktop(desktop_), desktopStarted(false),
blockCounter(0), pb(0), ledState(ledUnknown),
name(name_), pointerClient(0), clipboardClient(0),
+ pointerClientTime(0),
comparer(0), cursor(new Cursor(0, 0, Point(), NULL)),
renderedCursorInvalid(false),
keyRemapper(&KeyRemapper::defInstance),
void VNCServerST::pointerEvent(VNCSConnectionST* client,
const Point& pos, int buttonMask)
{
+ time_t now = time(0);
if (rfb::Server::maxIdleTime)
idleTimer.start(secsToMillis(rfb::Server::maxIdleTime));
// Let one client own the cursor whilst buttons are pressed in order
- // to provide a bit more sane user experience
- if ((pointerClient != NULL) && (pointerClient != client))
+ // to provide a bit more sane user experience. But limit the time to prevent
+ // locking out all others when e.g. the network is down.
+ if ((pointerClient != NULL) && (pointerClient != client) && ((now - pointerClientTime) < 3))
return;
+ pointerClientTime = now;
if (buttonMask)
pointerClient = client;
else