Merge remote-tracking branch 'tmk/master'

This commit is contained in:
Mark Sikora 2023-12-04 14:09:41 -05:00
commit c544d100f5
17 changed files with 1489 additions and 1461 deletions

View file

@ -23,8 +23,8 @@ Use PD2(USART RXD) for 'Keyboard Data' pin and give power with VCC and GND. Othe
------------------------
PD2 Keyboard Data
PD3 Keyboard Command
PD4 Mouse Data
PD0 BZ
PD0 Mouse Data
PD1 BZ
Target microcontroller is Atmel ATMega32U2 by default but porting this project to other 8-bit AVR controllers would be easy.

View file

@ -25,7 +25,7 @@
:10018000370A004C45443A20253032580A000A4CC0
:100190006F6F702073746172742E0A000A55534297
:1001A00020636F6E666967757265642E0A000A5473
:1001B0004D4B3A3735666238622F4C5546413A64AA
:1001B0004D4B3A6266383266312F4C5546413A64AF
:1001C00036613764660A0009025400030100A03258
:1001D00009040000010301010009211101000122AD
:1001E00040000705810308000A090401000103011A
@ -92,9 +92,9 @@
:1005B0005553454B45592045585452414B455920B8
:1005C000434F4E534F4C4520434F4D4D414E4420D9
:1005D0004B45594D41505F53454354494F4E20348C
:1005E0003039360A004255494C443A203735666264
:1005F0003862202832333A32393A3535204E6F7618
:100600002020372032303233290A005649443A201C
:1005E0003039360A004255494C443A206266383266
:1005F0006631202831313A35353A3435204E6F7620
:100600002020392032303233290A005649443A201A
:1006100030784645454428544D4B29205049443AAA
:100620002030783530323128534F4E59204E4557BF
:1006300053206B6579626F61726420636F6E7665BB
@ -1008,7 +1008,7 @@
:103EF000FF91EF919F918F910F900FBE0F901F90A8
:103F000018951F920F920FB60F9211248F939F93C3
:103F1000AF93BF938091BD019091BE01A091BF016D
:103F2000B091C001892B8A2B8B2B69F18BB191E069
:103F2000B091C001892B8A2B8B2B69F18BB192E068
:103F300089278BB98091BD019091BE01A091BF01ED
:103F4000B091C001181619061A061B069CF4809140
:103F5000BD019091BE01A091BF01B091C001019738
@ -1016,7 +1016,7 @@
:103F7000B093C001BF91AF919F918F910F900FBEF1
:103F80000F901F90189580916F008D7F80936F0028
:103F900010928000109281008FB7F89410928900DF
:103FA000109288008FBF5898E5CF0E94DC1F68945C
:103FA000109288008FBF5998E5CF0E94DC1F68945B
:103FB000B1110C946B2008950E94502088F09F57F7
:103FC00098F0B92F9927B751B0F0E1F0660F771F3D
:103FD000881F991F1AF0BA95C9F714C0B13091F033

View file

@ -133,7 +133,7 @@ uint8_t matrix_scan(void)
// make code
if (!matrix_is_on(ROW(code), COL(code))) {
matrix[ROW(code)] |= (1<<COL(code));
//tone(80, 100);
//tone(440, 100);
}
}
return code;

View file

@ -25,7 +25,7 @@
// Pin for buzzer: PD0
#define BZ_PIN_PORT PORTD
#define BZ_PIN_DDR DDRD
#define BZ_PIN_MASK (1<<0)
#define BZ_PIN_MASK (1<<1)
volatile long toggle_count;

View file

@ -73,7 +73,7 @@ EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
CONSOLE_ENABLE ?= yes # Console for debug(+400)
COMMAND_ENABLE ?= yes # Commands for debug and configuration
#SLEEP_LED_ENABLE ?= yes # Breathing sleep LED during USB suspend
#NKRO_ENABLE ?= yes # USB Nkey Rollover
NKRO_ENABLE ?= yes # USB Nkey Rollover
#ACTIONMAP_ENABLE ?= yes # Use 16bit action codes in keymap instead of 8bit keycodes

File diff suppressed because it is too large Load diff

View file

@ -1,66 +0,0 @@
#include "keymap_common.h"
#ifdef KEYMAP_SECTION_ENABLE
const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = {
#else
const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = {
#endif
/* 0: qwerty
* ,-----------------------------------------------------------.
* |` | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| #|Bsp|
* |-----------------------------------------------------------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |
* |-----------------------------------------------------------|
* |Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter |
* |-----------------------------------------------------------|
* |Shft| \| Z| X| C| V| B| N| M| ,| .| /|Shift |Esc|
* |-----------------------------------------------------------'
* |Ctrl|Gui |Alt | Space |App |Alt |Gui |Ctrl |
* `-----------------------------------------------------------'
*/
KEYMAP( \
GRV, 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, \
CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, \
LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,ESC, \
LCTL,LGUI,LALT, SPC, APP, RALT,RGUI,RCTL),
};
#ifdef KEYMAP_SECTION_ENABLE
const action_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = {
#else
const action_t fn_actions[] PROGMEM = {
#endif
[0] = ACTION_LAYER_MOMENTARY(1),
[1] = ACTION_LAYER_MOMENTARY(2),
[2] = ACTION_LAYER_MOMENTARY(3),
[3] = ACTION_LAYER_MOMENTARY(4),
[4] = ACTION_LAYER_MOMENTARY(5),
[5] = ACTION_LAYER_MOMENTARY(6),
[6] = ACTION_LAYER_MOMENTARY(7),
[7] = ACTION_LAYER_TOGGLE(1),
[8] = ACTION_LAYER_TOGGLE(2),
[9] = ACTION_LAYER_TOGGLE(3),
[10] = ACTION_LAYER_TAP_TOGGLE(1),
[11] = ACTION_LAYER_TAP_TOGGLE(2),
[12] = ACTION_LAYER_TAP_TOGGLE(3),
[13] = ACTION_LAYER_TAP_KEY(1, KC_BSLASH),
[14] = ACTION_LAYER_TAP_KEY(2, KC_TAB),
[15] = ACTION_LAYER_TAP_KEY(3, KC_ENTER),
[16] = ACTION_LAYER_TAP_KEY(4, KC_SPACE),
[17] = ACTION_LAYER_TAP_KEY(5, KC_SCOLON),
[18] = ACTION_LAYER_TAP_KEY(6, KC_QUOTE),
[19] = ACTION_LAYER_TAP_KEY(7, KC_SLASH),
[20] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_SPACE),
[21] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_SPACE),
[22] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_QUOTE),
[23] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENTER),
[24] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_ESC),
[25] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPACE),
[26] = ACTION_MODS_ONESHOT(MOD_LCTL),
[27] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_ESC),
[28] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_BSPACE),
[29] = ACTION_MODS_ONESHOT(MOD_LSFT),
[30] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_GRAVE),
[31] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_BSLASH),
};

View file

@ -62,7 +62,7 @@ void matrix_init(void)
}
//debug
debug_matrix = true;
debug_matrix = false;
LED_ON();
_delay_ms(500);
LED_OFF();

View file

@ -0,0 +1,82 @@
/*
Copyright 2023 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 "unimap_trans.h"
#define AC_L1 ACTION_LAYER_MOMENTARY(1)
#define AC_L2 ACTION_LAYER_MOMENTARY(2)
#define AC_SLS2 ACTION_LAYER_TAP_KEY(2, KC_SLSH)
#define AC_SCL3 ACTION_LAYER_TAP_KEY(3, KC_SCLN)
#define AC_SPC4 ACTION_LAYER_TAP_KEY(4, KC_SPC)
#define AC_BACK ACTION_MODS_KEY(MOD_LALT, KC_LEFT)
#define AC_FRWD ACTION_MODS_KEY(MOD_LALT, KC_RIGHT)
#define AC_ENT_ ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT)
#ifdef KEYMAP_SECTION_ENABLE
const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = {
#else
const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = {
#endif
/* 0:
* ,-----------------------------------------------------------.
* |` | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \ |
* |-----------------------------------------------------------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Bspc|
* |-----------------------------------------------------------|
* |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Enter |
* |-----------------------------------------------------------|
* |Shft| \| Z| X| C| V| B| N| M| ,| .| /|Shift |
* |-----------------------------------------------------------'
* |Ctrl|Gui |Alt | Space |Alt |App | L1 |
* `-----------------------------------------------------------'
*/
[0] = UNIMAP_ALPS64( \
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, GRV, BSLS,
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSPC,
LCTL,A, S, D, F, G, H, J, K, L, SCL3,QUOT, ENT_,
LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLS2, RSFT,L1,
L2, LGUI,LALT, SPC4, APP, RALT,RGUI,L1),
[1] = UNIMAP_ALPS64( \
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,GRV,
CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, INS, DEL,
TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN,TRNS, TRNS,TRNS,
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS),
[2] = UNIMAP_ALPS64(
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL,
TRNS,HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, TRNS,
TRNS,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, TRNS,
TRNS,TRNS,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS, TRNS,TRNS,
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS),
[3] = UNIMAP_ALPS64(
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL,
TAB, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,BACK,FRWD, TRNS,
TRNS,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,TRNS,NO, TRNS,
TRNS,TRNS,NO, NO, NO, NO, BTN3,BTN2,BTN1,BACK,FRWD,NO, TRNS,TRNS,
TRNS,TRNS,TRNS, BTN1, TRNS,TRNS,TRNS,TRNS),
[4] = UNIMAP_ALPS64(
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL,
TAB, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,BTN4,BTN5, TAB,
LCTL,VOLD,VOLU,MUTE,NO, NO, NO, MS_L,MS_D,MS_R,BTN1,NO, ENT,
LSFT,TRNS,NO, NO, NO, NO, BTN3,BTN2,BTN1,BACK,FRWD,NO, TRNS,TRNS,
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS),
};

View file

@ -113,7 +113,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)

View file

@ -48,8 +48,7 @@ TMK_DIR = ../../tmk_core
TARGET_DIR = .
# project specific files
SRC = keymap_common.c \
matrix.c \
SRC = matrix.c \
led.c
ifdef KEYMAP

View file

@ -142,6 +142,108 @@ static uint8_t current_layer_for_key(keypos_t key)
}
#ifdef BOOTMAGIC_ENABLE
#include "keymap.h"
extern keymap_config_t keymap_config;
static uint8_t config_keymap(uint8_t keycode)
{
switch (keycode) {
case KC_CAPSLOCK:
case KC_LOCKING_CAPS:
if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) {
return KC_LCTL;
}
return keycode;
case KC_LCTL:
if (keymap_config.swap_control_capslock) {
return KC_CAPSLOCK;
}
return KC_LCTL;
case KC_LALT:
if (keymap_config.swap_lalt_lgui) {
if (keymap_config.no_gui) {
return KC_NO;
}
return KC_LGUI;
}
return KC_LALT;
case KC_LGUI:
if (keymap_config.swap_lalt_lgui) {
return KC_LALT;
}
if (keymap_config.no_gui) {
return KC_NO;
}
return KC_LGUI;
case KC_RALT:
if (keymap_config.swap_ralt_rgui) {
if (keymap_config.no_gui) {
return KC_NO;
}
return KC_RGUI;
}
return KC_RALT;
case KC_RGUI:
if (keymap_config.swap_ralt_rgui) {
return KC_RALT;
}
if (keymap_config.no_gui) {
return KC_NO;
}
return KC_RGUI;
case KC_GRAVE:
if (keymap_config.swap_grave_esc) {
return KC_ESC;
}
return KC_GRAVE;
case KC_ESC:
if (keymap_config.swap_grave_esc) {
return KC_GRAVE;
}
return KC_ESC;
case KC_BSLASH:
if (keymap_config.swap_backslash_backspace) {
return KC_BSPACE;
}
return KC_BSLASH;
case KC_BSPACE:
if (keymap_config.swap_backslash_backspace) {
return KC_BSLASH;
}
return KC_BSPACE;
default:
return keycode;
}
}
static action_t get_action(uint8_t layer, keypos_t key)
{
action_t act = action_for_key(layer, key);
switch (act.kind.id) {
case ACT_LMODS:
case ACT_RMODS:
case ACT_LMODS_TAP:
case ACT_RMODS_TAP:
act.key.code = config_keymap(act.key.code);
break;
case ACT_LAYER_TAP:
case ACT_LAYER_TAP_EXT:
act.layer_tap.code = config_keymap(act.layer_tap.code);
break;
default:
break;
}
return act;
}
#else
static action_t get_action(uint8_t layer, keypos_t key)
{
return action_for_key(layer, key);
}
#endif
#ifndef NO_TRACK_KEY_PRESS
/* record layer on where key is pressed */
static uint8_t layer_pressed[MATRIX_ROWS][MATRIX_COLS] = {};
@ -161,5 +263,5 @@ action_t layer_switch_get_action(keyevent_t event)
#else
layer = current_layer_for_key(event.key);
#endif
return action_for_key(layer, event.key);
return get_action(layer, event.key);
}

View file

@ -2,6 +2,8 @@
#include <stdbool.h>
#include <avr/eeprom.h>
#include "eeconfig.h"
#include "keymap.h"
#include "print.h"
void eeconfig_init(void)
{
@ -22,7 +24,12 @@ void eeconfig_enable(void)
void eeconfig_disable(void)
{
eeprom_write_word(EECONFIG_MAGIC, 0xFFFF);
eeprom_write_word(EECONFIG_MAGIC, 0xFFFF);
eeprom_write_byte(EECONFIG_DEBUG, 0xFF);
eeprom_write_byte(EECONFIG_DEFAULT_LAYER, 0xFF);
eeprom_write_byte(EECONFIG_KEYMAP, 0xFF);
eeprom_write_byte(EECONFIG_MOUSEKEY_ACCEL, 0xFF);
eeprom_write_byte(EECONFIG_BACKLIGHT, 0xFF);
}
bool eeconfig_is_enabled(void)
@ -43,3 +50,13 @@ void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val
uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BACKLIGHT); }
void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); }
#endif
void eeconfig_debug(void)
{
xprintf("eeprom:");
for (int i = 0; i < 16 /* E2END + 1 */; i++) {
if ((i % 16) == 0) { xprintf("\n%04X: ", i); }
xprintf("%02X ", eeprom_read_byte((uint8_t *)i));
}
xprintf("\n");
}

View file

@ -34,7 +34,7 @@ void bootmagic(void)
/* eeconfig clear */
if (bootmagic_scan_key(BOOTMAGIC_KEY_EEPROM_CLEAR)) {
eeconfig_init();
eeconfig_disable();
}
/* bootloader */
@ -45,6 +45,10 @@ void bootmagic(void)
/* user-defined checks */
hook_bootmagic();
if (!eeconfig_is_enabled()) {
goto WAIT;
}
/* debug enable */
debug_config.raw = eeconfig_read_debug();
if (bootmagic_scan_key(BOOTMAGIC_KEY_DEBUG_ENABLE)) {
@ -61,35 +65,38 @@ void bootmagic(void)
eeconfig_write_debug(debug_config.raw);
/* keymap config */
keymap_config.raw = eeconfig_read_keymap();
keymap_config_t kc;
kc.raw = eeconfig_read_keymap();
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_CONTROL_CAPSLOCK)) {
keymap_config.swap_control_capslock = !keymap_config.swap_control_capslock;
kc.swap_control_capslock = !kc.swap_control_capslock;
}
if (bootmagic_scan_key(BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL)) {
keymap_config.capslock_to_control = !keymap_config.capslock_to_control;
kc.capslock_to_control = !kc.capslock_to_control;
}
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_LALT_LGUI)) {
keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui;
kc.swap_lalt_lgui = !kc.swap_lalt_lgui;
}
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_RALT_RGUI)) {
keymap_config.swap_ralt_rgui = !keymap_config.swap_ralt_rgui;
kc.swap_ralt_rgui = !kc.swap_ralt_rgui;
}
if (bootmagic_scan_key(BOOTMAGIC_KEY_NO_GUI)) {
keymap_config.no_gui = !keymap_config.no_gui;
kc.no_gui = !kc.no_gui;
}
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_GRAVE_ESC)) {
keymap_config.swap_grave_esc = !keymap_config.swap_grave_esc;
kc.swap_grave_esc = !kc.swap_grave_esc;
}
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE)) {
keymap_config.swap_backslash_backspace = !keymap_config.swap_backslash_backspace;
kc.swap_backslash_backspace = !kc.swap_backslash_backspace;
}
if (bootmagic_scan_key(BOOTMAGIC_HOST_NKRO)) {
keymap_config.nkro = !keymap_config.nkro;
kc.nkro = !kc.nkro;
}
eeconfig_write_keymap(keymap_config.raw);
eeconfig_write_keymap(kc.raw);
#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE)
keyboard_nkro = keymap_config.nkro;
if (kc.nkro) {
keyboard_nkro = !keyboard_nkro;
}
#endif
/* default layer */
@ -109,6 +116,18 @@ void bootmagic(void)
default_layer = eeconfig_read_default_layer();
default_layer_set((uint32_t)default_layer);
}
keymap_config = kc;
// wait until all key is released
WAIT:
matrix_scan();
for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
if (matrix_get_row(r)) {
goto WAIT;
wait_ms(10);
}
}
}
static bool scan_key(uint16_t code)

View file

@ -19,7 +19,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "wait.h"
#include "keycode.h"
#include "host.h"
#include "keymap.h"
#include "print.h"
#include "debug.h"
#include "util.h"
@ -145,6 +144,9 @@ static void command_common_help(void)
}
#ifdef BOOTMAGIC_ENABLE
#include "keymap.h"
__attribute__ ((weak)) void eeconfig_debug(void) {}
static void print_eeconfig(void)
{
print("default_layer: "); print_dec(eeconfig_read_default_layer()); print("\n");
@ -176,6 +178,8 @@ static void print_eeconfig(void)
print(".enable: "); print_dec(bc.enable); print("\n");
print(".level: "); print_dec(bc.level); print("\n");
#endif
eeconfig_debug();
}
#endif

View file

@ -72,4 +72,6 @@ uint8_t eeconfig_read_backlight(void);
void eeconfig_write_backlight(uint8_t val);
#endif
void eeconfig_debug(void);
#endif

View file

@ -27,10 +27,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <avr/pgmspace.h>
#endif
#ifdef BOOTMAGIC_ENABLE
extern keymap_config_t keymap_config;
#endif
static action_t keycode_to_action(uint8_t keycode);
@ -42,71 +38,6 @@ action_t action_for_key(uint8_t layer, keypos_t 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);
}