From 3b7b65b2f8a809af30eb1eff6f26df5907e6f0ba Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 19 Jan 2017 21:41:21 +0100 Subject: [PATCH] Simplify check for Alt-Numpad Create two new inline functions is_alt_numpad_key(PINPUT_RECORD) and is_alt_numpad_event(PINPUT_RECORD) which contain the actual checks. Call these functions from fhandler_console::read and peek_console for better readability. Signed-off-by: Corinna Vinschen --- winsup/cygwin/fhandler_console.cc | 29 +++++------------------------ winsup/cygwin/miscfuncs.h | 25 +++++++++++++++++++++++++ winsup/cygwin/select.cc | 20 +++++--------------- 3 files changed, 35 insertions(+), 39 deletions(-) diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index 13450d892..1f89acd56 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -7,7 +7,6 @@ Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */ #include "winsup.h" -#include #include "miscfuncs.h" #include #include @@ -399,33 +398,16 @@ fhandler_console::read (void *pv, size_t& buflen) break; } -#define ich (input_rec.Event.KeyEvent.uChar.AsciiChar) #define wch (input_rec.Event.KeyEvent.uChar.UnicodeChar) - /* Ignore key up events, except for left alt events with non-zero character - */ + /* Ignore key up events, except for Alt+Numpad events. */ if (!input_rec.Event.KeyEvent.bKeyDown && - /* - Event for left alt, with a non-zero character, comes from - "alt + numerics" key sequence. - e.g. 0233 => é - */ - !(wch != 0 - // ?? experimentally determined on an XP system - && virtual_key_code == VK_MENU - // left alt -- see http://www.microsoft.com/hwdev/tech/input/Scancode.asp - && input_rec.Event.KeyEvent.wVirtualScanCode == 0x38)) + !is_alt_numpad_event (&input_rec)) continue; - /* Ignore Alt+Numpad keys. These are used to enter codepoints not - available in the current keyboard layout. They are eventually - handled below after releasing the Alt key. For details see - http://www.fileformat.info/tip/microsoft/enter_unicode.htm */ + /* Ignore Alt+Numpad keys. They are eventually handled below after + releasing the Alt key. */ if (input_rec.Event.KeyEvent.bKeyDown - && wch == 0 - && input_rec.Event.KeyEvent.dwControlKeyState == LEFT_ALT_PRESSED - && input_rec.Event.KeyEvent.wVirtualScanCode >= DIK_NUMPAD7 - && input_rec.Event.KeyEvent.wVirtualScanCode <= DIK_NUMPAD0 - && input_rec.Event.KeyEvent.wVirtualScanCode != DIK_SUBTRACT) + && is_alt_numpad_key (&input_rec)) continue; if (control_key_state & SHIFT_PRESSED) @@ -510,7 +492,6 @@ fhandler_console::read (void *pv, size_t& buflen) con.nModifiers &= ~4; } } -#undef ich #undef wch break; diff --git a/winsup/cygwin/miscfuncs.h b/winsup/cygwin/miscfuncs.h index cc2293500..eb898e645 100644 --- a/winsup/cygwin/miscfuncs.h +++ b/winsup/cygwin/miscfuncs.h @@ -9,9 +9,34 @@ details. */ #ifndef _MISCFUNCS_H #define _MISCFUNCS_H +#include + #define likely(X) __builtin_expect (!!(X), 1) #define unlikely(X) __builtin_expect (!!(X), 0) +/* Check for Alt+Numpad keys in a console input record. These are used to + enter codepoints not available in the current keyboard layout For details + see http://www.fileformat.info/tip/microsoft/enter_unicode.htm */ +static inline bool +is_alt_numpad_key (PINPUT_RECORD pirec) +{ + return pirec->Event.KeyEvent.uChar.UnicodeChar == 0 + && pirec->Event.KeyEvent.dwControlKeyState == LEFT_ALT_PRESSED + && pirec->Event.KeyEvent.wVirtualScanCode >= DIK_NUMPAD7 + && pirec->Event.KeyEvent.wVirtualScanCode <= DIK_NUMPAD0 + && pirec->Event.KeyEvent.wVirtualScanCode != DIK_SUBTRACT; +} + +/* Event for left Alt, with a non-zero character, comes from Alt+Numpad + key sequence. e.g. 233 => é This is typically handled + as the key up event after releasing the Alt key. */ +static inline bool +is_alt_numpad_event (PINPUT_RECORD pirec) +{ + return pirec->Event.KeyEvent.uChar.UnicodeChar != 0 + && pirec->Event.KeyEvent.wVirtualKeyCode == VK_MENU + && pirec->Event.KeyEvent.wVirtualScanCode == 0x38; +} int __reg1 winprio_to_nice (DWORD); DWORD __reg1 nice_to_winprio (int &); diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index 1195951cb..158de6af7 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -12,7 +12,6 @@ details. */ #define __INSIDE_CYGWIN_NET__ #include "winsup.h" -#include #include #include #include "ntdll.h" @@ -896,26 +895,17 @@ peek_console (select_record *me, bool) { if (irec.Event.KeyEvent.bKeyDown) { - /* Ignore Alt+Numpad keys. These are used to enter codepoints - not available in the current keyboard layout. They are - eventually handled in the key-up case below. For details see - http://www.fileformat.info/tip/microsoft/enter_unicode.htm */ - if (irec.Event.KeyEvent.uChar.UnicodeChar == 0 - && irec.Event.KeyEvent.dwControlKeyState == LEFT_ALT_PRESSED - && irec.Event.KeyEvent.wVirtualScanCode >= DIK_NUMPAD7 - && irec.Event.KeyEvent.wVirtualScanCode <= DIK_NUMPAD0 - && irec.Event.KeyEvent.wVirtualScanCode != DIK_SUBTRACT) + /* Ignore Alt+Numpad keys. They are eventually handled in the + key-up case below. */ + if (is_alt_numpad_key (&irec)) ; /* Handle normal input. */ else if (irec.Event.KeyEvent.uChar.UnicodeChar || fhandler_console::get_nonascii_key (irec, tmpbuf)) return me->read_ready = true; } - /* Ignore key up events, except for left alt events with - non-zero character */ - else if (irec.Event.KeyEvent.uChar.UnicodeChar != 0 - && irec.Event.KeyEvent.wVirtualKeyCode == VK_MENU - && irec.Event.KeyEvent.wVirtualScanCode == 0x38) + /* Ignore key up events, except for Alt+Numpad events. */ + else if (is_alt_numpad_event (&irec)) return me->read_ready = true; } else