22b6e15a17
e5f9940 Merge commit '1bc3dd200b023cecf063a0cb3ba347f77f6d759d' into core_update da03c50 Add note for L/R side bit being ignored e80f3c1 Add in basic documentation for Macro system 35e8a76 core: Swap position of PEQL and PENT in unimap 00751f1 Merge pull request #406 from 39aldo39/patch-1 e50d7de V-USB remote wakeup 4340997 core: Fix typo in definition AC_g 958144d core: Debug print for system and consumer keys e7e1030 core: Fix sleep_led 0866323 core: Change matrix_init and matrix_print 0dbf73d core: Add matrix_clear() and default impl. 3202ca3 core: Add suspend mode options 4cda3aa core: Fix suspend/wake for converters #386 4e15247 core: LUFA_DEBUG_SUART for serial debug b9cf8e7 core: Fix mechanical locking supoort #390 12aa0fd Merge branch 'nemith-master' fccb3fa core: Fix OPT_DEFS for mbed build 2e2d2c8 Merge branch 'master' of github.com:leizzer/tmk_keyboard f1d3634 Change .gitignore for ChibiOS 3aab802 core: Fix build config in protocol.mk 5e43da0 core: Add short names in unimap 7a56998 core: Fix dfu wait in rules.mk 6d9c500 Merge branch 'mediakey-fix' 08382ac core: Fix 'make dfu' message 78cb04e Fix OS X Recognizing keyboard as Mouse/Tablet a114714 core: 'make dfu' waits for bootloader to start d0a8f13 core: Fix unimap UNIMAP_NO case e17abef core: Change lufa NKRO report size 16 to 32 bytes 375b20f core: Fix common.mk for build options 394fdff core: Fix unimap layout comment 912326c core: Add unimap support 00f4011 core: Fix doc/keymap.md for new keymap framework ddbd7b4 core: Add default implemenation of keymap read 671cacc core: action codes are action_t struct now b4fdb27 core: Change chibios repo directory names 7daed10 core: Fix keycode.txt 90399d7 core: Fix USB remote wakeup on ATmega32U2 #361 3677e84 usb_usb: Add multiple keyboard support 54d5b26 core: Fix Logical Maximum in report descriptor bd0d372 core: Fix LUFA report descriptor 95327b5 Merge pull request #355 from papodaca/XT 62bf548 core: change API of adb.c to accept device address 3097c9e Fix function name in host.h 836e209 Merge branch 'core_split_160522' 3918ea2 Merge commit '20b787fc1284176834cbe7ca2134e4b36bec5828' 7f87b11 core: Add comment of register 3 of ADB ef6478a core: Add adb_host_talk() 5c665b4 update macro names in bluefruit 4f2c5bf Merge commit '71381457fa1311dfa0b58ba882a96db740640871' 53a9c08 Merge pull request #321 from njbair/master f08a656 core: Fix media/consumer keys d526de8 Clean up wording in keymap example 0bb3dbb Clarify layer precedence d915c75 clarify layer documentation 72070d4 ps2_usb: Fix for VUSB configuration 170e2dc Mostly working. Is unstable, will emit bad codes after a while. c8e45b5 core: Actionmap support aabaa24 Codes appear to be detected correctly, the break codes are broken. git-subtree-dir: tmk_core git-subtree-split: e5f994033cbc8700745ac0c6d12772820492eed0
253 lines
7.0 KiB
C
253 lines
7.0 KiB
C
/*
|
|
Copyright 2013,2016 Jun Wako <wakojun@gmail.com>
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#include "keymap.h"
|
|
#include "report.h"
|
|
#include "keycode.h"
|
|
#include "action_layer.h"
|
|
#include "action.h"
|
|
#include "action_macro.h"
|
|
#include "wait.h"
|
|
#include "debug.h"
|
|
#include "bootloader.h"
|
|
#if defined(__AVR__)
|
|
#include <avr/pgmspace.h>
|
|
#endif
|
|
|
|
#ifdef BOOTMAGIC_ENABLE
|
|
extern keymap_config_t keymap_config;
|
|
#endif
|
|
|
|
static action_t keycode_to_action(uint8_t keycode);
|
|
|
|
|
|
/* converts key to action */
|
|
__attribute__ ((weak))
|
|
action_t action_for_key(uint8_t layer, keypos_t key)
|
|
{
|
|
uint8_t keycode = keymap_key_to_keycode(layer, key);
|
|
switch (keycode) {
|
|
case KC_FN0 ... KC_FN31:
|
|
return keymap_fn_to_action(keycode);
|
|
#ifdef BOOTMAGIC_ENABLE
|
|
case KC_CAPSLOCK:
|
|
case KC_LOCKING_CAPS:
|
|
if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) {
|
|
return keycode_to_action(KC_LCTL);
|
|
}
|
|
return keycode_to_action(keycode);
|
|
case KC_LCTL:
|
|
if (keymap_config.swap_control_capslock) {
|
|
return keycode_to_action(KC_CAPSLOCK);
|
|
}
|
|
return keycode_to_action(KC_LCTL);
|
|
case KC_LALT:
|
|
if (keymap_config.swap_lalt_lgui) {
|
|
if (keymap_config.no_gui) {
|
|
return keycode_to_action(KC_NO);
|
|
}
|
|
return keycode_to_action(KC_LGUI);
|
|
}
|
|
return keycode_to_action(KC_LALT);
|
|
case KC_LGUI:
|
|
if (keymap_config.swap_lalt_lgui) {
|
|
return keycode_to_action(KC_LALT);
|
|
}
|
|
if (keymap_config.no_gui) {
|
|
return keycode_to_action(KC_NO);
|
|
}
|
|
return keycode_to_action(KC_LGUI);
|
|
case KC_RALT:
|
|
if (keymap_config.swap_ralt_rgui) {
|
|
if (keymap_config.no_gui) {
|
|
return keycode_to_action(KC_NO);
|
|
}
|
|
return keycode_to_action(KC_RGUI);
|
|
}
|
|
return keycode_to_action(KC_RALT);
|
|
case KC_RGUI:
|
|
if (keymap_config.swap_ralt_rgui) {
|
|
return keycode_to_action(KC_RALT);
|
|
}
|
|
if (keymap_config.no_gui) {
|
|
return keycode_to_action(KC_NO);
|
|
}
|
|
return keycode_to_action(KC_RGUI);
|
|
case KC_GRAVE:
|
|
if (keymap_config.swap_grave_esc) {
|
|
return keycode_to_action(KC_ESC);
|
|
}
|
|
return keycode_to_action(KC_GRAVE);
|
|
case KC_ESC:
|
|
if (keymap_config.swap_grave_esc) {
|
|
return keycode_to_action(KC_GRAVE);
|
|
}
|
|
return keycode_to_action(KC_ESC);
|
|
case KC_BSLASH:
|
|
if (keymap_config.swap_backslash_backspace) {
|
|
return keycode_to_action(KC_BSPACE);
|
|
}
|
|
return keycode_to_action(KC_BSLASH);
|
|
case KC_BSPACE:
|
|
if (keymap_config.swap_backslash_backspace) {
|
|
return keycode_to_action(KC_BSLASH);
|
|
}
|
|
return keycode_to_action(KC_BSPACE);
|
|
#endif
|
|
default:
|
|
return keycode_to_action(keycode);
|
|
}
|
|
}
|
|
|
|
|
|
/* Macro */
|
|
__attribute__ ((weak))
|
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
|
{
|
|
(void)record;
|
|
(void)id;
|
|
(void)opt;
|
|
return MACRO_NONE;
|
|
}
|
|
|
|
/* Function */
|
|
__attribute__ ((weak))
|
|
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
|
|
{
|
|
(void)record;
|
|
(void)id;
|
|
(void)opt;
|
|
}
|
|
|
|
|
|
|
|
/* translates keycode to action */
|
|
static action_t keycode_to_action(uint8_t keycode)
|
|
{
|
|
switch (keycode) {
|
|
case KC_A ... KC_EXSEL:
|
|
case KC_LCTRL ... KC_RGUI:
|
|
return (action_t)ACTION_KEY(keycode);
|
|
break;
|
|
case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE:
|
|
return (action_t)ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode));
|
|
break;
|
|
case KC_AUDIO_MUTE ... KC_WWW_FAVORITES:
|
|
return (action_t)ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode));
|
|
break;
|
|
case KC_MS_UP ... KC_MS_ACCEL2:
|
|
return (action_t)ACTION_MOUSEKEY(keycode);
|
|
break;
|
|
case KC_TRNS:
|
|
return (action_t)ACTION_TRANSPARENT;
|
|
break;
|
|
case KC_BOOTLOADER:
|
|
clear_keyboard();
|
|
wait_ms(50);
|
|
bootloader_jump(); // not return
|
|
break;
|
|
default:
|
|
return (action_t)ACTION_NO;
|
|
break;
|
|
}
|
|
return (action_t)ACTION_NO;
|
|
}
|
|
|
|
|
|
|
|
#ifdef USE_LEGACY_KEYMAP
|
|
/*
|
|
* Legacy keymap support
|
|
* Consider using new keymap API instead.
|
|
*/
|
|
extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
|
|
extern const uint8_t fn_layer[];
|
|
extern const uint8_t fn_keycode[];
|
|
|
|
__attribute__ ((weak))
|
|
uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)
|
|
{
|
|
return pgm_read_byte(&keymaps[(layer)][(row)][(col)]);
|
|
}
|
|
|
|
__attribute__ ((weak))
|
|
uint8_t keymap_fn_layer(uint8_t index)
|
|
{
|
|
return pgm_read_byte(&fn_layer[index]);
|
|
}
|
|
|
|
__attribute__ ((weak))
|
|
uint8_t keymap_fn_keycode(uint8_t index)
|
|
{
|
|
return pgm_read_byte(&fn_keycode[index]);
|
|
}
|
|
|
|
__attribute__ ((weak))
|
|
uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
|
|
{
|
|
return keymap_get_keycode(layer, key.row, key.col);
|
|
}
|
|
|
|
|
|
/* Legacy keymap support */
|
|
__attribute__ ((weak))
|
|
action_t keymap_fn_to_action(uint8_t keycode)
|
|
{
|
|
switch (keycode) {
|
|
case KC_FN0 ... KC_FN31:
|
|
{
|
|
uint8_t layer = keymap_fn_layer(FN_INDEX(keycode));
|
|
uint8_t key = keymap_fn_keycode(FN_INDEX(keycode));
|
|
if (key) {
|
|
return (action_t)ACTION_LAYER_TAP_KEY(layer, key);
|
|
} else {
|
|
return (action_t)ACTION_LAYER_MOMENTARY(layer);
|
|
}
|
|
}
|
|
return (action_t)ACTION_NO;
|
|
default:
|
|
return (action_t)ACTION_NO;
|
|
}
|
|
}
|
|
|
|
#else
|
|
|
|
/* user keymaps should be defined somewhere */
|
|
extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
|
|
extern const action_t fn_actions[];
|
|
|
|
__attribute__ ((weak))
|
|
uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
|
|
{
|
|
#if defined(__AVR__)
|
|
return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
|
|
#else
|
|
return keymaps[(layer)][(key.row)][(key.col)];
|
|
#endif
|
|
}
|
|
|
|
__attribute__ ((weak))
|
|
action_t keymap_fn_to_action(uint8_t keycode)
|
|
{
|
|
#if defined(__AVR__)
|
|
return (action_t)pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
|
|
#else
|
|
return fn_actions[FN_INDEX(keycode)];
|
|
#endif
|
|
}
|
|
|
|
#endif
|