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();