From b07ab6d0db5aa85a38fa5c2cc097b6d37f781ac2 Mon Sep 17 00:00:00 2001 From: Nova Date: Sat, 11 Jan 2025 03:24:46 +0330 Subject: [PATCH] fix tray context menu on windows --- cmake/windows/windows.cmake | 2 +- include/sys/windows/cursor.h | 5 +++++ src/sys/windows/cursor.cpp | 16 ++++++++++++++++ src/ui/mainwindow.cpp | 12 ++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 include/sys/windows/cursor.h create mode 100644 src/sys/windows/cursor.cpp diff --git a/cmake/windows/windows.cmake b/cmake/windows/windows.cmake index 5f2c8f7..4141ecf 100644 --- a/cmake/windows/windows.cmake +++ b/cmake/windows/windows.cmake @@ -1,4 +1,4 @@ -set(PLATFORM_SOURCES 3rdparty/WinCommander.cpp src/sys/windows/guihelper.cpp src/sys/windows/MiniDump.cpp) +set(PLATFORM_SOURCES 3rdparty/WinCommander.cpp src/sys/windows/guihelper.cpp src/sys/windows/MiniDump.cpp src/sys/windows/cursor.cpp) set(PLATFORM_LIBRARIES wininet wsock32 ws2_32 user32 rasapi32 iphlpapi) include(cmake/windows/generate_product_version.cmake) diff --git a/include/sys/windows/cursor.h b/include/sys/windows/cursor.h new file mode 100644 index 0000000..a025cee --- /dev/null +++ b/include/sys/windows/cursor.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +QPoint GetCursorPosition(); diff --git a/src/sys/windows/cursor.cpp b/src/sys/windows/cursor.cpp new file mode 100644 index 0000000..9828655 --- /dev/null +++ b/src/sys/windows/cursor.cpp @@ -0,0 +1,16 @@ +#include "include/sys/windows/cursor.h" + +#include +#include + +#include "windows.h" + +QPoint GetCursorPosition() +{ + POINT P; + if (!GetCursorPos(&P)) + { + qDebug((std::to_string(GetLastError())).c_str()); + } + return {int(P.x), int(P.y)}; +} diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 604f7b9..79dce73 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -22,6 +22,7 @@ #ifdef Q_OS_WIN #include "3rdparty/WinCommander.hpp" +#include "include/sys/windows/cursor.h" #else #ifdef Q_OS_LINUX #include "include/sys/linux/LinuxCap.h" @@ -289,7 +290,18 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi connect(tray, &QSystemTrayIcon::activated, qApp, [=](QSystemTrayIcon::ActivationReason reason) { if (reason == QSystemTrayIcon::Context) { +#ifdef Q_OS_WIN + auto pos = GetCursorPosition(); + MW_show_log(Int2String(pos.x())); + MW_show_log(Int2String(pos.y())); + auto screen = QGuiApplication::screenAt(QCursor::pos()); + QPoint finalPos = {int(pos.x() / screen->devicePixelRatio()), int(pos.y() / screen->devicePixelRatio())}; + MW_show_log(Int2String(finalPos.x())); + MW_show_log(Int2String(finalPos.y())); + trayMenu->popup(finalPos); +#else trayMenu->popup(QCursor::pos()); +#endif } if (reason == QSystemTrayIcon::Trigger) { if (this->isVisible()) {