Workaround continuous resizing on Windows/MacOS
On Windows and MacOS, resizing blocks the event loop, so resizing events are not triggered: - <https://bugzilla.libsdl.org/show_bug.cgi?id=2077> - <https://stackoverflow.com/a/40693139/1987178> As a workaround, register an event watcher to render the screen from another thread. Since the whole event loop is blocked during resizing, the screen content is not refreshed (on Windows and MacOS) until resizing ends.
This commit is contained in:
parent
b858204786
commit
0b1e59186f
1 changed files with 22 additions and 0 deletions
|
@ -35,7 +35,29 @@ static struct input_manager input_manager = {
|
||||||
.screen = &screen,
|
.screen = &screen,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(__APPLE__) || defined(__WINDOWS__)
|
||||||
|
# define CONTINUOUS_RESIZING_WORKAROUND
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONTINUOUS_RESIZING_WORKAROUND
|
||||||
|
// On Windows and MacOS, resizing blocks the event loop, so resizing events are
|
||||||
|
// not triggered. As a workaround, handle them in an event handler.
|
||||||
|
//
|
||||||
|
// <https://bugzilla.libsdl.org/show_bug.cgi?id=2077>
|
||||||
|
// <https://stackoverflow.com/a/40693139/1987178>
|
||||||
|
static int event_watcher(void* data, SDL_Event* event) {
|
||||||
|
if (event->type == SDL_WINDOWEVENT && event->window.event == SDL_WINDOWEVENT_RESIZED) {
|
||||||
|
// called from another thread, not very safe, but it's a workaround!
|
||||||
|
screen_render(&screen);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void event_loop(void) {
|
static void event_loop(void) {
|
||||||
|
#ifdef CONTINUOUS_RESIZING_WORKAROUND
|
||||||
|
SDL_AddEventWatch(event_watcher, screen.window);
|
||||||
|
#endif
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while (SDL_WaitEvent(&event)) {
|
while (SDL_WaitEvent(&event)) {
|
||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
|
|
Loading…
Reference in a new issue