This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository x2gokdriveclient. commit a4bd23ee9a5c209b86388f778aec77b74acf4f0f Author: Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> Date: Tue Mar 15 11:27:10 2022 -0600 sending KEYRELEASE immediately after KEYPRESS to avoid the "key sticking". --- client.cpp | 2 +- client.h | 1 + debian/changelog | 1 + displayarea.cpp | 66 +++++++++++++++++++++++++++++++++++++++++--------------- 4 files changed, 52 insertions(+), 18 deletions(-) diff --git a/client.cpp b/client.cpp index 29883ba..f14a488 100644 --- a/client.cpp +++ b/client.cpp @@ -931,6 +931,7 @@ void Client::getServerversion() KDRStdErr(false)<<"server version: "<<serverVersion<<KDR_ENDL; initGeometry(); + checkServerVersion(); } void Client::getClientSelection() @@ -1725,7 +1726,6 @@ void Client::socketConnected() // send client version sendClientVersion(); - QTimer::singleShot(2000, this, SLOT(checkServerVersion())); } void Client::checkServerVersion() diff --git a/client.h b/client.h index 6383c5d..f53ca0b 100644 --- a/client.h +++ b/client.h @@ -201,6 +201,7 @@ public: ExtWin* findExtWinById(uint32_t extWinId); QImage* getDisplayImage(){return &displayImage;} void repaintAllWindows(); + quint16 getPublicServerVersion(){return serverVersion;} public slots: void sendOutputSelChunk(); diff --git a/debian/changelog b/debian/changelog index 5d9eb27..4320b97 100644 --- a/debian/changelog +++ b/debian/changelog @@ -42,5 +42,6 @@ x2gokdriveclient (0.0.0.1-0x2go1) UNRELEASED; urgency=medium - fix building on Windows. - rootless mode for x2gokdrive. - improve WM updates procedure. + - sending KEYRELEASE immediately after KEYPRESS to avoid the "key sticking". -- Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Tue, 04 Jun 2019 11:10:43 +0200 diff --git a/displayarea.cpp b/displayarea.cpp index c90242f..fd96de4 100644 --- a/displayarea.cpp +++ b/displayarea.cpp @@ -63,22 +63,37 @@ LRESULT CALLBACK LowLevelKeyboardProc( if((str->flags&LLKHF_ALTDOWN) && (str->vkCode == VK_TAB || str->vkCode == VK_F4)) { + uint32_t key= DisplayArea::win2pc105(str->scanCode); + uint32_t mods=0; + mods|=Mod1Mask; switch(wParam) { case WM_KEYDOWN: - case WM_SYSKEYDOWN: etype=KEYPRESS; break; + case WM_SYSKEYDOWN: etype=KEYPRESS; +// Client::KDRStdErr()<<"KEYPRESS: System alt+TAB"<<KDR_ENDL; + break; + case WM_KEYUP: - case WM_SYSKEYUP: etype=KEYRELEASE; break; + case WM_SYSKEYUP: etype=KEYRELEASE; +// Client::KDRStdErr()<<"KEYRELEASE: System alt+TAB"<<KDR_ENDL; + break; } - uint32_t key= DisplayArea::win2pc105(str->scanCode); - uint32_t mods=0; - mods|=Mod1Mask; char evmsg[EVLENGTH]={}; memcpy(evmsg,(char*)&etype,4); memcpy(evmsg+4,(char*)&mods,4); memcpy(evmsg+8,(char*)&key,4); display->client->sendEvent(evmsg); + //send key release immediately after key press to avoid key sticking + //server with version > 6 will do it automatically + if(etype==KEYPRESS && display->client->getPublicServerVersion()<7) + { + etype=KEYRELEASE; + memcpy(evmsg,(char*)&etype,4); + memcpy(evmsg+4,(char*)&mods,4); + memcpy(evmsg+8,(char*)&key,4); + display->client->sendEvent(evmsg); + } return -1; } return CallNextHookEx(0, nCode, wParam, lParam); @@ -99,16 +114,16 @@ DisplayArea::DisplayArea(Client* client, QWidget* parentWidget):QFrame(parentWid void DisplayArea::grabKeyboard() { #ifdef Q_OS_LINUX - Client::KDRStdErr()<<"Grab X11 Keyboard"; + Client::KDRStdErr()<<"Grab X11 Keyboard"<<KDR_ENDL; xcb_grab_key(QX11Info::connection(), 0, winId(), XCB_MOD_MASK_ANY, XCB_GRAB_ANY, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC); #endif #ifdef Q_OS_WIN display=this; - Client::KDRStdErr()<<"Setting Windows Keyboard hook"; + Client::KDRStdErr()<<"Setting Windows Keyboard hook"<<KDR_ENDL; if(!SetWindowsHookExA( WH_KEYBOARD_LL,LowLevelKeyboardProc,0, 0 )) { - Client::KDRStdErr()<<"Set kbd hook Failed "<<GetLastError(); + Client::KDRStdErr()<<"Set kbd hook Failed "<<GetLastError()<<KDR_ENDL; } #endif } @@ -373,10 +388,11 @@ void DisplayArea::debugLinuxMods(uint32_t nativeModifiers) void DisplayArea::keyPressEvent(QKeyEvent* event) { - /* - Client::KDRStdErr()<<"Press key:"<<event->key()<<"mod:"<<event->modifiers()<<"nat mod:"<<event->nativeModifiers()<< - "nat scan:"<<event->nativeScanCode()<<"nat vkey:"<<event->nativeVirtualKey()<<"text:"<<event->text(); -// debugLinuxMods(event->nativeModifiers());*/ + +// Client::KDRStdErr()<<"Press key:"<<event->key()<< +// "nat scan:"<<event->nativeScanCode()<<"nat vkey:"<<event->nativeVirtualKey()<<"text:"<<event->text(); +// debugLinuxMods(event->nativeModifiers()); +// Client::KDRStdErr()<<KDR_ENDL; char evmsg[EVLENGTH]={}; uint32_t state, key, etype; @@ -392,15 +408,20 @@ void DisplayArea::keyPressEvent(QKeyEvent* event) memcpy(evmsg+4,(char*)&state,4); memcpy(evmsg+8,(char*)&key,4); client->sendEvent(evmsg); +//send key release immediately after key press to avoid key sticking +//server with version > 6 will do it automatically + if(client->getPublicServerVersion()>6) + { + etype=KEYRELEASE; + memcpy(evmsg,(char*)&etype,4); + memcpy(evmsg+4,(char*)&state,4); + memcpy(evmsg+8,(char*)&key,4); + client->sendEvent(evmsg); + } } void DisplayArea::keyReleaseEvent(QKeyEvent* event) { -/* - Client::KDRStdErr()<<"Release key:"<<event->key()<<"mod:"<<event->modifiers()<<"nat mod:"<<event->nativeModifiers()<< - "nat scan:"<<event->nativeScanCode()<<"nat vkey:"<<event->nativeVirtualKey()<<"text:"<<event->text(); -*/ - char evmsg[EVLENGTH]={}; uint32_t state, key, etype; #ifdef Q_OS_LINUX @@ -410,6 +431,17 @@ void DisplayArea::keyReleaseEvent(QKeyEvent* event) key=win2pc105(event->nativeScanCode()); state=qtwinModifiers2pc105(event->nativeModifiers(), event->modifiers()); #endif + +//only send additional release event if modifier is set +#ifndef Q_OS_WIN + if(!state) + return; +#endif +// Client::KDRStdErr()<<"RELEASE key:"<<event->key()<< +// "nat scan:"<<event->nativeScanCode()<<"nat vkey:"<<event->nativeVirtualKey()<<"text:"<<event->text(); +// debugLinuxMods(event->nativeModifiers()); +// Client::KDRStdErr()<<KDR_ENDL; + etype=KEYRELEASE; memcpy(evmsg,(char*)&etype,4); memcpy(evmsg+4,(char*)&state,4); -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2gokdriveclient.git