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