qmk_firmware/keyboards/splitkb/kyria/keymaps/lms_ace01/keymap.c

853 lines
39 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Copyright 2021 Luis Moreno <acevice69@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 QMK_KEYBOARD_H
#include "keymap_spanish.h"
// Insert key state definition (Insert/Overwrite Mode)
static bool ins_state = true;
// Git Commands
static const char *sendstring_commands[] = {
// Config
"config //global",
// Create
"init",
"clone",
// Local changes
"status",
"diff",
"add",
"rm",
"mv",
"commit",
"stash",
"reset",
"revert",
// Branches and Tags
"branch /b @",
"switch",
"checkout",
"tag",
// Update & Publish
"remote",
"fetch",
"pull",
"push",
// Merge & Rebase
"merge",
"rebase",
// Commit history
"logg"
};
// Layers definition
enum layers {
_QWERTY_ES,
_COLEMAK_ES,
_SYMBOL,
_FN_NUMPAD,
_NAVIGATION,
_GIT_CMDS,
_SETTINGS
};
// Encoder Modes definition
#ifdef ENCODER_ENABLE
#define ENC_ALT_MAX_TIME 1250
typedef enum {
ENC_MODE_CHAR_LINE,
ENC_MODE_WORD_PAGE,
ENC_MODE_TABBING,
ENC_MODE_VOLUME,
ENC_MODE_LAST
} encoder_mode_t;
static encoder_mode_t enc_mode;
void encoder_cycle_mode(bool up);
#endif
// Tap Dance declarations/definitions
#ifdef TAP_DANCE_ENABLE
#define ACTION_TAP_DANCE_FN_ADVANCED_USER(user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset, user_user_data) \
{ .fn = {user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset}, .user_data = (void *)user_user_data, }
#define MAX_MOD 3 // Max number of modifiers: 0-Base, 1-Shift, 2-Ctrl
typedef enum {
TD_NONE,
TD_UNKNOWN,
TD_SINGLE_TAP,
TD_SINGLE_HOLD,
TD_DOUBLE_TAP
} td_state_t;
typedef struct {
bool is_press_action;
td_state_t state;
} td_tap_t;
typedef struct {
uint16_t keycode; // Keycode:
// - Tap if keycode != KC_NO
uint8_t layer[MAX_MOD]; // Layer with modifiers (0-Base, 1-Shift, 2-Ctrl):
// - Tap if keycode == KC_NO
// - Single Hold: Activate while holding
// - Double Tap: (Un)lock Layer
} td_user_data_t;
enum td_actions {
TAB,
ESC,
SPC,
ENT,
LWR,
RAI
};
static td_tap_t td_tap_state = {
.is_press_action = true,
.state = TD_NONE
};
td_state_t td_current (tap_dance_state_t *state);
void td_kc_ly_finished(tap_dance_state_t *state, void *user_data);
void td_kc_ly_reset (tap_dance_state_t *state, void *user_data);
tap_dance_action_t tap_dance_actions[] = {
[TAB] = ACTION_TAP_DANCE_DOUBLE(KC_TAB, KC_CAPS),
[ESC] = ACTION_TAP_DANCE_FN_ADVANCED_USER(NULL, td_kc_ly_finished, td_kc_ly_reset,
&((td_user_data_t) { KC_ESC, { _NAVIGATION, _QWERTY_ES, _QWERTY_ES }})),
[SPC] = ACTION_TAP_DANCE_FN_ADVANCED_USER(NULL, td_kc_ly_finished, td_kc_ly_reset,
&((td_user_data_t) { KC_SPC, { _SYMBOL , _QWERTY_ES, _QWERTY_ES }})),
[ENT] = ACTION_TAP_DANCE_FN_ADVANCED_USER(NULL, td_kc_ly_finished, td_kc_ly_reset,
&((td_user_data_t) { KC_ENT, { _SYMBOL , _QWERTY_ES, _QWERTY_ES }})),
[LWR] = ACTION_TAP_DANCE_FN_ADVANCED_USER(NULL, td_kc_ly_finished, td_kc_ly_reset,
&((td_user_data_t) { KC_NO, { _NAVIGATION, _GIT_CMDS , _QWERTY_ES }})),
[RAI] = ACTION_TAP_DANCE_FN_ADVANCED_USER(NULL, td_kc_ly_finished, td_kc_ly_reset,
&((td_user_data_t) { KC_NO, { _FN_NUMPAD , _GIT_CMDS , _QWERTY_ES }}))
};
#endif
// Keycode definitions
enum custom_keycodes {
CK_QUOT = SAFE_RANGE, // Single/Double quote
CK_BSDI, // Backspace/Delete/Insert
CK_ENCM, // Encoder Mode (-)
CK_ENCP, // Encoder Mode (+)
CK_LYDF, // Activate Default Layer
G_CONF, // Git Commands
G_INIT,
G_CLONE,
G_STAT,
G_DIFF,
G_ADD,
G_RM,
G_MV,
G_COMM,
G_STASH,
G_RESET,
G_REVER,
G_BRANC,
G_SWTCH,
G_CHECK,
G_TAG,
G_REMOT,
G_FETCH,
G_PULL,
G_PUSH,
G_MERGE,
G_REBAS,
G_LOG
};
#define LY_QWES DF(_QWERTY_ES)
#define LY_CLES DF(_COLEMAK_ES)
#ifdef TAP_DANCE_ENABLE
#define TD_TBCP TD(TAB)
#define TD_ESSY TD(ESC)
#define TD_SPSY TD(SPC)
#define TD_ENSY TD(ENT)
#define TD_LOWR TD(LWR)
#define TD_RAIS TD(RAI)
#else
#define TD_TBCP MT(MOD_LSFT, KC_TAB)
#define TD_ESSY LT(_SYMBOL , KC_ESC)
#define TD_SPSY KC_SPC
#define TD_ENSY KC_ENT
#define TD_LOWR TT(_NAVIGATION)
#define TD_RAIS TT(_SYMBOL)
#endif
#define MO_LSFT OSM(MOD_LSFT)
#define MO_LCTL OSM(MOD_LCTL)
#define MO_LALT OSM(MOD_LALT)
#define MT_RGUI MT(MOD_RGUI, KC_LEFT)
#define MT_RALT MT(MOD_RALT, KC_DOWN)
#define MT_RCTL MT(MOD_RCTL, KC_UP)
#define MT_RSFT MT(MOD_RSFT, KC_RGHT)
// Keymap definitions
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format off
/*
* Basic characters (QWERTY ES)
*
* ,-------------------------------------------. ,-------------------------------------------.
* |Esc/LNav| Q | W | E | R | T | | Y | U | I | O | P |BS/Dl/In|
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* |Tab/Caps| A | S | D | F | G | | H | J | K | L | Ñ | ´ ¨ |
* |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
* |EncMode-| Z | X | C | V | B | LGit | | | | LGit | N | M | , ; | . : | - _ |EncMode+|
* `-------------------------------------------| LNav | Space| | Enter|LFnNum|-------------------------------------------'
* +--------------------+------+ / | | / +------+--------------------+
* | Shift| Ctrl | Alt | GUI | LSym | | LSym | GUI | AltGr| Ctrl | Shift|
* | | | | | | | | <- | v | ^ | -> |
* `----------------------------------' `----------------------------------'
*/
[_QWERTY_ES] = LAYOUT(
TD_ESSY, ES_Q, ES_W, ES_E, ES_R, ES_T, ES_Y, ES_U, ES_I, ES_O, ES_P, CK_BSDI,
TD_TBCP, ES_A, ES_S, ES_D, ES_F, ES_G, ES_H, ES_J, ES_K, ES_L, ES_NTIL, ES_ACUT,
CK_ENCM, ES_Z, ES_X, ES_C, ES_V, ES_B, TD_LOWR, XXXXXXX, XXXXXXX, TD_RAIS, ES_N, ES_M, ES_COMM, ES_DOT, ES_MINS, CK_ENCP,
MO_LSFT, MO_LCTL, MO_LALT, KC_LGUI, TD_SPSY, TD_ENSY, MT_RGUI, MT_RALT, MT_RCTL, MT_RSFT
),
/*
* Basic characters (COLEMAK ES)
*
* ,-------------------------------------------. ,-------------------------------------------.
* |Esc/LNav| Q | W | F | P | G | | J | L | U | Y | Ñ |BS/Dl/In|
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* |Tab/Caps| A | R | S | T | D | | H | N | E | I | O | ´ ¨ |
* |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
* |EncMode-| Z | X | C | V | B | LGit | | | | LGit | K | M | , ; | . : | - _ |EncMode+|
* `-------------------------------------------| LNav | Space| | Enter|LFnNum|-------------------------------------------'
* +--------------------+------+ / | | / +------+--------------------+
* | Shift| Ctrl | Alt | GUI | LSym | | LSym | GUI | AltGr| Ctrl | Shift|
* | | | | | | | | <- | v | ^ | -> |
* `----------------------------------' `----------------------------------'
*/
[_COLEMAK_ES] = LAYOUT(
TD_ESSY, ES_Q, ES_W, ES_F, ES_P, ES_G, ES_J, ES_L, ES_U, ES_Y, ES_NTIL, CK_BSDI,
TD_TBCP, ES_A, ES_R, ES_S, ES_T, ES_D, ES_H, ES_N, ES_E, ES_I, ES_O, ES_ACUT,
CK_ENCM, ES_Z, ES_X, ES_C, ES_V, ES_B, TD_LOWR, XXXXXXX, XXXXXXX, TD_RAIS, ES_K, ES_M, ES_COMM, ES_DOT, ES_MINS, CK_ENCP,
MO_LSFT, MO_LCTL, MO_LALT, KC_LGUI, TD_SPSY, TD_ENSY, MT_RGUI, MT_RALT, MT_RCTL, MT_RSFT
),
/*
* Symbols
*
* ,-------------------------------------------. ,-------------------------------------------.
* | | 1 ! | 2 " | 3 · | 4 $ | 5 % | | 6 & | 7 / | 8 ( | 9 ) | 0 = | |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | ¡ ¿ | ' " | º ª | \ | | ¡ | | ~ $ | + * | - _ | / | ' ? | ` ^ |
* |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
* | | @ ⅛ | { | ( | [ ° | < > | | | | | | > | ] ¯ | ) | } ˘ | # £ | |
* `----------------------+------+------+------+------+ | | +------+------+------+------+----------------------'
* | | | | | | | | | | | |
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_SYMBOL] = LAYOUT(
_______, ES_1, ES_2, ES_3, ES_4, ES_5, ES_6, ES_7, ES_8, ES_9, ES_0, _______,
_______, ES_IEXL, CK_QUOT, ES_MORD, ES_BSLS, ES_PIPE, ES_TILD, ES_PLUS, ES_MINS, ES_SLSH, ES_QUOT, ES_GRV,
_______, ES_AT, ES_LCBR, ES_LPRN, ES_LBRC, ES_LABK, _______, XXXXXXX, XXXXXXX, _______, ES_RABK, ES_RBRC, ES_RPRN, ES_RCBR, ES_HASH, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/*
* Function keys, NumPad keys
*
* ,-------------------------------------------. ,-------------------------------------------.
* | | F1 | F2 | F3 | F4 | | | , ; | 7 / | 8 ( | 9 ) | * | |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | F5 | F6 | F7 | F8 | | | . : | 4 $ | 5 % | 6 & | - _ | + * |
* |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
* | | F9 | F10 | F11 | F12 | | | | | | | 0 = | 1 ! | 2 " | 3 · | / | |
* `----------------------+------+------+------+------+ | | +------+------+------+------+----------------------'
* | | | | | | | | | | | |
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_FN_NUMPAD] = LAYOUT(
_______, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX, ES_COMM, ES_7, ES_8, ES_9, ES_ASTR, _______,
_______, KC_F5, KC_F6, KC_F7, KC_F8, XXXXXXX, ES_DOT, ES_4, ES_5, ES_6, ES_MINS, ES_PLUS,
_______, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, ES_0, ES_1, ES_2, ES_3, ES_SLSH, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/*
* Navigation (Mouse deactivated for space saving)
*
* ,-------------------------------------------. ,-------------------------------------------.
* | | | MBt1 | MUp | MBt2 | | | PgUp | Home | Up | End | PgUp | |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | Menu | MLeft| MDown|MRight| | | PgDn | Left | Down | Right| PgDn | |
* |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
* | | | | | | | | | | | | |PrtScr|ScrLck| Pause| | |
* `----------------------+------+------+------+------+ | | +------+------+------+------+----------------------'
* | | | | | | | | | | | |
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_NAVIGATION] = LAYOUT(
_______, XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, XXXXXXX, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_PGUP, _______,
_______, KC_APP, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, KC_PSCR, KC_SCRL, KC_PAUS, XXXXXXX, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/*
* Git Commands
*
* ,-------------------------------------------. ,-------------------------------------------.
* | |Config| | | Init | | | | Clone| | | | |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | Diff | Add | Rm | Mv | | |Remote| Fetch| Pull | Push | Merge| Rebase |
* |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
* | |Commit| Stash| Reset|Revert|Status| | | | | | Log |Branch|Switch|ChkOut| Tag | |
* `----------------------+------+------+------+------+ | | +------+------+------+------+----------------------'
* | | | | | | | | | | | |
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_GIT_CMDS] = LAYOUT(
_______, G_CONF, XXXXXXX, XXXXXXX, G_INIT, XXXXXXX, XXXXXXX, G_CLONE, XXXXXXX, XXXXXXX, XXXXXXX, _______,
_______, G_DIFF, G_ADD, G_RM, G_MV, XXXXXXX, G_REMOT, G_FETCH, G_PULL, G_PUSH, G_MERGE, G_REBAS,
_______, G_COMM, G_STASH, G_RESET, G_REVER, G_STAT, _______, XXXXXXX, XXXXXXX, _______, G_LOG, G_BRANC, G_SWTCH, G_CHECK, G_TAG, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/*
* Settings (Default Layer, RGB, Media)
*
* ,-------------------------------------------. ,-------------------------------------------.
* | |QWE_ES|CLM_ES| | | | | | | Vol+ | | | |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | TOG | HUE+ | SAT+ | VAL+ | MOD | | Mute | Prev | Play | Next | | |
* |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
* | LDef | | HUE- | SAT- | VAL- | RMOD | | | | | | | | Vol- | | | LDef |
* `----------------------+------+------+------+------+ | | +------+------+------+------+----------------------'
* | | | | | | | | | | | |
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_SETTINGS] = LAYOUT(
_______, LY_QWES, LY_CLES, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, XXXXXXX, XXXXXXX, _______,
_______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, KC_MUTE, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
CK_LYDF, XXXXXXX, RGB_HUD, RGB_SAD, RGB_VAD, RGB_RMOD,_______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_VOLD, XXXXXXX, XXXXXXX, CK_LYDF,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
// /*
// * Layer template
// *
// * ,-------------------------------------------. ,-------------------------------------------.
// * | | | | | | | | | | | | | |
// * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
// * | | | | | | | | | | | | | |
// * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
// * | | | | | | | | | | | | | | | | | |
// * `----------------------+------+------+------+------+ | | +------+------+------+------+----------------------'
// * | | | | | | | | | | | |
// * | | | | | | | | | | | |
// * `----------------------------------' `----------------------------------'
// */
// [_LAYERINDEX] = LAYOUT(
// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// _______, _______, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, _______, _______,
// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
// ),
};
// clang-format on
/*
* INITIALIZING FUNCTIONS
*/
void matrix_init_user(void) {
#ifdef ENCODER_ENABLE
enc_mode = ENC_MODE_CHAR_LINE;
#endif
}
/*
* LAYER FUNCTIONS
*/
layer_state_t layer_state_set_user(layer_state_t state) {
// Activate Settings layer when both Symbol and Navigation layers are on
return update_tri_layer_state(state, _SYMBOL, _NAVIGATION, _SETTINGS);
}
/*
* MACRO FUNCTIONS
*/
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
// Get current modifier status (Normal and One Shot)
uint8_t mod_state = get_mods();
uint8_t osm_state = get_oneshot_mods();
// Process keycode
switch (keycode) {
case CK_QUOT: // Single/Double Quote
if (record->event.pressed) {
if ((mod_state | osm_state) & MOD_MASK_SHIFT) {
register_code(ES_2); // Shift(2) -> "
} else {
register_code(ES_QUOT); // Single Quote -> '
}
} else {
if ((mod_state | osm_state) & MOD_MASK_SHIFT) {
unregister_code(ES_2); // Shift(2) -> "
} else {
unregister_code(ES_QUOT); // Single Quote -> '
}
}
return false;
break;
case CK_BSDI: { // Backspace/Delete/Insert
static bool delkey_registered = false;
if (record->event.pressed) {
// Ctrl -> Insert/Overwrite Mode
// Shift -> Delete
// Normal -> Backspace
if ((mod_state | osm_state) & MOD_MASK_CTRL) {
del_mods(MOD_MASK_CTRL);
del_oneshot_mods(MOD_MASK_CTRL);
tap_code(KC_INS);
set_mods(mod_state);
set_oneshot_mods(osm_state);
ins_state = !ins_state;
} else if ((mod_state | osm_state) & MOD_MASK_SHIFT) {
delkey_registered = true;
del_mods(MOD_MASK_SHIFT);
del_oneshot_mods(MOD_MASK_SHIFT);
register_code(KC_DEL);
set_mods(mod_state);
set_oneshot_mods(osm_state);
} else {
register_code(KC_BSPC);
}
} else {
// Unregister keycode sent after the release of CK_BSDI
if (delkey_registered) {
unregister_code(KC_DEL);
delkey_registered = false;
} else {
unregister_code(KC_BSPC);
}
}
return false;
}
break;
case CK_LYDF: // De-activate all layers and activate Default layer
layer_move(get_highest_layer(default_layer_state));
return false;
break;
case G_CONF ... G_LOG:
if (record->event.pressed) {
del_mods(MOD_MASK_SHIFT);
del_oneshot_mods(MOD_MASK_SHIFT);
SEND_STRING("git ");
send_string(sendstring_commands[keycode - G_CONF]);
set_mods(mod_state);
set_oneshot_mods(osm_state);
}
break;
#ifdef ENCODER_ENABLE
case CK_ENCM: // Encoder Mode (-)
if (record->event.pressed) {
encoder_cycle_mode(false);
}
break;
case CK_ENCP: // Encoder Mode (+)
if (record->event.pressed) {
encoder_cycle_mode(true);
}
break;
#endif
}
return true;
};
/*
* TAP DANCE FUNCTIONS
*/
#ifdef TAP_DANCE_ENABLE
td_state_t td_current(tap_dance_state_t *state) {
switch (state->count) {
case 1:
return ((!state->pressed) ? TD_SINGLE_TAP : TD_SINGLE_HOLD);
case 2:
return TD_DOUBLE_TAP;
default:
return TD_UNKNOWN;
}
}
void td_kc_ly_finished(tap_dance_state_t *state, void *user_data) {
td_tap_state.state = td_current(state);
uint16_t keycode = ((td_user_data_t *)user_data)->keycode;
uint8_t *layer_arr = ((td_user_data_t *)user_data)->layer;
uint8_t layer_sel = *(layer_arr + 0);
// Get current modifier status (Normal and One Shot) and select layer
uint8_t mod_state = get_mods();
uint8_t osm_state = get_oneshot_mods();
if ((mod_state | osm_state) & MOD_MASK_SHIFT) {
if (*(layer_arr + 1) > _QWERTY_ES) {
layer_sel = *(layer_arr + 1);
}
}
if ((mod_state | osm_state) & MOD_MASK_CTRL) {
if (*(layer_arr + 2) > _QWERTY_ES) {
layer_sel = *(layer_arr + 2);
}
}
switch (td_tap_state.state) {
case TD_NONE:
case TD_UNKNOWN:
break;
case TD_SINGLE_TAP:
// Send keycode if available
// Otherwise, Lock Layer (Base/Shift/Ctrl) and Unlock rest of selectable layers
if (keycode != KC_NO) {
tap_code(keycode);
} else {
uint8_t layer_aux;
for (layer_aux = _GIT_CMDS; layer_aux >= _SYMBOL; layer_aux--) {
if ((layer_aux == layer_sel) && (!layer_state_is(layer_aux))) {
layer_on(layer_aux);
} else {
layer_off(layer_aux);
}
}
}
break;
case TD_SINGLE_HOLD:
// Lock Layer (Base/Shift/Ctrl) while Single Hold on the way
layer_on(layer_sel);
break;
case TD_DOUBLE_TAP:
// (Un)lock Layer (Base/Shift/Ctrl)
if (layer_state_is(layer_sel)) {
layer_off(layer_sel);
} else {
layer_on(layer_sel);
}
break;
}
}
void td_kc_ly_reset(tap_dance_state_t *state, void *user_data) {
uint8_t *layer_arr = ((td_user_data_t *)user_data)->layer;
if (td_tap_state.state == TD_SINGLE_HOLD) {
// Unlock any Layer (Base/Shift/Ctrl) when Single Hold finalizes
uint8_t i;
uint8_t layer_aux;
for (i = 0; i < MAX_MOD; i++) {
layer_aux = *(layer_arr + i);
if ((layer_aux > _QWERTY_ES)) {
layer_off(layer_aux);
}
}
}
td_tap_state.state = TD_NONE;
}
#endif
/*
* OLED FUNCTIONS
*/
#ifdef OLED_DRIVER_ENABLE
static void render_kyria_logo(void) {
static const char PROGMEM kyria_logo[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0xf0, 0x78, 0x38, 0x1c, 0x1e, 0x0e,
0x8e, 0x86, 0x86, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x86,
0x86, 0x8e, 0x0e, 0x1e, 0x1c, 0x38, 0x78, 0xf0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xe0, 0xf0, 0xfc, 0x3e, 0x0f, 0x07, 0x83, 0xe1, 0xf0, 0xf8, 0xbc, 0x9e, 0x8f, 0x87,
0x87, 0x83, 0x81, 0x81, 0xe0, 0x78, 0x1f, 0x07, 0xff, 0xff, 0x07, 0x1f, 0x78, 0xe0, 0x81, 0x81,
0x83, 0x87, 0x87, 0x8f, 0x9e, 0xbc, 0xf8, 0xf0, 0xe1, 0x83, 0x07, 0x0f, 0x3e, 0xfc, 0xf0, 0xe0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x07, 0x07, 0x3f, 0x73, 0xc7, 0x8f, 0x8d,
0x89, 0x99, 0x99, 0xb1, 0xf7, 0xee, 0xf8, 0xf0, 0xff, 0xff, 0xf0, 0xf8, 0xee, 0xf7, 0xb1, 0x99,
0x99, 0x89, 0x8d, 0x8f, 0xc7, 0x73, 0x3f, 0x07, 0x07, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xff,
0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0xe0, 0xfc, 0xce, 0xe3, 0xf1, 0xb1,
0x91, 0x99, 0x99, 0x8d, 0xef, 0x77, 0x1f, 0x0f, 0xff, 0xff, 0x0f, 0x1f, 0x77, 0xef, 0x8d, 0x99,
0x99, 0x91, 0xb1, 0xf1, 0xe3, 0xce, 0xfc, 0xe0, 0xe0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff,
0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x07, 0x0f, 0x3f, 0x7c, 0xf0, 0xe0, 0xc1, 0x87, 0x0f, 0x1f, 0x3d, 0x79, 0xf1, 0xe1,
0xe1, 0xc1, 0x81, 0x81, 0x07, 0x1e, 0xf8, 0xe0, 0xff, 0xff, 0xe0, 0xf8, 0x1e, 0x07, 0x81, 0x81,
0xc1, 0xe1, 0xe1, 0xf1, 0x79, 0x3d, 0x1f, 0x0f, 0x87, 0xc1, 0xe0, 0xf0, 0x7c, 0x3f, 0x0f, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x0f, 0x1e, 0x1c, 0x38, 0x78, 0x70,
0x71, 0x61, 0x61, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x61,
0x61, 0x71, 0x70, 0x78, 0x38, 0x1c, 0x1e, 0x0f, 0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc0, 0xfe, 0xfe, 0xfe, 0xc6, 0xe0, 0xf0, 0x70, 0x30, 0x10, 0x00, 0x70,
0xf0, 0xf0, 0x80, 0x00, 0xc0, 0xf0, 0xf0, 0x70, 0x10, 0xc0, 0xf0, 0xf0, 0xf0, 0x70, 0x30, 0x30,
0x30, 0xc0, 0xf6, 0xf6, 0xf6, 0x06, 0x00, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xf0, 0xf0, 0xe0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x10, 0x1f, 0x1f, 0x1f, 0x03, 0x0f, 0x1f, 0x1e, 0x18, 0x10, 0x00, 0xc0, 0xc0,
0xe7, 0xff, 0x7f, 0x3f, 0x0f, 0x03, 0x01, 0x00, 0x18, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00,
0x18, 0x1f, 0x1f, 0x1f, 0x00, 0x0e, 0x1f, 0x1f, 0x1f, 0x19, 0x0d, 0x1f, 0x1f, 0x1f, 0x03, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
oled_write_raw_P(kyria_logo, sizeof(kyria_logo));
}
static void render_qmk_logo(void) {
static const char PROGMEM qmk_logo[] = {
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4,
0
};
oled_write_P(qmk_logo, false);
}
static void render_status(void) {
// Get current modifier status (Normal and One Shot)
uint8_t mod_state = get_mods();
uint8_t osm_state = get_oneshot_mods();
uint8_t osl_state = get_oneshot_locked_mods();
bool caps_lock = host_keyboard_led_state().caps_lock;
// QMK Logo
render_qmk_logo();
#ifdef ENCODER_ENABLE
// Host Keyboard Encoder Mode
switch (enc_mode) {
case ENC_MODE_CHAR_LINE:
oled_write_P(PSTR("ENC \020 CHAR/LINE\n"), false);
break;
case ENC_MODE_WORD_PAGE:
oled_write_P(PSTR("ENC \020 WORD/PAGE\n"), false);
break;
case ENC_MODE_TABBING:
oled_write_P(PSTR("ENC \020 TABBING\n"), false);
break;
case ENC_MODE_VOLUME:
case ENC_MODE_LAST:
oled_write_P(PSTR("ENC \020 VOLUME\n"), false);
break;
}
#else
oled_write_P(PSTR("\n"), false);
#endif
// Host Keyboard Layer Status
oled_write_P(PSTR("\n"), false);
switch (get_highest_layer(layer_state)) {
case _QWERTY_ES:
oled_write_P(PSTR("L00 \020 QWERTY (ES)\n"), false);
break;
case _COLEMAK_ES:
oled_write_P(PSTR("L00 \020 COLEMAK (ES)\n"), false);
break;
case _SYMBOL:
oled_write_P(PSTR("L01 \020 SYMBOLS\n"), false);
break;
case _FN_NUMPAD:
oled_write_P(PSTR("L02 \020 FN / NUMPAD\n"), false);
break;
case _NAVIGATION:
oled_write_P(PSTR("L03 \020 NAVIGATION\n"), false);
break;
case _GIT_CMDS:
oled_write_P(PSTR("L04 \020 GIT COMMANDS\n"), false);
break;
case _SETTINGS:
oled_write_P(PSTR("L05 \020 SETTINGS\n"), false);
break;
}
// Host Keyboard Locked Modifiers Status
oled_write_P((osl_state & MOD_MASK_SHIFT) ? PSTR("LCK ") : PSTR(" ") , false);
oled_write_P((osl_state & MOD_MASK_CTRL) ? PSTR("LCK ") : PSTR(" ") , false);
oled_write_P((osl_state & MOD_MASK_ALT) ? PSTR("LCK ") : PSTR(" ") , false);
oled_write_P( PSTR(" ") , false);
oled_write_P((caps_lock) ? PSTR(" CAPS") : PSTR(" "), false);
// Host Keyboard Modifiers Status
oled_write_P(((mod_state | osm_state) & MOD_MASK_SHIFT) ? PSTR("SHF ") : PSTR(" ") , false);
oled_write_P(((mod_state | osm_state) & MOD_MASK_CTRL) ? PSTR("CTR ") : PSTR(" ") , false);
oled_write_P(((mod_state | osm_state) & MOD_MASK_ALT) ? PSTR("ALT ") : PSTR(" ") , false);
oled_write_P(((mod_state | osm_state) & MOD_MASK_GUI) ? PSTR("GUI ") : PSTR(" ") , false);
oled_write_P((ins_state) ? PSTR(" INS") : PSTR(" OWR"), false);
}
static void render_settings(void) {
#ifdef RGBLIGHT_ENABLE
char rgb_str[4];
oled_write_P(PSTR("\n\n"), false);
oled_write_P(PSTR("\020H: "), false);
itoa(rgblight_get_hue(), rgb_str, 10);
oled_write_ln(rgb_str, false);
oled_write_P(PSTR("\020S: "), false);
itoa(rgblight_get_sat(), rgb_str, 10);
oled_write_ln(rgb_str, false);
oled_write_P(PSTR("\020V: "), false);
itoa(rgblight_get_val(), rgb_str, 10);
oled_write_ln(rgb_str, false);
#else
oled_write_P(PSTR("\n\n\n\n\n"), false);
#endif
switch (get_highest_layer(default_layer_state)) {
case _QWERTY_ES:
oled_write_ln_P(PSTR(" \020QWERTY (ES)") , false);
break;
case _COLEMAK_ES:
oled_write_P (PSTR(" \020COLEMAK (ES)"), false);
break;
}
#ifdef RGBLIGHT_ENABLE
oled_write_ln_P(PSTR(" RGB DEFAULT"), false);
oled_write_ln_P(PSTR("SETTINGS LAYER "), false);
#else
oled_write_ln_P(PSTR(" DEFAULT"), false);
oled_write_ln_P(PSTR(" LAYER "), false);
#endif
}
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return OLED_ROTATION_180;
}
void oled_task_user(void) {
if (is_keyboard_master()) { // Main screen: Renders keyboard state (layer, modifiers) / RGB settings
if (get_highest_layer(layer_state) != _SETTINGS) {
render_status();
} else {
render_settings();
}
} else { // Auxiliar screen: Renders Kyria logo with scroll
render_kyria_logo();
oled_scroll_right();
}
}
#endif
/*
* ENCODER FUNCTIONS
*/
#ifdef ENCODER_ENABLE
void encoder_cycle_mode(bool up) {
if (enc_mode == 0 && !up) {
enc_mode = ENC_MODE_LAST - 1;
} else {
enc_mode = (enc_mode + (up ? +1 : -1)) % ENC_MODE_LAST;
}
}
bool encoder_update_user(uint8_t index, bool clockwise) {
// Select encoder mode
switch (enc_mode) {
case ENC_MODE_CHAR_LINE:
// Left Encoder: Character Left/Right. Right Encoder: Line Up/Down.
tap_code(!clockwise ? (index == 0 ? KC_LEFT : KC_UP): (index == 0 ? KC_RGHT : KC_DOWN));
break;
case ENC_MODE_WORD_PAGE:
// Left Encoder: Word Left/Right. Right Encoder: Page Up/Down.
tap_code16(!clockwise ? (index == 0 ? C(KC_LEFT) : KC_PGUP): (index == 0 ? C(KC_RGHT) : KC_PGDN));
break;
case ENC_MODE_TABBING:
// Left Encoder: Navigation Tabbing. Right Encoder: Editor Tabbing.
tap_code16(!clockwise ? (index == 0 ? S(C(KC_TAB)) : C(KC_PGUP)): (index == 0 ? C(KC_TAB) : C(KC_PGDN)));
break;
case ENC_MODE_VOLUME:
case ENC_MODE_LAST:
// Volume control
tap_code(clockwise ? KC_VOLU : KC_VOLD);
break;
}
return true;
}
#endif