From 02037974c598200318e439bda61e6ba68072da97 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Mon, 4 Sep 2017 12:18:58 +0300 Subject: [PATCH] rework modifier keys handling for #414 --- src/dlangui/core/events.d | 32 +++++++++++++------------- src/dlangui/platforms/windows/winapp.d | 30 ++++++++++++++++++++---- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/dlangui/core/events.d b/src/dlangui/core/events.d index a506422b..e2dbaa1b 100644 --- a/src/dlangui/core/events.d +++ b/src/dlangui/core/events.d @@ -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 diff --git a/src/dlangui/platforms/windows/winapp.d b/src/dlangui/platforms/windows/winapp.d index 109c406a..8ecf2525 100644 --- a/src/dlangui/platforms/windows/winapp.d +++ b/src/dlangui/platforms/windows/winapp.d @@ -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; }