From fa10f986b4b368089a1356896c1bd1fe6550e01d Mon Sep 17 00:00:00 2001 From: talksik Date: Tue, 13 Jan 2026 13:37:22 -0800 Subject: [PATCH] set app as dock-less background tool --- CMakeLists.txt | 1 + assets/logo.png | Bin 0 -> 9068 bytes src/MainWindow.cpp | 27 ++++++++++++++++++++++++++- src/MainWindow.h | 4 ++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 assets/logo.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 72e0f53..4b206c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,7 @@ qt_add_resources(llink FILES assets/icons/mono/basic/menu-rec.svg assets/icons/mono/basic/plus.svg + assets/logo.png ) # Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1. diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b51e41ce07d3a9ca5dd9ff3aedf53d32feacfd22 GIT binary patch literal 9068 zcmeHMYgkiP)?Oh%P?Uh6fJ6al0V@L{Dj+cdFN3rdwH>(>G$1HdZb4cQh$I$2sZzkH zBOs{~Kxp>gmd*$-A%K>1e&%QmM0BECIZP3$27v{Q6Y3QQP1~!c+UCj6 z^{&+pOwAU`i{g38{>C(dW<7c$|HJtvbOFC2tOcAF)@tivt)Ugxda|%~X<*4E2n9=E zSc(q>gC%CbC~=7s|37jf|9f0PS9f=JzYhJ`=){E6(cq7-Inma)w#oEE+?N4;Py7w$ z!rTmp!*RYBTvK6IcU^@y?HwN<@9OEXi0!L0_wew@V7t@gytuLM`y3vRSDolEKd5PD z@F1tvl(?R(m<5AvgqXx}QJ_k{d{p}0m{KmwV7hy_7>XZ!87bnO^;n(3<#L-_uQ{FN zfulVR3_|;fr4{a8JtEOh$5Ni$G1jp2tR*iiBPcX5{RV*QOo)o_rxIeJBqlO4l4HX< z;F>nIFhA>mDnnB|t<@(cItO_uHt6%>?F3(l;3oW z0ICp5!AW2BΜ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 #include #include +#include +#include +#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { this->setAttribute(Qt::WA_TranslucentBackground, true); this->setAttribute(Qt::WA_AcceptTouchEvents, true); - this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); + this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::Tool); this->resize(QSize(150, 150)); QWidget *centralWidget = new QWidget(this); @@ -114,6 +117,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) this->move(x, y); this->setCentralWidget(centralWidget); + + setupTrayIcon(); } void MainWindow::resizeEvent(QResizeEvent *event) @@ -147,6 +152,26 @@ void MainWindow::mouseReleaseEvent(QMouseEvent *event) unsetCursor(); } +void MainWindow::setupTrayIcon() +{ + m_trayIcon = new QSystemTrayIcon(this); + m_trayIcon->setIcon(QIcon(":/assets/logo.png")); + m_trayIcon->setToolTip("llink"); + + QMenu *trayMenu = new QMenu(this); + trayMenu->addAction("Show", this, &MainWindow::show); + trayMenu->addAction("Quit", qApp, &QApplication::quit); + m_trayIcon->setContextMenu(trayMenu); + + connect(m_trayIcon, &QSystemTrayIcon::activated, this, [this](QSystemTrayIcon::ActivationReason reason) { + if (reason == QSystemTrayIcon::Trigger) { + isVisible() ? hide() : show(); + } + }); + + m_trayIcon->show(); +} + MainWindow::~MainWindow() { } \ No newline at end of file diff --git a/src/MainWindow.h b/src/MainWindow.h index e01fc91..995d74a 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -8,6 +8,7 @@ #include class QSvgWidget; +class QSystemTrayIcon; class MainWindow : public QMainWindow { @@ -28,7 +29,10 @@ protected: void mouseReleaseEvent(QMouseEvent *event) override; private: + void setupTrayIcon(); + QSvgWidget *m_handleBar; + QSystemTrayIcon *m_trayIcon; QPoint dragPosition; bool dragging = false; };