Add keyboard keys to button mapping
This commit is contained in:
parent
68180359f5
commit
824c070df7
6 changed files with 344 additions and 11 deletions
|
@ -12,7 +12,7 @@ sudo make install
|
|||
- Restart to get userspace access to the mouse via the installed udev rule
|
||||
|
||||
## Usage
|
||||
The settings are store in a file and applied alla at once. See example.ini
|
||||
The settings are stored in a file and applied all at once. See example.ini and keymap.md
|
||||
|
||||
- Apply the example confiuration:
|
||||
``
|
||||
|
@ -28,4 +28,4 @@ mouse_m908 -h
|
|||
``
|
||||
|
||||
## TODO
|
||||
Button remapping is not (yet) fully supported: macros and keyboard keys aren't implemented.
|
||||
Button remapping is not (yet) fully supported: macros --and keyboard keys-- aren't implemented.
|
||||
|
|
12
example.ini
12
example.ini
|
@ -35,7 +35,7 @@ dpi5=8c
|
|||
#usb report rate (125, 250, 500, 1000) Hz
|
||||
report_rate=500
|
||||
|
||||
#button mapping: there is a total of 20 programmable buttons
|
||||
#button mapping: there is a total of 20 programmable buttons. keymap.md for full details
|
||||
button_left=left
|
||||
button_right=right
|
||||
button_middle=middle
|
||||
|
@ -51,11 +51,11 @@ button_4=dpi-cycle
|
|||
button_5=report_rate+
|
||||
button_6=report_rate-
|
||||
button_7=profile_switch
|
||||
button_8=none
|
||||
button_9=none
|
||||
button_10=none
|
||||
button_11=none
|
||||
button_12=none
|
||||
button_8=a
|
||||
button_9=b
|
||||
button_10=super_l+shift_l+2
|
||||
button_11=ctrl_l+a
|
||||
button_12=super_l+3
|
||||
|
||||
[profile2]
|
||||
lightmode=breathing
|
||||
|
|
|
@ -69,4 +69,152 @@ mouse_m908::mouse_m908(){
|
|||
{ "profile_switch", { 0x8d, 0x00, 0x00 } },
|
||||
{ "none", { 0x00, 0x00, 0x00 } } };
|
||||
|
||||
//modifier name → value
|
||||
_keyboard_modifier_values = {
|
||||
{ "ctrl_l+", 1 },
|
||||
{ "shift_l+", 2 },
|
||||
{ "alt_l+", 4 },
|
||||
{ "super_l+", 8 },
|
||||
{ "ctrl_r+", 16 },
|
||||
{ "shift_r+", 32 },
|
||||
{ "alt_r+", 64 },
|
||||
{ "super_r+", 128 } };
|
||||
|
||||
//keyboard key name → value
|
||||
//top row
|
||||
_keyboard_key_values["Esc"] = 0x29;
|
||||
_keyboard_key_values["F1"] = 0x3a;
|
||||
_keyboard_key_values["F2"] = 0x3b;
|
||||
_keyboard_key_values["F3"] = 0x3c;
|
||||
_keyboard_key_values["F4"] = 0x3d;
|
||||
_keyboard_key_values["F5"] = 0x3e;
|
||||
_keyboard_key_values["F6"] = 0x3f;
|
||||
_keyboard_key_values["F7"] = 0x40;
|
||||
_keyboard_key_values["F8"] = 0x41;
|
||||
_keyboard_key_values["F9"] = 0x42;
|
||||
_keyboard_key_values["F10"] = 0x43;
|
||||
_keyboard_key_values["F11"] = 0x44;
|
||||
_keyboard_key_values["F12"] = 0x45;
|
||||
_keyboard_key_values["PrtSc"] = 0x46;
|
||||
_keyboard_key_values["ScrLk"] = 0x47;
|
||||
_keyboard_key_values["Pause"] = 0x48;
|
||||
//alphanumeric
|
||||
_keyboard_key_values["a"] = 0x04;
|
||||
_keyboard_key_values["b"] = 0x05;
|
||||
_keyboard_key_values["c"] = 0x06;
|
||||
_keyboard_key_values["d"] = 0x07;
|
||||
_keyboard_key_values["e"] = 0x08;
|
||||
_keyboard_key_values["f"] = 0x09;
|
||||
_keyboard_key_values["g"] = 0x0a;
|
||||
_keyboard_key_values["h"] = 0x0b;
|
||||
_keyboard_key_values["i"] = 0x0c;
|
||||
_keyboard_key_values["j"] = 0x0d;
|
||||
_keyboard_key_values["k"] = 0x0e;
|
||||
_keyboard_key_values["l"] = 0x0f;
|
||||
_keyboard_key_values["m"] = 0x10;
|
||||
_keyboard_key_values["n"] = 0x11;
|
||||
_keyboard_key_values["o"] = 0x12;
|
||||
_keyboard_key_values["p"] = 0x13;
|
||||
_keyboard_key_values["q"] = 0x14;
|
||||
_keyboard_key_values["r"] = 0x15;
|
||||
_keyboard_key_values["s"] = 0x16;
|
||||
_keyboard_key_values["t"] = 0x17;
|
||||
_keyboard_key_values["u"] = 0x18;
|
||||
_keyboard_key_values["v"] = 0x19;
|
||||
_keyboard_key_values["w"] = 0x1a;
|
||||
_keyboard_key_values["x"] = 0x1b;
|
||||
_keyboard_key_values["y"] = 0x1c;
|
||||
_keyboard_key_values["z"] = 0x1d;
|
||||
_keyboard_key_values["1"] = 0x1e;
|
||||
_keyboard_key_values["2"] = 0x1f;
|
||||
_keyboard_key_values["3"] = 0x20;
|
||||
_keyboard_key_values["4"] = 0x21;
|
||||
_keyboard_key_values["5"] = 0x22;
|
||||
_keyboard_key_values["6"] = 0x23;
|
||||
_keyboard_key_values["7"] = 0x24;
|
||||
_keyboard_key_values["8"] = 0x25;
|
||||
_keyboard_key_values["9"] = 0x26;
|
||||
_keyboard_key_values["0"] = 0x27;
|
||||
//modifiers
|
||||
_keyboard_key_values["Tab"] = 0x2b;
|
||||
_keyboard_key_values["Caps_Lock"] = 0x39;
|
||||
_keyboard_key_values["Shift_l"] = 0xe1;
|
||||
_keyboard_key_values["Ctrl_l"] = 0xe0;
|
||||
_keyboard_key_values["Alt_l"] = 0xe2;
|
||||
_keyboard_key_values["Super_l"] = 0xe3;
|
||||
_keyboard_key_values["Super_r"] = 0xe7;
|
||||
_keyboard_key_values["Alt_r"] = 0xe6;
|
||||
_keyboard_key_values["Menu"] = 0x65;
|
||||
_keyboard_key_values["Ctrl_r"] = 0xe4;
|
||||
_keyboard_key_values["Shift_r"] = 0xe5;
|
||||
_keyboard_key_values["Return"] = 0x28;
|
||||
_keyboard_key_values["Backspace"] = 0x2a;
|
||||
_keyboard_key_values["Caps_Lock"] = 0x39;
|
||||
//special characters
|
||||
_keyboard_key_values["Space"] = 0x2b;
|
||||
_keyboard_key_values["Tilde"] = 0x35;
|
||||
_keyboard_key_values["Minus"] = 0x2d;
|
||||
_keyboard_key_values["Equals"] = 0x2e;
|
||||
_keyboard_key_values["Bracket_l"] = 0x2f;
|
||||
_keyboard_key_values["Bracket_r"] = 0x30;
|
||||
_keyboard_key_values["Backslash"] = 0x31;
|
||||
_keyboard_key_values["Semicolon"] = 0x33;
|
||||
_keyboard_key_values["Apostrophe"] = 0x34;
|
||||
_keyboard_key_values["Comma"] = 0x36;
|
||||
_keyboard_key_values["Period"] = 0x37;
|
||||
_keyboard_key_values["Slash"] = 0x38;
|
||||
_keyboard_key_values["Int_Key"] = 0x64;
|
||||
//navigation
|
||||
_keyboard_key_values["Right"] = 0x4f;
|
||||
_keyboard_key_values["Left"] = 0x50;
|
||||
_keyboard_key_values["Down"] = 0x51;
|
||||
_keyboard_key_values["Up"] = 0x52;
|
||||
_keyboard_key_values["Insert"] = 0x49;
|
||||
_keyboard_key_values["Home"] = 0x4a;
|
||||
_keyboard_key_values["PgUp"] = 0x4b;
|
||||
_keyboard_key_values["Delete"] = 0x4c;
|
||||
_keyboard_key_values["End"] = 0x4d;
|
||||
_keyboard_key_values["PgDown"] = 0x4e;
|
||||
//numpad
|
||||
_keyboard_key_values["Num_Slash"] = 0x54;
|
||||
_keyboard_key_values["Num_Asterisk"] = 0x55;
|
||||
_keyboard_key_values["Num_Minus"] = 0x56;
|
||||
_keyboard_key_values["Num_Plus"] = 0x57;
|
||||
_keyboard_key_values["Num_Return"] = 0x58;
|
||||
_keyboard_key_values["Num_1"] = 0x59;
|
||||
_keyboard_key_values["Num_2"] = 0x5a;
|
||||
_keyboard_key_values["Num_3"] = 0x5b;
|
||||
_keyboard_key_values["Num_4"] = 0x5c;
|
||||
_keyboard_key_values["Num_5"] = 0x5d;
|
||||
_keyboard_key_values["Num_6"] = 0x5e;
|
||||
_keyboard_key_values["Num_7"] = 0x5f;
|
||||
_keyboard_key_values["Num_8"] = 0x60;
|
||||
_keyboard_key_values["Num_9"] = 0x61;
|
||||
_keyboard_key_values["Num_0"] = 0x62;
|
||||
_keyboard_key_values["Num_Period"] = 0x63;
|
||||
_keyboard_key_values["Num_Lock"] = 0x53;
|
||||
//media controls, etc. TODO
|
||||
//special keys
|
||||
_keyboard_key_values["Lang1"] = 0x90;
|
||||
_keyboard_key_values["Lang2"] = 0x91;
|
||||
_keyboard_key_values["Lang3"] = 0x92;
|
||||
_keyboard_key_values["Lang4"] = 0x93;
|
||||
_keyboard_key_values["Lang5"] = 0x94;
|
||||
_keyboard_key_values["Lang6"] = 0x95;
|
||||
_keyboard_key_values["Lang7"] = 0x96;
|
||||
_keyboard_key_values["Lang8"] = 0x97;
|
||||
_keyboard_key_values["Lang9"] = 0x98;
|
||||
_keyboard_key_values["F13"] = 0x68;
|
||||
_keyboard_key_values["F14"] = 0x69;
|
||||
_keyboard_key_values["F15"] = 0x6a;
|
||||
_keyboard_key_values["F16"] = 0x6b;
|
||||
_keyboard_key_values["F17"] = 0x6c;
|
||||
_keyboard_key_values["F18"] = 0x6d;
|
||||
_keyboard_key_values["F19"] = 0x6e;
|
||||
_keyboard_key_values["F20"] = 0x6f;
|
||||
_keyboard_key_values["F21"] = 0x70;
|
||||
_keyboard_key_values["F22"] = 0x71;
|
||||
_keyboard_key_values["F23"] = 0x72;
|
||||
_keyboard_key_values["F24"] = 0x73;
|
||||
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <string>
|
||||
#include <algorithm>
|
||||
#include <exception>
|
||||
#include <regex>
|
||||
|
||||
class mouse_m908{
|
||||
|
||||
|
@ -122,6 +123,8 @@ class mouse_m908{
|
|||
|
||||
//mapping of button names to values
|
||||
std::map< std::string, std::array<uint8_t, 3> > _keycodes;
|
||||
std::map< std::string, uint8_t > _keyboard_modifier_values;
|
||||
std::map< std::string, uint8_t > _keyboard_key_values;
|
||||
|
||||
//usb data packets
|
||||
static uint8_t _data_profile[][16];
|
||||
|
|
|
@ -98,13 +98,37 @@ int mouse_m908::set_key_mapping( m908_profile profile, int key, std::array<uint8
|
|||
|
||||
int mouse_m908::set_key_mapping( m908_profile profile, int key, std::string mapping ){
|
||||
|
||||
try{
|
||||
// is string in _keycodes? mousebuttons/special functions
|
||||
if( _keycodes.find(mapping) != _keycodes.end() ){
|
||||
_keymap_data[profile][key][0] = _keycodes[mapping][0];
|
||||
_keymap_data[profile][key][1] = _keycodes[mapping][1];
|
||||
_keymap_data[profile][key][2] = _keycodes[mapping][2];
|
||||
} catch( std::exception& e ){
|
||||
return 1;
|
||||
} else{
|
||||
// string is not a key in _keycodes: keyboard key?
|
||||
|
||||
// search for modifiers and change values accordingly: ctrl, shift ...
|
||||
uint8_t first_value = 0x90;
|
||||
uint8_t modifier_value = 0x00;
|
||||
for( auto i : _keyboard_modifier_values ){
|
||||
if( mapping.find( i.first ) != std::string::npos ){
|
||||
modifier_value += i.second;
|
||||
first_value = 0x8f;
|
||||
}
|
||||
}
|
||||
|
||||
// get key value and store everything
|
||||
try{
|
||||
std::regex modifier_regex ("[a-z_]*\\+");
|
||||
// store values
|
||||
_keymap_data[profile][key][0] = first_value;
|
||||
_keymap_data[profile][key][1] = modifier_value;
|
||||
_keymap_data[profile][key][2] = _keyboard_key_values[std::regex_replace( mapping, modifier_regex, "" )];
|
||||
//std::cout << std::regex_replace( mapping, modifier_regex, "" ) << "\n";
|
||||
} catch( std::exception& f ){
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
158
keymap.md
Normal file
158
keymap.md
Normal file
|
@ -0,0 +1,158 @@
|
|||
# keymap.md
|
||||
This documents all options for button mapping.
|
||||
|
||||
## Mousebuttons and special functions
|
||||
forward
|
||||
backward
|
||||
dpi+
|
||||
dpi-
|
||||
dpi-cycle
|
||||
report_rate+
|
||||
report_rate-
|
||||
scroll_up
|
||||
scroll_down
|
||||
left
|
||||
right
|
||||
middle
|
||||
profile_switch
|
||||
none
|
||||
|
||||
## Keyboard keys
|
||||
### Modifers
|
||||
ctrl_l+
|
||||
shift_l+
|
||||
alt_l+
|
||||
super_l+
|
||||
ctrl_r+
|
||||
shift_r+
|
||||
alt_r+
|
||||
super_r+
|
||||
|
||||
### Keys
|
||||
Esc
|
||||
F1
|
||||
F2
|
||||
F3
|
||||
F4
|
||||
F5
|
||||
F6
|
||||
F7
|
||||
F8
|
||||
F9
|
||||
F10
|
||||
F11
|
||||
F12
|
||||
PrtSc
|
||||
ScrLk
|
||||
Pause
|
||||
a
|
||||
b
|
||||
c
|
||||
d
|
||||
e
|
||||
f
|
||||
g
|
||||
h
|
||||
i
|
||||
j
|
||||
k
|
||||
l
|
||||
m
|
||||
n
|
||||
o
|
||||
p
|
||||
q
|
||||
r
|
||||
s
|
||||
t
|
||||
u
|
||||
v
|
||||
w
|
||||
x
|
||||
y
|
||||
z
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
0
|
||||
Tab
|
||||
Caps_Lock
|
||||
Shift_l
|
||||
Ctrl_l
|
||||
Alt_l
|
||||
Super_l
|
||||
Super_r
|
||||
Alt_r
|
||||
Menu
|
||||
Ctrl_r
|
||||
Shift_r
|
||||
Return
|
||||
Backspace
|
||||
Caps_Lock
|
||||
Space
|
||||
Tilde
|
||||
Minus
|
||||
Equals
|
||||
Bracket_l
|
||||
Bracket_r
|
||||
Backslash
|
||||
Semicolon
|
||||
Apostrophe
|
||||
Comma
|
||||
Period
|
||||
Slash
|
||||
Int_Key
|
||||
Right
|
||||
Left
|
||||
Down
|
||||
Up
|
||||
Insert
|
||||
Home
|
||||
PgUp
|
||||
Delete
|
||||
End
|
||||
PgDown
|
||||
Num_Slash
|
||||
Num_Asterisk
|
||||
Num_Minus
|
||||
Num_Plus
|
||||
Num_Return
|
||||
Num_1
|
||||
Num_2
|
||||
Num_3
|
||||
Num_4
|
||||
Num_5
|
||||
Num_6
|
||||
Num_7
|
||||
Num_8
|
||||
Num_9
|
||||
Num_0
|
||||
Num_Period
|
||||
Num_Lock
|
||||
Lang1
|
||||
Lang2
|
||||
Lang3
|
||||
Lang4
|
||||
Lang5
|
||||
Lang6
|
||||
Lang7
|
||||
Lang8
|
||||
Lang9
|
||||
F13
|
||||
F14
|
||||
F15
|
||||
F16
|
||||
F17
|
||||
F18
|
||||
F19
|
||||
F20
|
||||
F21
|
||||
F22
|
||||
F23
|
||||
F24
|
Loading…
Add table
Reference in a new issue