void VncView::startQuitting() { kDebug(5011) << "about to quit"; setStatus(Disconnecting); m_quitFlag = true; vncThread.stop(); unpressModifiers(); // Disconnect all signals so that we don't get any more callbacks from the client thread vncThread.disconnect(); vncThread.quit(); const bool quitSuccess = vncThread.wait(500); if (!quitSuccess) { // happens when vncThread wants to call a slot via BlockingQueuedConnection, // needs an event loop in this thread so execution continues after 'emit' QEventLoop loop; if (!loop.processEvents()) { kDebug(5011) << "BUG: deadlocked, but no events to deliver?"; } vncThread.wait(500); } kDebug(5011) << "Quit VNC thread success:" << quitSuccess; setStatus(Disconnected); }
void VncView::keyEventHandler(QKeyEvent *e) { // strip away autorepeating KeyRelease; see bug #206598 if (e->isAutoRepeat() && (e->type() == QEvent::KeyRelease)) return; // parts of this code are based on http://italc.sourcearchive.com/documentation/1.0.9.1/vncview_8cpp-source.html rfbKeySym k = e->nativeVirtualKey(); // we do not handle Key_Backtab separately as the Shift-modifier // is already enabled if (e->key() == Qt::Key_Backtab) { k = XK_Tab; } const bool pressed = (e->type() == QEvent::KeyPress); // handle modifiers if (k == XK_Shift_L || k == XK_Control_L || k == XK_Meta_L || k == XK_Alt_L) { if (pressed) { m_mods[k] = true; } else if (m_mods.contains(k)) { m_mods.remove(k); } else { unpressModifiers(); } } if (k) { vncThread.keyEvent(k, pressed); } }
VncView::~VncView() { unpressModifiers(); // Disconnect all signals so that we don't get any more callbacks from the client thread disconnect(&vncThread, SIGNAL(imageUpdated(int, int, int, int)), this, SLOT(updateImage(int, int, int, int))); disconnect(&vncThread, SIGNAL(gotCut(const QString&)), this, SLOT(setCut(const QString&))); disconnect(&vncThread, SIGNAL(passwordRequest()), this, SLOT(requestPassword())); disconnect(&vncThread, SIGNAL(outputErrorMessage(QString)), this, SLOT(outputErrorMessage(QString))); startQuitting(); }