EventThread: Add 'recenter' parameter to window resize request

If true, centers the window on the current screen with the
new size.
This commit is contained in:
Amaryllis Kulla 2021-11-05 17:49:16 +01:00
parent d09fec941b
commit a92adee7f8
3 changed files with 37 additions and 7 deletions

View File

@ -201,9 +201,10 @@ RB_METHOD(graphicsResizeWindow)
RB_UNUSED_PARAM; RB_UNUSED_PARAM;
int width, height; int width, height;
rb_get_args(argc, argv, "ii", &width, &height RB_ARG_END); bool recenter = false;
rb_get_args(argc, argv, "ii|b", &width, &height, &recenter RB_ARG_END);
shState->eThread().requestWindowResize(width, height); shState->eThread().requestWindowResize(width, height, recenter);
return Qnil; return Qnil;
} }

View File

@ -101,6 +101,36 @@ bool EventThread::allocUserEvents()
return true; return true;
} }
static void writeResizeRequest(SDL_WindowEvent &event, int w, int h, bool recenter)
{
event.data1 = w;
event.data2 = h;
event.padding3 = recenter ? 1 : 0;
}
static void handleResizeRequest(SDL_Window *win, SDL_WindowEvent &event)
{
int newWidth = event.data1;
int newHeight = event.data2;
bool recenter = event.padding3 == 1;
if (recenter)
{
int display = SDL_GetWindowDisplayIndex(win);
if (display >= 0)
{
SDL_DisplayMode dm;
SDL_GetDesktopDisplayMode(display, &dm);
int newX = (dm.w - newWidth) / 2;
int newY = (dm.h - newHeight) / 2;
SDL_SetWindowPosition(win, newX, newY);
}
}
SDL_SetWindowSize(win, newWidth, newHeight);
}
EventThread::EventThread() EventThread::EventThread()
: fullscreen(false), : fullscreen(false),
showCursor(false) showCursor(false)
@ -410,7 +440,7 @@ void EventThread::process(RGSSThreadData &rtData)
break; break;
case REQUEST_WINRESIZE : case REQUEST_WINRESIZE :
SDL_SetWindowSize(win, event.window.data1, event.window.data2); handleResizeRequest(win, event.window);
break; break;
case REQUEST_MESSAGEBOX : case REQUEST_MESSAGEBOX :
@ -581,12 +611,11 @@ void EventThread::requestFullscreenMode(bool mode)
SDL_PushEvent(&event); SDL_PushEvent(&event);
} }
void EventThread::requestWindowResize(int width, int height) void EventThread::requestWindowResize(int width, int height, bool recenter)
{ {
SDL_Event event; SDL_Event event;
event.type = usrIdStart + REQUEST_WINRESIZE; event.type = usrIdStart + REQUEST_WINRESIZE;
event.window.data1 = width; writeResizeRequest(event.window, width, height, recenter);
event.window.data2 = height;
SDL_PushEvent(&event); SDL_PushEvent(&event);
} }

View File

@ -88,7 +88,7 @@ public:
/* Called from RGSS thread */ /* Called from RGSS thread */
void requestFullscreenMode(bool mode); void requestFullscreenMode(bool mode);
void requestWindowResize(int width, int height); void requestWindowResize(int width, int height, bool recenter = false);
void requestShowCursor(bool mode); void requestShowCursor(bool mode);
void requestTerminate(); void requestTerminate();