X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=FAQ-Keymap.md;h=a26461c01cf9ba617ad72e536b93624f35303526;hb=7741f2a4985da8e3af9550c713200561cdeffb27;hp=60f69d9a166f5e997c8886b1cb0ebe297eb78acc;hpb=7328ba0f3b3f6f65ae4b1d918cdb834fb54d83be;p=qmk_firmware.git diff --git a/FAQ-Keymap.md b/FAQ-Keymap.md index 60f69d9a1..a26461c01 100644 --- a/FAQ-Keymap.md +++ b/FAQ-Keymap.md @@ -1,9 +1,9 @@ ## READ FIRST -https://github.com/tmk/tmk_keyboard/blob/master/doc/keymap.md +https://github.com/tmk/tmk_core/blob/master/doc/keymap.md ## How to get keycode -See [doc/keycode.txt](https://github.com/tmk/tmk_keyboard/blob/master/doc/keycode.txt). -Keycodes are actually defined in [common/keycode.h](https://github.com/tmk/tmk_keyboard/blob/master/common/keycode.h). +See [doc/keycode.txt](https://github.com/tmk/tmk_core/blob/master/doc/keycode.txt). +Keycodes are actually defined in [common/keycode.h](https://github.com/tmk/tmk_core/blob/master/common/keycode.h). ## Sysrq key Use keycode for Print Screen(`KC_PSCREEN` or `KC_PSCR`) instead of `KC_SYSREQ`. Key combination of 'Alt + Print Screen' is recognized as 'System request'. @@ -27,7 +27,7 @@ https://github.com/tmk/tmk_keyboard/issues/67 Modifier keys or layers can be stuck unless layer switching is configured properly. For 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. -- https://github.com/tmk/tmk_keyboard/blob/master/doc/keymap.md#31-momentary-switching +- https://github.com/tmk/tmk_core/blob/master/doc/keymap.md#31-momentary-switching - http://geekhack.org/index.php?topic=57008.msg1492604#msg1492604 - https://github.com/tmk/tmk_keyboard/issues/248 @@ -64,11 +64,11 @@ And see this for **Unicode** input. - http://en.wikipedia.org/wiki/Unicode_input -### Apple keyboard Fn +## Apple/Mac keyboard Fn Not supported. -Apple keyboard sends keycode for Fn unlike most of other keyboards. -I think you can send Apple Fn key using Apple venter specific Page 0xff00 and usage 0x0003. But you have to change HID Report Descriptor for this, of course. +Apple/Mac keyboard sends keycode for Fn unlike most of other keyboards. +I 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. https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-606.1.7/IOHIDFamily/AppleHIDUsageTables.h @@ -111,6 +111,55 @@ https://github.com/tekezo/Karabiner/issues/403 ## Esc and `~ on a key + + +You can define FC660 and Poker style ESC with `ACTION_LAYER_MODS`. +https://github.com/tmk/tmk_core/blob/master/doc/keymap.md#35-momentary-switching-with-modifiers + +``` +#include "keymap_common.h" + + +/* Leopold FC660 + * https://elitekeyboards.com/products.php?sub=leopold,compact&pid=fc660c + * Shift + Esc = ~ + * Fn + Esc = ` + * + * Votex Poker II + * https://adprice.fedorapeople.org/poker2_manual.pdf + * Fn + Esc = ` + * Fn + Shift + Esc = ~ + */ +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: qwerty */ + [0] = KEYMAP( \ + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NUHS,BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, \ + FN0, NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,ESC, \ + LCTL,LGUI,LALT, SPC, RALT,FN1, RGUI,RCTL), + [1] = KEYMAP( \ + GRV, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,\ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), + [2] = KEYMAP( \ + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,\ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), +}; + +const uint16_t PROGMEM fn_actions[] = { + // https://github.com/tmk/tmk_core/blob/master/doc/keymap.md#35-momentary-switching-with-modifiers + [0] = ACTION_LAYER_MODS(1, MOD_LSFT), + [1] = ACTION_LAYER_MOMENTARY(2), +}; +``` + +Otherwise, you can write code, see this. https://github.com/p3lim/keyboard_firmware/commit/fd799c12b69a5ab5addd1d4c03380a1b8ef8e9dc @@ -120,4 +169,81 @@ It uses 16 bit codes and has no limitation of 32 Fn at the expense of memory spa https://github.com/tmk/tmk_keyboard/issues?utf8=%E2%9C%93&q=is%3Aissue+actionmap ### extension for modified keys -https://geekhack.org/index.php?topic=41989.msg1885526#msg1885526 \ No newline at end of file +https://geekhack.org/index.php?topic=41989.msg1885526#msg1885526 + + +## Arrow on Right Modifier keys with Dual-Role +This 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**. +``` +#include "keymap_common.h" + + +/* Arrow keys on right modifier keys with TMK dual role feature + * + * https://github.com/tmk/tmk_core/blob/master/doc/keymap.md#213-modifier-with-tap-keydual-role + * https://en.wikipedia.org/wiki/Modifier_key#Dual-role_keys + */ +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: qwerty */ + [0] = KEYMAP( \ + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NUHS,BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \ + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, \ + LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH,FN0, ESC, \ + FN4, LGUI,LALT, SPC, APP, FN2, FN1, FN3), + [1] = KEYMAP( \ + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,\ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN5, TRNS, \ + TRNS,TRNS,TRNS, TRNS, TRNS,FN7, FN6, FN8), +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_UP), + [1] = ACTION_MODS_TAP_KEY(MOD_RGUI, KC_DOWN), + [2] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_LEFT), + [3] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_RIGHT), + [4] = ACTION_LAYER_MOMENTARY(1), + [5] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_PGUP), + [6] = ACTION_MODS_TAP_KEY(MOD_RGUI, KC_PGDN), + [7] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_HOME), + [8] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_END), +}; + +``` + + +Dual-role key: https://en.wikipedia.org/wiki/Modifier_key#Dual-role_keys + + +## Eject on Mac OSX +`EJCT` keycode works on OSX. https://github.com/tmk/tmk_keyboard/issues/250 +It seems Windows 10 ignores the code and Linux/Xorg recognizes but has no mapping by default. + +Not 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. + + + +## What's weak_mods and real_mods in action_util.c +___TO BE IMPROVED___ + +real_mods is intended to retains state of real/physical modifier key state, while +weak_mods retains state of virtual or temprary modifiers which should not affect state real modifier key. + +Let's say you hold down physical left shift key and type ACTION_MODS_KEY(LSHIFT, KC_A), + +with weak_mods, +* (1) hold down left shift: real_mods |= MOD_BIT(LSHIFT) +* (2) press ACTION_MODS_KEY(LSHIFT, KC_A): weak_mods |= MOD_BIT(LSHIFT) +* (3) release ACTION_MODS_KEY(LSHIFT, KC_A): waek_mods &= ~MOD_BIT(LSHIFT) +real_mods still keeps modifier state. + +without weak mods, +* (1) hold down left shift: real_mods |= MOD_BIT(LSHIFT) +* (2) press ACTION_MODS_KEY(LSHIFT, KC_A): real_mods |= MOD_BIT(LSHIFT) +* (3) release ACTION_MODS_KEY(LSHIFT, KC_A): real_mods &= ~MOD_BIT(LSHIFT) +here real_mods lost state for 'physical left shift'. + +weak_mods is ORed with real_mods when keyboard report is sent. +https://github.com/tmk/tmk_core/blob/master/common/action_util.c#L57