Re: [hatari-devel] Keyup bug in SDL GUI

[ Thread Index | Date Index | More lists.tuxfamily.org/hatari-devel Archives ]


> Am 02.11.2022 um 18:42 schrieb Thomas Huth <th.huth@xxxxxxxxx>:
> 
> Am Wed, 2 Nov 2022 10:06:50 +0100
> schrieb Andreas Grabher <andreas_g86@xxxxxxxxxx>:
> 
>>>> Am 31.10.2022 um 19:48 schrieb Eero Tamminen <oak@xxxxxxxxxxxxxx>:
>>> 
>>> Hi,
>>> 
>>>> On 31.10.2022 20.35, Andreas Grabher wrote:
>>>> I might have found a bug in the SDL GUI. This scenario:
>>>> In the guest operating system I confirm some action by pressing enter  
>>>> —> SDL_KEYDOWN with SDLK_RETURN  
>>>> Due to some bug in the OS I get a double fault, which then activates Dialog_HaltDlg() before I am able to release the key
>>>> I then release the key  
>>>> —> SDL_KEYUP with SDLK_RETURN  
>>>> At this time we are already in the SDL_WaitEvent()-Loop in SDLGui_DoDialogExt() and the event is recognized as key up in the GUI. This leads to automatically pressing the default button which exits the dialog without me having a chance to select anything.
>>>> Can you confirm this? This will be difficult to fix.  
>>> 
>>> You can wait until all keys are up, before starting accepting input in SDL GUI.
>>> 
>>> No notify user about this wait, you can show a note about keys being down in statusbar.
>>> 
>>> If SDL does not provide information about pressed keys, keymap.c keeps count of them.
>>> 
>>> 
>>>   - Eero
>>> 
>> Maybe calling SDL_ResetKeyboard() before entering the SDL_WaitEvent()-loop would be the solution?
> 
> I don't think this would be the right fix - in case you still hold the key
> when the SDL_ResetKeyboard() is done, you still get the KEYUP event
> afterwards once the key is released. I think you have to something like
> this (untested):
> 
> const Uint8 *keys = SDL_GetKeyboardState();
> while (keys[SDLK_RETURN])
>     SDL_PumpEvents();
> 
> HTH,
>  Thomas
> 
I just read through the SDL code a bit and I think it should work with SDL_ResetKeyboard(). That function will send KEYUP event for all pressed keys. Releasing a key afterwards won‘t send another KEYUP event until the key is pressed again.

This should fix the issue:
SDL_ResetKeyboard();
SDL_PumpEvents();
SDL_FlushEvent(SDL_KEYUP);

I have some more keyboard issues. Calling host routines can cause stuck keys, especially stuck modifiers. Not sure how this can be fixed. 


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/