#include "keymap.h" | #include "keymap.h" | ||||
#include "report.h" | #include "report.h" | ||||
#include "keycode.h" | #include "keycode.h" | ||||
#include "action.h" | |||||
/* layer */ | /* layer */ | ||||
uint8_t current_layer = 0; | uint8_t current_layer = 0; | ||||
#ifndef NO_LEGACY_KEYMAP_SUPPORT | |||||
/* legacy support with weak reference */ | |||||
__attribute__ ((weak)) | |||||
action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) | |||||
action_t keymap_keycode_to_action(uint8_t keycode) | |||||
{ | { | ||||
/* convert from legacy keycode to action */ | |||||
uint8_t key = keymap_get_keycode(layer, row, col); | |||||
action_t action; | action_t action; | ||||
switch (key) { | |||||
switch (keycode) { | |||||
case KC_A ... KC_EXSEL: | case KC_A ... KC_EXSEL: | ||||
action.code = ACTION_KEY(key); | |||||
action.code = ACTION_KEY(keycode); | |||||
break; | break; | ||||
case KC_LCTRL ... KC_LGUI: | case KC_LCTRL ... KC_LGUI: | ||||
action.code = ACTION_LMOD(key); | |||||
action.code = ACTION_LMOD(keycode); | |||||
break; | break; | ||||
case KC_RCTRL ... KC_RGUI: | case KC_RCTRL ... KC_RGUI: | ||||
action.code = ACTION_RMOD(key); | |||||
action.code = ACTION_RMOD(keycode); | |||||
break; | break; | ||||
case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: | case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: | ||||
action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key)); | |||||
action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); | |||||
break; | break; | ||||
case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: | case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: | ||||
action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(key)); | |||||
action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); | |||||
break; | break; | ||||
case KC_MS_UP ... KC_MS_ACCEL2: | case KC_MS_UP ... KC_MS_ACCEL2: | ||||
action.code = ACTION_MOUSEKEY(key); | |||||
action.code = ACTION_MOUSEKEY(keycode); | |||||
break; | break; | ||||
case KC_FN0 ... KC_FN31: | |||||
{ | |||||
uint8_t layer = keymap_fn_layer(FN_INDEX(key)); | |||||
uint8_t code = keymap_fn_keycode(FN_INDEX(key)); | |||||
action.code = ACTION_LAYER_SET_TAP_KEY(layer, code); | |||||
} | |||||
case KC_TRNS: | |||||
action.code = ACTION_TRANSPARENT; | |||||
break; | break; | ||||
case KC_NO ... KC_UNDEFINED: | |||||
default: | default: | ||||
action.code = ACTION_NO; | action.code = ACTION_NO; | ||||
break; | break; | ||||
} | } | ||||
return action; | return action; | ||||
} | } | ||||
#ifndef NO_LEGACY_KEYMAP_SUPPORT | |||||
/* legacy support with weak reference */ | |||||
__attribute__ ((weak)) | |||||
action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) | |||||
{ | |||||
/* convert from legacy keycode to action */ | |||||
uint8_t keycode = keymap_get_keycode(layer, row, col); | |||||
action_t action; | |||||
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) { | |||||
action.code = ACTION_LAYER_SET_TAP_KEY(layer, key); | |||||
} else { | |||||
action.code = ACTION_LAYER_SET_MOMENTARY(layer); | |||||
} | |||||
} | |||||
return action; | |||||
default: | |||||
return keymap_keycode_to_action(keycode); | |||||
} | |||||
} | |||||
#endif | #endif | ||||
__attribute__ ((weak)) | __attribute__ ((weak)) |
extern uint8_t default_layer; | extern uint8_t default_layer; | ||||
/* translates key_t to keycode */ | |||||
uint8_t keymap_key_to_keycode(uint8_t layer, key_t key); | |||||
/* translates keycode to action */ | |||||
action_t keymap_keycode_to_action(uint8_t keycode); | |||||
/* translates Fn keycode to action */ | |||||
action_t keymap_fn_to_action(uint8_t keycode); | |||||
/* action for key */ | /* action for key */ | ||||
// TODO: should use struct key_t? | |||||
// TODO: should use struct key_t? move to action.h? | |||||
action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col); | action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col); | ||||
/* user defined special function */ | /* user defined special function */ | ||||
void keymap_call_function(keyrecord_t *record, uint8_t id, uint8_t opt); | void keymap_call_function(keyrecord_t *record, uint8_t id, uint8_t opt); | ||||
#ifndef NO_LEGACY_KEYMAP_SUPPORT | #ifndef NO_LEGACY_KEYMAP_SUPPORT | ||||
/* keycode of key */ | /* keycode of key */ | ||||
uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col); | uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col); |
/* convert keycode to action */ | |||||
action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) { | |||||
uint8_t key = (pgm_read_byte(&keymaps[(layer)][(row)][(col)])); | |||||
/* translates key to keycode */ | |||||
uint8_t keymap_key_to_keycode(uint8_t layer, key_t key) | |||||
{ | |||||
return pgm_read_byte(&keymaps[(layer)][(key.pos.row)][(key.pos.col)]); | |||||
} | |||||
/* translates Fn index to action */ | |||||
action_t keymap_fn_to_action(uint8_t keycode) | |||||
{ | |||||
action_t action; | action_t action; | ||||
switch (key) { | |||||
case KC_A ... KC_EXSEL: | |||||
action.code = ACTION_KEY(key); | |||||
break; | |||||
case KC_LCTRL ... KC_LGUI: | |||||
action.code = ACTION_LMOD(key); | |||||
break; | |||||
case KC_RCTRL ... KC_RGUI: | |||||
action.code = ACTION_RMOD(key); | |||||
break; | |||||
case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: | |||||
action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key)); | |||||
break; | |||||
case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: | |||||
action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(key)); | |||||
break; | |||||
case KC_MS_UP ... KC_MS_ACCEL2: | |||||
action.code = ACTION_MOUSEKEY(key); | |||||
break; | |||||
if (FN_INDEX(keycode) < sizeof(fn_actions) / sizeof(fn_actions[0])) { | |||||
action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); | |||||
} else { | |||||
action.code = ACTION_NO; | |||||
} | |||||
return action; | |||||
} | |||||
/* convert key to action */ | |||||
action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) | |||||
{ | |||||
key_t key; | |||||
key.pos.row = row; | |||||
key.pos.col = col; | |||||
uint8_t keycode = keymap_key_to_keycode(layer, key); | |||||
switch (keycode) { | |||||
case KC_FN0 ... KC_FN31: | case KC_FN0 ... KC_FN31: | ||||
if (FN_INDEX(key) < sizeof(fn_actions) / sizeof(fn_actions[0])) { | |||||
action.code = pgm_read_word(&fn_actions[FN_INDEX(key)]); | |||||
} else { | |||||
action.code = ACTION_NO; | |||||
} | |||||
break; | |||||
case KC_TRNS: | |||||
action.code = ACTION_TRANSPARENT; | |||||
break; | |||||
return keymap_fn_to_action(keycode); | |||||
default: | default: | ||||
action.code = ACTION_NO; | |||||
break; | |||||
return keymap_keycode_to_action(keycode); | |||||
} | } | ||||
return action; | |||||
} | } |
#include "keycode.h" | #include "keycode.h" | ||||
#include "action.h" | #include "action.h" | ||||
#include "action_macro.h" | #include "action_macro.h" | ||||
#include "report.h" | |||||
#include "host.h" | #include "host.h" | ||||
#include "debug.h" | #include "debug.h" | ||||
#include "keymap.h" | #include "keymap.h" | ||||
} | } | ||||
// TODO: use [1] = KEYMAP(...) to prevent from changing index of element? | |||||
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
/* Layer 0: Default Layer | /* Layer 0: Default Layer | ||||
* ,-----------------------------------------------------------. | * ,-----------------------------------------------------------. | ||||
} | } | ||||
} | } | ||||
/* convert keycode to action */ | |||||
action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) { | |||||
uint8_t key = (pgm_read_byte(&keymaps[(layer)][(row)][(col)])); | |||||
/* translates key to keycode */ | |||||
uint8_t keymap_key_to_keycode(uint8_t layer, key_t key) | |||||
{ | |||||
return pgm_read_byte(&keymaps[(layer)][(key.pos.row)][(key.pos.col)]); | |||||
} | |||||
/* translates Fn index to action */ | |||||
action_t keymap_fn_to_action(uint8_t keycode) | |||||
{ | |||||
action_t action; | action_t action; | ||||
switch (key) { | |||||
case KC_A ... KC_EXSEL: | |||||
action.code = ACTION_KEY(key); | |||||
break; | |||||
case KC_LCTRL ... KC_LGUI: | |||||
action.code = ACTION_LMOD(key); | |||||
break; | |||||
case KC_RCTRL ... KC_RGUI: | |||||
action.code = ACTION_RMOD(key); | |||||
break; | |||||
case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: | |||||
action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key)); | |||||
break; | |||||
case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: | |||||
action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(key)); | |||||
break; | |||||
case KC_MS_UP ... KC_MS_ACCEL2: | |||||
action.code = ACTION_MOUSEKEY(key); | |||||
break; | |||||
if (FN_INDEX(keycode) < sizeof(fn_actions) / sizeof(fn_actions[0])) { | |||||
action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); | |||||
} else { | |||||
action.code = ACTION_NO; | |||||
} | |||||
return action; | |||||
} | |||||
/* convert key to action */ | |||||
action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) | |||||
{ | |||||
key_t key; | |||||
key.pos.row = row; | |||||
key.pos.col = col; | |||||
uint8_t keycode = keymap_key_to_keycode(layer, key); | |||||
switch (keycode) { | |||||
case KC_FN0 ... KC_FN31: | case KC_FN0 ... KC_FN31: | ||||
if (FN_INDEX(key) < sizeof(fn_actions) / sizeof(fn_actions[0])) { | |||||
action.code = pgm_read_word(&fn_actions[FN_INDEX(key)]); | |||||
} else { | |||||
action.code = ACTION_NO; | |||||
} | |||||
break; | |||||
case KC_NO ... KC_UNDEFINED: | |||||
return keymap_fn_to_action(keycode); | |||||
default: | default: | ||||
action.code = ACTION_NO; | |||||
break; | |||||
return keymap_keycode_to_action(keycode); | |||||
} | } | ||||
return action; | |||||
} | } |