[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