implement bounds check for window spawning

This commit is contained in:
aurora 2022-08-22 22:05:16 +03:00
parent 58353398ec
commit 8b3c4a84a8
2 changed files with 38 additions and 3 deletions

View file

@ -2517,6 +2517,35 @@ void FurnaceGUI::processPoint(SDL_Event& ev) {
}
}
// how many pixels should be visible at least at x/y dir
#define OOB_PIXELS_SAFETY 25
bool FurnaceGUI::detectOutOfBoundsWindow() {
int count = SDL_GetNumVideoDisplays();
if(count < 1) {
logW("bounds check: error %s", SDL_GetError());
return false;
}
SDL_Rect rect;
for(int i = 0;i < count;i ++) {
if(SDL_GetDisplayUsableBounds(i, &rect) != 0) {
logW("bounds check: error %s", SDL_GetError());
return false;
}
bool xbound = (rect.x + OOB_PIXELS_SAFETY) <= (scrX + scrW) && (rect.x + rect.w - OOB_PIXELS_SAFETY) >= scrX;
bool ybound = (rect.y + OOB_PIXELS_SAFETY) <= (scrY + scrH) && (rect.y + rect.h - OOB_PIXELS_SAFETY) >= scrY;
logD("bounds check: display %d is at %dx%dx%dx%d: %s%s", i, rect.x + OOB_PIXELS_SAFETY, rect.y + OOB_PIXELS_SAFETY, rect.x + rect.w - OOB_PIXELS_SAFETY, rect.y + rect.h - OOB_PIXELS_SAFETY, xbound ? "x" : "", ybound ? "y" : "");
if(xbound && ybound) {
return true;
}
}
return false;
}
bool FurnaceGUI::loop() {
bool doThreadedInput=!settings.noThreadedInput;
if (doThreadedInput) {
@ -2714,9 +2743,7 @@ bool FurnaceGUI::loop() {
// update config x/y/w/h values based on scrMax state
if(updateWindow) {
if(scrMax) {
scrConfY=scrConfX = SDL_WINDOWPOS_CENTERED_DISPLAY(SDL_GetWindowDisplayIndex(sdlWin));
} else {
if(!scrMax) {
scrConfX=scrX;
scrConfY=scrY;
scrConfW=scrW;
@ -4483,6 +4510,13 @@ bool FurnaceGUI::init() {
SDL_Init(SDL_INIT_VIDEO);
// if window would spawn out of bounds, force it to be get default position
if(!detectOutOfBoundsWindow()) {
scrMax = false;
scrX=scrConfX=SDL_WINDOWPOS_CENTERED;
scrY=scrConfY=SDL_WINDOWPOS_CENTERED;
}
sdlWin=SDL_CreateWindow("Furnace",scrX,scrY,scrW*dpiScale,scrH*dpiScale,SDL_WINDOW_RESIZABLE|SDL_WINDOW_ALLOW_HIGHDPI|(scrMax?SDL_WINDOW_MAXIMIZED:0)|(fullScreen?SDL_WINDOW_FULLSCREEN_DESKTOP:0));
if (sdlWin==NULL) {
logE("could not open window! %s",SDL_GetError());

View file

@ -1710,6 +1710,7 @@ class FurnaceGUI {
void runBackupThread();
void pushPartBlend();
void popPartBlend();
bool detectOutOfBoundsWindow();
int processEvent(SDL_Event* ev);
bool loop();
bool finish();