aboutsummaryrefslogtreecommitdiff
path: root/docs/FAQ-Keymap.md
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2017-05-27 18:09:52 -0400
committerJack Humbert <jack.humb@gmail.com>2017-05-27 18:09:52 -0400
commit704794bae3bf96541b0362ea38b84706d5ee6958 (patch)
tree866be7a6a63cb8e5f6f7c236303a796239ed9eae /docs/FAQ-Keymap.md
parentd24da945d1dbfbe81177dd6611b0d5a27ab8344f (diff)
parente229dcadb5c9f8c09f14a439fe5a4c7c48ba2249 (diff)
downloadqmk_firmware-704794bae3bf96541b0362ea38b84706d5ee6958.tar.gz
qmk_firmware-704794bae3bf96541b0362ea38b84706d5ee6958.zip
subtree docs
Diffstat (limited to 'docs/FAQ-Keymap.md')
-rw-r--r--docs/FAQ-Keymap.md248
1 files changed, 248 insertions, 0 deletions
diff --git a/docs/FAQ-Keymap.md b/docs/FAQ-Keymap.md
new file mode 100644
index 000000000..7c73f571f
--- /dev/null
+++ b/docs/FAQ-Keymap.md
@@ -0,0 +1,248 @@
1## READ FIRST
2https://github.com/tmk/tmk_core/blob/master/doc/keymap.md
3
4## How to get keycode
5See [Keycodes](Keycodes). Keycodes are actually defined in [common/keycode.h](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/keycode.h).
6
7## Sysrq key
8Use keycode for Print Screen(`KC_PSCREEN` or `KC_PSCR`) instead of `KC_SYSREQ`. Key combination of 'Alt + Print Screen' is recognized as 'System request'.
9
10See [issue #168](https://github.com/tmk/tmk_keyboard/issues/168) and
11- http://en.wikipedia.org/wiki/Magic_SysRq_key
12- http://en.wikipedia.org/wiki/System_request
13
14## Power key doesn't work
15Use `KC_PWR` instead of `KC_POWER` or vice versa.
16- `KC_PWR` works with Windows and Linux, not with OSX.
17- `KC_POWER` works with OSX and Linux, not with Windows.
18
19http://geekhack.org/index.php?topic=14290.msg1327264#msg1327264
20
21## Oneshot modifier
22Solves my personal 'the' problem. I often got 'the' or 'THe' wrongly instead of 'The'. Oneshot Shift mitgates this for me.
23https://github.com/tmk/tmk_keyboard/issues/67
24
25## Modifier/Layer stuck
26Modifier keys or layers can be stuck unless layer switching is configured properly.
27For Modifier keys and layer actions you have to place `KC_TRANS` on same position of destination layer to unregister the modifier key or return to previous layer on release event.
28
29- https://github.com/tmk/tmk_core/blob/master/doc/keymap.md#31-momentary-switching
30- http://geekhack.org/index.php?topic=57008.msg1492604#msg1492604
31- https://github.com/tmk/tmk_keyboard/issues/248
32
33
34## Mechanical Lock Switch Support
35https://github.com/tmk/tmk_keyboard#mechanical-locking-support
36
37This feature is for *mechanical lock switch* like this Alps one.
38http://deskthority.net/wiki/Alps_SKCL_Lock
39
40Using enabling this feature and using keycodes `LCAP`, `LNUM` or `LSCR` in keymap you can use physical locking CapsLock, NumLock or ScrollLock keys as you expected.
41
42Old vintage mechanical keyboards occasionally have lock switches but modern ones don't have. ***You don't need this feature in most case and just use keycodes `CAPS`, `NLCK` and `SLCK`.***
43
44
45## Input special charactors other than ASCII like Cédille 'Ç'
46NO UNIVERSAL METHOD TO INPUT THOSE WORKS OVER ALL SYSTEMS. You have to define **MACRO** in way specific to your OS or layout.
47
48See this post for example **MACRO** code.
49
50http://deskthority.net/workshop-f7/tmk-keyboard-firmware-collection-t4478-120.html#p195620
51
52On **Windows** you can use `AltGr` key or **Alt code**.
53- http://en.wikipedia.org/wiki/AltGr_key
54- http://en.wikipedia.org/wiki/Alt_code
55
56On **Mac** OS defines `Option` key combinations.
57- http://en.wikipedia.org/wiki/Option_key#Alternative_keyboard_input
58
59On **Xorg** you can use `compose` key, instead.
60- http://en.wikipedia.org/wiki/Compose_key
61
62And see this for **Unicode** input.
63- http://en.wikipedia.org/wiki/Unicode_input
64
65
66## Apple/Mac keyboard Fn
67Not supported.
68
69Apple/Mac keyboard sends keycode for Fn unlike most of other keyboards.
70I think you can send Apple Fn key using Apple venter specific Page 0xff01 and usage 0x0003. But you have to change HID Report Descriptor for this, of course.
71
72https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-606.1.7/IOHIDFamily/AppleHIDUsageTables.h
73
74
75## Media control keys in Mac OSX
76#### KC_MNXT and KC_MPRV does not work on Mac
77Use `KC_MFFD`(`KC_MEDIA_FAST_FORWARD`) and `KC_MRWD`(`KC_MEDIA_REWIND`) instead of `KC_MNXT` and `KC_MPRV`.
78See https://github.com/tmk/tmk_keyboard/issues/195
79
80
81## Keys supported in Mac OSX?
82You can know which keycodes are supported in OSX from this source code.
83
84`usb_2_adb_keymap` array maps Keyboard/Keypad Page usages to ADB scancodes(OSX internal keycodes).
85
86https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-606.1.7/IOHIDFamily/Cosmo_USB2ADB.c
87
88And `IOHIDConsumer::dispatchConsumerEvent` handles Consumer page usages.
89
90https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-606.1.7/IOHIDFamily/IOHIDConsumer.cpp
91
92
93## JIS keys in Mac OSX
94Japanese JIS keyboard specific keys like `無変換(Muhenkan)`, `変換(Henkan)`, `ひらがな(hiragana)` are not recognized on OSX. You can use **Seil** to enable those keys, try following options.
95
96* Enable NFER Key on PC keyboard
97* Enable XFER Key on PC keyboard
98* Enable KATAKANA Key on PC keyboard
99
100https://pqrs.org/osx/karabiner/seil.html
101
102
103## RN-42 Bluetooth doesn't work with Karabiner
104Karabiner - Keymapping tool on Mac OSX - ignores inputs from RN-42 module by default. You have to enable this option to make Karabiner working with your keyboard.
105https://github.com/tekezo/Karabiner/issues/403#issuecomment-102559237
106
107See these for the deail of this problem.
108https://github.com/tmk/tmk_keyboard/issues/213
109https://github.com/tekezo/Karabiner/issues/403
110
111
112## Esc and `~ on a key
113
114
115You can define FC660 and Poker style ESC with `ACTION_LAYER_MODS`.
116https://github.com/tmk/tmk_core/blob/master/doc/keymap.md#35-momentary-switching-with-modifiers
117
118```
119#include "keymap_common.h"
120
121
122/* Leopold FC660
123 * https://elitekeyboards.com/products.php?sub=leopold,compact&pid=fc660c
124 * Shift + Esc = ~
125 * Fn + Esc = `
126 *
127 * Votex Poker II
128 * https://adprice.fedorapeople.org/poker2_manual.pdf
129 * Fn + Esc = `
130 * Fn + Shift + Esc = ~
131 */
132const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
133 /* 0: qwerty */
134 [0] = KEYMAP( \
135 ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NUHS,BSPC, \
136 TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \
137 LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, \
138 FN0, NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,ESC, \
139 LCTL,LGUI,LALT, SPC, RALT,FN1, RGUI,RCTL),
140 [1] = KEYMAP( \
141 GRV, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
142 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,\
143 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
144 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
145 TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS),
146 [2] = KEYMAP( \
147 GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,TRNS, \
148 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,\
149 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
150 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
151 TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS),
152};
153
154const uint16_t PROGMEM fn_actions[] = {
155 // https://github.com/tmk/tmk_core/blob/master/doc/keymap.md#35-momentary-switching-with-modifiers
156 [0] = ACTION_LAYER_MODS(1, MOD_LSFT),
157 [1] = ACTION_LAYER_MOMENTARY(2),
158};
159```
160
161Otherwise, you can write code, see this.
162https://github.com/p3lim/keyboard_firmware/commit/fd799c12b69a5ab5addd1d4c03380a1b8ef8e9dc
163
164
165## 32 Fn keys are not enough?
166### actionmap
167It uses 16 bit codes and has no limitation of 32 Fn at the expense of memory space. TMK keymap is actually is 8 bit codes as subset of the actionmap.
168https://github.com/tmk/tmk_keyboard/issues?utf8=%E2%9C%93&q=is%3Aissue+actionmap
169
170### extension for modified keys
171https://geekhack.org/index.php?topic=41989.msg1885526#msg1885526
172
173
174## Arrow on Right Modifier keys with Dual-Role
175This turns right modifer keys into arrow keys when the keys are tapped while still modifiers when the keys are hold. In TMK the dual-role function is dubbed **TAP**.
176```
177#include "keymap_common.h"
178
179
180/* Arrow keys on right modifier keys with TMK dual role feature
181 *
182 * https://github.com/tmk/tmk_core/blob/master/doc/keymap.md#213-modifier-with-tap-keydual-role
183 * https://en.wikipedia.org/wiki/Modifier_key#Dual-role_keys
184 */
185const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
186 /* 0: qwerty */
187 [0] = KEYMAP( \
188 ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NUHS,BSPC, \
189 TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \
190 LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, \
191 LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH,FN0, ESC, \
192 FN4, LGUI,LALT, SPC, APP, FN2, FN1, FN3),
193 [1] = KEYMAP( \
194 GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,TRNS, \
195 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,\
196 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
197 TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN5, TRNS, \
198 TRNS,TRNS,TRNS, TRNS, TRNS,FN7, FN6, FN8),
199};
200
201const uint16_t PROGMEM fn_actions[] = {
202 [0] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_UP),
203 [1] = ACTION_MODS_TAP_KEY(MOD_RGUI, KC_DOWN),
204 [2] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_LEFT),
205 [3] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_RIGHT),
206 [4] = ACTION_LAYER_MOMENTARY(1),
207 [5] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_PGUP),
208 [6] = ACTION_MODS_TAP_KEY(MOD_RGUI, KC_PGDN),
209 [7] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_HOME),
210 [8] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_END),
211};
212
213```
214
215
216Dual-role key: https://en.wikipedia.org/wiki/Modifier_key#Dual-role_keys
217
218
219## Eject on Mac OSX
220`EJCT` keycode works on OSX. https://github.com/tmk/tmk_keyboard/issues/250
221It seems Windows 10 ignores the code and Linux/Xorg recognizes but has no mapping by default.
222
223Not sure what keycode Eject is on genuine Apple keyboard actually. HHKB uses `F20` for Eject key(`Fn+f`) on Mac mode but this is not same as Apple Eject keycode probably.
224
225
226
227## What's weak_mods and real_mods in action_util.c
228___TO BE IMPROVED___
229
230real_mods is intended to retains state of real/physical modifier key state, while
231weak_mods retains state of virtual or temprary modifiers which should not affect state real modifier key.
232
233Let's say you hold down physical left shift key and type ACTION_MODS_KEY(LSHIFT, KC_A),
234
235with weak_mods,
236* (1) hold down left shift: real_mods |= MOD_BIT(LSHIFT)
237* (2) press ACTION_MODS_KEY(LSHIFT, KC_A): weak_mods |= MOD_BIT(LSHIFT)
238* (3) release ACTION_MODS_KEY(LSHIFT, KC_A): waek_mods &= ~MOD_BIT(LSHIFT)
239real_mods still keeps modifier state.
240
241without weak mods,
242* (1) hold down left shift: real_mods |= MOD_BIT(LSHIFT)
243* (2) press ACTION_MODS_KEY(LSHIFT, KC_A): real_mods |= MOD_BIT(LSHIFT)
244* (3) release ACTION_MODS_KEY(LSHIFT, KC_A): real_mods &= ~MOD_BIT(LSHIFT)
245here real_mods lost state for 'physical left shift'.
246
247weak_mods is ORed with real_mods when keyboard report is sent.
248https://github.com/tmk/tmk_core/blob/master/common/action_util.c#L57 \ No newline at end of file