From: kub Date: Thu, 14 Dec 2023 21:13:01 +0000 (+0100) Subject: improve redraw events handling X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7cddc27accc089fdb58e99cdac0071cc904ecef1;p=libpicofe.git improve redraw events handling --- diff --git a/in_sdl.c b/in_sdl.c index d8f5ed5..b36beee 100644 --- a/in_sdl.c +++ b/in_sdl.c @@ -355,33 +355,16 @@ static int handle_joy_event(struct in_sdl_state *state, SDL_Event *event, static int collect_events(struct in_sdl_state *state, int *one_kc, int *one_down) { - SDL_Event events[4]; + SDL_Event events[8]; Uint32 mask = state->joy ? JOY_EVENTS : (SDL_ALLEVENTS & ~JOY_EVENTS); int count, maxcount, is_emukey = 0; - int i, ret, retval = 0; - int num_events, num_peeped_events; + int i = 0, ret = 0, retval = 0; SDL_Event *event; -#ifdef SDL_REDRAW_EVT - if (state->rdraw) { - if (one_kc != NULL) - *one_kc = SDLK_UNKNOWN; - if (one_down != NULL) - *one_down = 0; - state->rdraw = 0; - return 1; - } -#endif - maxcount = (one_kc != NULL) ? 1 : sizeof(events) / sizeof(events[0]); - SDL_PumpEvents(); - num_events = SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, mask); - - for (num_peeped_events = 0; num_peeped_events < num_events; num_peeped_events += count) { - count = SDL_PeepEvents(events, maxcount, SDL_GETEVENT, mask); - if (count <= 0) - break; + maxcount = sizeof(events) / sizeof(events[0]); + if ((count = SDL_PeepEvents(events, maxcount, SDL_GETEVENT, mask)) > 0) { for (i = 0; i < count; i++) { event = &events[i]; if (state->joy) { @@ -397,35 +380,43 @@ static int collect_events(struct in_sdl_state *state, int *one_kc, int *one_down SDL_PushEvent(event); break; default: +#ifdef SDL_REDRAW_EVT + state->rdraw |= (one_kc != NULL && + event->type == SDL_VIDEORESIZE); +#endif if (ext_event_handler != NULL) ext_event_handler(event); break; } -#ifdef SDL_REDRAW_EVT - if (ret != -2 && event->type == SDL_VIDEORESIZE) { - if (one_kc != NULL) - *one_kc = SDLK_UNKNOWN; - if (one_down != NULL) - *one_down = 1; - state->rdraw = 1; - is_emukey = 1, ret = 1; - } else - continue; -#endif + continue; } retval |= ret; if ((is_emukey || one_kc != NULL) && retval) { - // don't lose events other devices might want to handle - if (++i < count) - SDL_PeepEvents(events+i, count-i, SDL_ADDEVENT, mask); - goto out; + break; } } } -out: +#ifdef SDL_REDRAW_EVT + // if the event queue has been emptied and resize events were in it + if (state->rdraw && count == 0) { + state->rdraw = 0; + // dummy key event to force returning from the key loop, + // so the application has a chance to redraw the window + if (one_kc != NULL) { + *one_kc = SDLK_UNKNOWN; + retval |= 1; + } + if (one_down != NULL) + *one_down = 1; + } else + i++; +#endif + // don't lose events other devices might want to handle + if (i < count) + SDL_PeepEvents(events+i, count-i, SDL_ADDEVENT, mask); return retval; }