Browse Source

UI: Implement Taskbar Overlay for Qt6

Tommy Vercetti 3 năm trước cách đây
mục cha
commit
cabc3c8aec
1 tập tin đã thay đổi với 56 bổ sung3 xóa
  1. 56 3
      UI/platform-windows.cpp

+ 56 - 3
UI/platform-windows.cpp

@@ -498,7 +498,60 @@ void TaskbarOverlaySetStatus(TaskbarOverlayStatus status)
 	taskBtn->setOverlayIcon(icon);
 	taskBtn->setOverlayIcon(icon);
 }
 }
 #else
 #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
 #endif