diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f938c6e64..679f6e860 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -174,7 +174,7 @@ jobs: cp rundir/RelWithDebInfo/bin/obs-ffmpeg-mux ./OBS.app/Contents/MacOS cp rundir/RelWithDebInfo/bin/libobsglad.0.dylib ./OBS.app/Contents/MacOS cp -R rundir/RelWithDebInfo/data ./OBS.app/Contents/Resources - cp ../CI/scripts/macos/app/obs.icns ./OBS.app/Contents/Resources + cp ../CI/scripts/macos/app/AppIcon.icns ./OBS.app/Contents/Resources cp -R rundir/RelWithDebInfo/obs-plugins/ ./OBS.app/Contents/PlugIns cp ../CI/scripts/macos/app/Info.plist ./OBS.app/Contents diff --git a/CI/full-build-macos.sh b/CI/full-build-macos.sh index 090e5963f..f00092dd9 100755 --- a/CI/full-build-macos.sh +++ b/CI/full-build-macos.sh @@ -383,7 +383,7 @@ prepare_macos_bundle() { cp rundir/${BUILD_CONFIG}/bin/obs-ffmpeg-mux ./OBS.app/Contents/MacOS cp rundir/${BUILD_CONFIG}/bin/libobsglad.0.dylib ./OBS.app/Contents/MacOS cp -R rundir/${BUILD_CONFIG}/data ./OBS.app/Contents/Resources - cp ${CI_SCRIPTS}/app/obs.icns ./OBS.app/Contents/Resources + cp ${CI_SCRIPTS}/app/AppIcon.icns ./OBS.app/Contents/Resources cp -R rundir/${BUILD_CONFIG}/obs-plugins/ ./OBS.app/Contents/PlugIns cp ${CI_SCRIPTS}/app/Info.plist ./OBS.app/Contents # Scripting plugins are required to be placed in same directory as binary diff --git a/CI/scripts/macos/app/AppIcon.icns b/CI/scripts/macos/app/AppIcon.icns new file mode 100644 index 000000000..b4cf117ed Binary files /dev/null and b/CI/scripts/macos/app/AppIcon.icns differ diff --git a/CI/scripts/macos/app/Info.plist b/CI/scripts/macos/app/Info.plist index 3d9214a9d..4f19a3d46 100644 --- a/CI/scripts/macos/app/Info.plist +++ b/CI/scripts/macos/app/Info.plist @@ -3,7 +3,7 @@ CFBundleIconFile - obs.icns + AppIcon.icns CFBundleName OBS CFBundleGetInfoString diff --git a/CI/scripts/macos/app/big_sur_icon_template.psd b/CI/scripts/macos/app/big_sur_icon_template.psd new file mode 100644 index 000000000..71af91dd1 Binary files /dev/null and b/CI/scripts/macos/app/big_sur_icon_template.psd differ diff --git a/CI/scripts/macos/package/settings.json.template b/CI/scripts/macos/package/settings.json.template index 4bcc0764c..de39e030f 100644 --- a/CI/scripts/macos/package/settings.json.template +++ b/CI/scripts/macos/package/settings.json.template @@ -1,7 +1,7 @@ { "title": "OBS-Studio $$VERSION$$", "background": "$$CI_PATH$$/package/background.tiff", - "icon": "$$CI_PATH$$/app/obs.icns", + "icon": "$$CI_PATH$$/app/AppIcon.icns", "format": "ULFO", "icon-size": 96, "window": { diff --git a/UI/forms/images/obs_256x256.png b/UI/forms/images/obs_256x256.png new file mode 100644 index 000000000..2b264dde0 Binary files /dev/null and b/UI/forms/images/obs_256x256.png differ diff --git a/UI/forms/images/obs_macos.png b/UI/forms/images/obs_macos.png new file mode 100644 index 000000000..57f2e0a7b Binary files /dev/null and b/UI/forms/images/obs_macos.png differ diff --git a/UI/forms/images/obs_paused_macos.png b/UI/forms/images/obs_paused_macos.png new file mode 100644 index 000000000..f80f40d74 Binary files /dev/null and b/UI/forms/images/obs_paused_macos.png differ diff --git a/UI/forms/images/tray_active_macos.png b/UI/forms/images/tray_active_macos.png new file mode 100644 index 000000000..5864c61a1 Binary files /dev/null and b/UI/forms/images/tray_active_macos.png differ diff --git a/UI/forms/obs.qrc b/UI/forms/obs.qrc index 97118eba7..93b09b703 100644 --- a/UI/forms/obs.qrc +++ b/UI/forms/obs.qrc @@ -10,9 +10,13 @@ images/plus.svg images/down.svg images/up.svg + images/obs_256x256.png images/obs.png + images/obs_macos.png images/obs_paused.png + images/obs_paused_macos.png images/tray_active.png + images/tray_active_macos.png images/expand.svg images/unlocked.svg images/locked.svg diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp index 559f06aa5..bdf1eb0e3 100644 --- a/UI/obs-app.cpp +++ b/UI/obs-app.cpp @@ -1125,7 +1125,12 @@ OBSApp::OBSApp(int &argc, char **argv, profiler_name_store_t *store) { sleepInhibitor = os_inhibit_sleep_create("OBS Video/audio"); +#ifdef __APPLE__ + setWindowIcon( + QIcon::fromTheme("obs", QIcon(":/res/images/obs_256x256.png"))); +#else setWindowIcon(QIcon::fromTheme("obs", QIcon(":/res/images/obs.png"))); +#endif } OBSApp::~OBSApp() diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 98ce9fb9e..7d85edfe3 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -5619,10 +5619,19 @@ inline void OBSBasic::OnActivate() App()->IncrementSleepInhibition(); UpdateProcessPriority(); - if (trayIcon && trayIcon->isVisible()) + if (trayIcon && trayIcon->isVisible()) { +#ifdef __APPLE__ + QIcon trayMask = + QIcon(":/res/images/tray_active_macos.png"); + trayMask.setIsMask(true); + trayIcon->setIcon( + QIcon::fromTheme("obs-tray", trayMask)); +#else trayIcon->setIcon(QIcon::fromTheme( "obs-tray-active", QIcon(":/res/images/tray_active.png"))); +#endif + } } } @@ -5637,19 +5646,42 @@ inline void OBSBasic::OnDeactivate() App()->DecrementSleepInhibition(); ClearProcessPriority(); - if (trayIcon && trayIcon->isVisible()) - trayIcon->setIcon(QIcon::fromTheme( - "obs-tray", QIcon(":/res/images/obs.png"))); + if (trayIcon && trayIcon->isVisible()) { +#ifdef __APPLE__ + QIcon trayIconFile = + QIcon(":/res/images/obs_macos.png"); + trayIconFile.setIsMask(true); +#else + QIcon trayIconFile = QIcon(":/res/images/obs.png"); +#endif + trayIcon->setIcon( + QIcon::fromTheme("obs-tray", trayIconFile)); + } } else if (outputHandler->Active() && trayIcon && trayIcon->isVisible()) { - if (os_atomic_load_bool(&recording_paused)) - trayIcon->setIcon(QIcon::fromTheme( - "obs-tray-paused", - QIcon(":/res/images/obs_paused.png"))); - else - trayIcon->setIcon(QIcon::fromTheme( - "obs-tray-active", - QIcon(":/res/images/tray_active.png"))); + if (os_atomic_load_bool(&recording_paused)) { +#ifdef __APPLE__ + QIcon trayIconFile = + QIcon(":/res/images/obs_paused_macos.png"); + trayIconFile.setIsMask(true); +#else + QIcon trayIconFile = + QIcon(":/res/images/obs_paused.png"); +#endif + trayIcon->setIcon(QIcon::fromTheme("obs-tray-paused", + trayIconFile)); + } else { +#ifdef __APPLE__ + QIcon trayIconFile = + QIcon(":/res/images/tray_active_macos.png"); + trayIconFile.setIsMask(true); +#else + QIcon trayIconFile = + QIcon(":/res/images/tray_active.png"); +#endif + trayIcon->setIcon(QIcon::fromTheme("obs-tray-active", + trayIconFile)); + } } } @@ -7536,9 +7568,14 @@ void OBSBasic::ToggleShowHide() void OBSBasic::SystemTrayInit() { +#ifdef __APPLE__ + QIcon trayIconFile = QIcon(":/res/images/obs_macos.png"); + trayIconFile.setIsMask(true); +#else + QIcon trayIconFile = QIcon(":/res/images/obs.png"); +#endif trayIcon.reset(new QSystemTrayIcon( - QIcon::fromTheme("obs-tray", QIcon(":/res/images/obs.png")), - this)); + QIcon::fromTheme("obs-tray", trayIconFile), this)); trayIcon->setToolTip("OBS Studio"); showHide = new QAction(QTStr("Basic.SystemTray.Show"), trayIcon.data()); @@ -7593,10 +7630,12 @@ void OBSBasic::IconActivated(QSystemTrayIcon::ActivationReason reason) AddProjectorMenuMonitors(studioProgramProjector, this, SLOT(OpenStudioProgramProjector())); +#ifndef __APPLE__ if (reason == QSystemTrayIcon::Trigger) { EnablePreviewDisplay(previewEnabled && !isVisible()); ToggleShowHide(); } +#endif } void OBSBasic::SysTrayNotify(const QString &text, @@ -8114,10 +8153,18 @@ void OBSBasic::PauseRecording() ui->statusbar->RecordingPaused(); - if (trayIcon && trayIcon->isVisible()) - trayIcon->setIcon(QIcon::fromTheme( - "obs-tray-paused", - QIcon(":/res/images/obs_paused.png"))); + if (trayIcon && trayIcon->isVisible()) { +#ifdef __APPLE__ + QIcon trayIconFile = + QIcon(":/res/images/obs_paused_macos.png"); + trayIconFile.setIsMask(true); +#else + QIcon trayIconFile = + QIcon(":/res/images/obs_paused.png"); +#endif + trayIcon->setIcon(QIcon::fromTheme("obs-tray-paused", + trayIconFile)); + } os_atomic_set_bool(&recording_paused, true); @@ -8145,10 +8192,18 @@ void OBSBasic::UnpauseRecording() ui->statusbar->RecordingUnpaused(); - if (trayIcon && trayIcon->isVisible()) - trayIcon->setIcon(QIcon::fromTheme( - "obs-tray-active", - QIcon(":/res/images/tray_active.png"))); + if (trayIcon && trayIcon->isVisible()) { +#ifdef __APPLE__ + QIcon trayIconFile = + QIcon(":/res/images/tray_active_macos.png"); + trayIconFile.setIsMask(true); +#else + QIcon trayIconFile = + QIcon(":/res/images/tray_active.png"); +#endif + trayIcon->setIcon(QIcon::fromTheme("obs-tray-active", + trayIconFile)); + } os_atomic_set_bool(&recording_paused, false); diff --git a/UI/window-basic-stats.cpp b/UI/window-basic-stats.cpp index bbcb4c991..90995ec70 100644 --- a/UI/window-basic-stats.cpp +++ b/UI/window-basic-stats.cpp @@ -170,7 +170,12 @@ OBSBasicStats::OBSBasicStats(QWidget *parent, bool closeable) resize(800, 280); setWindowTitle(QTStr("Basic.Stats")); +#ifdef __APPLE__ + setWindowIcon( + QIcon::fromTheme("obs", QIcon(":/res/images/obs_256x256.png"))); +#else setWindowIcon(QIcon::fromTheme("obs", QIcon(":/res/images/obs.png"))); +#endif setWindowModality(Qt::NonModal); setAttribute(Qt::WA_DeleteOnClose, true); diff --git a/UI/window-projector.cpp b/UI/window-projector.cpp index 9e7b9835e..1f181aac1 100644 --- a/UI/window-projector.cpp +++ b/UI/window-projector.cpp @@ -31,8 +31,12 @@ OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, int monitor, setWindowFlags(Qt::WindowStaysOnTopHint); type = type_; - +#ifdef __APPLE__ + setWindowIcon( + QIcon::fromTheme("obs", QIcon(":/res/images/obs_256x256.png"))); +#else setWindowIcon(QIcon::fromTheme("obs", QIcon(":/res/images/obs.png"))); +#endif if (monitor == -1) resize(480, 270);