This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch master in repository x2gokdriveclient. from 74d6188 - rootless mode for x2gokdrive. - improve WM updates procedure. new a4bd23e sending KEYRELEASE immediately after KEYPRESS to avoid the "key sticking". The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Summary of changes: client.cpp | 2 +- client.h | 1 + debian/changelog | 1 + displayarea.cpp | 66 +++++++++++++++++++++++++++++++++++++++++--------------- 4 files changed, 52 insertions(+), 18 deletions(-) -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2gokdriveclient.git
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