From d2e4eef313cdb370afb1a22b8b96561f841926d8 Mon Sep 17 00:00:00 2001 From: Kang Lin Date: Fri, 7 Feb 2025 10:45:07 +0800 Subject: [PATCH] VNC: modify mouse to add back button --- .github/workflows/appimage.yml | 2 +- ChangeLog.md | 1 + ChangeLog_zh_CN.md | 1 + .../Client/ConnectLibVNCServer.cpp | 25 ++++++-- Plugins/TigerVnc/Client/ConnectVnc.cpp | 58 +++++++++++-------- etc/RabbitRemoteControl_logqt.ini | 5 ++ etc/RabbitRemoteControl_logqt_debug.ini | 5 ++ .../org.Rabbit.RemoteControl.desktop.in | 2 +- snap/snapcraft.yaml | 2 +- 9 files changed, 68 insertions(+), 33 deletions(-) diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index c967507f5..0dd3e712a 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -116,7 +116,7 @@ jobs: working-directory: ${{env.SOURCE_DIR}} run: | if [ ! -d ${{env.INSTALL_DIR}}/lib/cmake/FreeRDP3 ]; then - git clone -b 3.10.3 https://github.com/FreeRDP/FreeRDP.git + git clone -b 3.11.0 https://github.com/FreeRDP/FreeRDP.git # git clone https://github.com/KangLin/FreeRDP.git cd FreeRDP git submodule update --init --recursive diff --git a/ChangeLog.md b/ChangeLog.md index b26ec305f..dfa6636b2 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,6 +1,7 @@ ## Change Log ### v0.0.33 - Remove donate bitcoin +- VNC: modify mouse. add back button ### v0.0.32 - Fix player menu bug diff --git a/ChangeLog_zh_CN.md b/ChangeLog_zh_CN.md index 27efbe440..4d30caf22 100644 --- a/ChangeLog_zh_CN.md +++ b/ChangeLog_zh_CN.md @@ -1,6 +1,7 @@ ## 修改日志 ### v0.0.33 - 移除捐赠比特币 +- VNC: 修改鼠标,增加后退按钮 ### v0.0.32 - 修复播放器菜单错误 diff --git a/Plugins/LibVNCServer/Client/ConnectLibVNCServer.cpp b/Plugins/LibVNCServer/Client/ConnectLibVNCServer.cpp index d635f2e1b..2985c6661 100644 --- a/Plugins/LibVNCServer/Client/ConnectLibVNCServer.cpp +++ b/Plugins/LibVNCServer/Client/ConnectLibVNCServer.cpp @@ -10,6 +10,8 @@ static Q_LOGGING_CATEGORY(log, "LibVNCServer.Connect") static Q_LOGGING_CATEGORY(logger, "LibVNCServer.Connect.log") +static Q_LOGGING_CATEGORY(logKey, "LibVNCServer.Connect.Key") +static Q_LOGGING_CATEGORY(logMouse, "LibVNCServer.Connect.Mouse") const char* gThis = "This pointer"; #define LOG_BUFFER_LENGTH 1024 @@ -572,7 +574,7 @@ void CConnectLibVNCServer::mousePressEvent(QMouseEvent *event) { if(!m_pClient) return; if(m_pParameter && m_pParameter->GetOnlyView()) return; - //qDebug(log) << "CConnectLibVnc::slotMousePressEvent" << e->button() << e->buttons(); + unsigned char mask = 0; if(event->button() & Qt::MouseButton::LeftButton) mask |= 0x1; @@ -580,8 +582,12 @@ void CConnectLibVNCServer::mousePressEvent(QMouseEvent *event) mask |= 0x2; if(event->button() & Qt::MouseButton::RightButton) mask |= 0x4; - + if(event->button() & Qt::MouseButton::BackButton) + mask |= 0x80; QPoint pos = event->pos(); + + qDebug(logMouse) << Q_FUNC_INFO << event->buttons() << event->button() << pos << mask; + SendPointerEvent(m_pClient, pos.x(), pos.y(), mask); } @@ -591,12 +597,12 @@ void CConnectLibVNCServer::mouseReleaseEvent(QMouseEvent *event) if(m_pParameter && m_pParameter->GetOnlyView()) return; int mask = 0; QPoint pos = event->pos(); + qDebug(logMouse) << Q_FUNC_INFO << event->buttons() << event->button() << pos << mask; SendPointerEvent(m_pClient, pos.x(), pos.y(), mask); } void CConnectLibVNCServer::mouseMoveEvent(QMouseEvent *event) { - //qDebug(log) << "CConnectLibVnc::slotMouseMoveEvent" << buttons << pos; if(!m_pClient) return; if(m_pParameter && m_pParameter->GetOnlyView()) return; int mask = 0; @@ -606,13 +612,16 @@ void CConnectLibVNCServer::mouseMoveEvent(QMouseEvent *event) mask |= 0x2; if(event->buttons() & Qt::MouseButton::RightButton) mask |= 0x4; + if(event->buttons() & Qt::MouseButton::BackButton) + mask |= 0x80; QPoint pos = event->pos(); + qDebug(logMouse) << Q_FUNC_INFO << event->buttons() << event->button() << pos << mask; SendPointerEvent(m_pClient, pos.x(), pos.y(), mask); } +// https://github.com/rfbproto/rfbproto/blob/master/rfbproto.rst#pointerevent void CConnectLibVNCServer::wheelEvent(QWheelEvent *event) { - //qDebug(log) << "CConnectLibVnc::slotWheelEvent" << buttons << pos << angleDelta; if(!m_pClient) return; if(m_pParameter && m_pParameter->GetOnlyView()) return; int mask = 0; @@ -622,7 +631,9 @@ void CConnectLibVNCServer::wheelEvent(QWheelEvent *event) mask |= 0x2; if(event->buttons() & Qt::MouseButton::RightButton) mask |= 0x4; - + if(event->buttons() & Qt::MouseButton::BackButton) + mask |= 0x80; + QPoint d = event->angleDelta(); if(d.y() > 0) mask |= 0x8; @@ -640,6 +651,8 @@ void CConnectLibVNCServer::wheelEvent(QWheelEvent *event) pos = event->pos(); #endif + qDebug(logMouse) << Q_FUNC_INFO << event->buttons() << event->angleDelta() << pos; + SendPointerEvent(m_pClient, pos.x(), pos.y(), mask); } @@ -914,6 +927,7 @@ void CConnectLibVNCServer::keyPressEvent(QKeyEvent *event) if (event->modifiers() & Qt::ShiftModifier) modifier = true; uint32_t k = TranslateRfbKey(event->key(), modifier); + qDebug(logKey) << Q_FUNC_INFO << event << k << modifier; SendKeyEvent(m_pClient, k, TRUE); } @@ -925,6 +939,7 @@ void CConnectLibVNCServer::keyReleaseEvent(QKeyEvent *event) if (event->modifiers() & Qt::ShiftModifier) modifier = true; uint32_t k = TranslateRfbKey(event->key(), modifier); + qDebug(logKey) << Q_FUNC_INFO << event << k << modifier; SendKeyEvent(m_pClient, k, FALSE); } diff --git a/Plugins/TigerVnc/Client/ConnectVnc.cpp b/Plugins/TigerVnc/Client/ConnectVnc.cpp index f4fc05763..67a0491ed 100644 --- a/Plugins/TigerVnc/Client/ConnectVnc.cpp +++ b/Plugins/TigerVnc/Client/ConnectVnc.cpp @@ -55,7 +55,9 @@ static Q_LOGGING_CATEGORY(log, "VNC.Connect") static Q_LOGGING_CATEGORY(logVNC, "VNC.Log") - +static Q_LOGGING_CATEGORY(logKey, "VNC.Connect.Key") +static Q_LOGGING_CATEGORY(logMouse, "VNC.Connect.Mouse") + class VncLogger: public rfb::Logger { public: @@ -799,20 +801,21 @@ void CConnectVnc::mousePressEvent(QMouseEvent *event) if(!writer()) return; if(m_pPara && m_pPara->GetOnlyView()) return; - unsigned char mask = 0; + uint8_t mask = 0; if(event->button() & Qt::MouseButton::LeftButton) mask |= 0x1; if(event->button() & Qt::MouseButton::MiddleButton) mask |= 0x2; if(event->button() & Qt::MouseButton::RightButton) mask |= 0x4; - + if(event->button() & Qt::MouseButton::BackButton) + mask |= 0x80; + QPoint pos = event->pos(); rfb::Point p(pos.x(), pos.y()); - /* - qDebug(log) << "CConnectVnc::slotMousePressEvent buttons:" - << event->buttons() << event->button() << pos << mask;//*/ + qDebug(logMouse) << Q_FUNC_INFO << event->buttons() << event->button() << pos << mask; + try{ writer()->writePointerEvent(p, mask); } catch (rdr::Exception& e) { @@ -824,12 +827,10 @@ void CConnectVnc::mouseReleaseEvent(QMouseEvent *event) { if(!writer()) return; if(m_pPara && m_pPara->GetOnlyView()) return; - int mask = 0; + uint8_t mask = 0; QPoint pos = event->pos(); rfb::Point p(pos.x(), pos.y()); - /* - qDebug(log) << "CConnectVnc::slotMouseReleaseEvent buttons:" - << event->buttons() << event->button() << pos << mask;//*/ + qDebug(logMouse) << Q_FUNC_INFO << event->buttons() << event->button() << pos << mask; try{ writer()->writePointerEvent(p, mask); } catch (rdr::Exception& e) { @@ -841,18 +842,21 @@ void CConnectVnc::mouseMoveEvent(QMouseEvent *event) { if(!writer()) return; if(m_pPara && m_pPara->GetOnlyView()) return; - int mask = 0; + QPoint pos = event->pos(); rfb::Point p(pos.x(), pos.y()); + uint8_t mask = 0; if(event->buttons() & Qt::MouseButton::LeftButton) mask |= 0x1; if(event->buttons() & Qt::MouseButton::MiddleButton) mask |= 0x2; if(event->buttons() & Qt::MouseButton::RightButton) mask |= 0x4; - /* - qDebug(log) << "CConnectVnc::slotMouseMoveEvent buttons:" - << event->buttons() << event->button() << pos << mask;//*/ + if(event->buttons() & Qt::MouseButton::BackButton) + mask |= 0x80; + + qDebug(logMouse) << Q_FUNC_INFO << event->buttons() << event->button() << pos << mask; + try{ writer()->writePointerEvent(p, mask); } catch (rdr::Exception& e) { @@ -863,19 +867,17 @@ void CConnectVnc::mouseMoveEvent(QMouseEvent *event) // https://github.com/rfbproto/rfbproto/blob/master/rfbproto.rst#pointerevent void CConnectVnc::wheelEvent(QWheelEvent *event) { - /* - qDebug(log) << "CConnectVnc::slotWheelEvent buttons:" - << event->buttons() << event->angleDelta() << pos;//*/ if(!writer()) return; if(m_pPara && m_pPara->GetOnlyView()) return; - int mask = 0; - + uint8_t mask = 0; if(event->buttons() & Qt::MouseButton::LeftButton) mask |= 0x1; if(event->buttons() & Qt::MouseButton::MiddleButton) mask |= 0x2; if(event->buttons() & Qt::MouseButton::RightButton) mask |= 0x4; + if(event->buttons() & Qt::MouseButton::BackButton) + mask |= 0x80; QPoint d = event->angleDelta(); if(d.y() > 0) @@ -895,6 +897,12 @@ void CConnectVnc::wheelEvent(QWheelEvent *event) #endif rfb::Point p(pos.x(), pos.y()); + //* + qDebug(logMouse) << Q_FUNC_INFO << event->buttons() +#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0) + << event->button() +#endif + << pos << mask; //*/ try{ writer()->writePointerEvent(p, mask); @@ -910,15 +918,15 @@ void CConnectVnc::keyPressEvent(QKeyEvent *event) bool modifier = false; if (event->modifiers() & Qt::ShiftModifier) modifier = true; - //qDebug(log) << "slotKeyPressEvent key:" << key << modifiers; + uint32_t k = TranslateRfbKey(event->key(), modifier); - + qDebug(logKey) << Q_FUNC_INFO << event << k << modifier; + try{ writer()->writeKeyEvent(k, 0, true); } catch (rdr::Exception& e) { emit sigError(-1, e.str()); } - } void CConnectVnc::keyReleaseEvent(QKeyEvent *event) @@ -928,15 +936,15 @@ void CConnectVnc::keyReleaseEvent(QKeyEvent *event) bool modifier = false; if (event->modifiers() & Qt::ShiftModifier) modifier = true; - //qDebug(log) << "slotKeyReleaseEvent key:" << key << modifiers; + uint32_t k = TranslateRfbKey(event->key(), modifier); - + qDebug(logKey) << Q_FUNC_INFO << event << k << modifier; + try{ writer()->writeKeyEvent(k, 0, false); } catch (rdr::Exception& e) { emit sigError(-1, e.str()); } - } QString CConnectVnc::ConnectInformation() diff --git a/etc/RabbitRemoteControl_logqt.ini b/etc/RabbitRemoteControl_logqt.ini index dbcc3a138..639a926b7 100644 --- a/etc/RabbitRemoteControl_logqt.ini +++ b/etc/RabbitRemoteControl_logqt.ini @@ -50,6 +50,11 @@ Client.Connect.Desktop.Mouse=false Client.FrmViewer.Key=false Client.FrmViewer.Mouse=false +VNC.Connect.Key=false +VNC.Connect.Mouse=false +LibVNCServer.Connect.Key=false +LibVNCServer.Connect.Mouse=false + ;FreeRDP*=true ;FreeRDP.Log.*=false ;FreeRDP.Log.debug=true diff --git a/etc/RabbitRemoteControl_logqt_debug.ini b/etc/RabbitRemoteControl_logqt_debug.ini index b7eb30612..5b032e702 100644 --- a/etc/RabbitRemoteControl_logqt_debug.ini +++ b/etc/RabbitRemoteControl_logqt_debug.ini @@ -50,6 +50,11 @@ Client.Connect.Desktop.Mouse=false Client.FrmViewer.Key=false Client.FrmViewer.Mouse=false +VNC.Connect.Key=false +VNC.Connect.Mouse=false +LibVNCServer.Connect.Key=false +LibVNCServer.Connect.Mouse=false + ;FreeRDP*=true ;FreeRDP.Log=true ;FreeRDP.Log.debug=true diff --git a/share/applications/org.Rabbit.RemoteControl.desktop.in b/share/applications/org.Rabbit.RemoteControl.desktop.in index 2a251342e..613978967 100644 --- a/share/applications/org.Rabbit.RemoteControl.desktop.in +++ b/share/applications/org.Rabbit.RemoteControl.desktop.in @@ -10,7 +10,7 @@ Terminal=false StartupNotify=true # https://specifications.freedesktop.org/menu-spec/latest/apa.html -Categories=Network;Utility;P2P;Qt;RemoteAccess +Categories=Network;Utility;P2P;Qt;RemoteAccess;AudioVideo;Video;Audio;Player;Recorder # https://www.freedesktop.org/wiki/Specifications/mime-apps-spec/ # https://www.freedesktop.org/wiki/Specifications/shared-mime-info-spec/ diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index ec91664ba..5fcf32810 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -63,7 +63,7 @@ parts: plugin: cmake source: https://github.com/FreeRDP/FreeRDP.git source-type: git - source-tag: 3.10.3 + source-tag: 3.11.0 source-depth: 1 build-packages: - libssl-dev