diff options
| -rw-r--r-- | keyboards/dz60/keymaps/billypython/config.h | 3 | ||||
| -rw-r--r-- | keyboards/dz60/keymaps/billypython/keymap.c | 46 | ||||
| -rw-r--r-- | keyboards/dz60/keymaps/billypython/rules.mk | 8 | ||||
| -rw-r--r-- | keyboards/whitefox/keymaps/billypython/config.h | 16 | ||||
| -rw-r--r-- | keyboards/whitefox/keymaps/billypython/keymap.c | 133 | ||||
| -rw-r--r-- | keyboards/whitefox/keymaps/billypython/rules.mk | 9 | ||||
| -rw-r--r-- | users/billypython/billypython.c | 32 | ||||
| -rw-r--r-- | users/billypython/billypython.h | 34 | ||||
| -rw-r--r-- | users/billypython/config.h | 19 | ||||
| -rw-r--r-- | users/billypython/rules.mk | 6 | ||||
| -rw-r--r-- | users/billypython/tap_dance.c | 33 | ||||
| -rw-r--r-- | users/billypython/tap_dance.h | 9 |
12 files changed, 202 insertions, 146 deletions
diff --git a/keyboards/dz60/keymaps/billypython/config.h b/keyboards/dz60/keymaps/billypython/config.h new file mode 100644 index 000000000..4b511eb84 --- /dev/null +++ b/keyboards/dz60/keymaps/billypython/config.h | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | #pragma once | ||
| 2 | |||
| 3 | #define LAYER_FN | ||
diff --git a/keyboards/dz60/keymaps/billypython/keymap.c b/keyboards/dz60/keymaps/billypython/keymap.c new file mode 100644 index 000000000..78fc55f6f --- /dev/null +++ b/keyboards/dz60/keymaps/billypython/keymap.c | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | #include QMK_KEYBOARD_H | ||
| 2 | #include "billypython.h" | ||
| 3 | |||
| 4 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
| 5 | /* Base layer | ||
| 6 | * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ | ||
| 7 | * │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ \ │ ` │ | ||
| 8 | * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ | ||
| 9 | * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │Bspc │ | ||
| 10 | * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ | ||
| 11 | * │FnCaps│ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ | ||
| 12 | * ├──────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬───┬───┤ | ||
| 13 | * │LShift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │RSC│ ↑ │Del│ | ||
| 14 | * ├────┬──┴─┬─┴──┬┴───┴───┴───┴───┴───┴───┼───┼───┼───┼───┼───┤ | ||
| 15 | * │LCtl│LGui│LAlt│ Space │RAl│FnL│ ← │ ↓ │ → │ | ||
| 16 | * └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘ | ||
| 17 | */ | ||
| 18 | [L_BASE] = LAYOUT_directional( \ | ||
| 19 | KC_ESC, 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_BSLS, KC_GRV, \ | ||
| 20 | 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_BSPC, \ | ||
| 21 | FN_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, \ | ||
| 22 | KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSF_RCT, KC_UP, KC_DEL, \ | ||
| 23 | KC_LCTL, KC_LGUI, KC_LALT, XXXXXXX, KC_SPC, XXXXXXX, KC_RALT, FN_FNLK, KC_LEFT, KC_DOWN, KC_RGHT \ | ||
| 24 | ), | ||
| 25 | |||
| 26 | /* Function layer | ||
| 27 | * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ | ||
| 28 | * │ │F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│ │PSc│ | ||
| 29 | * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ | ||
| 30 | * │ M4 │M2 │M↑ │M1 │M3 │M5 │ │PgU│ ↑ │PgD│Ply│Prv│Nxt│Clear│ | ||
| 31 | * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ | ||
| 32 | * │ │M← │M↓ │M→ │MW↑│ │Hom│ ← │ ↓ │ → │End│ │ │ | ||
| 33 | * ├──────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬───┬───┤ | ||
| 34 | * │ │MA0│MA2│MW←│MW→│ │ │ │Vo-│Vo+│Mut│App│PgU│Ins│ | ||
| 35 | * ├────┬──┴─┬─┴──┬┴───┴───┴───┴───┴───┴───┼───┼───┼───┼───┼───┤ | ||
| 36 | * │ │ │ │ MW↓ │ │ │Hom│PgD│End│ | ||
| 37 | * └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘ | ||
| 38 | */ | ||
| 39 | [L_FN] = LAYOUT_directional( \ | ||
| 40 | _______, 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, \ | ||
| 41 | KC_BTN4, KC_BTN2, KC_MS_U, KC_BTN1, KC_BTN3, KC_BTN5, _______, KC_PGUP, KC_UP, KC_PGDN, KC_MPLY, KC_MPRV, KC_MNXT, CLEAR, \ | ||
| 42 | _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______, _______, \ | ||
| 43 | _______, KC_ACL0, KC_ACL2, KC_WH_L, KC_WH_R, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_APP, KC_PGUP, KC_INS, \ | ||
| 44 | _______, _______, _______, XXXXXXX, KC_WH_D, XXXXXXX, _______, _______, KC_HOME, KC_PGDN, KC_END \ | ||
| 45 | ), | ||
| 46 | }; | ||
diff --git a/keyboards/dz60/keymaps/billypython/rules.mk b/keyboards/dz60/keymaps/billypython/rules.mk new file mode 100644 index 000000000..332613604 --- /dev/null +++ b/keyboards/dz60/keymaps/billypython/rules.mk | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | BACKLIGHT_ENABLE = no | ||
| 2 | BOOTMAGIC_ENABLE = no | ||
| 3 | COMMAND_ENABLE = yes | ||
| 4 | CONSOLE_ENABLE = yes | ||
| 5 | EXTRAKEY_ENABLE = yes | ||
| 6 | MOUSEKEY_ENABLE = yes | ||
| 7 | RGBLIGHT_ENABLE = no | ||
| 8 | TAP_DANCE_ENABLE = yes | ||
diff --git a/keyboards/whitefox/keymaps/billypython/config.h b/keyboards/whitefox/keymaps/billypython/config.h index 275f8effb..4b511eb84 100644 --- a/keyboards/whitefox/keymaps/billypython/config.h +++ b/keyboards/whitefox/keymaps/billypython/config.h | |||
| @@ -1,17 +1,3 @@ | |||
| 1 | #pragma once | 1 | #pragma once |
| 2 | 2 | ||
| 3 | #define FORCE_NKRO | 3 | #define LAYER_FN |
| 4 | |||
| 5 | #define MAGIC_KEY_LAYER0_ALT1 BSLS | ||
| 6 | #define MAGIC_KEY_BOOTLOADER ESC | ||
| 7 | |||
| 8 | #define MOUSEKEY_DELAY 50 | ||
| 9 | #define MOUSEKEY_INTERVAL 15 | ||
| 10 | #define MOUSEKEY_MAX_SPEED 4 | ||
| 11 | #define MOUSEKEY_TIME_TO_MAX 50 | ||
| 12 | #define MOUSEKEY_WHEEL_MAX_SPEED 1 | ||
| 13 | #define MOUSEKEY_WHEEL_TIME_TO_MAX 50 | ||
| 14 | |||
| 15 | #define PERMISSIVE_HOLD | ||
| 16 | #define TAPPING_TERM 200 | ||
| 17 | #define TAPPING_TOGGLE 2 | ||
diff --git a/keyboards/whitefox/keymaps/billypython/keymap.c b/keyboards/whitefox/keymaps/billypython/keymap.c index dfc7d6a96..79758de80 100644 --- a/keyboards/whitefox/keymaps/billypython/keymap.c +++ b/keyboards/whitefox/keymaps/billypython/keymap.c | |||
| @@ -1,95 +1,5 @@ | |||
| 1 | #include QMK_KEYBOARD_H | 1 | #include QMK_KEYBOARD_H |
| 2 | 2 | #include "billypython.h" | |
| 3 | #define TOP LCTL(KC_HOME) | ||
| 4 | #define BOTTOM LCTL(KC_END) | ||
| 5 | |||
| 6 | #define FN MO(L_FN) | ||
| 7 | #define FN_CAPS LT(L_FN, KC_CAPS) | ||
| 8 | #define FN_FNLK TT(L_FN) | ||
| 9 | |||
| 10 | #define RSF_RCT TD(TD_RSF_RCT) | ||
| 11 | |||
| 12 | #define COMMA UC(0x002C) | ||
| 13 | #define L_PAREN UC(0x0028) | ||
| 14 | #define R_PAREN UC(0x0029) | ||
| 15 | #define EQUALS UC(0x003D) | ||
| 16 | #define TIMES UC(0x00D7) | ||
| 17 | #define DIVIDE UC(0x00F7) | ||
| 18 | #define MINUS UC(0x2212) | ||
| 19 | |||
| 20 | void eeconfig_init_user(void) { | ||
| 21 | set_unicode_input_mode(UC_LNX); | ||
| 22 | } | ||
| 23 | |||
| 24 | enum layers { | ||
| 25 | L_BASE, | ||
| 26 | L_FN, | ||
| 27 | L_NUMPAD, | ||
| 28 | }; | ||
| 29 | |||
| 30 | enum custom_keycodes { | ||
| 31 | CLEAR = SAFE_RANGE, | ||
| 32 | NUMPAD, | ||
| 33 | }; | ||
| 34 | |||
| 35 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
| 36 | switch (keycode) { | ||
| 37 | case CLEAR: | ||
| 38 | if (record->event.pressed) { | ||
| 39 | SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); | ||
| 40 | } | ||
| 41 | return false; | ||
| 42 | |||
| 43 | case NUMPAD: | ||
| 44 | if (record->event.pressed) { | ||
| 45 | layer_invert(L_NUMPAD); | ||
| 46 | bool num_lock = host_keyboard_leds() & 1<<USB_LED_NUM_LOCK; | ||
| 47 | if (num_lock != (bool)IS_LAYER_ON(L_NUMPAD)) { | ||
| 48 | tap_code(KC_NLCK); // Toggle Num Lock to match layer state. | ||
| 49 | } | ||
| 50 | } | ||
| 51 | return false; | ||
| 52 | |||
| 53 | default: | ||
| 54 | return true; | ||
| 55 | } | ||
| 56 | } | ||
| 57 | |||
| 58 | #define ACTION_TAP_DANCE_DOUBLE_MODS(mod1, mod2) { \ | ||
| 59 | .fn = { td_double_mods_each, NULL, td_double_mods_reset }, \ | ||
| 60 | .user_data = &(qk_tap_dance_pair_t){ mod1, mod2 }, \ | ||
| 61 | } | ||
| 62 | |||
| 63 | void td_double_mods_each(qk_tap_dance_state_t *state, void *user_data) { | ||
| 64 | qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data; | ||
| 65 | // Single tap → mod1, double tap → mod2, triple tap etc. → mod1+mod2 | ||
| 66 | if (state->count == 1 || state->count == 3) { | ||
| 67 | register_code(mods->kc1); | ||
| 68 | } else if (state->count == 2) { | ||
| 69 | unregister_code(mods->kc1); | ||
| 70 | register_code(mods->kc2); | ||
| 71 | } | ||
| 72 | // Prevent tap dance from sending kc1 and kc2 as weak mods | ||
| 73 | state->weak_mods &= ~(MOD_BIT(mods->kc1) | MOD_BIT(mods->kc2)); | ||
| 74 | } | ||
| 75 | |||
| 76 | void td_double_mods_reset(qk_tap_dance_state_t *state, void *user_data) { | ||
| 77 | qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data; | ||
| 78 | if (state->count == 1 || state->count > 2) { | ||
| 79 | unregister_code(mods->kc1); | ||
| 80 | } | ||
| 81 | if (state->count >= 2) { | ||
| 82 | unregister_code(mods->kc2); | ||
| 83 | } | ||
| 84 | } | ||
| 85 | |||
| 86 | enum tap_dance { | ||
| 87 | TD_RSF_RCT, | ||
| 88 | }; | ||
| 89 | |||
| 90 | qk_tap_dance_action_t tap_dance_actions[] = { | ||
| 91 | [TD_RSF_RCT] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RSFT, KC_RCTL), | ||
| 92 | }; | ||
| 93 | 3 | ||
| 94 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | 4 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |
| 95 | /* Base layer | 5 | /* Base layer |
| @@ -106,11 +16,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 106 | * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ | 16 | * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ |
| 107 | */ | 17 | */ |
| 108 | [L_BASE] = LAYOUT_truefox( \ | 18 | [L_BASE] = LAYOUT_truefox( \ |
| 109 | KC_ESC, 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_BSLS,KC_GRV, KC_PSCR, \ | 19 | KC_ESC, 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_BSLS, KC_GRV, KC_PSCR, \ |
| 110 | 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_BSPC, KC_DEL, \ | 20 | 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_BSPC, KC_DEL, \ |
| 111 | FN_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, KC_PGUP, \ | 21 | FN_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, KC_PGUP, \ |
| 112 | KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,RSF_RCT, KC_UP, KC_PGDN, \ | 22 | KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSF_RCT, KC_UP, KC_PGDN, \ |
| 113 | KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,FN_FNLK, KC_LEFT,KC_DOWN,KC_RGHT \ | 23 | KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, FN_FNLK, KC_LEFT, KC_DOWN, KC_RGHT \ |
| 114 | ), | 24 | ), |
| 115 | 25 | ||
| 116 | /* Function layer | 26 | /* Function layer |
| @@ -127,31 +37,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 127 | * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ | 37 | * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ |
| 128 | */ | 38 | */ |
| 129 | [L_FN] = LAYOUT_truefox( \ | 39 | [L_FN] = LAYOUT_truefox( \ |
| 130 | _______,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, NUMPAD, KC_SLCK,KC_PAUS, \ | 40 | _______, 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_NLCK, KC_SLCK, KC_PAUS, \ |
| 131 | KC_BTN4,KC_BTN2,KC_MS_U,KC_BTN1,KC_BTN3,KC_BTN5,_______,KC_PGUP,KC_UP, KC_PGDN,KC_MPLY,KC_MPRV,KC_MNXT,CLEAR, KC_INS, \ | 41 | KC_BTN4, KC_BTN2, KC_MS_U, KC_BTN1, KC_BTN3, KC_BTN5, _______, KC_PGUP, KC_UP, KC_PGDN, KC_MPLY, KC_MPRV, KC_MNXT, CLEAR, KC_INS, \ |
| 132 | _______,KC_MS_L,KC_MS_D,KC_MS_R,KC_WH_U,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_END, _______, _______, TOP, \ | 42 | _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______, _______, TOP, \ |
| 133 | _______, KC_ACL0,KC_ACL2,KC_WH_L,KC_WH_R,_______,_______,_______,KC_VOLD,KC_VOLU,KC_MUTE,KC_APP, KC_PGUP,BOTTOM, \ | 43 | _______, KC_ACL0, KC_ACL2, KC_WH_L, KC_WH_R, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_APP, KC_PGUP, BOTTOM, \ |
| 134 | _______,_______,_______, KC_WH_D, _______,_______, KC_HOME,KC_PGDN,KC_END \ | 44 | _______, _______, _______, KC_WH_D, _______, _______, KC_HOME, KC_PGDN, KC_END \ |
| 135 | ), | ||
| 136 | |||
| 137 | /* Numpad layer | ||
| 138 | * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ | ||
| 139 | * │Num│ │ │ │ │ │ │P7 │P8 │P9 │P- │ − │ = │Num│ │ │ | ||
| 140 | * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ | ||
| 141 | * │ │ │ │ │ │ │ │P4 │P5 │P6 │P+ │ ( │ ) │ │ │ | ||
| 142 | * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ | ||
| 143 | * │ │ │ │ │ │ │ │P1 │P2 │P3 │P* │ × │ PEnter │ │ | ||
| 144 | * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ | ||
| 145 | * │ │ │ │ │ │ │P0 │P0 │ , │P. │P/ │ ÷ │ │ │ | ||
| 146 | * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ | ||
| 147 | * │ │ │ │ │ │ │ │ │ │ │ | ||
| 148 | * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ | ||
| 149 | */ | ||
| 150 | [L_NUMPAD] = LAYOUT_truefox( \ | ||
| 151 | NUMPAD, _______,_______,_______,_______,_______,_______,KC_P7, KC_P8, KC_P9, KC_PMNS,MINUS, EQUALS, NUMPAD, _______,_______, \ | ||
| 152 | _______,_______,_______,_______,_______,_______,_______,KC_P4, KC_P5, KC_P6, KC_PPLS,L_PAREN,R_PAREN,_______, _______, \ | ||
| 153 | _______,_______,_______,_______,_______,_______,_______,KC_P1, KC_P2, KC_P3, KC_PAST,TIMES, KC_PENT, _______, \ | ||
| 154 | _______, _______,_______,_______,_______,_______,KC_P0, KC_P0, COMMA, KC_PDOT,KC_PSLS,DIVIDE, _______,_______, \ | ||
| 155 | _______,_______,_______, _______, _______,_______, _______,_______,_______ \ | ||
| 156 | ), | 45 | ), |
| 157 | }; | 46 | }; |
diff --git a/keyboards/whitefox/keymaps/billypython/rules.mk b/keyboards/whitefox/keymaps/billypython/rules.mk index 8fbc1f3af..133c7af54 100644 --- a/keyboards/whitefox/keymaps/billypython/rules.mk +++ b/keyboards/whitefox/keymaps/billypython/rules.mk | |||
| @@ -1,15 +1,6 @@ | |||
| 1 | AUDIO_ENABLE = no | ||
| 2 | BACKLIGHT_ENABLE = no | 1 | BACKLIGHT_ENABLE = no |
| 3 | BLUETOOTH_ENABLE = no | ||
| 4 | BOOTMAGIC_ENABLE = no | 2 | BOOTMAGIC_ENABLE = no |
| 5 | COMMAND_ENABLE = yes | 3 | COMMAND_ENABLE = yes |
| 6 | CONSOLE_ENABLE = yes | 4 | CONSOLE_ENABLE = yes |
| 7 | EXTRAKEY_ENABLE = yes | ||
| 8 | MIDI_ENABLE = no | ||
| 9 | MOUSEKEY_ENABLE = yes | ||
| 10 | NKRO_ENABLE = yes | ||
| 11 | RGBLIGHT_ENABLE = no | ||
| 12 | SLEEP_LED_ENABLE = no | ||
| 13 | TAP_DANCE_ENABLE = yes | 5 | TAP_DANCE_ENABLE = yes |
| 14 | UNICODE_ENABLE = yes | ||
| 15 | VISUALIZER_ENABLE = no | 6 | VISUALIZER_ENABLE = no |
diff --git a/users/billypython/billypython.c b/users/billypython/billypython.c new file mode 100644 index 000000000..7bdfe33a4 --- /dev/null +++ b/users/billypython/billypython.c | |||
| @@ -0,0 +1,32 @@ | |||
| 1 | #include "billypython.h" | ||
| 2 | |||
| 3 | __attribute__((weak)) | ||
| 4 | bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { | ||
| 5 | return true; | ||
| 6 | } | ||
| 7 | |||
| 8 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
| 9 | if (!process_record_keymap(keycode, record)) { | ||
| 10 | return false; | ||
| 11 | } | ||
| 12 | |||
| 13 | switch (keycode) { | ||
| 14 | case CLEAR: | ||
| 15 | if (record->event.pressed) { | ||
| 16 | SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); | ||
| 17 | } | ||
| 18 | return false; | ||
| 19 | |||
| 20 | default: | ||
| 21 | return true; | ||
| 22 | } | ||
| 23 | } | ||
| 24 | |||
| 25 | __attribute__((weak)) | ||
| 26 | uint32_t layer_state_set_keymap(uint32_t state) { | ||
| 27 | return state; | ||
| 28 | } | ||
| 29 | |||
| 30 | uint32_t layer_state_set_user(uint32_t state) { | ||
| 31 | return layer_state_set_keymap(state); | ||
| 32 | } | ||
diff --git a/users/billypython/billypython.h b/users/billypython/billypython.h new file mode 100644 index 000000000..4a444e978 --- /dev/null +++ b/users/billypython/billypython.h | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "quantum.h" | ||
| 4 | |||
| 5 | #ifdef TAP_DANCE_ENABLE | ||
| 6 | #include "tap_dance.h" | ||
| 7 | #endif | ||
| 8 | |||
| 9 | #ifdef LAYER_FN | ||
| 10 | #define FN MO(L_FN) | ||
| 11 | #define FN_CAPS LT(L_FN, KC_CAPS) | ||
| 12 | #define FN_FNLK TT(L_FN) | ||
| 13 | #endif | ||
| 14 | |||
| 15 | #define TOP LCTL(KC_HOME) | ||
| 16 | #define BOTTOM LCTL(KC_END) | ||
| 17 | |||
| 18 | enum keycodes_user { | ||
| 19 | CLEAR = SAFE_RANGE, | ||
| 20 | |||
| 21 | RANGE_KEYMAP, | ||
| 22 | }; | ||
| 23 | |||
| 24 | enum layers_user { | ||
| 25 | L_BASE, | ||
| 26 | #ifdef LAYER_FN | ||
| 27 | L_FN, | ||
| 28 | #endif | ||
| 29 | |||
| 30 | L_RANGE_KEYMAP, | ||
| 31 | }; | ||
| 32 | |||
| 33 | bool process_record_keymap(uint16_t keycode, keyrecord_t *record); | ||
| 34 | uint32_t layer_state_set_keymap(uint32_t state); | ||
diff --git a/users/billypython/config.h b/users/billypython/config.h new file mode 100644 index 000000000..705e6c934 --- /dev/null +++ b/users/billypython/config.h | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | #pragma once | ||
| 2 | |||
| 3 | #define FORCE_NKRO | ||
| 4 | |||
| 5 | #define MAGIC_KEY_BOOTLOADER B | ||
| 6 | |||
| 7 | #define MOUSEKEY_DELAY 50 | ||
| 8 | #define MOUSEKEY_INTERVAL 15 | ||
| 9 | #define MOUSEKEY_MAX_SPEED 4 | ||
| 10 | #define MOUSEKEY_TIME_TO_MAX 50 | ||
| 11 | #define MOUSEKEY_WHEEL_MAX_SPEED 1 | ||
| 12 | #define MOUSEKEY_WHEEL_TIME_TO_MAX 50 | ||
| 13 | |||
| 14 | #define NO_ACTION_FUNCTION | ||
| 15 | #define NO_ACTION_MACRO | ||
| 16 | |||
| 17 | #define PERMISSIVE_HOLD | ||
| 18 | #define TAPPING_TERM 200 | ||
| 19 | #define TAPPING_TOGGLE 2 | ||
diff --git a/users/billypython/rules.mk b/users/billypython/rules.mk new file mode 100644 index 000000000..915323b49 --- /dev/null +++ b/users/billypython/rules.mk | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | SRC += billypython.c | ||
| 2 | ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) | ||
| 3 | SRC += tap_dance.c | ||
| 4 | endif | ||
| 5 | |||
| 6 | EXTRAFLAGS += -flto | ||
diff --git a/users/billypython/tap_dance.c b/users/billypython/tap_dance.c new file mode 100644 index 000000000..74ae16639 --- /dev/null +++ b/users/billypython/tap_dance.c | |||
| @@ -0,0 +1,33 @@ | |||
| 1 | #include "tap_dance.h" | ||
| 2 | |||
| 3 | #define ACTION_TAP_DANCE_DOUBLE_MODS(mod1, mod2) { \ | ||
| 4 | .fn = { td_double_mods_each, NULL, td_double_mods_reset }, \ | ||
| 5 | .user_data = &(qk_tap_dance_pair_t){ mod1, mod2 }, \ | ||
| 6 | } | ||
| 7 | |||
| 8 | void td_double_mods_each(qk_tap_dance_state_t *state, void *user_data) { | ||
| 9 | qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data; | ||
| 10 | // Single tap → mod1, double tap → mod2, triple tap etc. → mod1+mod2 | ||
| 11 | if (state->count == 1 || state->count == 3) { | ||
| 12 | register_code(mods->kc1); | ||
| 13 | } else if (state->count == 2) { | ||
| 14 | unregister_code(mods->kc1); | ||
| 15 | register_code(mods->kc2); | ||
| 16 | } | ||
| 17 | // Prevent tap dance from sending kc1 and kc2 as weak mods | ||
| 18 | state->weak_mods &= ~(MOD_BIT(mods->kc1) | MOD_BIT(mods->kc2)); | ||
| 19 | } | ||
| 20 | |||
| 21 | void td_double_mods_reset(qk_tap_dance_state_t *state, void *user_data) { | ||
| 22 | qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data; | ||
| 23 | if (state->count == 1 || state->count >= 3) { | ||
| 24 | unregister_code(mods->kc1); | ||
| 25 | } | ||
| 26 | if (state->count >= 2) { | ||
| 27 | unregister_code(mods->kc2); | ||
| 28 | } | ||
| 29 | } | ||
| 30 | |||
| 31 | qk_tap_dance_action_t tap_dance_actions[] = { | ||
| 32 | [TD_RSF_RCT] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RSFT, KC_RCTL), | ||
| 33 | }; | ||
diff --git a/users/billypython/tap_dance.h b/users/billypython/tap_dance.h new file mode 100644 index 000000000..258198141 --- /dev/null +++ b/users/billypython/tap_dance.h | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "quantum.h" | ||
| 4 | |||
| 5 | #define RSF_RCT TD(TD_RSF_RCT) | ||
| 6 | |||
| 7 | enum tap_dance { | ||
| 8 | TD_RSF_RCT, | ||
| 9 | }; | ||
