Browse Source

UI: Use rect intersection test for validating position

Instead of checking to see if the window's position is valid, check to
see if the rectangles of the window and the monitor intersect via a
rectangle intersection test.
jp9000 9 years ago
parent
commit
48f0c73f82
3 changed files with 9 additions and 9 deletions
  1. 7 5
      UI/obs-app.cpp
  2. 1 1
      UI/obs-app.hpp
  3. 1 3
      UI/window-basic-main.cpp

+ 7 - 5
UI/obs-app.cpp

@@ -1518,17 +1518,19 @@ bool GetClosestUnusedFileName(std::string &path, const char *extension)
 	return true;
 	return true;
 }
 }
 
 
-bool WindowPositionValid(int x, int y)
+bool WindowPositionValid(QRect rect)
 {
 {
 	vector<MonitorInfo> monitors;
 	vector<MonitorInfo> monitors;
 	GetMonitors(monitors);
 	GetMonitors(monitors);
 
 
 	for (auto &monitor : monitors) {
 	for (auto &monitor : monitors) {
-		int br_x = monitor.x + monitor.cx;
-		int br_y = monitor.y + monitor.cy;
+		int left   = int(monitor.x);
+		int top    = int(monitor.y);
+		int right  = left + int(monitor.cx);
+		int bottom = top  + int(monitor.cy);
 
 
-		if (x >= monitor.x && x < br_x &&
-		    y >= monitor.y && y < br_y)
+		if ((rect.left() - right)  < 0 && (left - rect.right())  < 0 &&
+		    (rect.top()  - bottom) < 0 && (top  - rect.bottom()) < 0)
 			return true;
 			return true;
 	}
 	}
 
 

+ 1 - 1
UI/obs-app.hpp

@@ -166,7 +166,7 @@ inline const char *Str(const char *lookup) {return App()->GetString(lookup);}
 bool GetFileSafeName(const char *name, std::string &file);
 bool GetFileSafeName(const char *name, std::string &file);
 bool GetClosestUnusedFileName(std::string &path, const char *extension);
 bool GetClosestUnusedFileName(std::string &path, const char *extension);
 
 
-bool WindowPositionValid(int x, int y);
+bool WindowPositionValid(QRect rect);
 
 
 static inline int GetProfilePath(char *path, size_t size, const char *file)
 static inline int GetProfilePath(char *path, size_t size, const char *file)
 {
 {

+ 1 - 3
UI/window-basic-main.cpp

@@ -137,9 +137,7 @@ OBSBasic::OBSBasic(QWidget *parent)
 		restoreGeometry(byteArray);
 		restoreGeometry(byteArray);
 
 
 		QRect windowGeometry = normalGeometry();
 		QRect windowGeometry = normalGeometry();
-		int posx = windowGeometry.x();
-		int posy = windowGeometry.y();
-		if (!WindowPositionValid(posx, posy)) {
+		if (!WindowPositionValid(windowGeometry)) {
 			QRect rect = App()->desktop()->availableGeometry();
 			QRect rect = App()->desktop()->availableGeometry();
 			setGeometry(QStyle::alignedRect(
 			setGeometry(QStyle::alignedRect(
 						Qt::LeftToRight,
 						Qt::LeftToRight,