qmk_firmware/keyboards/massdrop/ctrl/keymaps/xanimos/keymap.c

518 lines
29 KiB
C

/* Copyright 2022 Daniel Weeks (@xanimos)
*
* 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 <string.h>
#define MILLISECONDS_IN_SECOND 1000
// These are just to make it neater to use builtin HSV values in the keymap
#define RED {HSV_RED}
#define CORAL {HSV_CORAL}
#define ORANGE {HSV_ORANGE}
#define GOLDEN {HSV_GOLDENROD}
#define GOLD {HSV_GOLD}
#define YELLOW {HSV_YELLOW}
#define CHART {HSV_CHARTREUSE}
#define GREEN {HSV_GREEN}
#define SPRING {HSV_SPRINGGREEN}
#define TURQ {HSV_TURQUOISE}
#define TEAL {HSV_TEAL}
#define CYAN {HSV_CYAN}
#define AZURE {HSV_AZURE}
#define BLUE {HSV_BLUE}
#define PURPLE {HSV_PURPLE}
#define MAGENT {HSV_MAGENTA}
#define PINK {HSV_PINK}
//========================================================== CONFIGURABLE DEFAULTS ==========================================================
#define RGB_DEFAULT_TIME_OUT 30
#define RGB_FAST_MODE_TIME_OUT 3
#define RGB_TIME_OUT_MAX 600
#define RGB_TIME_OUT_MIN 10
#define RGB_TIME_OUT_STEP 10
extern rgb_config_t rgb_matrix_config;
bool disable_layer_color;
bool rgb_enabled_flag; // Current LED state flag. If false then LED is off.
bool rgb_time_out_enable; // Idle LED toggle enable. If false then LED will not turn off after idle timeout.
bool rgb_time_out_fast_mode_enabled; // Enable flag for RGB timeout fast mode
bool rgb_time_out_user_value; // This holds the toggle value set by user with ROUT_TG. It's necessary as RGB_TOG changes timeout enable.
uint16_t rgb_time_out_seconds; // Idle LED timeout value, in seconds not milliseconds
uint16_t rgb_time_out_saved_seconds; // The saved user config for RGB timeout period
led_flags_t rgb_time_out_saved_flag; // Store LED flag before timeout so it can be restored when LED is turned on again.
enum layout_names {
_KL=0, // Keys Layout: The main keyboard layout that has all the characters
_FL, // Function Layout: The function key activated layout with default functions and some added ones
_GL, // GIT Layout: GIT shortcuts and macros
_NUMPAD, // Numpad Layout: Adds a numpad to the keys
};
// Tap Dance keycodes
enum td_keycodes {
TD_FN_SWITCH = 0
};
// Define a type containing as many tapdance states as you need
typedef enum {
TD_NONE,
TD_UNKNOWN,
TD_SINGLE_HOLD,
TD_DOUBLE_HOLD
} td_state_t;
typedef struct {
bool is_press_action;
td_state_t state;
} td_tap_t;
// Declare your tapdance functions:
// Function to determine the current tapdance state
td_state_t cur_dance(tap_dance_state_t *state);
// `finished` and `reset` functions for each tapdance keycode
void fn_tap_finished(tap_dance_state_t *state, void *user_data);
void fn_tap_reset(tap_dance_state_t *state, void *user_data);
enum ctrl_keycodes {
MD_BOOT = SAFE_RANGE, // Restart into bootloader after hold timeout
ROUT_TG, // Timeout Toggle. Toggle idle LED time out on or off
ROUT_VI, // Timeout Value Increase. Increase idle time out before LED disabled
ROUT_VD, // Timeout Value Decrease. Decrease idle time out before LED disabled
ROUT_FM, // RGB timeout fast mode toggle
TOG_NPD, // Toggle Numpad On/Off
COPY_ALL, // Copy all text using ctrl(a+c)
};
enum string_macro_keycodes {
// The start of this enum should always be equal to end of ctrl_keycodes + 1
G_INIT = COPY_ALL + 1, // git init
G_CLONE, // git clone
G_ADD, // git add
G_DIFF, // git diff
G_RESET, // git reset --soft
G_BRANH, // git branch list
G_CHECK, // git checkout
G_REMTE, // git remote add
G_FETCH, // git fetch
G_PULL, // git pull
G_PUPST, // git pull upstream
G_PUSH, // git push
G_PSORG, // git push -u origin
G_PSFWL, // git push --force-with-lease
G_COMM, // git commit
G_COMSG, // git commit -m ": [TFS-]"
G_STAT, // git status
G_LOG, // git log
};
static uint16_t idle_timer; // Idle LED timeout timer
static uint8_t idle_second_counter; // Idle LED seconds counter, counts seconds not milliseconds
static uint8_t key_event_counter; // This counter is used to check if any keys are being held
static const char * sendstring_commands[] = {
"git init",
"git clone ",
"git add ",
"git diff ",
"git reset --soft ",
"git branch --list",
"git checkout ",
"git remote add ",
"git fetch ",
"git pull",
"git pull upstream ",
"git push",
"git push -u origin ",
"git push --force-with-lease",
"git commit ",
"git commit -m \": [TFS-]\"",
"git status",
"git log",
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_KL] = LAYOUT(
// ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
KC_ESC , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SCRL,RCS(KC_M),
// ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_MINS, KC_EQL, KC_BSPC, KC_INS , KC_HOME, KC_PGUP,
// TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL , KC_END , KC_PGDN,
// CAPS A S D F G H J K L ; ' ENTER
KC_CAPS, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, KC_ENT ,
// SHIFT Z X C V B N M , . / RSHIFT UP
SC_LSPO, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, SC_RSPC, KC_UP ,
// CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, TD(TD_FN_SWITCH), KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
[_FL] = LAYOUT(
// ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
_______, ROUT_TG, ROUT_FM, ROUT_VD, ROUT_VI, _______, _______, _______, _______, _______, _______, KC_WAKE, KC_SLEP, KC_PAUS, _______, KC_MUTE,
// ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MSTP, KC_MPLY, KC_VOLU,
// TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
_______, RGB_MOD, RGB_SPI, RGB_VAI, RGB_HUI, RGB_SAI, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD,
// CAPS A S D F G H J K L ; ' ENTER
_______,RGB_RMOD, RGB_SPD, RGB_VAD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______,
// SHIFT Z X C V B N M , . / RSHIFT UP
_______, _______, _______,COPY_ALL, _______, MD_BOOT, NK_TOGG, _______, _______, _______, _______, TOG_NPD, KC_BRIU,
// CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BRID, _______
),
[_GL] = LAYOUT(
// ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
G_INIT, G_CLONE, G_REMTE, G_RESET, G_PSFWL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
_______, G_PUPST, G_PULL, G_PSORG, G_PUSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// CAPS A S D F G H J K L ; ' ENTER
_______, G_ADD, G_STAT, G_DIFF, G_FETCH, _______, _______, _______, _______, _______, _______, _______, _______,
// SHIFT Z X C V B N M , . / RSHIFT UP
_______, G_LOG, G_CHECK, G_COMM, G_COMSG, G_BRANH, _______, _______, _______, _______, _______, _______, _______,
// CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
[_NUMPAD] = LAYOUT(
// ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
TOG_NPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
_______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, _______, _______, _______, _______, _______, _______,
// CAPS A S D F G H J K L ; ' ENTER
_______, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, _______, _______,
// SHIFT Z X C V B N M , . / RSHIFT UP
_______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PDOT, _______, _______, _______, _______,
// CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
_______, _______, _______, KC_P0, _______, _______, _______, _______, _______, _______, _______
),
/*
[X] = LAYOUT(
// ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 PRINT SCLCK PAUSE
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// ~ 1 2 3 4 5 6 7 8 9 0 - = BCKSP INS HOME PGUP
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// TAB Q W E R T Y U I O P [ ] \ DEL END PGDN
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// CAPS A S D F G H J K L ; ' ENTER
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// SHIFT Z X C V B N M , . / RSHIFT UP
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// CTRL GUI ALT SPACE RALT MENU RGUI RCTRL LEFT DOWN RIGHT
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
*/
};
#define __OFF__ {0, 0, 0}
const uint8_t PROGMEM ledmap[][RGB_MATRIX_LED_COUNT][3] = {
[_FL] = {
// These remain on base layer rgb to see adjustments ;)
// |----------------------------------|
// _______, ROUT_TG, ROUT_FM, ROUT_VD, ROUT_VI, _______, _______, _______, _______, _______, _______, KC_WAKE, KC_SLEP, KC_PAUS, _______, KC_MUTE,
__OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, YELLOW, YELLOW, ORANGE, __OFF__, GOLD,
// RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MSTP, KC_MPLY, KC_VOLU,
GOLD, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, RED, SPRING, ORANGE,
// _______, RGB_MOD, RGB_SPI, RGB_VAI, RGB_HUI, RGB_SAI, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD,
__OFF__, ORANGE, GREEN, AZURE, GOLDEN, MAGENT, __OFF__, AZURE, AZURE, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, TEAL, TEAL, ORANGE,
// _______,RGB_RMOD, RGB_SPD, RGB_VAD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______,
__OFF__, ORANGE, GREEN, AZURE, GOLDEN, MAGENT, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
// _______, _______, _______,COPY_ALL, _______, MD_BOOT, NK_TOGG, _______, _______, _______, _______, TO(_NUMPAD), KC_BRIU,
__OFF__, __OFF__, __OFF__, CORAL, __OFF__, RED, TURQ, __OFF__, __OFF__, __OFF__, __OFF__, CYAN, SPRING,
// _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BRID, _______
__OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, SPRING, __OFF__
},
[_GL] = {
// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
__OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
// G_INIT, G_CLONE, G_REMTE, G_RESET, G_PSFWL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
AZURE, CHART, CHART, RED, CORAL, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
// _______, G_PUPST, G_PULL, G_PSORG, G_PUSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
__OFF__, BLUE, PURPLE, MAGENT, PINK, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
// _______, G_ADD, G_STAT, G_DIFF, G_FETCH, _______, _______, _______, _______, _______, _______, _______, _______,
__OFF__, SPRING, GREEN, TURQ, TEAL, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
// _______, G_LOG, G_CHECK, G_COMM, G_COMSG, G_BRANH, _______, _______, _______, _______, _______, _______, _______,
__OFF__, CYAN, GOLDEN, YELLOW, GOLD, CHART, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
__OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__
},
[_NUMPAD] = {
// TO(_KL), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
RED, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
__OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
// _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, _______, _______, _______, _______, _______, _______,
__OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, GREEN, GREEN, GREEN, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__,
// _______, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, _______, _______,
__OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, TURQ, TURQ, TURQ, __OFF__, __OFF__, __OFF__, __OFF__,
// _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PDOT, _______, _______, _______,
__OFF__, __OFF__, __OFF__, __OFF__, __OFF__, CYAN, CYAN, CYAN, AZURE, __OFF__, __OFF__, __OFF__, __OFF__,
// _______, _______, _______, KC_P0, _______, _______, _______, _______, _______, _______, _______
__OFF__, __OFF__, __OFF__, CYAN, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__, __OFF__
},
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
// Enable or disable debugging
debug_enable = false;
debug_matrix = false;
debug_keyboard = false;
debug_mouse = false;
idle_second_counter = 0; // Counter for number of seconds keyboard has been idle.
key_event_counter = 0; // Counter to determine if keys are being held, neutral at 0.
rgb_time_out_seconds = RGB_DEFAULT_TIME_OUT; // RGB timeout initialized to its default configure in keymap.h
rgb_time_out_enable = false; // Disable RGB timeout by default. Enable using toggle key.
rgb_time_out_user_value = false; // Has to have the same initial value as rgb_time_out_enable.
rgb_enabled_flag = true; // Initially, keyboard RGB is enabled. Change to false config.h initializes RGB disabled.
rgb_time_out_fast_mode_enabled = false; // RGB timeout fast mode disabled initially.
rgb_time_out_saved_flag = rgb_matrix_get_flags(); // Save RGB matrix state for when keyboard comes back from ide.
};
void keyboard_post_init_user(void) {
rgb_matrix_enable();
}
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
if(rgb_time_out_enable && rgb_enabled_flag) {
// If the key event counter is not zero then some key was pressed down but not released, thus reset the timeout counter.
if (key_event_counter) {
idle_second_counter = 0;
} else if (timer_elapsed(idle_timer) > MILLISECONDS_IN_SECOND) {
idle_second_counter++;
idle_timer = timer_read();
}
if (idle_second_counter >= rgb_time_out_seconds) {
rgb_time_out_saved_flag = rgb_matrix_get_flags();
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_disable_noeeprom();
rgb_enabled_flag = false;
idle_second_counter = 0;
}
}
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
static uint32_t key_timer;
// Increment key event counter for every press and decrement for every release.
if (record->event.pressed) {
key_event_counter++;
} else {
key_event_counter--;
}
if (rgb_time_out_enable) {
idle_timer = timer_read();
// Reset the seconds counter. Without this, something like press> leave x seconds> press, would be x seconds on the effective counter not 0 as it should.
idle_second_counter = 0;
if (!rgb_enabled_flag) {
rgb_matrix_enable_noeeprom();
rgb_matrix_set_flags(rgb_time_out_saved_flag);
rgb_enabled_flag = true;
}
}
switch (keycode) {
case MD_BOOT:
if (record->event.pressed) {
key_timer = timer_read32();
} else {
if (timer_elapsed32(key_timer) >= 500) {
reset_keyboard();
}
}
return false;
}
if (record->event.pressed) {
switch (keycode) {
case RGB_TOG:
rgb_time_out_enable = rgb_time_out_user_value;
switch (rgb_matrix_get_flags()) {
case LED_FLAG_ALL: {
rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
case LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER: {
rgb_matrix_set_flags(LED_FLAG_UNDERGLOW);
rgb_matrix_set_color_all(0, 0, 0);
}
break;
case LED_FLAG_UNDERGLOW: {
// This line is for LED idle timer. It disables the toggle so you can turn off LED completely if you like
rgb_time_out_enable = false;
rgb_matrix_set_flags(LED_FLAG_NONE);
rgb_matrix_disable_noeeprom();
}
break;
default: {
rgb_matrix_set_flags(LED_FLAG_ALL);
rgb_matrix_enable_noeeprom();
}
break;
}
return false;
// ======================================================== CUSTOM KEYCOADS BELOW ========================================================
case COPY_ALL:
// Selects all and text and copy
SEND_STRING(SS_LCTL("ac"));
return false;
case ROUT_TG:
// Toggle idle LED timeout on or off
rgb_time_out_enable = !rgb_time_out_enable;
rgb_time_out_user_value = rgb_time_out_enable;
return false;
case ROUT_VI:
// Increase idle LED timeout value in seconds
// Only increase if current value is lower than RGB_TIME_OUT_MAX. Don't care what value the result will be
// Modity RGB_TIME_OUT_STEP for bigger or smaller increments
if (!rgb_time_out_fast_mode_enabled && rgb_time_out_seconds <= RGB_TIME_OUT_MAX) {
rgb_time_out_seconds += RGB_TIME_OUT_STEP;
}
return false;
case ROUT_VD:
// Decrease idle LED timeout value in seconds
// Only decrease if current value is higher than minimum value and the result is larger than zero
// Modity RGB_TIME_OUT_STEP for bigger or smaller decrements
if (!rgb_time_out_fast_mode_enabled && rgb_time_out_seconds > RGB_TIME_OUT_MIN) {
rgb_time_out_seconds -= RGB_TIME_OUT_STEP;
}
return false;
case ROUT_FM:
if (rgb_time_out_fast_mode_enabled) {
rgb_time_out_seconds = rgb_time_out_saved_seconds;
} else {
rgb_time_out_saved_seconds = rgb_time_out_seconds;
rgb_time_out_seconds = RGB_FAST_MODE_TIME_OUT;
}
rgb_time_out_fast_mode_enabled = !rgb_time_out_fast_mode_enabled;
return false;
case G_INIT ... G_LOG:
send_string_with_delay(sendstring_commands[keycode - G_INIT], 5);
return false;
case TOG_NPD:
if (get_highest_layer(layer_state) != _NUMPAD) {
layer_move(_NUMPAD);
} else {
layer_move(_KL);
}
return false;
}
}
return true;
}
void set_layer_color(int layer) {
if (layer == 0) { return; }
for (int i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
HSV hsv = {
.h = pgm_read_byte(&ledmap[layer][i][0]),
.s = pgm_read_byte(&ledmap[layer][i][1]),
.v = pgm_read_byte(&ledmap[layer][i][2]),
};
if (hsv.h || hsv.s || hsv.v) {
RGB rgb = hsv_to_rgb(hsv);
float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX;
rgb_matrix_set_color(i, f * rgb.r, f * rgb.g, f * rgb.b);
continue;
}
if(layer == _FL && i <= 4 && i >= 1) {
continue; // Leave RGB for F1-F4 of function layer to adjust RGB settings
}
rgb_matrix_set_color(i, 0, 0, 0);
}
}
bool rgb_matrix_indicators_user(void) {
if (disable_layer_color ||
rgb_matrix_get_flags() == LED_FLAG_NONE ||
rgb_matrix_get_flags() == LED_FLAG_UNDERGLOW) {
return;
}
set_layer_color(get_highest_layer(layer_state));
return false;
}
td_state_t cur_dance(tap_dance_state_t *state) {
if (state->pressed && !state->interrupted) {
if (state->count == 1) { return TD_SINGLE_HOLD; }
return TD_DOUBLE_HOLD;
}
return TD_UNKNOWN;
}
static td_tap_t fn_tap_state = {
.is_press_action = true,
.state = TD_NONE
};
void fn_tap_finished(tap_dance_state_t *state, void *user_data) {
fn_tap_state.state = cur_dance(state);
switch (fn_tap_state.state) {
case TD_SINGLE_HOLD:
// set function layer
layer_move(_FL);
break;
case TD_DOUBLE_HOLD:
// set git layer
layer_move(_GL);
break;
case TD_UNKNOWN:
register_code(KC_APP);
break;
default:
break;
}
}
void fn_tap_reset(tap_dance_state_t *state, void *user_data) {
switch (fn_tap_state.state) {
case TD_UNKNOWN:
unregister_code(KC_APP);
break;
case TD_DOUBLE_HOLD:
case TD_SINGLE_HOLD:
// Set default layer if we didn't activate numpad layer in function
if (get_highest_layer(layer_state) != _NUMPAD) {
layer_move(_KL);
}
break;
break;
default:
break;
}
fn_tap_state.state = TD_NONE;
}
tap_dance_action_t tap_dance_actions[] = {
[TD_FN_SWITCH] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, fn_tap_finished, fn_tap_reset)
};