From cabc3c8aec8d2bfab24a9d312dad2a0fdd069439 Mon Sep 17 00:00:00 2001 From: Tommy Vercetti <7903172+tommyvct@users.noreply.github.com> Date: Sun, 26 Jun 2022 04:59:51 -0500 Subject: [PATCH] UI: Implement Taskbar Overlay for Qt6 --- UI/platform-windows.cpp | 59 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/UI/platform-windows.cpp b/UI/platform-windows.cpp index 2645c29bc..d1fea81a0 100644 --- a/UI/platform-windows.cpp +++ b/UI/platform-windows.cpp @@ -498,7 +498,60 @@ void TaskbarOverlaySetStatus(TaskbarOverlayStatus status) taskBtn->setOverlayIcon(icon); } #else -// Needs to be re-implemented for Qt6, perhaps natively without Qt -void TaskbarOverlayInit() {} -void TaskbarOverlaySetStatus(TaskbarOverlayStatus) {} + +HWND hwnd; +void TaskbarOverlayInit() +{ + hwnd = (HWND)App()->GetMainWindow()->winId(); +} + +void TaskbarOverlaySetStatus(TaskbarOverlayStatus status) +{ + ITaskbarList4 *taskbarIcon; + auto hr = CoCreateInstance(CLSID_TaskbarList, NULL, + CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&taskbarIcon)); + + if (FAILED(hr)) { + taskbarIcon->Release(); + return; + } + + hr = taskbarIcon->HrInit(); + + if (FAILED(hr)) { + taskbarIcon->Release(); + return; + } + + if (status != TaskbarOverlayStatusInactive) { + QIcon qicon; + switch (status) { + case TaskbarOverlayStatusActive: + qicon = QIcon::fromTheme( + "obs-active", QIcon(":/res/images/active.png")); + break; + case TaskbarOverlayStatusPaused: + qicon = QIcon::fromTheme( + "obs-paused", QIcon(":/res/images/paused.png")); + break; + } + + HICON hicon = nullptr; + if (!qicon.isNull()) { + Q_GUI_EXPORT HICON qt_pixmapToWinHICON( + const QPixmap &p); + hicon = qt_pixmapToWinHICON( + qicon.pixmap(GetSystemMetrics(SM_CXSMICON))); + if (!hicon) + return; + } + + taskbarIcon->SetOverlayIcon(hwnd, hicon, nullptr); + DestroyIcon(hicon); + } else { + taskbarIcon->SetOverlayIcon(hwnd, nullptr, nullptr); + } + taskbarIcon->Release(); +} #endif