diff --git a/UI/window-projector.cpp b/UI/window-projector.cpp index 7b8dc0f48..600a49ae3 100644 --- a/UI/window-projector.cpp +++ b/UI/window-projector.cpp @@ -14,6 +14,7 @@ static QList multiviewProjectors; static bool updatingMultiview = false, drawLabel, drawSafeArea, mouseSwitching, transitionOnDoubleClick; static MultiviewLayout multiviewLayout; +static size_t maxSrcs, numSrcs; OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, int monitor, QString title, ProjectorType type_) @@ -452,7 +453,7 @@ void OBSProjector::OBSRenderMultiview(void *data, uint32_t cx, uint32_t cy) /* ----------------------------- */ /* draw sources */ - for (size_t i = 0; i < 8; i++) { + for (size_t i = 0; i < numSrcs; i++) { OBSSource src = OBSGetStrongRef(window->multiviewScenes[i]); // Handle all the offsets @@ -673,22 +674,22 @@ static int getSourceByPosition(int x, int y) int minY = 0; int maxX = cx; int maxY = cy; - int halfX = cx / 2; - int halfY = cy / 2; + int pvwpgmX = cx / 2; + int pvwpgmY = cy / 2; int pos = -1; switch (multiviewLayout) { case MultiviewLayout::VERTICAL_LEFT_8_SCENES: if (float(cx) / float(cy) > ratio) { int validX = cy * ratio; - maxX = halfX + (validX / 2); + maxX = pvwpgmX + (validX / 2); } else { int validY = cx / ratio; - minY = halfY - (validY / 2); - maxY = halfY + (validY / 2); + minY = pvwpgmY - (validY / 2); + maxY = pvwpgmY + (validY / 2); } - minX = halfX; + minX = pvwpgmX; if (x < minX || x > maxX || y < minY || y > maxY) break; @@ -700,14 +701,14 @@ static int getSourceByPosition(int x, int y) case MultiviewLayout::VERTICAL_RIGHT_8_SCENES: if (float(cx) / float(cy) > ratio) { int validX = cy * ratio; - minX = halfX - (validX / 2); + minX = pvwpgmX - (validX / 2); } else { int validY = cx / ratio; - minY = halfY - (validY / 2); - maxY = halfY + (validY / 2); + minY = pvwpgmY - (validY / 2); + maxY = pvwpgmY + (validY / 2); } - maxX = halfX; + maxX = pvwpgmX; if (x < minX || x > maxX || y < minY || y > maxY) break; @@ -719,14 +720,14 @@ static int getSourceByPosition(int x, int y) case MultiviewLayout::HORIZONTAL_BOTTOM_8_SCENES: if (float(cx) / float(cy) > ratio) { int validX = cy * ratio; - minX = halfX - (validX / 2); - maxX = halfX + (validX / 2); + minX = pvwpgmX - (validX / 2); + maxX = pvwpgmX + (validX / 2); } else { int validY = cx / ratio; - minY = halfY - (validY / 2); + minY = pvwpgmY - (validY / 2); } - maxY = halfY; + maxY = pvwpgmY; if (x < minX || x > maxX || y < minY || y > maxY) break; @@ -738,14 +739,14 @@ static int getSourceByPosition(int x, int y) default: // MultiviewLayout::HORIZONTAL_TOP_8_SCENES if (float(cx) / float(cy) > ratio) { int validX = cy * ratio; - minX = halfX - (validX / 2); - maxX = halfX + (validX / 2); + minX = pvwpgmX - (validX / 2); + maxX = pvwpgmX + (validX / 2); } else { int validY = cx / ratio; - maxY = halfY + (validY / 2); + maxY = pvwpgmY + (validY / 2); } - minY = halfY; + minY = pvwpgmY; if (x < minX || x > maxX || y < minY || y > maxY) break; @@ -848,12 +849,32 @@ void OBSProjector::UpdateMultiview() struct obs_frontend_source_list scenes = {}; obs_frontend_get_scenes(&scenes); - int curIdx = 0; + size_t curIdx = 0; multiviewLabels[0] = CreateLabel(Str("StudioMode.Preview"), h / 2); multiviewLabels[1] = CreateLabel(Str("StudioMode.Program"), h / 2); - for (size_t i = 0; i < scenes.sources.num && curIdx < 8; i++) { + multiviewLayout = static_cast(config_get_int( + GetGlobalConfig(), "BasicWindow", "MultiviewLayout")); + + drawLabel = config_get_bool(GetGlobalConfig(), + "BasicWindow", "MultiviewDrawNames"); + + drawSafeArea = config_get_bool(GetGlobalConfig(), "BasicWindow", + "MultiviewDrawAreas"); + + mouseSwitching = config_get_bool(GetGlobalConfig(), "BasicWindow", + "MultiviewMouseSwitch"); + + transitionOnDoubleClick = config_get_bool(GetGlobalConfig(), + "BasicWindow", "TransitionOnDoubleClick"); + + switch(multiviewLayout) { + default: + maxSrcs = 8; + } + + for (size_t i = 0; i < scenes.sources.num && curIdx < maxSrcs; i++) { obs_source_t *src = scenes.sources.array[i]; OBSData data = obs_source_get_private_settings(src); obs_data_release(data); @@ -874,23 +895,9 @@ void OBSProjector::UpdateMultiview() curIdx++; } + numSrcs = curIdx; obs_frontend_source_list_free(&scenes); - - multiviewLayout = static_cast(config_get_int( - GetGlobalConfig(), "BasicWindow", "MultiviewLayout")); - - drawLabel = config_get_bool(GetGlobalConfig(), - "BasicWindow", "MultiviewDrawNames"); - - drawSafeArea = config_get_bool(GetGlobalConfig(), "BasicWindow", - "MultiviewDrawAreas"); - - mouseSwitching = config_get_bool(GetGlobalConfig(), "BasicWindow", - "MultiviewMouseSwitch"); - - transitionOnDoubleClick = config_get_bool(GetGlobalConfig(), - "BasicWindow", "TransitionOnDoubleClick"); } void OBSProjector::UpdateProjectorTitle(QString name)