On Aug 16 17:31, Oliver Schmidt wrote:
Hi,
I had the problem, that the state of the modifier keys was lost when
a window is created (or raised).
Example: in window A Ctrl + some key opens a window B, then in
window B Ctrl + some other key triggers the next action. However
after the opening of window B the Ctrl key has to be released and
pressed again. If the user keeps the Ctrl key holding when the
window B is opened, the next key press X will be interpreted as X
and not as Ctrl+X.
I send a patch to fix this problem with this email: I just extended
the function winRestoreModeKeyStates in winkeybd.c to consider not
only the mode switch key but also the modifiers Ctrl, Shift,
Alt/AltGr by using the Windows function GetAsyncKeyState.
This patch works fine for me.
However one problem is unsolved: if the key combination for opening
window B (in the above example) is an AltGr key combination, the
GetAsyncKeyState will also report, that the Ctrl key is pressed,
which is not true, since this is the well known Windows fake Ctrl_L
:-(
Any suggestions how to solve this?
At that time, doesn't GetAsyncKeyState (VK_RMENU) also return 0?
So, shouldn't something along these lines do the trick:
BOOL ctrl = (GetAsyncKeyState (VK_CONTROL) 0);
BOOL shift = (GetAsyncKeyState (VK_CONTROL) 0);
BOOL alt = (GetAsyncKeyState (VK_CONTROL) 0);
BOOL altlang = (GetAsyncKeyState (VK_CONTROL) 0);
if (ctrl altlang)
ctrl = FALSE;
if (WIN_XOR (internalKeyStates ControlMask, ctrl)
winSendKeyEvent (KEY_LCtrl, ctrl);
if (WIN_XOR (internalKeyStates ShiftMask, shift))
winSendKeyEvent (KEY_ShiftL, shift);
if (WIN_XOR (internalKeyStates Mod1Mask, alt))
winSendKeyEvent (KEY_Alt, alt);
if (WIN_XOR (internalKeyStates Mod5Mask, altlang))
winSendKeyEvent (KEY_AltLang, altlang);
Corinna
--
Corinna Vinschen Please, send mails regarding Cygwin to
Cygwin Project Co-Leader cygwin AT cygwin DOT com
Red Hat
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://x.cygwin.com/docs/
FAQ: http://x.cygwin.com/docs/faq/