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?
Best regards,
Oliver
diff --git a/cygwin/hw/xwin/winkeybd.c b/cygwin/hw/xwin/winkeybd.c
index 9e5a9b0..e807fc5 100644
--- a/cygwin/hw/xwin/winkeybd.c
+++ b/cygwin/hw/xwin/winkeybd.c
@@ -255,6 +255,7 @@ void
winRestoreModeKeyStates (void)
{
DWORD dwKeyState;
+ BOOL modifierPressed;
BOOL processEvents = TRUE;
unsigned short internalKeyStates;
@@ -282,6 +283,34 @@ winRestoreModeKeyStates (void)
* have a logical XOR operator, so we use a macro instead.
*/
+ modifierPressed = (GetAsyncKeyState (VK_CONTROL) < 0);
+ if (WIN_XOR (internalKeyStates & ControlMask, modifierPressed))
+ {
+ if (modifierPressed) winSendKeyEvent (KEY_LCtrl, TRUE);
+ else winSendKeyEvent (KEY_LCtrl, FALSE);
+ }
+
+ modifierPressed = (GetAsyncKeyState (VK_SHIFT) < 0);
+ if (WIN_XOR (internalKeyStates & ShiftMask, modifierPressed))
+ {
+ if (modifierPressed) winSendKeyEvent (KEY_ShiftL, TRUE);
+ else winSendKeyEvent (KEY_ShiftL, FALSE);
+ }
+
+ modifierPressed = (GetAsyncKeyState (VK_LMENU) < 0);
+ if (WIN_XOR (internalKeyStates & Mod1Mask, modifierPressed))
+ {
+ if (modifierPressed) winSendKeyEvent (KEY_Alt, TRUE);
+ else winSendKeyEvent (KEY_Alt, FALSE);
+ }
+
+ modifierPressed = (GetAsyncKeyState (VK_RMENU) < 0);
+ if (WIN_XOR (internalKeyStates & Mod5Mask, modifierPressed))
+ {
+ if (modifierPressed) winSendKeyEvent (KEY_AltLang, TRUE);
+ else winSendKeyEvent (KEY_AltLang, FALSE);
+ }
+
/* Has the key state changed? */
dwKeyState = GetKeyState (VK_NUMLOCK) & 0x0001;
if (WIN_XOR (internalKeyStates & NumLockMask, dwKeyState))
--
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/