2015-04-10 01:32:04 +09:00
|
|
|
#include <stdint.h>
|
|
|
|
|
#include "keyboard.h"
|
|
|
|
|
#include "action.h"
|
|
|
|
|
#include "util.h"
|
|
|
|
|
#include "action_layer.h"
|
2016-04-21 14:35:48 +09:00
|
|
|
#include "hook.h"
|
2015-04-10 01:32:04 +09:00
|
|
|
|
|
|
|
|
#ifdef DEBUG_ACTION
|
|
|
|
|
#include "debug.h"
|
|
|
|
|
#else
|
|
|
|
|
#include "nodebug.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Default Layer State
|
|
|
|
|
*/
|
|
|
|
|
uint32_t default_layer_state = 0;
|
|
|
|
|
|
|
|
|
|
static void default_layer_state_set(uint32_t state)
|
|
|
|
|
{
|
|
|
|
|
debug("default_layer_state: ");
|
|
|
|
|
default_layer_debug(); debug(" to ");
|
|
|
|
|
default_layer_state = state;
|
2016-05-22 22:49:29 +09:00
|
|
|
hook_default_layer_change(default_layer_state);
|
2015-04-10 01:32:04 +09:00
|
|
|
default_layer_debug(); debug("\n");
|
2017-05-26 12:03:30 +09:00
|
|
|
#ifdef NO_TRACK_KEY_PRESS
|
2015-04-10 01:32:04 +09:00
|
|
|
clear_keyboard_but_mods(); // To avoid stuck keys
|
2017-05-26 12:03:30 +09:00
|
|
|
#endif
|
2015-04-10 01:32:04 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void default_layer_debug(void)
|
|
|
|
|
{
|
|
|
|
|
dprintf("%08lX(%u)", default_layer_state, biton32(default_layer_state));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void default_layer_set(uint32_t state)
|
|
|
|
|
{
|
|
|
|
|
default_layer_state_set(state);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifndef NO_ACTION_LAYER
|
|
|
|
|
void default_layer_or(uint32_t state)
|
|
|
|
|
{
|
|
|
|
|
default_layer_state_set(default_layer_state | state);
|
|
|
|
|
}
|
|
|
|
|
void default_layer_and(uint32_t state)
|
|
|
|
|
{
|
|
|
|
|
default_layer_state_set(default_layer_state & state);
|
|
|
|
|
}
|
|
|
|
|
void default_layer_xor(uint32_t state)
|
|
|
|
|
{
|
|
|
|
|
default_layer_state_set(default_layer_state ^ state);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef NO_ACTION_LAYER
|
|
|
|
|
/*
|
|
|
|
|
* Keymap Layer State
|
|
|
|
|
*/
|
|
|
|
|
uint32_t layer_state = 0;
|
|
|
|
|
|
|
|
|
|
static void layer_state_set(uint32_t state)
|
|
|
|
|
{
|
|
|
|
|
dprint("layer_state: ");
|
|
|
|
|
layer_debug(); dprint(" to ");
|
|
|
|
|
layer_state = state;
|
2016-04-21 14:35:48 +09:00
|
|
|
hook_layer_change(layer_state);
|
2015-04-10 01:32:04 +09:00
|
|
|
layer_debug(); dprintln();
|
2017-05-26 12:03:30 +09:00
|
|
|
#ifdef NO_TRACK_KEY_PRESS
|
2015-04-10 01:32:04 +09:00
|
|
|
clear_keyboard_but_mods(); // To avoid stuck keys
|
2017-05-26 12:03:30 +09:00
|
|
|
#endif
|
2015-04-10 01:32:04 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void layer_clear(void)
|
|
|
|
|
{
|
|
|
|
|
layer_state_set(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void layer_move(uint8_t layer)
|
|
|
|
|
{
|
|
|
|
|
layer_state_set(1UL<<layer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void layer_on(uint8_t layer)
|
|
|
|
|
{
|
|
|
|
|
layer_state_set(layer_state | (1UL<<layer));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void layer_off(uint8_t layer)
|
|
|
|
|
{
|
|
|
|
|
layer_state_set(layer_state & ~(1UL<<layer));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void layer_invert(uint8_t layer)
|
|
|
|
|
{
|
|
|
|
|
layer_state_set(layer_state ^ (1UL<<layer));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void layer_or(uint32_t state)
|
|
|
|
|
{
|
|
|
|
|
layer_state_set(layer_state | state);
|
|
|
|
|
}
|
|
|
|
|
void layer_and(uint32_t state)
|
|
|
|
|
{
|
|
|
|
|
layer_state_set(layer_state & state);
|
|
|
|
|
}
|
|
|
|
|
void layer_xor(uint32_t state)
|
|
|
|
|
{
|
|
|
|
|
layer_state_set(layer_state ^ state);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void layer_debug(void)
|
|
|
|
|
{
|
|
|
|
|
dprintf("%08lX(%u)", layer_state, biton32(layer_state));
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-05-26 12:03:30 +09:00
|
|
|
/* return layer effective for key at this time */
|
|
|
|
|
static uint8_t current_layer_for_key(keypos_t key)
|
2015-04-10 01:32:04 +09:00
|
|
|
{
|
|
|
|
|
#ifndef NO_ACTION_LAYER
|
2017-09-14 12:58:06 +09:00
|
|
|
action_t action = ACTION_TRANSPARENT;
|
2015-04-10 01:32:04 +09:00
|
|
|
uint32_t layers = layer_state | default_layer_state;
|
|
|
|
|
/* check top layer first */
|
|
|
|
|
for (int8_t i = 31; i >= 0; i--) {
|
|
|
|
|
if (layers & (1UL<<i)) {
|
|
|
|
|
action = action_for_key(i, key);
|
2016-03-30 03:37:57 +09:00
|
|
|
if (action.code != (action_t)ACTION_TRANSPARENT.code) {
|
2017-05-26 12:03:30 +09:00
|
|
|
return i;
|
2015-04-10 01:32:04 +09:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* fall back to layer 0 */
|
2017-05-26 12:03:30 +09:00
|
|
|
return 0;
|
|
|
|
|
#else
|
|
|
|
|
return biton32(default_layer_state);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2023-11-27 02:15:05 +09:00
|
|
|
#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
|
|
|
|
|
|
|
|
|
|
|
2017-05-26 12:03:30 +09:00
|
|
|
#ifndef NO_TRACK_KEY_PRESS
|
|
|
|
|
/* record layer on where key is pressed */
|
|
|
|
|
static uint8_t layer_pressed[MATRIX_ROWS][MATRIX_COLS] = {};
|
|
|
|
|
#endif
|
|
|
|
|
action_t layer_switch_get_action(keyevent_t event)
|
|
|
|
|
{
|
2017-10-22 03:09:20 +09:00
|
|
|
if (IS_NOEVENT(event)) return (action_t)ACTION_NO;
|
|
|
|
|
|
2017-05-26 12:03:30 +09:00
|
|
|
uint8_t layer = 0;
|
|
|
|
|
#ifndef NO_TRACK_KEY_PRESS
|
|
|
|
|
if (event.pressed) {
|
|
|
|
|
layer = current_layer_for_key(event.key);
|
|
|
|
|
layer_pressed[event.key.row][event.key.col] = layer;
|
|
|
|
|
} else {
|
|
|
|
|
layer = layer_pressed[event.key.row][event.key.col];
|
|
|
|
|
}
|
2015-04-10 01:32:04 +09:00
|
|
|
#else
|
2017-05-26 12:03:30 +09:00
|
|
|
layer = current_layer_for_key(event.key);
|
2015-04-10 01:32:04 +09:00
|
|
|
#endif
|
2023-11-27 02:15:05 +09:00
|
|
|
return get_action(layer, event.key);
|
2015-04-10 01:32:04 +09:00
|
|
|
}
|