[X2Go-Commits] [x2gokdriveclient] 01/01: sending KEYRELEASE immediately after KEYPRESS to avoid the "key sticking".
git-admin at x2go.org
git-admin at x2go.org
Tue Mar 15 18:27:21 CET 2022
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 at 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 at 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
More information about the x2go-commits
mailing list