Skip to content

Commit

Permalink
Added Windows key-mapping module.
Browse files Browse the repository at this point in the history
  • Loading branch information
ahlstromcj committed Jul 18, 2023
1 parent 2f32846 commit 80604b0
Show file tree
Hide file tree
Showing 7 changed files with 675 additions and 47 deletions.
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# README for Seq66 0.99.7 2023-07-17
# README for Seq66 0.99.7 2023-07-18

__Seq66__: MIDI sequencer/live-looper with a hardware-sampler grid interface;
pattern banks, triggers, and playlists for song management; scale and chord
Expand Down Expand Up @@ -93,8 +93,10 @@ Windows, and using a conventional source tarball.
* Fixed an important port-translation bug in output port-mapping.
* Recent Files is disabled if there are none.
* Revamped the Playlist tab, as it was confusing and very buggy.
* Added Windows key-mapping to fix processing "native virtual" keys,
such as the arrow keys.
* Added auto-play and auto-advance to play-lists.
* Fixed a bug in rcsettings::make_config_filespec().
* Fixed bug in rcsettings::make_config_filespec().
* Version 0.99.6:
* Issue #3 follow-ons:
* Added a qscrollslave to allow QScrollArea to allow the pattern
Expand Down
4 changes: 3 additions & 1 deletion RELNOTES
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Release Notes for Seq66 v. 0.99.7 2023-07-14
Release Notes for Seq66 v. 0.99.7 2023-07-18

This file lists __major__ changes in version 0.99.7

Expand All @@ -12,6 +12,8 @@ This file lists __major__ changes in version 0.99.7
- Fixed an important port-translation bug in output port-mapping.
- Revamped the Playlist tab, as it was confusing and very buggy.
- Added auto-play and auto-advance to play-lists.
- Added Windows key-mapping to fix processing "native virtual" keys,
such as the arrow keys.

Read the NEWS, README.md, and TODO files.

Expand Down
214 changes: 214 additions & 0 deletions contrib/notes/win-virtual-keys.text
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes

The following table shows the symbolic constant names, hexadecimal values, and
mouse orboard equivalents for the virtual-key codes used by the system.
The codes are listed in numeric order.

Notes:

[1] Used for miscellaneous characters; it can vary by keyboard.
[2] The <>s on the US standardboard, or the \\| on the non-US 102-keyboard.
[3] Used to pass Unicode characters as if they were strokes. The VK_PACKET
is the low word of a 32-bit Virtual Key value used for non-keyboard
input methods. For more information, see Remark in KEYBDINPUT,
SendInput, WM_KEYDOWN, and WM_KEYUP.

- 0xE8 Unassigned

Constant Value Description

VK_LBUTTON 0x01 Left mouse button
VK_RBUTTON 0x02 Right mouse button
VK_CANCEL 0x03 Control-break processing
VK_MBUTTON 0x04 Middle mouse button (three-button mouse)
VK_XBUTTON1 0x05 X1 mouse button
VK_XBUTTON2 0x06 X2 mouse button
- 0x07 Undefined
VK_BACK 0x08 BACKSPACE
VK_TAB 0x09 TAB
- 0x0A-0B Reserved
VK_CLEAR 0x0C CLEAR
VK_RETURN 0x0D ENTER
- 0x0E-0F Undefined
VK_SHIFT 0x10 SHIFT
VK_CONTROL 0x11 CTRL
VK_MENU 0x12 ALT
VK_PAUSE 0x13 PAUSE
VK_CAPITAL 0x14 CAPS LOCK
VK_KANA 0x15 IME Kana mode
VK_HANGUEL 0x15 IME Hanguel mode (compatibility; use VK_HANGUL)
VK_HANGUL 0x15 IME Hangul mode
VK_IME_ON 0x16 IME On
VK_JUNJA 0x17 IME Junja mode
VK_FINAL 0x18 IME final mode
VK_HANJA 0x19 IME Hanja mode
VK_KANJI 0x19 IME Kanji mode
VK_IME_OFF 0x1A IME Off
VK_ESCAPE 0x1B ESC
VK_CONVERT 0x1C IME convert
VK_NONCONVERT 0x1D IME nonconvert
VK_ACCEPT 0x1E IME accept
VK_MODECHANGE 0x1F IME mode change request
VK_SPACE 0x20 SPACEBAR
VK_PRIOR 0x21 PAGE UP
VK_NEXT 0x22 PAGE DOWN
VK_END 0x23 END
VK_HOME 0x24 HOME
VK_LEFT 0x25 LEFT ARROW
VK_UP 0x26 UP ARROW
VK_RIGHT 0x27 RIGHT ARROW
VK_DOWN 0x28 DOWN ARROW
VK_SELECT 0x29 SELECT
VK_PRINT 0x2A PRINT
VK_EXECUTE 0x2B EXECUTE
VK_SNAPSHOT 0x2C PRINT SCREEN
VK_INSERT 0x2D INS
VK_DELETE 0x2E DEL
VK_HELP 0x2F HELP

VK_0x30 0x30 0
VK_0x31 0x31 1
VK_0x32 0x32 2
VK_0x33 0x33 3
VK_0x34 0x34 4
VK_0x35 0x35 5
VK_0x36 0x36 6
VK_0x37 0x37 7
VK_0x38 0x38 8
VK_0x39 0x39 9
- 0x3A-40 Undefined
VK_0x41 0x41 A
VK_0x42 0x42 B
VK_0x43 0x43 C
VK_0x44 0x44 D
VK_0x45 0x45 E
VK_0x46 0x46 F
VK_0x47 0x47 G
VK_0x48 0x48 H
VK_0x49 0x49 I
VK_0x4A 0x4A J
VK_0x4B 0x4B K
VK_0x4C 0x4C L
VK_0x4D 0x4D M
VK_0x4E 0x4E N
VK_0x4F 0x4F O
VK_0x50 0x50 P
VK_0x51 0x51 Q
VK_0x52 0x52 R
VK_0x53 0x53 S
VK_0x54 0x54 T
VK_0x55 0x55 U
VK_0x56 0x56 V
VK_0x57 0x57 W
VK_0x58 0x58 X
VK_0x59 0x59 Y
VK_0x5A 0x5A Z
VK_LWIN 0x5B Left Windows
VK_RWIN 0x5C Right Windows
VK_APPS 0x5D Applications
- 0x5E Reserved
VK_SLEEP 0x5F Computer Sleep
VK_NUMPAD0 0x60 Numericpad 0
VK_NUMPAD1 0x61 Numericpad 1
VK_NUMPAD2 0x62 Numericpad 2
VK_NUMPAD3 0x63 Numericpad 3
VK_NUMPAD4 0x64 Numericpad 4
VK_NUMPAD5 0x65 Numericpad 5
VK_NUMPAD6 0x66 Numericpad 6
VK_NUMPAD7 0x67 Numericpad 7
VK_NUMPAD8 0x68 Numericpad 8
VK_NUMPAD9 0x69 Numericpad 9
VK_MULTIPLY 0x6A Multiply
VK_ADD 0x6B Add
VK_SEPARATOR 0x6C Separator
VK_SUBTRACT 0x6D Subtract
VK_DECIMAL 0x6E Decimal
VK_DIVIDE 0x6F Divide
VK_F1 0x70 F1
VK_F2 0x71 F2
VK_F3 0x72 F3
VK_F4 0x73 F4
VK_F5 0x74 F5
VK_F6 0x75 F6
VK_F7 0x76 F7
VK_F8 0x77 F8
VK_F9 0x78 F9
VK_F10 0x79 F10
VK_F11 0x7A F11
VK_F12 0x7B F12
VK_F13 0x7C F13
VK_F14 0x7D F14
VK_F15 0x7E F15
VK_F16 0x7F F16
VK_F17 0x80 F17
VK_F18 0x81 F18
VK_F19 0x82 F19
VK_F20 0x83 F20
VK_F21 0x84 F21
VK_F22 0x85 F22
VK_F23 0x86 F23
VK_F24 0x87 F24
- 0x88-8F Unassigned
VK_NUMLOCK 0x90 NUM LOCK
VK_SCROLL 0x91 SCROLL LOCK
- 0x92-96 OEM specific
- 0x97-9F Unassigned
VK_LSHIFT 0xA0 Left SHIFT
VK_RSHIFT 0xA1 Right SHIFT
VK_LCONTROL 0xA2 Left CONTROL
VK_RCONTROL 0xA3 Right CONTROL
VK_LMENU 0xA4 Left ALT
VK_RMENU 0xA5 Right ALT
VK_BROWSER_BACK 0xA6 Browser Back
VK_BROWSER_FORWARD 0xA7 Browser Forward
VK_BROWSER_REFRESH 0xA8 Browser Refresh
VK_BROWSER_STOP 0xA9 Browser Stop
VK_BROWSER_SEARCH 0xAA Browser Search
VK_BROWSER_FAVORITES 0xAB Browser Favorites
VK_BROWSER_HOME 0xAC Browser Start and Home
VK_VOLUME_MUTE 0xAD Volume Mute
VK_VOLUME_DOWN 0xAE Volume Down
VK_VOLUME_UP 0xAF Volume Up
VK_MEDIA_NEXT_TRACK 0xB0 Next Track
VK_MEDIA_PREV_TRACK 0xB1 Previous Track
VK_MEDIA_STOP 0xB2 Stop Media
VK_MEDIA_PLAY_PAUSE 0xB3 Play/Pause Media
VK_LAUNCH_MAIL 0xB4 Start Mail
VK_LAUNCH_MEDIA_SELECT 0xB5 Select Media
VK_LAUNCH_APP1 0xB6 Start Application 1
VK_LAUNCH_APP2 0xB7 Start Application 2
- 0xB8-B9 Reserved

VK_OEM_1 0xBA [1] US standardboard ';:'
VK_OEM_PLUS 0xBB Any country/region '+'
VK_OEM_COMMA 0xBC Any country/region ','
VK_OEM_MINUS 0xBD Any country/region '-'
VK_OEM_PERIOD 0xBE Any country/region '.'
VK_OEM_2 0xBF [1] US standardboard '/?'
VK_OEM_3 0xC0 [1] US standardboard '`~'
- 0xC1-D7 Reserved
- 0xD8-DA Unassigned
VK_OEM_4 0xDB [1] US standardboard '[{'
VK_OEM_5 0xDC [1] US standardboard '\|'
VK_OEM_6 0xDD [1] US standardboard ']}'
VK_OEM_7 0xDE [1] US standardboard 'single-/double-quote'
VK_OEM_8 0xDF [1] None
- 0xE0 Reserved
VK_OEM_101 0xE1 OEM specific
VK_OEM_102 0xE2 [2]
- 0xE3-E4 OEM specific
VK_PROCESSKEY 0xE5 IME PROCESS
- 0xE6 OEM specific
VK_PACKET 0xE7 [3]
- 0xE8 Unassigned
0 0xE9-F5 OEM specific
VK_ATTN 0xF6 Attn
VK_CRSEL 0xF7 CrSel
VK_EXSEL 0xF8 ExSel
VK_EREOF 0xF9 Erase EOF
VK_PLAY 0xFA Play
VK_ZOOM 0xFB Zoom
VK_NONAME 0xFC Reserved
VK_PA1 0xFD PA1
VK_OEM_CLEAR 0xFE Clear

49 changes: 35 additions & 14 deletions libseq66/src/ctrl/keymap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
* \library seq66 application
* \author Chris Ahlstrom
* \date 2018-11-12
* \updates 2021-12-04
* \updates 2023-07-18
* \license GNU GPLv2 or above
*/

Expand Down Expand Up @@ -244,11 +244,17 @@ struct qt_keycodes
* values in accessor functions.
*/

#if defined SEQ66_PLATFORM_WINDOWS

#include "winkeys.hpp" /* provisional Windows key mapping */

#else

static qt_keycodes &
qt_keys (int i)
{
using namespace keyboard;
static qt_keycodes s_qt_keys [] = /* modifiable from inside this module */
static qt_keycodes s_qt_keys [] = /* modifiable inside this module */
{
/*
* Code Qt Qt Key
Expand All @@ -273,9 +279,9 @@ qt_keys (int i)
{ 0x0b, 0x4b, 0x6b, "VT", KCTRL }, // ^K: Vertical Tab
{ 0x0c, 0x4c, 0x6c, "FF", KCTRL }, // ^L: Form Feed
{ 0x0d, 0x4d, 0x6d, "CR", KCTRL }, // ^M: Carriage Return
{ 0x0e, 0x4e, 0x60, "SO", KCTRL }, // ^N: Shift Out
{ 0x0f, 0x4f, 0x6e, "SI", KCTRL }, // ^O: Shift In
{ 0x10, 0x50, 0x7f, "DLE", KCTRL }, // ^P: Data Link Escape
{ 0x0e, 0x4e, 0x6e, "SO", KCTRL }, // ^N: Shift Out
{ 0x0f, 0x4f, 0x6f, "SI", KCTRL }, // ^O: Shift In
{ 0x10, 0x50, 0x70, "DLE", KCTRL }, // ^P: Data Link Escape
{ 0x11, 0x51, 0x71, "DC1", KCTRL }, // ^Q: Device Control 1
{ 0x12, 0x52, 0x72, "DC2", KCTRL }, // ^R: Device Control 2
{ 0x13, 0x53, 0x73, "DC3", KCTRL }, // ^S: Device Control 3
Expand Down Expand Up @@ -567,6 +573,8 @@ qt_keys (int i)
return s_qt_keys[i];
}

#endif // defined SEQ66_PLATFORM_WINDOWS

/**
* Returns the key-name for undefined keys, those not yet defined in the
* key-map. Also used when out-of-range ordinals are encountered.
Expand Down Expand Up @@ -823,6 +831,19 @@ qt_modkey_ordinal (eventkey qtkey, unsigned qtmodifier, eventkey virtkey)
result = cqi->second.qtk_ordinal;
}
}

#if defined SEQ66_PLATFORM_DEBUG
std::string name = qt_ordinal_keyname(result);
char temp[132];
(void) snprintf
(
temp, sizeof temp,
"qt_modkey_ordinal(0x%x, 0x%x, 0x%x) --> 0x%x '%s'",
qtkey, qtmodifier, virtkey, result, name.c_str()
);
printf("%s\n", temp);
#endif

return result;
}

Expand Down Expand Up @@ -956,15 +977,15 @@ setup_qt_azerty_fr_keys ()
{ 0x22, 0x22, 0x22, "\"", KNONE }, // QuoteDbl
{ 0x23, 0x23, 0x23, "#", KALTGR }, // NumberSign
{ 0x26, 0x26, 0x26, "&", KNONE }, // Ampersand
{ 0x27, 0x27, 0x27, "'", KNONE }, // Apostrophe
{ 0x28, 0x28, 0x28, "(", KNONE }, // ParenLeft
{ 0x29, 0x29, 0x29, ")", KNONE }, // ParenRight
{ 0x2a, 0x2a, 0x2a, "*", KNONE }, // Asterisk
{ 0x2e, 0x2e, 0x2e, ".", KSHIFT }, // Period
{ 0x2f, 0x2f, 0x2f, "/", KSHIFT }, // Slash
{ 0x3a, 0x3a, 0x3a, ":", KNONE }, // Colon
{ 0x3c, 0x3c, 0x3c, "<", KNONE },
{ 0x40, 0x40, 0x40, "@", KALTGR }, // AtSign
{ 0x27, 0x27, 0x27, "'", KNONE }, // Apostrophe
{ 0x28, 0x28, 0x28, "(", KNONE }, // ParenLeft
{ 0x29, 0x29, 0x29, ")", KNONE }, // ParenRight
{ 0x2a, 0x2a, 0x2a, "*", KNONE }, // Asterisk
{ 0x2e, 0x2e, 0x2e, ".", KSHIFT }, // Period
{ 0x2f, 0x2f, 0x2f, "/", KSHIFT }, // Slash
{ 0x3a, 0x3a, 0x3a, ":", KNONE }, // Colon
{ 0x3c, 0x3c, 0x3c, "<", KNONE },
{ 0x40, 0x40, 0x40, "@", KALTGR }, // AtSign
{ 0x5b, 0x5b, 0x5b, "[", KALTGR }, // BracketLeft
{ 0x5c, 0x5c, 0x5c, "\\", KALTGR }, // Backslash
{ 0x5d, 0x5d, 0x5d, "]", KALTGR }, // BracketRight
Expand Down
Loading

0 comments on commit 80604b0

Please sign in to comment.