From 412a75601e0bcc1525a068eb9c8e54b5e0366f4c Mon Sep 17 00:00:00 2001 From: Chris Angelico Date: Sat, 1 Jun 2019 06:51:39 +1000 Subject: [PATCH 1/2] UI: Break out the opening of a projector into a slot function --- UI/window-basic-main.cpp | 9 ++++++++- UI/window-basic-main.hpp | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index f092c36f5..ad9d6e707 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -6570,6 +6570,13 @@ void OBSBasic::OpenSceneWindow() void OBSBasic::OpenSavedProjectors() { for (SavedProjectorInfo *info : savedProjectorsArray) { + OpenSavedProjector(info); + } +} + +void OBSBasic::OpenSavedProjector(SavedProjectorInfo *info) +{ + if (info) { OBSProjector *projector = nullptr; switch (info->type) { case ProjectorType::Source: @@ -6577,7 +6584,7 @@ void OBSBasic::OpenSavedProjectors() OBSSource source = obs_get_source_by_name(info->name.c_str()); if (!source) - continue; + return; projector = OpenProjector(source, info->monitor, info->type); diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index e4ecc2791..a92da91d3 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -621,6 +621,7 @@ private slots: void ScenePasteFilters(); void CheckDiskSpaceRemaining(); + void OpenSavedProjector(SavedProjectorInfo *info); void ScenesReordered(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row); From 7c540acc11b53935b2d2bddecf4b8d9fb06731b8 Mon Sep 17 00:00:00 2001 From: Chris Angelico Date: Sat, 1 Jun 2019 13:13:24 +1000 Subject: [PATCH 2/2] UI: Create an API for opening projector windows --- UI/api-interface.cpp | 25 +++++++++++++++++++ UI/obs-frontend-api/obs-frontend-api.cpp | 7 ++++++ UI/obs-frontend-api/obs-frontend-api.h | 2 ++ UI/obs-frontend-api/obs-frontend-internal.hpp | 3 +++ UI/window-basic-main.cpp | 1 + 5 files changed, 38 insertions(+) diff --git a/UI/api-interface.cpp b/UI/api-interface.cpp index 0d928ac76..a2139efa4 100644 --- a/UI/api-interface.cpp +++ b/UI/api-interface.cpp @@ -371,6 +371,31 @@ struct OBSStudioAPI : obs_frontend_callbacks { return App()->GlobalConfig(); } + void obs_frontend_open_projector(const char *type, int monitor, + const char *geometry, + const char *name) override + { + SavedProjectorInfo proj = { + ProjectorType::Preview, + monitor, + geometry ? geometry : "", + name ? name : "", + }; + if (type) { + if (astrcmpi(type, "Source") == 0) + proj.type = ProjectorType::Source; + else if (astrcmpi(type, "Scene") == 0) + proj.type = ProjectorType::Scene; + else if (astrcmpi(type, "StudioProgram") == 0) + proj.type = ProjectorType::StudioProgram; + else if (astrcmpi(type, "Multiview") == 0) + proj.type = ProjectorType::Multiview; + } + QMetaObject::invokeMethod(main, "OpenSavedProjector", + WaitConnection(), + Q_ARG(SavedProjectorInfo *, &proj)); + } + void obs_frontend_save(void) override { main->SaveProject(); } void obs_frontend_defer_save_begin(void) override diff --git a/UI/obs-frontend-api/obs-frontend-api.cpp b/UI/obs-frontend-api/obs-frontend-api.cpp index c5fafeb0c..8066666c5 100644 --- a/UI/obs-frontend-api/obs-frontend-api.cpp +++ b/UI/obs-frontend-api/obs-frontend-api.cpp @@ -327,6 +327,13 @@ config_t *obs_frontend_get_global_config(void) : nullptr; } +void obs_frontend_open_projector(const char *type, int monitor, + const char *geometry, const char *name) +{ + if (callbacks_valid()) + c->obs_frontend_open_projector(type, monitor, geometry, name); +} + void obs_frontend_save(void) { if (callbacks_valid()) diff --git a/UI/obs-frontend-api/obs-frontend-api.h b/UI/obs-frontend-api/obs-frontend-api.h index f350d520b..18e9d4e1c 100644 --- a/UI/obs-frontend-api/obs-frontend-api.h +++ b/UI/obs-frontend-api/obs-frontend-api.h @@ -165,6 +165,8 @@ EXPORT void obs_frontend_replay_buffer_save(void); EXPORT void obs_frontend_replay_buffer_stop(void); EXPORT bool obs_frontend_replay_buffer_active(void); +EXPORT void obs_frontend_open_projector(const char *type, int monitor, + const char *geometry, const char *name); EXPORT void obs_frontend_save(void); EXPORT void obs_frontend_defer_save_begin(void); EXPORT void obs_frontend_defer_save_end(void); diff --git a/UI/obs-frontend-api/obs-frontend-internal.hpp b/UI/obs-frontend-api/obs-frontend-internal.hpp index 80051ca79..a5ba063b9 100644 --- a/UI/obs-frontend-api/obs-frontend-internal.hpp +++ b/UI/obs-frontend-api/obs-frontend-internal.hpp @@ -72,6 +72,9 @@ struct obs_frontend_callbacks { virtual config_t *obs_frontend_get_profile_config(void) = 0; virtual config_t *obs_frontend_get_global_config(void) = 0; + virtual void obs_frontend_open_projector(const char *type, int monitor, + const char *geometry, + const char *name) = 0; virtual void obs_frontend_save(void) = 0; virtual void obs_frontend_defer_save_begin(void) = 0; virtual void obs_frontend_defer_save_end(void) = 0; diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index ad9d6e707..a5a5cf76d 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -242,6 +242,7 @@ OBSBasic::OBSBasic(QWidget *parent) qRegisterMetaType("OBSSceneItem"); qRegisterMetaType("OBSSource"); qRegisterMetaType("obs_hotkey_id"); + qRegisterMetaType("SavedProjectorInfo *"); qRegisterMetaTypeStreamOperators>>( "std::vector>");