From 460f94c00402bc1fab0b13d51ee4b82d108259d2 Mon Sep 17 00:00:00 2001 From: kateleet Date: Sat, 4 Dec 2021 09:02:19 +0800 Subject: [PATCH] Improve the system tray, fix the wine apps cannot click the tray icon. --- qml/main.qml | 9 ++++---- src/systemtray/statusnotifieritemsource.cpp | 23 ++++++++++++++++++--- src/systemtray/statusnotifieritemsource.h | 6 +++++- src/systemtray/systemtraymodel.cpp | 16 +++++++++----- src/systemtray/systemtraymodel.h | 2 +- 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/qml/main.qml b/qml/main.qml index 2af3c0e..44d6c52 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -89,9 +89,8 @@ Item { id: acticityItem animationEnabled: true Layout.fillHeight: true - Layout.preferredWidth: acticityLayout.implicitWidth ? Math.min(acticityLayout.implicitWidth + FishUI.Units.largeSpacing, - rootItem.width / 2) - : 0 + Layout.preferredWidth: Math.min(rootItem.width / 3, + acticityLayout.implicitWidth + FishUI.Units.largeSpacing) onClicked: { if (mouse.button === Qt.RightButton) acticityMenu.open() @@ -260,7 +259,7 @@ Item { width: trayView.itemWidth height: ListView.view.height - animationEnabled: true + animationEnabled: false onDarkModeChanged: updateTimer.restart() @@ -327,7 +326,7 @@ Item { if (mouse.button === Qt.LeftButton) { trayModel.leftButtonClick(model.id, pos.x, pos.y) } else if (mouse.button === Qt.RightButton) { - trayModel.rightButtonClick(model.id, pos.x, pos.y) + trayModel.rightButtonClick(model.id, _trayItem, pos.x, pos.y) } else if (mouse.button === Qt.MiddleButton) { trayModel.middleButtonClick(model.id, pos.x, pos.y) } diff --git a/src/systemtray/statusnotifieritemsource.cpp b/src/systemtray/statusnotifieritemsource.cpp index 3a870ab..ddcf10d 100644 --- a/src/systemtray/statusnotifieritemsource.cpp +++ b/src/systemtray/statusnotifieritemsource.cpp @@ -153,13 +153,30 @@ void StatusNotifierItemSource::scroll(int delta, const QString &direction) } } -void StatusNotifierItemSource::contextMenu(int x, int y) +void StatusNotifierItemSource::contextMenu(int x, int y, QQuickItem *item) { if (m_menuImporter) { // Popup menu - if (m_menuImporter->menu()) { + QMenu *menu = m_menuImporter->menu(); + + if (menu) { m_menuImporter->updateMenu(); - m_menuImporter->menu()->popup(QPoint(x, y)); + + menu->winId(); + + if (item) { + QRect screenItemRect(item->mapToScene(QPointF(0, 0)).toPoint(), QSize(item->width(), item->height())); + + if (item->window()) { + screenItemRect.moveTopLeft(item->window()->mapToGlobal(screenItemRect.topLeft())); + menu->windowHandle()->setTransientParent(item->window()); + } + + menu->popup(QPoint(screenItemRect.left(), + screenItemRect.bottom() + 5)); + } else { + menu->popup(QPoint(x, y + 5)); + } } } else { qWarning() << "Could not find DBusMenu interface, falling back to calling ContextMenu()"; diff --git a/src/systemtray/statusnotifieritemsource.h b/src/systemtray/statusnotifieritemsource.h index 6bde5be..ef2e400 100644 --- a/src/systemtray/statusnotifieritemsource.h +++ b/src/systemtray/statusnotifieritemsource.h @@ -27,6 +27,10 @@ #include #include +#include +#include +#include + #include "statusnotifieritem_interface.h" class DBusMenuImporter; @@ -48,7 +52,7 @@ public: void activate(int x, int y); void secondaryActivate(int x, int y); void scroll(int delta, const QString &direction); - void contextMenu(int x, int y); + void contextMenu(int x, int y, QQuickItem *item); signals: void contextMenuReady(QMenu *menu); diff --git a/src/systemtray/systemtraymodel.cpp b/src/systemtray/systemtraymodel.cpp index c7ae501..3a0985c 100644 --- a/src/systemtray/systemtraymodel.cpp +++ b/src/systemtray/systemtraymodel.cpp @@ -113,23 +113,29 @@ void SystemTrayModel::leftButtonClick(const QString &id, int x, int y) StatusNotifierItemSource *item = findItemById(id); if (item) { - item->activate(x, y); + item->activate(x * qApp->devicePixelRatio(), + y * qApp->devicePixelRatio()); } } -void SystemTrayModel::rightButtonClick(const QString &id, int x, int y) +void SystemTrayModel::rightButtonClick(const QString &id, QQuickItem *iconItem, int x, int y) { StatusNotifierItemSource *item = findItemById(id); + if (item) { - item->contextMenu(x, y); + item->contextMenu(x * qApp->devicePixelRatio(), + y * qApp->devicePixelRatio(), + iconItem); } } void SystemTrayModel::middleButtonClick(const QString &id, int x, int y) { StatusNotifierItemSource *item = findItemById(id); + if (item) { - item->secondaryActivate(x, y); + item->secondaryActivate(x * qApp->devicePixelRatio(), + y * qApp->devicePixelRatio()); } } @@ -167,7 +173,7 @@ QPointF SystemTrayModel::popupPosition(QQuickItem *visualParent, int x, int y) void SystemTrayModel::onItemAdded(const QString &service) { - StatusNotifierItemSource *source = new StatusNotifierItemSource(service, this); + StatusNotifierItemSource *source = m_sniHost->itemForService(service); connect(source, &StatusNotifierItemSource::updated, this, &SystemTrayModel::updated); diff --git a/src/systemtray/systemtraymodel.h b/src/systemtray/systemtraymodel.h index 52e99cb..9d81572 100644 --- a/src/systemtray/systemtraymodel.h +++ b/src/systemtray/systemtraymodel.h @@ -55,7 +55,7 @@ public: StatusNotifierItemSource *findItemById(const QString &id); Q_INVOKABLE void leftButtonClick(const QString &id, int x, int y); - Q_INVOKABLE void rightButtonClick(const QString &id, int x, int y); + Q_INVOKABLE void rightButtonClick(const QString &id, QQuickItem *iconItem, int x, int y); Q_INVOKABLE void middleButtonClick(const QString &id, int x, int y); Q_INVOKABLE void move(int from, int to);