From 9211dba267696dd7be212a8f8dabccdd9a26fbc2 Mon Sep 17 00:00:00 2001 From: Shaolin Date: Thu, 1 Mar 2018 02:10:32 -0300 Subject: [PATCH] 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)); + } + } } }