UI: Move taskbar overlay functions into platform.hpp

Refactors the existing implementation for Windows into
platform-windows.cpp, allowing for other OS implementations in the
future.
master
gxalpha 2022-04-23 18:05:21 +02:00 committed by Matt Gajownik
parent 5ac6c03a8a
commit 41521b2816
6 changed files with 61 additions and 35 deletions

View File

@ -215,6 +215,10 @@ bool ProcessIsRosettaTranslated()
#endif
}
// Not implemented yet
void TaskbarOverlayInit() {}
void TaskbarOverlaySetStatus(TaskbarOverlayStatus) {}
/*
* This custom NSApplication subclass makes the app compatible with CEF. Qt
* also has an NSApplication subclass, but it doesn't conflict thanks to Qt

View File

@ -37,6 +37,11 @@
#include <util/windows/HRError.hpp>
#include <util/windows/ComPtr.hpp>
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
#include <QWinTaskbarButton>
#include <QMainWindow>
#endif
using namespace std;
static inline bool check_path(const char *data, const char *path,
@ -464,3 +469,36 @@ bool IsRunningOnWine()
return false;
}
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QWinTaskbarButton *taskBtn;
void TaskbarOverlayInit()
{
QMainWindow *main = App()->GetMainWindow();
taskBtn = new QWinTaskbarButton(main);
taskBtn->setWindow(main->windowHandle());
}
void TaskbarOverlaySetStatus(TaskbarOverlayStatus status)
{
if (status == TaskbarOverlayStatusInactive) {
taskBtn->clearOverlayIcon();
return;
}
QIcon icon;
if (status == TaskbarOverlayStatusActive) {
icon = QIcon::fromTheme("obs-active",
QIcon(":/res/images/active.png"));
} else {
icon = QIcon::fromTheme("obs-paused",
QIcon(":/res/images/paused.png"));
}
taskBtn->setOverlayIcon(icon);
}
#else
// Needs to be re-implemented for Qt6, perhaps natively without Qt
void TaskbarOverlayInit() {}
void TaskbarOverlaySetStatus(TaskbarOverlayStatus) {}
#endif

View File

@ -251,3 +251,7 @@ bool SetDisplayAffinitySupported(void)
// Not implemented yet
return false;
}
// Not implemented yet
void TaskbarOverlayInit() {}
void TaskbarOverlaySetStatus(TaskbarOverlayStatus) {}

View File

@ -36,6 +36,14 @@ void SetAlwaysOnTop(QWidget *window, bool enable);
bool SetDisplayAffinitySupported(void);
enum TaskbarOverlayStatus {
TaskbarOverlayStatusInactive,
TaskbarOverlayStatusActive,
TaskbarOverlayStatusPaused,
};
void TaskbarOverlayInit();
void TaskbarOverlaySetStatus(TaskbarOverlayStatus status);
#ifdef _WIN32
class RunOnceMutex;
RunOnceMutex

View File

@ -2011,9 +2011,7 @@ void OBSBasic::OBSInit()
SystemTray(true);
#if defined(_WIN32) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
taskBtn->setWindow(windowHandle());
#endif
TaskbarOverlayInit();
#ifdef __APPLE__
disableColorSpaceConversion(this);
@ -6713,10 +6711,7 @@ inline void OBSBasic::OnActivate(bool force)
App()->IncrementSleepInhibition();
UpdateProcessPriority();
#if defined(_WIN32) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
taskBtn->setOverlayIcon(QIcon::fromTheme(
"obs-active", QIcon(":/res/images/active.png")));
#endif
TaskbarOverlaySetStatus(TaskbarOverlayStatusActive);
if (trayIcon && trayIcon->isVisible()) {
#ifdef __APPLE__
QIcon trayMask =
@ -6744,9 +6739,7 @@ inline void OBSBasic::OnDeactivate()
App()->DecrementSleepInhibition();
ClearProcessPriority();
#if defined(_WIN32) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
taskBtn->clearOverlayIcon();
#endif
TaskbarOverlaySetStatus(TaskbarOverlayStatusInactive);
if (trayIcon && trayIcon->isVisible()) {
#ifdef __APPLE__
QIcon trayIconFile =
@ -6771,11 +6764,7 @@ inline void OBSBasic::OnDeactivate()
#endif
trayIcon->setIcon(QIcon::fromTheme("obs-tray-paused",
trayIconFile));
#if defined(_WIN32) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
taskBtn->setOverlayIcon(QIcon::fromTheme(
"obs-paused",
QIcon(":/res/images/paused.png")));
#endif
TaskbarOverlaySetStatus(TaskbarOverlayStatusPaused);
} else {
#ifdef __APPLE__
QIcon trayIconFile =
@ -6787,11 +6776,7 @@ inline void OBSBasic::OnDeactivate()
#endif
trayIcon->setIcon(QIcon::fromTheme("obs-tray-active",
trayIconFile));
#if defined(_WIN32) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
taskBtn->setOverlayIcon(QIcon::fromTheme(
"obs-active",
QIcon(":/res/images/active.png")));
#endif
TaskbarOverlaySetStatus(TaskbarOverlayStatusActive);
}
}
}
@ -9773,10 +9758,7 @@ void OBSBasic::PauseRecording()
ui->statusbar->RecordingPaused();
#if defined(_WIN32) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
taskBtn->setOverlayIcon(QIcon::fromTheme(
"obs-paused", QIcon(":/res/images/paused.png")));
#endif
TaskbarOverlaySetStatus(TaskbarOverlayStatusPaused);
if (trayIcon && trayIcon->isVisible()) {
#ifdef __APPLE__
QIcon trayIconFile =
@ -9820,10 +9802,7 @@ void OBSBasic::UnpauseRecording()
ui->statusbar->RecordingUnpaused();
#if defined(_WIN32) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
taskBtn->setOverlayIcon(QIcon::fromTheme(
"obs-active", QIcon(":/res/images/active.png")));
#endif
TaskbarOverlaySetStatus(TaskbarOverlayStatusActive);
if (trayIcon && trayIcon->isVisible()) {
#ifdef __APPLE__
QIcon trayIconFile =

View File

@ -22,9 +22,6 @@
#include <QThread>
#include <QWidgetAction>
#include <QSystemTrayIcon>
#if defined(_WIN32) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
#include <QWinTaskbarButton>
#endif
#include <QStyledItemDelegate>
#include <obs.hpp>
#include <vector>
@ -325,10 +322,6 @@ private:
QPointer<QAction> renameScene;
QPointer<QAction> renameSource;
#if defined(_WIN32) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QWinTaskbarButton *taskBtn = new QWinTaskbarButton(this);
#endif
QPointer<QWidget> programWidget;
QPointer<QVBoxLayout> programLayout;
QPointer<QLabel> programLabel;