mirror of https://github.com/buggins/dlangui.git
rework modifier keys handling for #414
This commit is contained in:
parent
ba99d5c82a
commit
02037974c5
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue