Bug #45385 related to keyboard and probably wineserver - where to start the search

John Found johnfound at asm32.info
Wed Jun 27 11:24:27 CDT 2018


While reading the code in wineX11.drv/keyboard.c I noticed the following fragment from the function X11DRV_KeymapNotify:

    for (vkey = VK_LSHIFT; vkey <= VK_RMENU; vkey++)
    {
        int m = vkey - VK_LSHIFT;
>>>     if (modifiers[m].vkey && !(keystate[vkey] & 0x80) != !modifiers[m].pressed)
        {
            TRACE( "Adjusting state for vkey %#.2x. State before %#.2x\n",
                   modifiers[m].vkey, keystate[vkey]);

            update_key_state( keystate, vkey, modifiers[m].pressed );
            changed = TRUE;
        }
    }

Can someone explain what the condition pointed by >>> is doing? (Unfortunately, my C skills are pretty low...)

Why not simply "(modifiers[m].vkey && (keystate[vkey] & 0x80) != modifiers[m].pressed)"?

And why is modifiers[m].vkey included in the condition?

Best Regards

On Wed, 27 Jun 2018 08:50:22 +0300
John Found <johnfound at asm32.info> wrote:

> I just reported bug #45385 (https://bugs.winehq.org/show_bug.cgi?id=45385) and want to try to fix it.
> 
> So I want to ask about some preliminary directions - where to check the code, 
> what is the general structure of the code related to the bug subject, possible suspicious places.
> 
> Here is the full bug report in order to save you a visit to the bug tracker:
> 
> > I noticed that the state of the keys sometimes sticks in pressed state.
> > 
> > This happens when cycling windows with some shortcut key combination. 
> > 
> > For example if cycling with Alt+Tab, on pressing Alt, the program gets WM_KEYDOWN and the state of the VK_MENU becomes pressed. But after cycling windows, the program does not get WM_KEYUP because the window is not focused and VK_MENU (and the respective VK_LMENU or VK_RMENU) remain in pressed state.
> > 
> > When cycling back to the program window, the window get focused only after releasing Alt key, so it does not get this event as well.
> > 
> > If cycling windows with another shortcut key combination (for example Alt+Shift+Tab - for backward cycling) both VK_MENU and VK_SHIFT keys stick.
> > 
> > In the same time, GetAsyncKeyState returns the proper state of the keys.
> > 
> > Note1: The problem is obviously in the wineserver code, because it handles the key state tables for the different threads.
> > 
> > Note2: The effect happens only sometimes. It seems the code for proper processing is already there, but some racing conditions have place.
> > 
> > Note3: There is some probability that the effect is in result of my application code, but it never happens on real Windows, so I considered it a bug.
> > 
> > Note4: I tried to workaround this problem by reading the whole table by GetAsyncKeyState and setting it then with SetKeyboardState on WM_ACTIVATE message of the main window. This workaround actually works, but is too ugly IMO.
> > The same trick on WM_ACTIVATEAPP does not work.

-- 
John Found <johnfound at asm32.info>



More information about the wine-devel mailing list