From dd5e3ef3fe70e59f3c8dca4ab82deed741703672 Mon Sep 17 00:00:00 2001 From: Shaolin Date: Tue, 27 Feb 2018 20:26:22 -0300 Subject: [PATCH 01/15] UI: Only load projectors if SaveProjectors is true --- UI/window-basic-main.cpp | 84 ++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index f1e23a348..cd4616d4e 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -834,47 +834,6 @@ void OBSBasic::Load(const char *file) ui->transitionDuration->setValue(newDuration); SetTransition(curTransition); - /* ------------------- */ - - obs_data_array_t *savedProjectors = obs_data_get_array(data, - "saved_projectors"); - - if (savedProjectors) - LoadSavedProjectors(savedProjectors); - - obs_data_array_release(savedProjectors); - - /* ------------------- */ - - obs_data_array_t *savedPreviewProjectors = obs_data_get_array(data, - "saved_preview_projectors"); - - if (savedPreviewProjectors) - LoadSavedPreviewProjectors(savedPreviewProjectors); - - obs_data_array_release(savedPreviewProjectors); - - /* ------------------- */ - - obs_data_array_t *savedStudioProgramProjectors = obs_data_get_array(data, - "saved_studio_preview_projectors"); - - if (savedStudioProgramProjectors) - LoadSavedStudioProgramProjectors(savedStudioProgramProjectors); - - obs_data_array_release(savedStudioProgramProjectors); - - /* ------------------- */ - - obs_data_array_t *savedMultiviewProjectors = obs_data_get_array(data, - "saved_multiview_projectors"); - - if (savedMultiviewProjectors) - LoadSavedMultiviewProjectors(savedMultiviewProjectors); - - obs_data_array_release(savedMultiviewProjectors); - - retryScene: curScene = obs_get_source_by_name(sceneName); curProgramScene = obs_get_source_by_name(programSceneName); @@ -905,6 +864,49 @@ retryScene: obs_data_array_release(sources); obs_data_array_release(sceneOrder); + /* ------------------- */ + + bool projectorSave = config_get_bool(GetGlobalConfig(), "BasicWindow", + "SaveProjectors"); + + if (projectorSave) { + obs_data_array_t *savedProjectors = obs_data_get_array(data, + "saved_projectors"); + + if (savedProjectors) + LoadSavedProjectors(savedProjectors); + + obs_data_array_release(savedProjectors); + + obs_data_array_t *savedPreviewProjectors = obs_data_get_array( + data, "saved_preview_projectors"); + + if (savedPreviewProjectors) + LoadSavedPreviewProjectors(savedPreviewProjectors); + + obs_data_array_release(savedPreviewProjectors); + + obs_data_array_t *savedStudioProgramProjectors; + savedStudioProgramProjectors = obs_data_get_array(data, + "saved_studio_preview_projectors"); + + if (savedStudioProgramProjectors) + LoadSavedStudioProgramProjectors( + savedStudioProgramProjectors); + + obs_data_array_release(savedStudioProgramProjectors); + + obs_data_array_t *savedMultiviewProjectors = obs_data_get_array( + data, "saved_multiview_projectors"); + + if (savedMultiviewProjectors) + LoadSavedMultiviewProjectors(savedMultiviewProjectors); + + obs_data_array_release(savedMultiviewProjectors); + } + + /* ------------------- */ + std::string file_base = strrchr(file, '/') + 1; file_base.erase(file_base.size() - 5, 5); From d13b4d35a0e4c6274e6a08705490b4067e97c8c0 Mon Sep 17 00:00:00 2001 From: Shaolin Date: Tue, 27 Feb 2018 22:08:44 -0300 Subject: [PATCH 02/15] UI: Simplify the OpenProjector logic --- UI/window-basic-main.cpp | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index cd4616d4e..7ac5df1e4 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -5585,31 +5585,10 @@ void OBSBasic::OpenProjector(obs_source_t *source, int monitor, bool window, if (monitor > 9 || monitor > QGuiApplication::screens().size() - 1) return; - if (!window) { - delete projectors[monitor]; - projectors[monitor].clear(); - RemoveSavedProjectors(monitor); - } - OBSProjector *projector = new OBSProjector(nullptr, source, !!window); const char *name = obs_source_get_name(source); - if (!window) { - if (type == ProjectorType::StudioProgram) { - studioProgramProjectorArray.at((size_t)monitor) = 1; - } else if (type == ProjectorType::Preview) { - previewProjectorArray.at((size_t)monitor) = 1; - } else if (type == ProjectorType::Multiview) { - multiviewProjectorArray.at((size_t)monitor) = 1; - } else { - projectorArray.at((size_t)monitor) = name; - } - } - - if (!window) { - projector->Init(monitor, false, nullptr, type); - projectors[monitor] = projector; - } else { + if (window) { projector->Init(monitor, true, title, type); for (auto &projPtr : windowProjectors) { @@ -5621,6 +5600,23 @@ void OBSBasic::OpenProjector(obs_source_t *source, int monitor, bool window, if (projector) windowProjectors.push_back(projector); + } else { + delete projectors[monitor]; + projectors[monitor].clear(); + RemoveSavedProjectors(monitor); + + if (type == ProjectorType::StudioProgram) { + studioProgramProjectorArray.at((size_t)monitor) = 1; + } else if (type == ProjectorType::Preview) { + previewProjectorArray.at((size_t)monitor) = 1; + } else if (type == ProjectorType::Multiview) { + multiviewProjectorArray.at((size_t)monitor) = 1; + } else { + projectorArray.at((size_t)monitor) = name; + } + + projector->Init(monitor, false, nullptr, type); + projectors[monitor] = projector; } } From cfc2c1373dcba75371b1e76e0668e61197f120da Mon Sep 17 00:00:00 2001 From: Shaolin Date: Tue, 27 Feb 2018 22:42:23 -0300 Subject: [PATCH 03/15] UI: Check if source is valid earlier --- UI/window-basic-main.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 7ac5df1e4..74e892ce7 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -5679,14 +5679,13 @@ void OBSBasic::OpenSourceWindow() { int monitor = sender()->property("monitor").toInt(); OBSSceneItem item = GetCurrentSceneItem(); - OBSSource source = obs_sceneitem_get_source(item); - QString text = QString::fromUtf8(obs_source_get_name(source)); - - QString title = QTStr("SourceWindow") + " - " + text; - if (!item) return; + OBSSource source = obs_sceneitem_get_source(item); + QString text = QString::fromUtf8(obs_source_get_name(source)); + QString title = QTStr("SourceWindow") + " - " + text; + OpenProjector(obs_sceneitem_get_source(item), monitor, true, title); } @@ -5701,14 +5700,13 @@ void OBSBasic::OpenSceneWindow() { int monitor = sender()->property("monitor").toInt(); OBSScene scene = GetCurrentScene(); - OBSSource source = obs_scene_get_source(scene); - QString text = QString::fromUtf8(obs_source_get_name(source)); - - QString title = QTStr("SceneWindow") + " - " + text; - if (!scene) return; + OBSSource source = obs_scene_get_source(scene); + QString text = QString::fromUtf8(obs_source_get_name(source)); + QString title = QTStr("SceneWindow") + " - " + text; + OpenProjector(obs_scene_get_source(scene), monitor, true, title); } From 2d864590fe204a27cf74281e153eafdb3a3eb32b Mon Sep 17 00:00:00 2001 From: Shaolin Date: Tue, 27 Feb 2018 23:47:42 -0300 Subject: [PATCH 04/15] UI: Fix the Multiview window not using translation --- UI/window-basic-main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 74e892ce7..65fa0e8e5 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -5692,7 +5692,7 @@ void OBSBasic::OpenSourceWindow() void OBSBasic::OpenMultiviewWindow() { int monitor = sender()->property("monitor").toInt(); - OpenProjector(nullptr, monitor, true, "Multiview", + OpenProjector(nullptr, monitor, true, QTStr("MultiviewWindowed"), ProjectorType::Multiview); } From c605f74d3fc7669fd53e58adaa42ef09343e823d Mon Sep 17 00:00:00 2001 From: Shaolin Date: Wed, 28 Feb 2018 00:27:17 -0300 Subject: [PATCH 05/15] UI: Make OpenSavedProjectors indentation clear --- UI/window-basic-main.cpp | 54 ++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 65fa0e8e5..b9b7e115c 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -5715,42 +5715,42 @@ void OBSBasic::OpenSavedProjectors() bool projectorSave = config_get_bool(GetGlobalConfig(), "BasicWindow", "SaveProjectors"); - if (projectorSave) { - for (size_t i = 0; i < projectorArray.size(); i++) { - if (projectorArray.at(i).empty() == false) { - OBSSource source = obs_get_source_by_name( - projectorArray.at(i).c_str()); + if (!projectorSave) + return; - if (!source) { - RemoveSavedProjectors((int)i); - obs_source_release(source); - continue; - } + for (size_t i = 0; i < projectorArray.size(); i++) { + if (projectorArray.at(i).empty() == false) { + OBSSource source = obs_get_source_by_name( + projectorArray.at(i).c_str()); - OpenProjector(source, (int)i, false); - obs_source_release(source); + if (!source) { + RemoveSavedProjectors((int)i); + continue; } + + OpenProjector(source, (int)i, false); + obs_source_release(source); } + } - for (size_t i = 0; i < studioProgramProjectorArray.size(); i++) { - if (studioProgramProjectorArray.at(i) == 1) { - OpenProjector(nullptr, (int)i, false, nullptr, - ProjectorType::StudioProgram); - } + for (size_t i = 0; i < studioProgramProjectorArray.size(); i++) { + if (studioProgramProjectorArray.at(i) == 1) { + OpenProjector(nullptr, (int)i, false, nullptr, + ProjectorType::StudioProgram); } + } - for (size_t i = 0; i < previewProjectorArray.size(); i++) { - if (previewProjectorArray.at(i) == 1) { - OpenProjector(nullptr, (int)i, false, nullptr, - ProjectorType::Preview); - } + for (size_t i = 0; i < previewProjectorArray.size(); i++) { + if (previewProjectorArray.at(i) == 1) { + OpenProjector(nullptr, (int)i, false, nullptr, + ProjectorType::Preview); } + } - for (size_t i = 0; i < multiviewProjectorArray.size(); i++) { - if (multiviewProjectorArray.at(i) == 1) { - OpenProjector(nullptr, (int)i, false, nullptr, - ProjectorType::Multiview); - } + for (size_t i = 0; i < multiviewProjectorArray.size(); i++) { + if (multiviewProjectorArray.at(i) == 1) { + OpenProjector(nullptr, (int)i, false, nullptr, + ProjectorType::Multiview); } } } From abbcb6ae884841883a80fe0a7a981752222e3843 Mon Sep 17 00:00:00 2001 From: Shaolin Date: Wed, 28 Feb 2018 00:57:54 -0300 Subject: [PATCH 06/15] UI: Move ProjectorType enum to projector header --- UI/window-basic-main.hpp | 8 +------- UI/window-projector.cpp | 2 +- UI/window-projector.hpp | 8 +++++++- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 9b4302fa1..9851b5357 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -29,6 +29,7 @@ #include "window-basic-transform.hpp" #include "window-basic-adv-audio.hpp" #include "window-basic-filters.hpp" +#include "window-projector.hpp" #include @@ -67,13 +68,6 @@ enum class QtDataRole { OBSSignals, }; -enum class ProjectorType { - Source, - Preview, - StudioProgram, - Multiview -}; - struct QuickTransition { QPushButton *button = nullptr; OBSSource source; diff --git a/UI/window-projector.cpp b/UI/window-projector.cpp index 0ad9755ad..d901101e7 100644 --- a/UI/window-projector.cpp +++ b/UI/window-projector.cpp @@ -3,7 +3,7 @@ #include #include #include -#include "window-projector.hpp" +#include "window-basic-main.hpp" #include "display-helpers.hpp" #include "qt-wrappers.hpp" #include "platform.hpp" diff --git a/UI/window-projector.hpp b/UI/window-projector.hpp index 606ab616b..aa24b425c 100644 --- a/UI/window-projector.hpp +++ b/UI/window-projector.hpp @@ -2,7 +2,13 @@ #include #include "qt-display.hpp" -#include "window-basic-main.hpp" + +enum class ProjectorType { + Source, + Preview, + StudioProgram, + Multiview +}; class QMouseEvent; From 7da90fa25f51ba1f8bcc50d5ed582e12ab7e3068 Mon Sep 17 00:00:00 2001 From: Shaolin Date: Wed, 28 Feb 2018 02:31:35 -0300 Subject: [PATCH 07/15] UI: Refactor Projector OBSRender source usage --- UI/window-projector.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/UI/window-projector.cpp b/UI/window-projector.cpp index d901101e7..5bd26e375 100644 --- a/UI/window-projector.cpp +++ b/UI/window-projector.cpp @@ -588,6 +588,7 @@ void OBSProjector::OBSRender(void *data, uint32_t cx, uint32_t cy) return; OBSBasic *main = reinterpret_cast(App()->GetMainWindow()); + OBSSource source = window->source; uint32_t targetCX; uint32_t targetCY; @@ -595,9 +596,9 @@ void OBSProjector::OBSRender(void *data, uint32_t cx, uint32_t cy) int newCX, newCY; float scale; - if (window->source) { - targetCX = std::max(obs_source_get_width(window->source), 1u); - targetCY = std::max(obs_source_get_height(window->source), 1u); + if (source) { + targetCX = std::max(obs_source_get_width(source), 1u); + targetCY = std::max(obs_source_get_height(source), 1u); } else { struct obs_video_info ovi; obs_get_video_info(&ovi); @@ -615,14 +616,12 @@ void OBSProjector::OBSRender(void *data, uint32_t cx, uint32_t cy) gs_ortho(0.0f, float(targetCX), 0.0f, float(targetCY), -100.0f, 100.0f); gs_set_viewport(x, y, newCX, newCY); - OBSSource source = window->source; - if (window->type == ProjectorType::Preview && main->IsPreviewProgramMode()) { OBSSource curSource = main->GetCurrentSceneSource(); - if (window->source != curSource) { - obs_source_dec_showing(window->source); + if (source != curSource) { + obs_source_dec_showing(source); obs_source_inc_showing(curSource); source = curSource; } From 3952fe2693bfabed29b5af3919360ad409f3d6d3 Mon Sep 17 00:00:00 2001 From: Shaolin Date: Wed, 28 Feb 2018 14:27:12 -0300 Subject: [PATCH 08/15] UI: Simplify Projector Init --- UI/window-projector.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/UI/window-projector.cpp b/UI/window-projector.cpp index 5bd26e375..c6581ba73 100644 --- a/UI/window-projector.cpp +++ b/UI/window-projector.cpp @@ -135,25 +135,19 @@ static OBSSource CreateLabel(const char *name, size_t h) void OBSProjector::Init(int monitor, bool window, QString title, ProjectorType type_) { - QScreen *screen = QGuiApplication::screens()[monitor]; - - if (!window) - setGeometry(screen->geometry()); - bool alwaysOnTop = config_get_bool(GetGlobalConfig(), "BasicWindow", "ProjectorAlwaysOnTop"); if (alwaysOnTop && !window) SetAlwaysOnTop(this, true); - if (window) - setWindowTitle(title); - show(); - if (source) - obs_source_inc_showing(source); + if (window) { + setWindowTitle(title); + } else { + QScreen *screen = QGuiApplication::screens()[monitor]; + setGeometry(screen->geometry()); - if (!window) { QAction *action = new QAction(this); action->setShortcut(Qt::Key_Escape); addAction(action); @@ -162,6 +156,9 @@ void OBSProjector::Init(int monitor, bool window, QString title, activateWindow(); } + if (source) + obs_source_inc_showing(source); + savedMonitor = monitor; isWindow = window; type = type_; From e6c00afeac7d2d0b6c771ef7f0dd478643ca152d Mon Sep 17 00:00:00 2001 From: Shaolin Date: Wed, 28 Feb 2018 15:01:31 -0300 Subject: [PATCH 09/15] UI: Add Scene to ProjectorType --- UI/window-projector.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/UI/window-projector.hpp b/UI/window-projector.hpp index aa24b425c..5fa35f0b0 100644 --- a/UI/window-projector.hpp +++ b/UI/window-projector.hpp @@ -5,6 +5,7 @@ enum class ProjectorType { Source, + Scene, Preview, StudioProgram, Multiview From 8ec1f97d3039598f37d716384e416eed215c7daa Mon Sep 17 00:00:00 2001 From: Shaolin Date: Wed, 28 Feb 2018 15:34:17 -0300 Subject: [PATCH 10/15] UI: Add helper functions to Projector --- UI/window-projector.cpp | 15 +++++++++++++++ UI/window-projector.hpp | 3 +++ 2 files changed, 18 insertions(+) diff --git a/UI/window-projector.cpp b/UI/window-projector.cpp index c6581ba73..384c1709a 100644 --- a/UI/window-projector.cpp +++ b/UI/window-projector.cpp @@ -857,6 +857,21 @@ void OBSProjector::UpdateMultiview() multiviewLayout = HORIZONTAL_TOP; } +OBSSource OBSProjector::GetSource() +{ + return source; +} + +ProjectorType OBSProjector::GetProjectorType() +{ + return type; +} + +int OBSProjector::GetMonitor() +{ + return savedMonitor; +} + void OBSProjector::UpdateMultiviewProjectors() { obs_enter_graphics(); diff --git a/UI/window-projector.hpp b/UI/window-projector.hpp index 5fa35f0b0..752b49eb0 100644 --- a/UI/window-projector.hpp +++ b/UI/window-projector.hpp @@ -53,5 +53,8 @@ public: void Init(int monitor, bool window, QString title, ProjectorType type = ProjectorType::Source); + OBSSource GetSource(); + ProjectorType GetProjectorType(); + int GetMonitor(); static void UpdateMultiviewProjectors(); }; From 76af4ff36d5bbf0c61b0f431b949ecf52d1e40db Mon Sep 17 00:00:00 2001 From: Shaolin Date: Wed, 28 Feb 2018 17:49:47 -0300 Subject: [PATCH 11/15] UI: Clean up save and load projector code --- UI/window-basic-main.cpp | 292 +++++++++++---------------------------- UI/window-basic-main.hpp | 29 ++-- UI/window-projector.cpp | 5 - 3 files changed, 89 insertions(+), 237 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index b9b7e115c..8d6d44c6c 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -137,11 +137,6 @@ OBSBasic::OBSBasic(QWidget *parent) { setAttribute(Qt::WA_NativeWindow); - projectorArray.resize(10, ""); - previewProjectorArray.resize(10, 0); - multiviewProjectorArray.resize(10, 0); - studioProgramProjectorArray.resize(10, 0); - setAcceptDrops(true); ui->setupUi(this); @@ -319,10 +314,7 @@ static obs_data_t *GenerateSaveData(obs_data_array_t *sceneOrder, obs_data_array_t *quickTransitionData, int transitionDuration, obs_data_array_t *transitions, OBSScene &scene, OBSSource &curProgramScene, - obs_data_array_t *savedProjectorList, - obs_data_array_t *savedPreviewProjectorList, - obs_data_array_t *savedStudioProgramProjectorList, - obs_data_array_t *savedMultiviewProjectorList) + obs_data_array_t *savedProjectorList) { obs_data_t *saveData = obs_data_create(); @@ -364,12 +356,6 @@ static obs_data_t *GenerateSaveData(obs_data_array_t *sceneOrder, obs_data_set_array(saveData, "quick_transitions", quickTransitionData); obs_data_set_array(saveData, "transitions", transitions); obs_data_set_array(saveData, "saved_projectors", savedProjectorList); - obs_data_set_array(saveData, "saved_preview_projectors", - savedPreviewProjectorList); - obs_data_set_array(saveData, "saved_studio_preview_projectors", - savedStudioProgramProjectorList); - obs_data_set_array(saveData, "saved_multiview_projectors", - savedMultiviewProjectorList); obs_data_array_release(sourcesArray); obs_data_set_string(saveData, "current_transition", @@ -439,62 +425,24 @@ obs_data_array_t *OBSBasic::SaveSceneListOrder() obs_data_array_t *OBSBasic::SaveProjectors() { - obs_data_array_t *saveProjector = obs_data_array_create(); + obs_data_array_t *savedProjectors = obs_data_array_create(); + + auto saveProjector = [savedProjectors](OBSProjector *projector) { + if (!projector) + return; - for (size_t i = 0; i < projectorArray.size(); i++) { obs_data_t *data = obs_data_create(); - obs_data_set_string(data, "saved_projectors", - projectorArray.at(i).c_str()); - obs_data_array_push_back(saveProjector, data); + ProjectorType type = projector->GetProjectorType(); + obs_data_set_int(data, "monitor", projector->GetMonitor()); + obs_data_set_int(data, "type", static_cast(type)); + obs_data_array_push_back(savedProjectors, data); obs_data_release(data); - } + }; - return saveProjector; -} + for (QPointer &proj : projectors) + saveProjector(static_cast(proj.data())); -obs_data_array_t *OBSBasic::SavePreviewProjectors() -{ - obs_data_array_t *saveProjector = obs_data_array_create(); - - for (size_t i = 0; i < previewProjectorArray.size(); i++) { - obs_data_t *data = obs_data_create(); - obs_data_set_int(data, "saved_preview_projectors", - previewProjectorArray.at(i)); - obs_data_array_push_back(saveProjector, data); - obs_data_release(data); - } - - return saveProjector; -} - -obs_data_array_t *OBSBasic::SaveStudioProgramProjectors() -{ - obs_data_array_t *saveProjector = obs_data_array_create(); - - for (size_t i = 0; i < studioProgramProjectorArray.size(); i++) { - obs_data_t *data = obs_data_create(); - obs_data_set_int(data, "saved_studio_preview_projectors", - studioProgramProjectorArray.at(i)); - obs_data_array_push_back(saveProjector, data); - obs_data_release(data); - } - - return saveProjector; -} - -obs_data_array_t *OBSBasic::SaveMultiviewProjectors() -{ - obs_data_array_t *saveProjector = obs_data_array_create(); - - for (size_t i = 0; i < multiviewProjectorArray.size(); i++) { - obs_data_t *data = obs_data_create(); - obs_data_set_int(data, "saved_multiview_projectors", - multiviewProjectorArray.at(i)); - obs_data_array_push_back(saveProjector, data); - obs_data_release(data); - } - - return saveProjector; + return savedProjectors; } void OBSBasic::Save(const char *file) @@ -508,17 +456,9 @@ void OBSBasic::Save(const char *file) obs_data_array_t *transitions = SaveTransitions(); obs_data_array_t *quickTrData = SaveQuickTransitions(); obs_data_array_t *savedProjectorList = SaveProjectors(); - obs_data_array_t *savedPreviewProjectorList = SavePreviewProjectors(); - obs_data_array_t *savedStudioProgramProjectorList = - SaveStudioProgramProjectors(); - obs_data_array_t *savedMultiviewProjectorList = - SaveMultiviewProjectors(); obs_data_t *saveData = GenerateSaveData(sceneOrder, quickTrData, ui->transitionDuration->value(), transitions, - scene, curProgramScene, savedProjectorList, - savedPreviewProjectorList, - savedStudioProgramProjectorList, - savedMultiviewProjectorList); + scene, curProgramScene, savedProjectorList); obs_data_set_bool(saveData, "preview_locked", ui->preview->Locked()); obs_data_set_bool(saveData, "scaling_enabled", @@ -545,9 +485,6 @@ void OBSBasic::Save(const char *file) obs_data_array_release(quickTrData); obs_data_array_release(transitions); obs_data_array_release(savedProjectorList); - obs_data_array_release(savedPreviewProjectorList); - obs_data_array_release(savedStudioProgramProjectorList); - obs_data_array_release(savedMultiviewProjectorList); } static void LoadAudioDevice(const char *name, int channel, obs_data_t *parent) @@ -653,47 +590,12 @@ void OBSBasic::LoadSavedProjectors(obs_data_array_t *array) for (size_t i = 0; i < num; i++) { obs_data_t *data = obs_data_array_item(array, i); - projectorArray.at(i) = obs_data_get_string(data, - "saved_projectors"); - obs_data_release(data); - } -} - -void OBSBasic::LoadSavedPreviewProjectors(obs_data_array_t *array) -{ - size_t num = obs_data_array_count(array); - - for (size_t i = 0; i < num; i++) { - obs_data_t *data = obs_data_array_item(array, i); - previewProjectorArray.at(i) = obs_data_get_int(data, - "saved_preview_projectors"); - - obs_data_release(data); - } -} - -void OBSBasic::LoadSavedStudioProgramProjectors(obs_data_array_t *array) -{ - size_t num = obs_data_array_count(array); - - for (size_t i = 0; i < num; i++) { - obs_data_t *data = obs_data_array_item(array, i); - studioProgramProjectorArray.at(i) = obs_data_get_int(data, - "saved_studio_preview_projectors"); - - obs_data_release(data); - } -} - -void OBSBasic::LoadSavedMultiviewProjectors(obs_data_array_t *array) -{ - size_t num = obs_data_array_count(array); - - for (size_t i = 0; i < num; i++) { - obs_data_t *data = obs_data_array_item(array, i); - multiviewProjectorArray.at(i) = obs_data_get_int(data, - "saved_multiview_projectors"); + SavedProjectorInfo *info = new SavedProjectorInfo(); + info->monitor = obs_data_get_int(data, "monitor"); + info->type = static_cast(obs_data_get_int(data, + "type")); + savedProjectorsArray.emplace_back(info); obs_data_release(data); } @@ -877,32 +779,6 @@ retryScene: LoadSavedProjectors(savedProjectors); obs_data_array_release(savedProjectors); - - obs_data_array_t *savedPreviewProjectors = obs_data_get_array( - data, "saved_preview_projectors"); - - if (savedPreviewProjectors) - LoadSavedPreviewProjectors(savedPreviewProjectors); - - obs_data_array_release(savedPreviewProjectors); - - obs_data_array_t *savedStudioProgramProjectors; - savedStudioProgramProjectors = obs_data_get_array(data, - "saved_studio_preview_projectors"); - - if (savedStudioProgramProjectors) - LoadSavedStudioProgramProjectors( - savedStudioProgramProjectors); - - obs_data_array_release(savedStudioProgramProjectors); - - obs_data_array_t *savedMultiviewProjectors = obs_data_get_array( - data, "saved_multiview_projectors"); - - if (savedMultiviewProjectors) - LoadSavedMultiviewProjectors(savedMultiviewProjectors); - - obs_data_array_release(savedMultiviewProjectors); } /* ------------------- */ @@ -2328,14 +2204,6 @@ void OBSBasic::RenameSources(OBSSource source, QString newName, volumes[i]->SetName(newName); } - std::string newText = newName.toUtf8().constData(); - std::string prevText = prevName.toUtf8().constData(); - - for (size_t j = 0; j < projectorArray.size(); j++) { - if (projectorArray.at(j) == prevText) - projectorArray.at(j) = newText; - } - SaveProject(); obs_scene_t *scene = obs_scene_from_source(source); @@ -5578,17 +5446,17 @@ void OBSBasic::NudgeDown() {Nudge(1, MoveDir::Down);} void OBSBasic::NudgeLeft() {Nudge(1, MoveDir::Left);} void OBSBasic::NudgeRight() {Nudge(1, MoveDir::Right);} -void OBSBasic::OpenProjector(obs_source_t *source, int monitor, bool window, - QString title, ProjectorType type) +void OBSBasic::OpenProjector(obs_source_t *source, int monitor, QString title, + ProjectorType type) { /* seriously? 10 monitors? */ if (monitor > 9 || monitor > QGuiApplication::screens().size() - 1) return; - OBSProjector *projector = new OBSProjector(nullptr, source, !!window); - const char *name = obs_source_get_name(source); + OBSProjector *projector = new OBSProjector(nullptr, source, + title != nullptr); - if (window) { + if (title != nullptr) { projector->Init(monitor, true, title, type); for (auto &projPtr : windowProjectors) { @@ -5603,17 +5471,6 @@ void OBSBasic::OpenProjector(obs_source_t *source, int monitor, bool window, } else { delete projectors[monitor]; projectors[monitor].clear(); - RemoveSavedProjectors(monitor); - - if (type == ProjectorType::StudioProgram) { - studioProgramProjectorArray.at((size_t)monitor) = 1; - } else if (type == ProjectorType::Preview) { - previewProjectorArray.at((size_t)monitor) = 1; - } else if (type == ProjectorType::Multiview) { - multiviewProjectorArray.at((size_t)monitor) = 1; - } else { - projectorArray.at((size_t)monitor) = name; - } projector->Init(monitor, false, nullptr, type); projectors[monitor] = projector; @@ -5623,14 +5480,13 @@ void OBSBasic::OpenProjector(obs_source_t *source, int monitor, bool window, void OBSBasic::OpenStudioProgramProjector() { int monitor = sender()->property("monitor").toInt(); - OpenProjector(nullptr, monitor, false, nullptr, - ProjectorType::StudioProgram); + OpenProjector(nullptr, monitor, nullptr, ProjectorType::StudioProgram); } void OBSBasic::OpenPreviewProjector() { int monitor = sender()->property("monitor").toInt(); - OpenProjector(nullptr, monitor, false, nullptr, ProjectorType::Preview); + OpenProjector(nullptr, monitor, nullptr, ProjectorType::Preview); } void OBSBasic::OpenSourceProjector() @@ -5640,14 +5496,13 @@ void OBSBasic::OpenSourceProjector() if (!item) return; - OpenProjector(obs_sceneitem_get_source(item), monitor, false); + OpenProjector(obs_sceneitem_get_source(item), monitor, nullptr); } void OBSBasic::OpenMultiviewProjector() { int monitor = sender()->property("monitor").toInt(); - OpenProjector(nullptr, monitor, false, nullptr, - ProjectorType::Multiview); + OpenProjector(nullptr, monitor, nullptr, ProjectorType::Multiview); } void OBSBasic::OpenSceneProjector() @@ -5657,22 +5512,22 @@ void OBSBasic::OpenSceneProjector() if (!scene) return; - OpenProjector(obs_scene_get_source(scene), monitor, false); + OpenProjector(obs_scene_get_source(scene), monitor, nullptr, + ProjectorType::Scene); } void OBSBasic::OpenStudioProgramWindow() { int monitor = sender()->property("monitor").toInt(); QString title = QTStr("StudioProgramWindow"); - OpenProjector(nullptr, monitor, true, title, - ProjectorType::StudioProgram); + OpenProjector(nullptr, monitor, title, ProjectorType::StudioProgram); } void OBSBasic::OpenPreviewWindow() { int monitor = sender()->property("monitor").toInt(); QString title = QTStr("PreviewWindow"); - OpenProjector(nullptr, monitor, true, nullptr, ProjectorType::Preview); + OpenProjector(nullptr, monitor, title, ProjectorType::Preview); } void OBSBasic::OpenSourceWindow() @@ -5686,14 +5541,14 @@ void OBSBasic::OpenSourceWindow() QString text = QString::fromUtf8(obs_source_get_name(source)); QString title = QTStr("SourceWindow") + " - " + text; - OpenProjector(obs_sceneitem_get_source(item), monitor, true, title); + OpenProjector(obs_sceneitem_get_source(item), monitor, title); } void OBSBasic::OpenMultiviewWindow() { int monitor = sender()->property("monitor").toInt(); - OpenProjector(nullptr, monitor, true, QTStr("MultiviewWindowed"), - ProjectorType::Multiview); + QString title = QTStr("MultiviewWindowed"); + OpenProjector(nullptr, monitor, title, ProjectorType::Multiview); } void OBSBasic::OpenSceneWindow() @@ -5707,7 +5562,7 @@ void OBSBasic::OpenSceneWindow() QString text = QString::fromUtf8(obs_source_get_name(source)); QString title = QTStr("SceneWindow") + " - " + text; - OpenProjector(obs_scene_get_source(scene), monitor, true, title); + OpenProjector(obs_scene_get_source(scene), monitor, title); } void OBSBasic::OpenSavedProjectors() @@ -5718,51 +5573,62 @@ void OBSBasic::OpenSavedProjectors() if (!projectorSave) return; - for (size_t i = 0; i < projectorArray.size(); i++) { - if (projectorArray.at(i).empty() == false) { + for (SavedProjectorInfo *info : savedProjectorsArray) { + switch (info->type) { + case ProjectorType::Source: { OBSSource source = obs_get_source_by_name( - projectorArray.at(i).c_str()); - - if (!source) { - RemoveSavedProjectors((int)i); + info->name.c_str()); + if (!source) continue; - } - OpenProjector(source, (int)i, false); + QString text = QString::fromUtf8( + obs_source_get_name(source)); + QString title = QTStr("SourceWindow") + " - " + text; + + OpenProjector(source, info->monitor, title, + ProjectorType::Source); + obs_source_release(source); + break; } - } + case ProjectorType::Scene: { + OBSSource source = obs_get_source_by_name( + info->name.c_str()); + if (!source) + continue; - for (size_t i = 0; i < studioProgramProjectorArray.size(); i++) { - if (studioProgramProjectorArray.at(i) == 1) { - OpenProjector(nullptr, (int)i, false, nullptr, - ProjectorType::StudioProgram); + QString text = QString::fromUtf8( + obs_source_get_name(source)); + QString title = QTStr("SceneWindow") + " - " + text; + + OpenProjector(source, info->monitor, title, + ProjectorType::Scene); + + obs_source_release(source); + break; } - } - - for (size_t i = 0; i < previewProjectorArray.size(); i++) { - if (previewProjectorArray.at(i) == 1) { - OpenProjector(nullptr, (int)i, false, nullptr, + case ProjectorType::Preview: { + OpenProjector(nullptr, info->monitor, + QTStr("PreviewWindow"), ProjectorType::Preview); + break; } - } - - for (size_t i = 0; i < multiviewProjectorArray.size(); i++) { - if (multiviewProjectorArray.at(i) == 1) { - OpenProjector(nullptr, (int)i, false, nullptr, + case ProjectorType::StudioProgram: { + OpenProjector(nullptr, info->monitor, + QTStr("StudioProgramWindow"), + ProjectorType::StudioProgram); + break; + } + case ProjectorType::Multiview: { + OpenProjector(nullptr, info->monitor, + QTStr("MultiviewWindowed"), ProjectorType::Multiview); + break; + } } } } -void OBSBasic::RemoveSavedProjectors(int monitor) -{ - studioProgramProjectorArray.at((size_t)monitor) = 0; - multiviewProjectorArray.at((size_t)monitor) = 0; - previewProjectorArray.at((size_t)monitor) = 0; - projectorArray.at((size_t)monitor) = ""; -} - void OBSBasic::on_actionFullscreenInterface_triggered() { if (!fullscreenInterface) diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 9851b5357..72441e38d 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -68,6 +68,13 @@ enum class QtDataRole { OBSSignals, }; +struct SavedProjectorInfo { + ProjectorType type; + int monitor; + std::string geometry; + std::string name; +}; + struct QuickTransition { QPushButton *button = nullptr; OBSSource source; @@ -114,11 +121,6 @@ private: std::vector signalHandlers; - std::vector projectorArray; - std::vector studioProgramProjectorArray; - std::vector multiviewProjectorArray; - std::vector previewProjectorArray; - bool loaded = false; long disableSaving = 1; bool projectChanged = false; @@ -163,6 +165,7 @@ private: ConfigFile basicConfig; + std::vector savedProjectorsArray; QPointer projectors[10]; QList> windowProjectors; @@ -246,7 +249,8 @@ private: void ClearSceneData(); void Nudge(int dist, MoveDir dir); - void OpenProjector(obs_source_t *source, int monitor, bool window, + + void OpenProjector(obs_source_t *source, int monitor, QString title = nullptr, ProjectorType type = ProjectorType::Source); @@ -361,18 +365,6 @@ private: obs_data_array_t *SaveProjectors(); void LoadSavedProjectors(obs_data_array_t *savedProjectors); - obs_data_array_t *SavePreviewProjectors(); - void LoadSavedPreviewProjectors( - obs_data_array_t *savedPreviewProjectors); - - obs_data_array_t *SaveStudioProgramProjectors(); - void LoadSavedStudioProgramProjectors( - obs_data_array_t *savedStudioProgramProjectors); - - obs_data_array_t *SaveMultiviewProjectors(); - void LoadSavedMultiviewProjectors( - obs_data_array_t *savedMultiviewProjectors); - public slots: void StartStreaming(); void StopStreaming(); @@ -562,7 +554,6 @@ public: void SystemTray(bool firstStarted); void OpenSavedProjectors(); - void RemoveSavedProjectors(int monitor); protected: virtual void closeEvent(QCloseEvent *event) override; diff --git a/UI/window-projector.cpp b/UI/window-projector.cpp index 384c1709a..b549a1f05 100644 --- a/UI/window-projector.cpp +++ b/UI/window-projector.cpp @@ -792,11 +792,6 @@ void OBSProjector::mousePressEvent(QMouseEvent *event) void OBSProjector::EscapeTriggered() { - if (!isWindow) { - OBSBasic *main = (OBSBasic*)obs_frontend_get_main_window(); - main->RemoveSavedProjectors(savedMonitor); - } - deleteLater(); } From 372640ff351b0d530ce5512fb375a8153bcf265a Mon Sep 17 00:00:00 2001 From: Shaolin Date: Wed, 28 Feb 2018 21:43:07 -0300 Subject: [PATCH 12/15] UI: Update Projectors title on source name change --- UI/window-basic-main.cpp | 10 ++++------ UI/window-projector.cpp | 43 +++++++++++++++++++++++++++++++++++----- UI/window-projector.hpp | 3 +++ 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 8d6d44c6c..ee9468e62 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -2204,6 +2204,8 @@ void OBSBasic::RenameSources(OBSSource source, QString newName, volumes[i]->SetName(newName); } + OBSProjector::RenameProjector(prevName, newName); + SaveProject(); obs_scene_t *scene = obs_scene_from_source(source); @@ -5538,9 +5540,7 @@ void OBSBasic::OpenSourceWindow() return; OBSSource source = obs_sceneitem_get_source(item); - QString text = QString::fromUtf8(obs_source_get_name(source)); - QString title = QTStr("SourceWindow") + " - " + text; - + QString title = QString::fromUtf8(obs_source_get_name(source)); OpenProjector(obs_sceneitem_get_source(item), monitor, title); } @@ -5559,9 +5559,7 @@ void OBSBasic::OpenSceneWindow() return; OBSSource source = obs_scene_get_source(scene); - QString text = QString::fromUtf8(obs_source_get_name(source)); - QString title = QTStr("SceneWindow") + " - " + text; - + QString title = QString::fromUtf8(obs_source_get_name(source)); OpenProjector(obs_scene_get_source(scene), monitor, title); } diff --git a/UI/window-projector.cpp b/UI/window-projector.cpp index b549a1f05..fc1272985 100644 --- a/UI/window-projector.cpp +++ b/UI/window-projector.cpp @@ -3,6 +3,7 @@ #include #include #include +#include "obs-app.hpp" #include "window-basic-main.hpp" #include "display-helpers.hpp" #include "qt-wrappers.hpp" @@ -13,6 +14,7 @@ #define VERTICAL_LEFT 2 #define VERTICAL_RIGHT 3 +static QList windowedProjectors; static QList multiviewProjectors; static bool updatingMultiview = false; static int multiviewLayout = HORIZONTAL_TOP; @@ -89,6 +91,9 @@ OBSProjector::~OBSProjector() if (type == ProjectorType::Multiview) multiviewProjectors.removeAll(this); + if (isWindow) + windowedProjectors.removeAll(this); + App()->DecrementSleepInhibition(); } @@ -135,6 +140,10 @@ static OBSSource CreateLabel(const char *name, size_t h) void OBSProjector::Init(int monitor, bool window, QString title, ProjectorType type_) { + savedMonitor = monitor; + isWindow = window; + type = type_; + bool alwaysOnTop = config_get_bool(GetGlobalConfig(), "BasicWindow", "ProjectorAlwaysOnTop"); if (alwaysOnTop && !window) @@ -143,7 +152,8 @@ void OBSProjector::Init(int monitor, bool window, QString title, show(); if (window) { - setWindowTitle(title); + UpdateProjectorTitle(title); + windowedProjectors.push_back(this); } else { QScreen *screen = QGuiApplication::screens()[monitor]; setGeometry(screen->geometry()); @@ -159,10 +169,6 @@ void OBSProjector::Init(int monitor, bool window, QString title, if (source) obs_source_inc_showing(source); - savedMonitor = monitor; - isWindow = window; - type = type_; - if (type == ProjectorType::Multiview) { obs_enter_graphics(); gs_render_start(true); @@ -852,6 +858,26 @@ void OBSProjector::UpdateMultiview() multiviewLayout = HORIZONTAL_TOP; } +void OBSProjector::UpdateProjectorTitle(QString name) +{ + projectorTitle = name; + + QString title = nullptr; + switch (type) { + case ProjectorType::Scene: + title = QTStr("SceneWindow") + " - " + name; + break; + case ProjectorType::Source: + title = QTStr("SourceWindow") + " - " + name; + break; + default: + title = name; + break; + } + + setWindowTitle(title); +} + OBSSource OBSProjector::GetSource() { return source; @@ -880,3 +906,10 @@ void OBSProjector::UpdateMultiviewProjectors() updatingMultiview = false; obs_leave_graphics(); } + +void OBSProjector::RenameProjector(QString oldName, QString newName) +{ + for (auto &projector : windowedProjectors) + if (projector->projectorTitle == oldName) + projector->UpdateProjectorTitle(newName); +} diff --git a/UI/window-projector.hpp b/UI/window-projector.hpp index 752b49eb0..5ece95bd5 100644 --- a/UI/window-projector.hpp +++ b/UI/window-projector.hpp @@ -29,6 +29,7 @@ private: int savedMonitor = 0; bool isWindow = false; + QString projectorTitle; ProjectorType type = ProjectorType::Source; OBSWeakSource multiviewScenes[8]; OBSSource multiviewLabels[10]; @@ -42,6 +43,7 @@ private: bool ready = false; void UpdateMultiview(); + void UpdateProjectorTitle(QString name); private slots: void EscapeTriggered(); @@ -57,4 +59,5 @@ public: ProjectorType GetProjectorType(); int GetMonitor(); static void UpdateMultiviewProjectors(); + static void RenameProjector(QString oldName, QString newName); }; From 8b6641d1a826442588a5271be8cef355a0eee565 Mon Sep 17 00:00:00 2001 From: Shaolin Date: Wed, 28 Feb 2018 23:34:11 -0300 Subject: [PATCH 13/15] UI: Clean up OBSProjector creation --- UI/window-basic-main.cpp | 46 +++++++------- UI/window-basic-main.hpp | 5 +- UI/window-projector.cpp | 125 ++++++++++++++++++++------------------- UI/window-projector.hpp | 10 ++-- 4 files changed, 93 insertions(+), 93 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index ee9468e62..2237f88b2 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -5448,19 +5448,17 @@ void OBSBasic::NudgeDown() {Nudge(1, MoveDir::Down);} void OBSBasic::NudgeLeft() {Nudge(1, MoveDir::Left);} void OBSBasic::NudgeRight() {Nudge(1, MoveDir::Right);} -void OBSBasic::OpenProjector(obs_source_t *source, int monitor, QString title, - ProjectorType type) +OBSProjector *OBSBasic::OpenProjector(obs_source_t *source, int monitor, + QString title, ProjectorType type) { /* seriously? 10 monitors? */ if (monitor > 9 || monitor > QGuiApplication::screens().size() - 1) - return; + return nullptr; - OBSProjector *projector = new OBSProjector(nullptr, source, - title != nullptr); - - if (title != nullptr) { - projector->Init(monitor, true, title, type); + OBSProjector *projector = new OBSProjector(nullptr, source, monitor, + title, type); + if (monitor < 0) { for (auto &projPtr : windowProjectors) { if (!projPtr) { projPtr = projector; @@ -5474,9 +5472,11 @@ void OBSBasic::OpenProjector(obs_source_t *source, int monitor, QString title, delete projectors[monitor]; projectors[monitor].clear(); - projector->Init(monitor, false, nullptr, type); projectors[monitor] = projector; } + + projector->Init(); + return projector; } void OBSBasic::OpenStudioProgramProjector() @@ -5498,7 +5498,8 @@ void OBSBasic::OpenSourceProjector() if (!item) return; - OpenProjector(obs_sceneitem_get_source(item), monitor, nullptr); + OpenProjector(obs_sceneitem_get_source(item), monitor, nullptr, + ProjectorType::Source); } void OBSBasic::OpenMultiviewProjector() @@ -5520,47 +5521,46 @@ void OBSBasic::OpenSceneProjector() void OBSBasic::OpenStudioProgramWindow() { - int monitor = sender()->property("monitor").toInt(); - QString title = QTStr("StudioProgramWindow"); - OpenProjector(nullptr, monitor, title, ProjectorType::StudioProgram); + OpenProjector(nullptr, -1, QTStr("StudioProgramWindow"), + ProjectorType::StudioProgram); } void OBSBasic::OpenPreviewWindow() { - int monitor = sender()->property("monitor").toInt(); - QString title = QTStr("PreviewWindow"); - OpenProjector(nullptr, monitor, title, ProjectorType::Preview); + OpenProjector(nullptr, -1, QTStr("PreviewWindow"), + ProjectorType::Preview); } void OBSBasic::OpenSourceWindow() { - int monitor = sender()->property("monitor").toInt(); OBSSceneItem item = GetCurrentSceneItem(); if (!item) return; OBSSource source = obs_sceneitem_get_source(item); QString title = QString::fromUtf8(obs_source_get_name(source)); - OpenProjector(obs_sceneitem_get_source(item), monitor, title); + + OpenProjector(obs_sceneitem_get_source(item), -1, title, + ProjectorType::Source); } void OBSBasic::OpenMultiviewWindow() { - int monitor = sender()->property("monitor").toInt(); - QString title = QTStr("MultiviewWindowed"); - OpenProjector(nullptr, monitor, title, ProjectorType::Multiview); + OpenProjector(nullptr, -1, QTStr("MultiviewWindowed"), + ProjectorType::Multiview); } void OBSBasic::OpenSceneWindow() { - int monitor = sender()->property("monitor").toInt(); OBSScene scene = GetCurrentScene(); if (!scene) return; OBSSource source = obs_scene_get_source(scene); QString title = QString::fromUtf8(obs_source_get_name(source)); - OpenProjector(obs_scene_get_source(scene), monitor, title); + + OpenProjector(obs_scene_get_source(scene), -1, title, + ProjectorType::Scene); } void OBSBasic::OpenSavedProjectors() diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 72441e38d..894b086ae 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -250,9 +250,8 @@ private: void Nudge(int dist, MoveDir dir); - void OpenProjector(obs_source_t *source, int monitor, - QString title = nullptr, - ProjectorType type = ProjectorType::Source); + OBSProjector *OpenProjector(obs_source_t *source, int monitor, + QString title, ProjectorType type); void GetAudioSourceFilters(); void GetAudioSourceProperties(); diff --git a/UI/window-projector.cpp b/UI/window-projector.cpp index fc1272985..3adc295c5 100644 --- a/UI/window-projector.cpp +++ b/UI/window-projector.cpp @@ -19,14 +19,20 @@ static QList multiviewProjectors; static bool updatingMultiview = false; static int multiviewLayout = HORIZONTAL_TOP; -OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, bool window) +OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, int monitor, + QString title, ProjectorType type_) : OBSQTDisplay (widget, Qt::Window), source (source_), removedSignal (obs_source_get_signal_handler(source), "remove", OBSSourceRemoved, this) { - if (!window) { + projectorTitle = title; + savedMonitor = monitor; + isWindow = savedMonitor < 0; + type = type_; + + if (!isWindow) { setWindowFlags(Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint); } @@ -51,12 +57,61 @@ OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, bool window) bool hideCursor = config_get_bool(GetGlobalConfig(), "BasicWindow", "HideProjectorCursor"); - if (hideCursor && !window) { + if (hideCursor && !isWindow) { QPixmap empty(16, 16); empty.fill(Qt::transparent); setCursor(QCursor(empty)); } + if (type == ProjectorType::Multiview) { + obs_enter_graphics(); + gs_render_start(true); + gs_vertex2f(0.001f, 0.001f); + gs_vertex2f(0.001f, 0.997f); + gs_vertex2f(0.997f, 0.997f); + gs_vertex2f(0.997f, 0.001f); + gs_vertex2f(0.001f, 0.001f); + outerBox = gs_render_save(); + + gs_render_start(true); + gs_vertex2f(0.04f, 0.04f); + gs_vertex2f(0.04f, 0.96f); + gs_vertex2f(0.96f, 0.96f); + gs_vertex2f(0.96f, 0.04f); + gs_vertex2f(0.04f, 0.04f); + innerBox = gs_render_save(); + + gs_render_start(true); + gs_vertex2f(0.15f, 0.04f); + gs_vertex2f(0.15f, 0.96f); + leftVLine = gs_render_save(); + + gs_render_start(true); + gs_vertex2f(0.85f, 0.04f); + gs_vertex2f(0.85f, 0.96f); + rightVLine = gs_render_save(); + + gs_render_start(true); + gs_vertex2f(0.0f, 0.5f); + gs_vertex2f(0.075f, 0.5f); + leftLine = gs_render_save(); + + gs_render_start(true); + gs_vertex2f(0.5f, 0.0f); + gs_vertex2f(0.5f, 0.09f); + topLine = gs_render_save(); + + gs_render_start(true); + gs_vertex2f(0.925f, 0.5f); + gs_vertex2f(1.0f, 0.5f); + rightLine = gs_render_save(); + obs_leave_graphics(); + + UpdateMultiview(); + + multiviewProjectors.push_back(this); + } + App()->IncrementSleepInhibition(); resize(480, 270); } @@ -137,25 +192,20 @@ static OBSSource CreateLabel(const char *name, size_t h) return txtSource; } -void OBSProjector::Init(int monitor, bool window, QString title, - ProjectorType type_) +void OBSProjector::Init() { - savedMonitor = monitor; - isWindow = window; - type = type_; - bool alwaysOnTop = config_get_bool(GetGlobalConfig(), "BasicWindow", "ProjectorAlwaysOnTop"); - if (alwaysOnTop && !window) + if (alwaysOnTop && !isWindow) SetAlwaysOnTop(this, true); show(); - if (window) { - UpdateProjectorTitle(title); + if (isWindow) { + UpdateProjectorTitle(projectorTitle); windowedProjectors.push_back(this); } else { - QScreen *screen = QGuiApplication::screens()[monitor]; + QScreen *screen = QGuiApplication::screens()[savedMonitor]; setGeometry(screen->geometry()); QAction *action = new QAction(this); @@ -169,55 +219,6 @@ void OBSProjector::Init(int monitor, bool window, QString title, if (source) obs_source_inc_showing(source); - if (type == ProjectorType::Multiview) { - obs_enter_graphics(); - gs_render_start(true); - gs_vertex2f(0.001f, 0.001f); - gs_vertex2f(0.001f, 0.997f); - gs_vertex2f(0.997f, 0.997f); - gs_vertex2f(0.997f, 0.001f); - gs_vertex2f(0.001f, 0.001f); - outerBox = gs_render_save(); - - gs_render_start(true); - gs_vertex2f(0.04f, 0.04f); - gs_vertex2f(0.04f, 0.96f); - gs_vertex2f(0.96f, 0.96f); - gs_vertex2f(0.96f, 0.04f); - gs_vertex2f(0.04f, 0.04f); - innerBox = gs_render_save(); - - gs_render_start(true); - gs_vertex2f(0.15f, 0.04f); - gs_vertex2f(0.15f, 0.96f); - leftVLine = gs_render_save(); - - gs_render_start(true); - gs_vertex2f(0.85f, 0.04f); - gs_vertex2f(0.85f, 0.96f); - rightVLine = gs_render_save(); - - gs_render_start(true); - gs_vertex2f(0.0f, 0.5f); - gs_vertex2f(0.075f, 0.5f); - leftLine = gs_render_save(); - - gs_render_start(true); - gs_vertex2f(0.5f, 0.0f); - gs_vertex2f(0.5f, 0.09f); - topLine = gs_render_save(); - - gs_render_start(true); - gs_vertex2f(0.925f, 0.5f); - gs_vertex2f(1.0f, 0.5f); - rightLine = gs_render_save(); - obs_leave_graphics(); - - UpdateMultiview(); - - multiviewProjectors.push_back(this); - } - ready = true; } diff --git a/UI/window-projector.hpp b/UI/window-projector.hpp index 5ece95bd5..35badccee 100644 --- a/UI/window-projector.hpp +++ b/UI/window-projector.hpp @@ -27,8 +27,8 @@ private: void mousePressEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; - int savedMonitor = 0; - bool isWindow = false; + int savedMonitor; + bool isWindow; QString projectorTitle; ProjectorType type = ProjectorType::Source; OBSWeakSource multiviewScenes[8]; @@ -49,11 +49,11 @@ private slots: void EscapeTriggered(); public: - OBSProjector(QWidget *parent, obs_source_t *source, bool window); + OBSProjector(QWidget *widget, obs_source_t *source_, int monitor, + QString title, ProjectorType type_); ~OBSProjector(); - void Init(int monitor, bool window, QString title, - ProjectorType type = ProjectorType::Source); + void Init(); OBSSource GetSource(); ProjectorType GetProjectorType(); From 3390be50ce7ead6874690369e24961ffcafc6b37 Mon Sep 17 00:00:00 2001 From: Shaolin Date: Thu, 1 Mar 2018 00:20:54 -0300 Subject: [PATCH 14/15] UI: Remove a second call to OpenSavedProjectors OpenSavedProjectors is already called from RefreshSceneCollections earlier by OBSInit. --- UI/window-basic-main.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 2237f88b2..c18c05c0a 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -1480,8 +1480,6 @@ void OBSBasic::OBSInit() SystemTray(true); - OpenSavedProjectors(); - if (windowState().testFlag(Qt::WindowFullScreen)) fullscreenInterface = true; From 9211dba267696dd7be212a8f8dabccdd9a26fbc2 Mon Sep 17 00:00:00 2001 From: Shaolin Date: Thu, 1 Mar 2018 02:10:32 -0300 Subject: [PATCH 15/15] UI: Save windowed projectors on exit --- UI/window-basic-main.cpp | 68 ++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index c18c05c0a..da8bb0120 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -433,8 +433,22 @@ obs_data_array_t *OBSBasic::SaveProjectors() obs_data_t *data = obs_data_create(); ProjectorType type = projector->GetProjectorType(); + switch (type) { + case ProjectorType::Scene: + case ProjectorType::Source: { + obs_source_t *source = projector->GetSource(); + const char *name = obs_source_get_name(source); + obs_data_set_string(data, "name", name); + break; + } + default: + break; + } obs_data_set_int(data, "monitor", projector->GetMonitor()); obs_data_set_int(data, "type", static_cast(type)); + obs_data_set_string(data, "geometry", + projector->saveGeometry().toBase64() + .constData()); obs_data_array_push_back(savedProjectors, data); obs_data_release(data); }; @@ -442,6 +456,9 @@ obs_data_array_t *OBSBasic::SaveProjectors() for (QPointer &proj : projectors) saveProjector(static_cast(proj.data())); + for (QPointer &proj : windowProjectors) + saveProjector(static_cast(proj.data())); + return savedProjectors; } @@ -595,6 +612,9 @@ void OBSBasic::LoadSavedProjectors(obs_data_array_t *array) info->monitor = obs_data_get_int(data, "monitor"); info->type = static_cast(obs_data_get_int(data, "type")); + info->geometry = std::string( + obs_data_get_string(data, "geometry")); + info->name = std::string(obs_data_get_string(data, "name")); savedProjectorsArray.emplace_back(info); obs_data_release(data); @@ -5570,58 +5590,58 @@ void OBSBasic::OpenSavedProjectors() return; for (SavedProjectorInfo *info : savedProjectorsArray) { + OBSProjector *projector = nullptr; switch (info->type) { - case ProjectorType::Source: { - OBSSource source = obs_get_source_by_name( - info->name.c_str()); - if (!source) - continue; - - QString text = QString::fromUtf8( - obs_source_get_name(source)); - QString title = QTStr("SourceWindow") + " - " + text; - - OpenProjector(source, info->monitor, title, - ProjectorType::Source); - - obs_source_release(source); - break; - } + case ProjectorType::Source: case ProjectorType::Scene: { OBSSource source = obs_get_source_by_name( info->name.c_str()); if (!source) continue; - QString text = QString::fromUtf8( - obs_source_get_name(source)); - QString title = QTStr("SceneWindow") + " - " + text; + QString title = nullptr; + if (info->monitor < 0) + title = QString::fromUtf8( + obs_source_get_name(source)); - OpenProjector(source, info->monitor, title, - ProjectorType::Scene); + projector = OpenProjector(source, info->monitor, title, + info->type); obs_source_release(source); break; } case ProjectorType::Preview: { - OpenProjector(nullptr, info->monitor, + projector = OpenProjector(nullptr, info->monitor, QTStr("PreviewWindow"), ProjectorType::Preview); break; } case ProjectorType::StudioProgram: { - OpenProjector(nullptr, info->monitor, + projector = OpenProjector(nullptr, info->monitor, QTStr("StudioProgramWindow"), ProjectorType::StudioProgram); break; } case ProjectorType::Multiview: { - OpenProjector(nullptr, info->monitor, + projector = OpenProjector(nullptr, info->monitor, QTStr("MultiviewWindowed"), ProjectorType::Multiview); break; } } + + if (!info->geometry.empty()) { + QByteArray byteArray = QByteArray::fromBase64( + QByteArray(info->geometry.c_str())); + projector->restoreGeometry(byteArray); + + if (!WindowPositionValid(projector->normalGeometry())) { + QRect rect = App()->desktop()->geometry(); + projector->setGeometry(QStyle::alignedRect( + Qt::LeftToRight, + Qt::AlignCenter, size(), rect)); + } + } } }