From 0c6fa0a2ba8633e5d8daf5977d5301eb80193589 Mon Sep 17 00:00:00 2001 From: Lain Date: Thu, 3 Aug 2023 18:21:01 -0700 Subject: [PATCH] UI: Fix YouTubeAppDock crash Apparently the YouTube app dock thing didn't take into consideration the fact that the user may have the browser source available, but may not have browser docks available (via the `cef` global). This is because certain system configurations do not support browser widgets, such as Wayland on Linux. (Lain note: There's multiple things I'm unhappy about here. I'm mostly going to blame myself for multiple reasons.) --- UI/window-basic-main.cpp | 6 ++++++ UI/window-basic-settings-stream.cpp | 4 ++-- UI/window-basic-settings.cpp | 29 ++++++++++++++++++----------- UI/window-basic-settings.hpp | 2 ++ UI/window-dock-youtube-app.cpp | 6 ++++++ 5 files changed, 34 insertions(+), 13 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 4a3d0e6b3..42d51b5da 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -8493,6 +8493,9 @@ YouTubeAppDock *OBSBasic::GetYouTubeAppDock() void OBSBasic::NewYouTubeAppDock() { + if (!cef) + return; + if (youtubeAppDock) delete youtubeAppDock; youtubeAppDock = new YouTubeAppDock(); @@ -8500,6 +8503,9 @@ void OBSBasic::NewYouTubeAppDock() void OBSBasic::DeleteYouTubeAppDock() { + if (!cef) + return; + if (youtubeAppDock) delete youtubeAppDock; youtubeAppDock = nullptr; diff --git a/UI/window-basic-settings-stream.cpp b/UI/window-basic-settings-stream.cpp index 918d23dca..e969ea61d 100644 --- a/UI/window-basic-settings-stream.cpp +++ b/UI/window-basic-settings-stream.cpp @@ -771,7 +771,7 @@ void OBSBasicSettings::on_connectAccount_clicked() if (!!auth) { OnAuthConnected(); #ifdef YOUTUBE_ENABLED - if (IsYouTubeService(service)) { + if (cef && IsYouTubeService(service)) { if (!main->GetYouTubeAppDock()) { main->NewYouTubeAppDock(); } @@ -822,7 +822,7 @@ void OBSBasicSettings::on_disconnectAccount_clicked() ui->connectedAccountText->setVisible(false); #ifdef YOUTUBE_ENABLED - if (IsYouTubeService(service)) { + if (cef && IsYouTubeService(service)) { if (!main->GetYouTubeAppDock()) { main->NewYouTubeAppDock(); } diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp index 77378a7c1..8bdda23aa 100644 --- a/UI/window-basic-settings.cpp +++ b/UI/window-basic-settings.cpp @@ -4245,18 +4245,9 @@ void OBSBasicSettings::on_listWidget_itemSelectionChanged() pageIndex = row; } -void OBSBasicSettings::on_buttonBox_clicked(QAbstractButton *button) +void OBSBasicSettings::UpdateYouTubeAppDockSettings() { - QDialogButtonBox::ButtonRole val = ui->buttonBox->buttonRole(button); - - if (val == QDialogButtonBox::ApplyRole || - val == QDialogButtonBox::AcceptRole) { - if (!QueryAllowedToClose()) - return; - - SaveSettings(); - -#ifdef YOUTUBE_ENABLED + if (cef) { std::string service = ui->service->currentText().toStdString(); if (IsYouTubeService(service)) { if (!main->GetYouTubeAppDock()) { @@ -4270,6 +4261,22 @@ void OBSBasicSettings::on_buttonBox_clicked(QAbstractButton *button) } main->DeleteYouTubeAppDock(); } + } +} + +void OBSBasicSettings::on_buttonBox_clicked(QAbstractButton *button) +{ + QDialogButtonBox::ButtonRole val = ui->buttonBox->buttonRole(button); + + if (val == QDialogButtonBox::ApplyRole || + val == QDialogButtonBox::AcceptRole) { + if (!QueryAllowedToClose()) + return; + + SaveSettings(); + +#ifdef YOUTUBE_ENABLED + UpdateYouTubeAppDockSettings(); #endif ClearChanged(); } diff --git a/UI/window-basic-settings.hpp b/UI/window-basic-settings.hpp index 394b36f93..9f3f85a3b 100644 --- a/UI/window-basic-settings.hpp +++ b/UI/window-basic-settings.hpp @@ -350,6 +350,8 @@ private: bool AskIfCanCloseSettings(); + void UpdateYouTubeAppDockSettings(); + QIcon generalIcon; QIcon streamIcon; QIcon outputIcon; diff --git a/UI/window-dock-youtube-app.cpp b/UI/window-dock-youtube-app.cpp index 24e0c56f9..643bda923 100644 --- a/UI/window-dock-youtube-app.cpp +++ b/UI/window-dock-youtube-app.cpp @@ -50,6 +50,9 @@ YouTubeAppDock::~YouTubeAppDock() bool YouTubeAppDock::IsYTServiceSelected() { + if (!cef) + return false; + obs_service_t *service_obj = OBSBasic::Get()->GetService(); OBSDataAutoRelease settings = obs_service_get_settings(service_obj); const char *service = obs_data_get_string(settings, "service"); @@ -430,6 +433,9 @@ YoutubeApiWrappers *YouTubeAppDock::GetYTApi() void YouTubeAppDock::CleanupYouTubeUrls() { + if (!cef) + return; + static constexpr const char *YOUTUBE_VIDEO_URL = "://studio.youtube.com/video/"; // remove legacy YouTube Browser Docks (once)