rework modifier keys handling for #414

This commit is contained in:
Vadim Lopatin 2017-09-04 12:18:58 +03:00
parent ba99d5c82a
commit 02037974c5
2 changed files with 41 additions and 21 deletions

View File

@ -943,33 +943,33 @@ enum KeyAction : uint {
/// Keyboard flags for KeyEvent
enum KeyFlag : uint {
/// Ctrl key is down
Control = 0x0008,
Control = 0x0001,
/// Shift key is down
Shift = 0x0004,
Shift = 0x0002,
/// Alt key is down
Alt = 0x0080,
Alt = 0x0004,
Option = Alt,
/// Menu key
Menu = 0x0040,
Menu = 0x0008,
Command = Menu,
// Flags not counting left or right difference
MainFlags = 0xFF,
/// Right Ctrl key is down
RControl = 0x0108,
RControl = 0x0101,
/// Right Shift key is down
RShift = 0x0104,
RShift = 0x0202,
/// Right Alt key is down
RAlt = 0x0180,
/// Left Ctrl key is down
LControl = 0x0208,
/// Left Shift key is down
LShift = 0x0204,
/// Left Alt key is down
LAlt = 0x0280,
/// Left Menu/Win key is down
LMenu = 0x0240,
RAlt = 0x0404,
/// Right Menu/Win key is down
RMenu = 0x0140,
RMenu = 0x0808,
/// Left Ctrl key is down
LControl = 0x1001,
/// Left Shift key is down
LShift = 0x2002,
/// Left Alt key is down
LAlt = 0x4004,
/// Left Menu/Win key is down
LMenu = 0x8008,
LRControl = LControl | RControl, // both left and right
LRAlt = LAlt | RAlt, // both left and right

View File

@ -903,11 +903,13 @@ class Win32Window : Window {
}
bool onKey(KeyAction action, uint keyCode, int repeatCount, dchar character = 0, bool syskey = false) {
debug(KeyInput) Log.d("enter onKey action=", action, " keyCode=", keyCode, " char=", character, "(", cast(int)character, ")", " syskey=", syskey, " _keyFlags=", "%04x"d.format(_keyFlags));
KeyEvent event;
if (syskey)
_keyFlags |= KeyFlag.Alt;
//else
// _keyFlags &= ~KeyFlag.Alt;
uint oldFlags = _keyFlags;
if (action == KeyAction.KeyDown || action == KeyAction.KeyUp) {
switch(keyCode) {
case KeyCode.LSHIFT:
@ -949,8 +951,8 @@ class Win32Window : Window {
updateKeyFlags((GetKeyState(VK_RWIN) & 0x8000) != 0 ? KeyAction.KeyDown : KeyAction.KeyUp, KeyFlag.RMenu, KeyFlag.LMenu);
updateKeyFlags((GetKeyState(VK_LMENU) & 0x8000) != 0 ? KeyAction.KeyDown : KeyAction.KeyUp, KeyFlag.LAlt, KeyFlag.RAlt);
updateKeyFlags((GetKeyState(VK_RMENU) & 0x8000) != 0 ? KeyAction.KeyDown : KeyAction.KeyUp, KeyFlag.RAlt, KeyFlag.LAlt);
if (action == KeyAction.KeyDown)
Log.d("keydown, keyFlags=", _keyFlags);
//updateKeyFlags((GetKeyState(VK_LALT) & 0x8000) != 0 ? KeyAction.KeyDown : KeyAction.KeyUp, KeyFlag.LAlt, KeyFlag.RAlt);
//updateKeyFlags((GetKeyState(VK_RALT) & 0x8000) != 0 ? KeyAction.KeyDown : KeyAction.KeyUp, KeyFlag.RAlt, KeyFlag.LAlt);
break;
}
//updateKeyFlags((GetKeyState(VK_CONTROL) & 0x8000) != 0 ? KeyAction.KeyDown : KeyAction.KeyUp, KeyFlag.Control);
@ -958,6 +960,15 @@ class Win32Window : Window {
//updateKeyFlags((GetKeyState(VK_MENU) & 0x8000) != 0 ? KeyAction.KeyDown : KeyAction.KeyUp, KeyFlag.Alt);
if (keyCode == 0xBF)
keyCode = KeyCode.KEY_DIVIDE;
debug(KeyInput) {
if (oldFlags != _keyFlags) {
debug(KeyInput) Log.d(" flags updated: onKey action=", action, " keyCode=", keyCode, " char=", character, "(", cast(int)character, ")", " syskey=", syskey, " _keyFlags=", "%04x"d.format(_keyFlags));
}
//if (action == KeyAction.KeyDown)
// Log.d("keydown, keyFlags=", _keyFlags);
}
event = new KeyEvent(action, keyCode, _keyFlags);
} else if (action == KeyAction.Text && character != 0) {
bool ctrlAZKeyCode = (character >= 1 && character <= 26);
@ -966,7 +977,12 @@ class Win32Window : Window {
} else {
dchar[] text;
text ~= character;
event = new KeyEvent(action, 0, _keyFlags, cast(dstring)text);
uint newFlags = _keyFlags;
if ((newFlags & KeyFlag.Alt) && (newFlags & KeyFlag.Control)) {
newFlags &= (~(KeyFlag.LRAlt)) & (~(KeyFlag.LRControl));
debug(KeyInput) Log.d(" flags updated for text: onKey action=", action, " keyCode=", keyCode, " char=", character, "(", cast(int)character, ")", " syskey=", syskey, " _keyFlags=", "%04x"d.format(_keyFlags));
}
event = new KeyEvent(action, 0, newFlags, cast(dstring)text);
}
}
bool res = false;
@ -1488,7 +1504,9 @@ LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_UNICHAR:
if (window !is null) {
int repeatCount = lParam & 0xFFFF;
if (window.onKey(KeyAction.Text, cast(uint)wParam, repeatCount, wParam == UNICODE_NOCHAR ? 0 : cast(uint)wParam))
dchar ch = wParam == UNICODE_NOCHAR ? 0 : cast(uint)wParam;
debug(KeyInput) Log.d("WM_UNICHAR ", ch, " (", cast(int)ch, ")");
if (window.onKey(KeyAction.Text, cast(uint)wParam, repeatCount, ch))
return 1; // processed
return 1;
}
@ -1496,7 +1514,9 @@ LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_CHAR:
if (window !is null) {
int repeatCount = lParam & 0xFFFF;
if (window.onKey(KeyAction.Text, cast(uint)wParam, repeatCount, wParam == UNICODE_NOCHAR ? 0 : cast(uint)wParam))
dchar ch = wParam == UNICODE_NOCHAR ? 0 : cast(uint)wParam;
debug(KeyInput) Log.d("WM_CHAR ", ch, " (", cast(int)ch, ")");
if (window.onKey(KeyAction.Text, cast(uint)wParam, repeatCount, ch))
return 1; // processed
return 1;
}