1
0
Эх сурвалжийг харах

UI: Delete projector when monitor is disconnected

Clayton Groeneveld 5 жил өмнө
parent
commit
846c3d5acc

+ 15 - 1
UI/window-projector.cpp

@@ -63,6 +63,8 @@ OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, int monitor,
 	};
 
 	connect(this, &OBSQTDisplay::DisplayCreated, addDrawCallback);
+	connect(App(), &QGuiApplication::screenRemoved, this,
+		&OBSProjector::ScreenRemoved);
 
 	if (type == ProjectorType::Multiview) {
 		obs_enter_graphics();
@@ -168,12 +170,14 @@ OBSProjector::~OBSProjector()
 		multiviewProjectors.removeAll(this);
 
 	App()->DecrementSleepInhibition();
+
+	screen = nullptr;
 }
 
 void OBSProjector::SetMonitor(int monitor)
 {
 	savedMonitor = monitor;
-	QScreen *screen = QGuiApplication::screens()[monitor];
+	screen = QGuiApplication::screens()[monitor];
 	setGeometry(screen->geometry());
 	showFullScreen();
 	SetHideCursor();
@@ -1078,6 +1082,7 @@ void OBSProjector::OpenWindowedProjector()
 	savedMonitor = -1;
 
 	UpdateProjectorTitle(QT_UTF8(obs_source_get_name(source)));
+	screen = nullptr;
 }
 
 void OBSProjector::ResizeToContent()
@@ -1135,3 +1140,12 @@ void OBSProjector::SetIsAlwaysOnTop(bool isAlwaysOnTop, bool isOverridden)
 
 	SetAlwaysOnTop(this, isAlwaysOnTop);
 }
+
+void OBSProjector::ScreenRemoved(QScreen *screen_)
+{
+	if (GetMonitor() < 0 || !screen)
+		return;
+
+	if (screen == screen_)
+		EscapeTriggered();
+}

+ 3 - 0
UI/window-projector.hpp

@@ -77,12 +77,15 @@ private:
 	QRect prevGeometry;
 	void SetMonitor(int monitor);
 
+	QScreen *screen = nullptr;
+
 private slots:
 	void EscapeTriggered();
 	void OpenFullScreenProjector();
 	void ResizeToContent();
 	void OpenWindowedProjector();
 	void AlwaysOnTopToggled(bool alwaysOnTop);
+	void ScreenRemoved(QScreen *screen_);
 
 public:
 	OBSProjector(QWidget *widget, obs_source_t *source_, int monitor,