add expose event to redraw handling
authorkub <derkub@gmail.com>
Wed, 12 Feb 2025 18:23:52 +0000 (19:23 +0100)
committerkub <derkub@gmail.com>
Wed, 12 Feb 2025 18:23:58 +0000 (19:23 +0100)
in_sdl.c

index 43d44c5..bfd0647 100644 (file)
--- a/in_sdl.c
+++ b/in_sdl.c
@@ -25,8 +25,8 @@ struct in_sdl_state {
        int joy_id;
        int axis_keydown[2];
 #ifdef SDL_REDRAW_EVT
-       int rdraw;
-       SDL_Event redraw;
+       int redraw;
+       SDL_Event revent;
 #endif
        keybits_t keystate[SDLK_LAST / KEYBITS_WORD_BITS + 1];
        // emulator keys should always be processed immediately lest one is lost
@@ -384,8 +384,13 @@ static int collect_events(struct in_sdl_state *state, int *one_kc, int *one_down
                                        default:
 #ifdef SDL_REDRAW_EVT
                                                if (event->type == SDL_VIDEORESIZE) {
-                                                       state->rdraw = 1;
-                                                       state->redraw = *event;
+                                                       state->redraw = 1;
+                                                       state->revent = *event;
+                                               } else if (event->type == SDL_VIDEOEXPOSE) {
+                                                       if (state->revent.type == SDL_NOEVENT) {
+                                                               state->redraw = 1;
+                                                               state->revent = *event;
+                                                       }
                                                } else
 #endif
                                                if (ext_event_handler != NULL)
@@ -404,11 +409,12 @@ static int collect_events(struct in_sdl_state *state, int *one_kc, int *one_down
        }
 
 #ifdef SDL_REDRAW_EVT
-       // if the event queue has been emptied and resize events were in it
-       if (state->rdraw && count == 0) {
+       // if the event queue has been emptied and resize/expose events were in it
+       if (state->redraw && count == 0) {
                if (ext_event_handler != NULL)
-                       ext_event_handler(&state->redraw);
-               state->rdraw = 0;
+                       ext_event_handler(&state->revent);
+               state->redraw = 0;
+               state->revent.type = SDL_NOEVENT;
                // dummy key event to force returning from the key loop,
                // so the application has a chance to redraw the window
                if (one_kc != NULL) {