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

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



> Am 29.11.2022 um 11:21 schrieb Andreas Grabher <andreas_g86@xxxxxxxxxx>:
> 
> 
>> 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. 
> 
I can now confirm that the SDL_ResetKeyboard() function works as expected. There is no KEYUP event afterwards except if i hold the key long enough to trigger key repeat. Maybe repeated key events should also be ignored in the GUI code. 




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