~ruther/qmk_firmware

36d3902504d6aa0d2bdac88c90339c902ade11b3 — Konstantin Đorđević 6 years ago f204ed6
[User] Update personal userspace and keymaps, add reactive underglow (#6410)

* Update MODERN_DOLCH_RED color

* Remove unused RAL_LAL tap dance

* Disable Space Cadet on all boards

* Rework SEND_STRING_CLEAN into CLEAN_MODS, fix DST_P_R/DST_N_A

* Disable unnecessary underglow animations

* Rearrange feature flags in rules.mk files

* Change custom colors from structs to defines

* Add some explicit initializers

* Add MODERN_DOLCH_CYAN color

* Add IS_LAYER_ON_STATE()/IS_LAYER_OFF_STATE() macros

* Add led_set_keymap() template function

* Change underglow color based on Caps/Fn state

* Preserve val when changing underglow colors

* Only trigger Fn light for Fn layer

* Refactor fn_light() and caps_light() slightly

* Add comments to fn_light() and caps_light()
M keyboards/kbdfans/kbd6x/keymaps/konstantin/config.h => keyboards/kbdfans/kbd6x/keymaps/konstantin/config.h +0 -1
@@ 1,4 1,3 @@
#pragma once

#define LAYER_FN
#define SEND_STRING_CLEAN

M keyboards/kbdfans/kbd6x/keymaps/konstantin/keymap.c => keyboards/kbdfans/kbd6x/keymaps/konstantin/keymap.c +41 -1
@@ 10,7 10,7 @@ enum layers_keymap {
};

void eeconfig_init_keymap(void) {
    rgblight_sethsv(MODERN_DOLCH_RED.h, MODERN_DOLCH_RED.s, MODERN_DOLCH_RED.v);
    rgblight_sethsv(MODERN_DOLCH_RED);
    rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL);
}



@@ 31,6 31,46 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
    }
}

static bool skip_caps = false;

static void fn_light(uint32_t state) {
    if (IS_LAYER_ON_STATE(state, L_FN)) {
        rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
        rgblight_sethsv_noeeprom(modern_dolch_red.h, modern_dolch_red.s, rgblight_get_val());
        skip_caps = true;
    } else {
        rgblight_config_t saved = { .raw = eeconfig_read_rgblight() };
        rgblight_sethsv_noeeprom(saved.hue, saved.sat, saved.val);
        rgblight_mode_noeeprom(saved.mode);
    }
    // caps_light will be called automatically after this
}

static void caps_light(uint8_t usb_led) {
    if (skip_caps) {
        skip_caps = false;
        return;  // Skip calls triggered by the Fn layer turning on
    }
    if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
        rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
        rgblight_sethsv_noeeprom(modern_dolch_cyan.h, modern_dolch_cyan.s, rgblight_get_val());
    } else {
        fn_light(layer_state);  // Caps is off, check if Fn light should be on
    }
}

uint32_t layer_state_set_keymap(uint32_t state) {
    static uint32_t prev_state = L_BASE;
    if (IS_LAYER_ON_STATE(state, L_FN) != IS_LAYER_ON_STATE(prev_state, L_FN)) {
        fn_light(state);  // Fn state changed since last time
    }
    return prev_state = state;
}

void led_set_keymap(uint8_t usb_led) {
    caps_light(usb_led);
}

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /* Base layer
     * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐

M keyboards/kbdfans/kbd6x/keymaps/konstantin/rules.mk => keyboards/kbdfans/kbd6x/keymaps/konstantin/rules.mk +11 -11
@@ 1,11 1,11 @@
BOOTMAGIC_ENABLE  = no
COMMAND_ENABLE    = yes
CONSOLE_ENABLE    = no
EXTRAKEY_ENABLE   = yes
MOUSEKEY_ENABLE   = yes
NKRO_ENABLE       = yes
TAP_DANCE_ENABLE  = yes
UNICODEMAP_ENABLE = no

BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE  = yes
BACKLIGHT_ENABLE   = no
BOOTMAGIC_ENABLE   = no
COMMAND_ENABLE     = yes
CONSOLE_ENABLE     = yes
EXTRAKEY_ENABLE    = yes
MOUSEKEY_ENABLE    = yes
NKRO_ENABLE        = yes
RGBLIGHT_ENABLE    = yes
SPACE_CADET_ENABLE = no
TAP_DANCE_ENABLE   = yes
UNICODEMAP_ENABLE  = no

M keyboards/melody96/keymaps/konstantin/keymap.c => keyboards/melody96/keymaps/konstantin/keymap.c +1 -1
@@ 1,7 1,7 @@
#include QMK_KEYBOARD_H
#include "konstantin.h"

static const HSV *colors[] = { &GODSPEED_BLUE, &GODSPEED_YELLOW };
static const HSV *colors[] = { &godspeed_blue, &godspeed_yellow };
static const size_t cnum = sizeof colors / sizeof *colors;
static size_t cidx = 0;


M keyboards/melody96/keymaps/konstantin/rules.mk => keyboards/melody96/keymaps/konstantin/rules.mk +11 -10
@@ 1,10 1,11 @@
BOOTMAGIC_ENABLE  = no
COMMAND_ENABLE    = yes
CONSOLE_ENABLE    = no
EXTRAKEY_ENABLE   = yes
MOUSEKEY_ENABLE   = yes
NKRO_ENABLE       = yes
TAP_DANCE_ENABLE  = yes
UNICODEMAP_ENABLE = yes

BACKLIGHT_ENABLE = no
BACKLIGHT_ENABLE   = no
BOOTMAGIC_ENABLE   = no
COMMAND_ENABLE     = yes
CONSOLE_ENABLE     = no
EXTRAKEY_ENABLE    = yes
MOUSEKEY_ENABLE    = yes
NKRO_ENABLE        = yes
RGBLIGHT_ENABLE    = yes
SPACE_CADET_ENABLE = no
TAP_DANCE_ENABLE   = yes
UNICODEMAP_ENABLE  = yes

M keyboards/wasdat/keymaps/konstantin/rules.mk => keyboards/wasdat/keymaps/konstantin/rules.mk +10 -8
@@ 1,8 1,10 @@
BOOTMAGIC_ENABLE  = no
COMMAND_ENABLE    = yes
CONSOLE_ENABLE    = yes
EXTRAKEY_ENABLE   = yes
MOUSEKEY_ENABLE   = yes
NKRO_ENABLE       = yes
TAP_DANCE_ENABLE  = yes
UNICODEMAP_ENABLE = yes
BACKLIGHT_ENABLE   = no
BOOTMAGIC_ENABLE   = no
COMMAND_ENABLE     = yes
CONSOLE_ENABLE     = yes
EXTRAKEY_ENABLE    = yes
MOUSEKEY_ENABLE    = yes
NKRO_ENABLE        = yes
SPACE_CADET_ENABLE = no
TAP_DANCE_ENABLE   = yes
UNICODEMAP_ENABLE  = yes

M keyboards/whitefox/keymaps/konstantin/rules.mk => keyboards/whitefox/keymaps/konstantin/rules.mk +11 -11
@@ 1,11 1,11 @@
BOOTMAGIC_ENABLE  = no
COMMAND_ENABLE    = yes
CONSOLE_ENABLE    = yes
EXTRAKEY_ENABLE   = yes
MOUSEKEY_ENABLE   = yes
NKRO_ENABLE       = yes
TAP_DANCE_ENABLE  = yes
UNICODEMAP_ENABLE = yes

BACKLIGHT_ENABLE  = no
VISUALIZER_ENABLE = no
BACKLIGHT_ENABLE   = no
BOOTMAGIC_ENABLE   = no
COMMAND_ENABLE     = yes
CONSOLE_ENABLE     = yes
EXTRAKEY_ENABLE    = yes
MOUSEKEY_ENABLE    = yes
NKRO_ENABLE        = yes
SPACE_CADET_ENABLE = no
TAP_DANCE_ENABLE   = yes
UNICODEMAP_ENABLE  = yes
VISUALIZER_ENABLE  = no

M users/konstantin/config.h => users/konstantin/config.h +6 -0
@@ 13,6 13,12 @@
#define NO_ACTION_MACRO
#define NO_ACTION_ONESHOT

#undef  RGBLIGHT_ANIMATIONS
#define RGBLIGHT_EFFECT_BREATHING
#define RGBLIGHT_EFFECT_RAINBOW_MOOD
#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
#define RGBLIGHT_EFFECT_SNAKE

#define PERMISSIVE_HOLD
#define TAPPING_TERM        200
#define TAPPING_TOGGLE      2

M users/konstantin/konstantin.c => users/konstantin/konstantin.c +32 -20
@@ 32,26 32,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    }

    switch (keycode) {
    case CLEAR:
        if (record->event.pressed) {
            SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE));
        }
        return false;

    case DST_P_R:
        (record->event.pressed ? register_code16 : unregister_code16)(
            (get_mods() & DST_MOD_MASK) ? DST_REM : DST_PRV
        );
        return false;

    case DST_N_A:
        (record->event.pressed ? register_code16 : unregister_code16)(
            (get_mods() & DST_MOD_MASK) ? DST_ADD : DST_NXT
        );
        return false;

        uint16_t kc;
#ifdef LAYER_FN
        static bool fn_lock;
        static bool fn_lock = false;

    case FN_FNLK:
        if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) {


@@ 77,6 60,28 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
        }
        return true;

    case CLEAR:
        if (record->event.pressed) {
            CLEAN_MODS(
                SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE));
            )
        }
        return false;

    case DST_P_R:
        kc = (get_mods() & DST_MOD_MASK) ? DST_REM : DST_PRV;
        CLEAN_MODS(
            (record->event.pressed ? register_code16 : unregister_code16)(kc);
        )
        return false;

    case DST_N_A:
        kc = (get_mods() & DST_MOD_MASK) ? DST_ADD : DST_NXT;
        CLEAN_MODS(
            (record->event.pressed ? register_code16 : unregister_code16)(kc);
        )
        return false;

    default:
        return true;
    }


@@ 91,7 96,7 @@ uint32_t layer_state_set_user(uint32_t state) {
    state = layer_state_set_keymap(state);

#ifdef LAYER_NUMPAD
    bool numpad = state & 1UL<<L_NUMPAD;
    bool numpad = IS_LAYER_ON_STATE(state, L_NUMPAD);
    bool num_lock = IS_HOST_LED_ON(USB_LED_NUM_LOCK);
    if (numpad != num_lock) {
        tap_code(KC_NLCK);  // Toggle Num Lock to match Numpad layer state


@@ 100,3 105,10 @@ uint32_t layer_state_set_user(uint32_t state) {

    return state;
}

__attribute__((weak))
void led_set_keymap(uint8_t usb_led) {}

void led_set_user(uint8_t usb_led) {
    led_set_keymap(usb_led);
}

M users/konstantin/konstantin.h => users/konstantin/konstantin.h +12 -10
@@ 47,15 47,16 @@

#define LCT_CPS LCTL_T(KC_CAPS)

#ifdef SEND_STRING_CLEAN
    #undef  SEND_STRING
    #define SEND_STRING(string) {         \
            uint8_t ss_mods = get_mods(); \
            clear_mods();                 \
            send_string_P(PSTR(string));  \
            set_mods(ss_mods);            \
        }
#endif
#define IS_LAYER_ON_STATE(state, layer)  ( (state) & (1UL << (layer)))
#define IS_LAYER_OFF_STATE(state, layer) (~(state) & (1UL << (layer)))

// Clear mods, perform action, restore mods
#define CLEAN_MODS(action) {       \
        uint8_t mods = get_mods(); \
        clear_mods();              \
        action;                    \
        set_mods(mods);            \
    }

enum keycodes_user {
    CLEAR = SAFE_RANGE,


@@ 81,5 82,6 @@ void keyboard_pre_init_keymap(void);
void eeconfig_init_keymap(void);
void keyboard_post_init_keymap(void);

bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
bool     process_record_keymap(uint16_t keycode, keyrecord_t *record);
uint32_t layer_state_set_keymap(uint32_t state);
void     led_set_keymap(uint8_t usb_led);

M users/konstantin/rgb.c => users/konstantin/rgb.c +4 -3
@@ 20,6 20,7 @@ const uint8_t PROGMEM RGBLED_SNAKE_INTERVALS[] = { 20, 50, 100 };
const uint8_t PROGMEM RGBLED_KNIGHT_INTERVALS[] = { 20, 50, 100 };
#endif

const HSV GODSPEED_BLUE    = { .h = 198, .s = 68,  .v = 255 };
const HSV GODSPEED_YELLOW  = { .h = 27,  .s = 153, .v = 255 };
const HSV MODERN_DOLCH_RED = { .h = 252, .s = 255, .v = 144 };
const HSV godspeed_blue     = { GODSPEED_BLUE };
const HSV godspeed_yellow   = { GODSPEED_YELLOW };
const HSV modern_dolch_cyan = { MODERN_DOLCH_CYAN };
const HSV modern_dolch_red  = { MODERN_DOLCH_RED };

M users/konstantin/rgb.h => users/konstantin/rgb.h +9 -3
@@ 2,6 2,12 @@

#include "quantum.h"

extern const HSV GODSPEED_BLUE;
extern const HSV GODSPEED_YELLOW;
extern const HSV MODERN_DOLCH_RED;
#define GODSPEED_BLUE     198, 68,  255
#define GODSPEED_YELLOW   27,  153, 255
#define MODERN_DOLCH_CYAN 110, 255, 108
#define MODERN_DOLCH_RED  251, 255, 108

extern const HSV godspeed_blue;
extern const HSV godspeed_yellow;
extern const HSV modern_dolch_cyan;
extern const HSV modern_dolch_red;

M users/konstantin/tap_dance.c => users/konstantin/tap_dance.c +1 -1
@@ 107,12 107,12 @@ void td_layer_mod_reset(qk_tap_dance_state_t *state, void *user_data) {
qk_tap_dance_action_t tap_dance_actions[] = {
    [TD_DST_A_R] = ACTION_TAP_DANCE_DOUBLE(DST_ADD, DST_REM),

    [TD_RAL_LAL] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RALT, KC_LALT),
    [TD_RAL_RGU] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RALT, KC_RGUI),
    [TD_RCT_RSF] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RCTL, KC_RSFT),
    [TD_RSF_RCT] = ACTION_TAP_DANCE_DOUBLE_MOD(KC_RSFT, KC_RCTL),

    [TD_LSFT_FN] = ACTION_TAP_DANCE_MOD_LAYER(KC_LSFT, L_FN),
    [TD_RCTL_FN] = ACTION_TAP_DANCE_MOD_LAYER(KC_RCTL, L_FN),

    [TD_FN_RCTL] = ACTION_TAP_DANCE_LAYER_MOD(L_FN, KC_RCTL),
};

M users/konstantin/tap_dance.h => users/konstantin/tap_dance.h +2 -2
@@ 4,24 4,24 @@

#define DST_A_R TD(TD_DST_A_R)

#define RAL_LAL TD(TD_RAL_LAL)
#define RAL_RGU TD(TD_RAL_RGU)
#define RCT_RSF TD(TD_RCT_RSF)
#define RSF_RCT TD(TD_RSF_RCT)

#define LSFT_FN TD(TD_LSFT_FN)
#define RCTL_FN TD(TD_RCTL_FN)

#define FN_RCTL TD(TD_FN_RCTL)

enum tap_dance {
    TD_DST_A_R,

    TD_RAL_LAL,
    TD_RAL_RGU,
    TD_RCT_RSF,
    TD_RSF_RCT,

    TD_LSFT_FN,
    TD_RCTL_FN,

    TD_FN_RCTL,
};