From 8b456631284cb2c7dc484de513ba8785a970688e Mon Sep 17 00:00:00 2001 From: Andrew Reisner Date: Wed, 11 Feb 2026 17:57:08 -0500 Subject: [PATCH] add keyball. --- .../keyball/keyball39/keymaps/init/config.h | 50 ++++ .../keyball/keyball39/keymaps/init/keymap.c | 221 ++++++++++++++++++ .../keyball/keyball39/keymaps/init/rules.mk | 7 + keyboards/zsa/voyager/keymaps/ball/config.h | 18 ++ keyboards/zsa/voyager/keymaps/ball/keymap.c | 130 +++++++++++ .../zsa/voyager/keymaps/ball/keymap.json | 5 + keyboards/zsa/voyager/keymaps/ball/rules.mk | 5 + keyboards/zsa/voyager/keymaps/mod/keymap.c | 26 ++- keyboards/zsa/voyager/keymaps/mod/rules.mk | 1 + qmk.json | 3 +- 10 files changed, 460 insertions(+), 6 deletions(-) create mode 100644 keyboards/keyball/keyball39/keymaps/init/config.h create mode 100644 keyboards/keyball/keyball39/keymaps/init/keymap.c create mode 100644 keyboards/keyball/keyball39/keymaps/init/rules.mk create mode 100644 keyboards/zsa/voyager/keymaps/ball/config.h create mode 100644 keyboards/zsa/voyager/keymaps/ball/keymap.c create mode 100644 keyboards/zsa/voyager/keymaps/ball/keymap.json create mode 100644 keyboards/zsa/voyager/keymaps/ball/rules.mk diff --git a/keyboards/keyball/keyball39/keymaps/init/config.h b/keyboards/keyball/keyball39/keymaps/init/config.h new file mode 100644 index 0000000000000000000000000000000000000000..920d06139b1a4c5d5e83a537843045f8bf8b3d45 --- /dev/null +++ b/keyboards/keyball/keyball39/keymaps/init/config.h @@ -0,0 +1,50 @@ +/* +This is the c configuration file for the keymap + +Copyright 2022 @Yowkees +Copyright 2022 MURAOKA Taro (aka KoRoN, @kaoriya) + +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 RGBLIGHT_ENABLE +# define RGBLIGHT_EFFECT_BREATHING +# define RGBLIGHT_EFFECT_RAINBOW_MOOD +# define RGBLIGHT_EFFECT_RAINBOW_SWIRL +# define RGBLIGHT_EFFECT_SNAKE +# define RGBLIGHT_EFFECT_KNIGHT +# define RGBLIGHT_EFFECT_CHRISTMAS +# define RGBLIGHT_EFFECT_STATIC_GRADIENT +# define RGBLIGHT_EFFECT_RGB_TEST +# define RGBLIGHT_EFFECT_ALTERNATING +# define RGBLIGHT_EFFECT_TWINKLE +#endif + +#define TAP_CODE_DELAY 5 + +// Home row mods settings +#define TAPPING_TERM 200 +#define QUICK_TAP_TERM 0 +#define PERMISSIVE_HOLD +#define BOTH_SHIFTS_TURNS_ON_CAPS_WORD + +#define QUICK_TAP_TERM_PER_KEY + +// Auto mouse settings +#define POINTING_DEVICE_AUTO_MOUSE_ENABLE +#define AUTO_MOUSE_DEFAULT_LAYER 3 +#define AUTO_MOUSE_TIME 490 +#define AUTO_MOUSE_THRESHOLD 5 diff --git a/keyboards/keyball/keyball39/keymaps/init/keymap.c b/keyboards/keyball/keyball39/keymaps/init/keymap.c new file mode 100644 index 0000000000000000000000000000000000000000..178e801e61492e85fadb7f65a3b8015a826fa1b1 --- /dev/null +++ b/keyboards/keyball/keyball39/keymaps/init/keymap.c @@ -0,0 +1,221 @@ +/* +Copyright 2022 @Yowkees +Copyright 2022 MURAOKA Taro (aka KoRoN, @kaoriya) + +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 "quantum.h" + +// Home row mods +#define HR_A KC_A +#define HR_S MT(MOD_LALT, KC_S) +#define HR_D MT(MOD_LSFT, KC_D) +#define HR_F MT(MOD_LCTL, KC_F) + +#define HR_J MT(MOD_RCTL, KC_J) +#define HR_K MT(MOD_RSFT, KC_K) +#define HR_L MT(MOD_RALT, KC_L) +#define HR_SCLN KC_SCLN + + +// Custom shortcuts +#define KC_EUNDO LCTL(LSFT(KC_MINUS)) +#define KC_AENTER LCTL(LALT(KC_ENT)) +#define WAYFULL LGUI(LSFT(KC_F)) +#define WAYHALF LGUI(LSFT(KC_D)) +#define KC_CAD LCTL(LALT(KC_DEL)) + +enum { + TD_UNDO, +}; + +// Combo for caps word +const uint16_t PROGMEM capsword_combo[] = {HR_D, HR_K, COMBO_END}; + +combo_t key_combos[] = { + COMBO(capsword_combo, QK_CAPS_WORD_TOGGLE), +}; + +tap_dance_action_t tap_dance_actions[] = { + [TD_UNDO] = ACTION_TAP_DANCE_DOUBLE(KC_U, KC_EUNDO), +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // Base layer + [0] = LAYOUT_universal( + KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , TD(TD_UNDO), KC_I , KC_O , KC_P , + HR_A , HR_S , HR_D , HR_F , KC_G , KC_H , HR_J , HR_K , HR_L , HR_SCLN , + KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , + KC_ESC , KC_TAB , MO(5) , LT(3,KC_TAB), LT(4,KC_BSPC), KC_LGUI, MT(MOD_RGUI, KC_ENT), LT(4,KC_SPC), _______, _______, _______, KC_QUOT + ), + + // Transparent layer for HR_L GUI+N behavior + [1] = LAYOUT_universal( + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + + // Gaming layer (removes home row mods via layer toggle) + [2] = LAYOUT_universal( + _______ , _______ , KC_E , _______ , _______ , _______ , KC_U , _______ , _______ , _______ , + KC_A , KC_S , KC_D , KC_F , _______ , _______ , KC_J , KC_K , KC_L , KC_SCLN , + _______ , _______ , _______ , _______ , KC_B , _______ , _______ , _______ , _______ , _______ , + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + + // Mouse + Numpad layer (via left thumb) + [3] = LAYOUT_universal( + _______ , _______ , _______ , _______ , _______ , KC_SLSH , KC_7 , KC_8 , KC_9 , KC_ASTR , + _______ , _______ , _______ , _______ , _______ , KC_MINS , KC_4 , KC_5 , KC_6 , KC_PLUS , + SCRL_TO , SCRL_MO , KC_BTN2 , KC_BTN1 , _______ , KC_0 , KC_1 , KC_2 , KC_3 , KC_DOT , + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + + // Symbols layer (via thumb keys) + [4] = LAYOUT_universal( + KC_GRV , KC_TILDE , KC_HASH , KC_AMPR , KC_PIPE, KC_CIRC , KC_LCBR , KC_RCBR , KC_LBRC , KC_RBRC , + KC_EXLM , KC_UNDS , KC_COLN , KC_EQL , KC_DLR , KC_AT , KC_LPRN , KC_RPRN , KC_UNDS , KC_SCLN , + KC_PERC , KC_QUES , KC_ASTR , KC_PLUS , KC_BSLS , KC_SLSH , KC_MINUS , KC_LT , KC_GT , KC_DQT , + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + + // Nav/Settings layer + [5] = LAYOUT_universal( + RGB_TOG , AML_TO , AML_I50 , AML_D50 , TG(1) , _______ , SSNP_VRT , SSNP_HOR , SSNP_FRE , QK_BOOT , + WAYHALF , WAYFULL , KC_CAD , KC_AENTER, SCRL_DVI, CPI_I100, KC_HOME , KC_UP , KC_END , _______ , + RGB_MOD , RGB_RMOD , RGB_VAI , RGB_VAD , SCRL_DVD, CPI_D100, KC_LEFT , KC_DOWN , KC_RGHT , _______ , + QK_BOOT , KBC_RST , _______ , _______ , _______ , _______ , _______ , C(S(KC_TAB)), C(KC_TAB), KC_PGUP , KC_PGDN , KBC_SAVE + ), +}; +// clang-format on + +layer_state_t layer_state_set_user(layer_state_t state) { + // Auto enable scroll mode on layer 5 (nav layer) + // Only force scroll ON for layer 5; let SCRL_TO handle toggling otherwise + if (get_highest_layer(state) == 5) { + keyball_set_scroll_mode(true); + } + return state; +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case HR_L: + if (record->event.pressed && record->tap.count && layer_state_is(1)) { + uint8_t mods = get_mods(); + uint8_t weak = get_weak_mods(); + uint8_t oneshot = get_oneshot_mods(); + + if ((mods | weak | oneshot) & MOD_MASK_GUI) { + // GUI is already held; just tap N so the host sees GUI+N. + tap_code(KC_N); + return false; + } + } + break; + } + + return true; +} + +bool caps_word_press_user(uint16_t keycode) { + switch (keycode) { + // Keycodes that continue Caps Word, with shift applied. + case KC_A ... KC_Z: + case TD(TD_UNDO): // Treat tap dance U like a letter + add_weak_mods(MOD_BIT(KC_LSFT)); + return true; + + // Keycodes that continue Caps Word, without shifting. + case KC_1 ... KC_0: + case KC_BSPC: + case KC_DEL: + case KC_UNDS: + case KC_MINS: + return true; + + default: + return false; // Deactivate Caps Word. + } +} + +// Override scroll direction (invert vertical scroll) with accumulator +// Adjust SCROLL_DIVISOR to control speed (higher = slower) +#define SCROLL_DIVISOR 4 + +void keyball_on_apply_motion_to_mouse_scroll(report_mouse_t *report, report_mouse_t *output, bool is_left) { + static int16_t acc_h = 0; + static int16_t acc_v = 0; + + // Accumulate movement + acc_h += report->x; + acc_v += report->y; + + // Consume input + report->x = 0; + report->y = 0; + + // Calculate scroll output + int8_t h = acc_h / SCROLL_DIVISOR; + int8_t v = acc_v / SCROLL_DIVISOR; + + // Keep remainder for next time + acc_h -= h * SCROLL_DIVISOR; + acc_v -= v * SCROLL_DIVISOR; + + // Apply to output (inverted) + output->h = is_left ? h : -h; + output->v = is_left ? v : -v; + + // scroll snapping + switch (keyball_get_scrollsnap_mode()) { + case KEYBALL_SCROLLSNAP_MODE_VERTICAL: + output->h = 0; + break; + case KEYBALL_SCROLLSNAP_MODE_HORIZONTAL: + output->v = 0; + break; + default: + // pass by without doing anything + break; + } +} + +uint16_t get_quick_tap_term(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case LT(4, KC_BSPC): + return TAPPING_TERM; // Enable quick-tap for backspace + case HR_F: + return TAPPING_TERM; // Enable quick-tap for Ctrl+F repeating + default: + return 0; // Disabled for everything else (home row mods) + } +} + +#ifdef OLED_ENABLE + +# include "lib/oledkit/oledkit.h" + +void oledkit_render_info_user(void) { + keyball_oled_render_keyinfo(); + keyball_oled_render_ballinfo(); + keyball_oled_render_layerinfo(); +} +#endif diff --git a/keyboards/keyball/keyball39/keymaps/init/rules.mk b/keyboards/keyball/keyball39/keymaps/init/rules.mk new file mode 100644 index 0000000000000000000000000000000000000000..f7e7eb07e3294a08229e41608fabd7c91d403831 --- /dev/null +++ b/keyboards/keyball/keyball39/keymaps/init/rules.mk @@ -0,0 +1,7 @@ +RGBLIGHT_ENABLE = yes +OLED_ENABLE = yes +CAPS_WORD_ENABLE = yes +TAP_DANCE_ENABLE = yes +COMBO_ENABLE = yes +POINTING_DEVICE_ENABLE = yes + diff --git a/keyboards/zsa/voyager/keymaps/ball/config.h b/keyboards/zsa/voyager/keymaps/ball/config.h new file mode 100644 index 0000000000000000000000000000000000000000..8f15288d3ebea7edf1f48e3735e2156096b276fc --- /dev/null +++ b/keyboards/zsa/voyager/keymaps/ball/config.h @@ -0,0 +1,18 @@ +/* #define TAPPING_TERM 200 */ +#define PERMISSIVE_HOLD +// #define TAPPING_FORCE_HOLD +#define BOTH_SHIFTS_TURNS_ON_CAPS_WORD + +#define TAPPING_TERM_PER_KEY +#define POINTING_DEVICE_HIRES_SCROLL_ENABLE +#define POINTING_DEVICE_HIRES_SCROLL_EXPONENT 0 +#define MOUSE_EXTENDED_REPORT +#define WHEEL_EXTENDED_REPORT +#define NAVIGATOR_SCROLL_DIVIDER 10 +#define NAVIGATOR_SCROLL_INVERT_Y + +#define POINTING_DEVICE_AUTO_MOUSE_ENABLE +#define AUTO_MOUSE_DEFAULT_LAYER 2 +#define AUTO_MOUSE_TIME 490 +#define AUTO_MOUSE_THRESHOLD 5 +#define AUTO_MOUSE_SCROLL_THRESHOLD AUTO_MOUSE_THRESHOLD / NAVIGATOR_SCROLL_DIVIDER diff --git a/keyboards/zsa/voyager/keymaps/ball/keymap.c b/keyboards/zsa/voyager/keymaps/ball/keymap.c new file mode 100644 index 0000000000000000000000000000000000000000..bd75e35428095f98fdb1ee45888efa3595783083 --- /dev/null +++ b/keyboards/zsa/voyager/keymaps/ball/keymap.c @@ -0,0 +1,130 @@ +// Copyright 2023 ZSA Technology Labs, Inc <@zsa> +// Copyright 2023 Christopher Courtney, aka Drashna Jael're (@drashna) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum custom_keycodes { + DRAG_SCROLL = SAFE_RANGE, + NAVIGATOR_INC_CPI, + NAVIGATOR_DEC_CPI, +}; + +#define HR_A KC_A +#define HR_S MT(MOD_LALT, KC_S) +#define HR_D MT(MOD_LSFT, KC_D) +#define HR_F MT(MOD_LCTL, KC_F) + +#define HR_J MT(MOD_RCTL, KC_J) +#define HR_K MT(MOD_RSFT, KC_K) +#define HR_L MT(MOD_RALT, KC_L) +#define HR_SCLN KC_SCLN + +#define LR_V LT(3, KC_V) +#define LR_B LT(2, KC_B) + +#define KC_EUNDO LCTL(LSFT(KC_MINUS)) +#define KC_AENTER LCTL(LALT(KC_ENT)) +#define WAYFULL LGUI(LSFT(KC_F)) +#define WAYHALF LGUI(LSFT(KC_D)) +#define KC_CAD LCTL(LALT(KC_DEL)) + +enum { + TD_UNDO, +}; + +// Combo for caps word +const uint16_t PROGMEM capsword_combo[] = {HR_D, HR_K, COMBO_END}; + +combo_t key_combos[] = { + COMBO(capsword_combo, QK_CAPS_WORD_TOGGLE), +}; + +tap_dance_action_t tap_dance_actions[] = { + [TD_UNDO] = ACTION_TAP_DANCE_DOUBLE(KC_U, KC_EUNDO), +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_EQUAL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, TD(TD_UNDO), KC_I, KC_O, KC_P, KC_BSLS, + KC_ESCAPE,HR_A, HR_S, HR_D, HR_F, KC_G, KC_H, HR_J, HR_K, HR_L, HR_SCLN, RSFT_T(KC_QUOT), + MO(5), KC_Z, KC_X, KC_C, LR_V, LR_B, KC_N, KC_M, KC_COMMA,KC_DOT, KC_SLSH, TG(1), + LT(4, KC_BSPC), KC_LGUI, MT(MOD_RGUI, KC_ENT), LT(4, KC_SPC) + ), + [1] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______ + ), + // Mouse layer + [2] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, NAVIGATOR_DEC_CPI, NAVIGATOR_INC_CPI, _______, _______, _______, _______, _______, _______, _______, + _______, _______, DRAG_SCROLL, KC_MS_BTN2, KC_MS_BTN1, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______ + ), + [3] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, KC_SLSH, KC_7, KC_8, KC_9, KC_ASTR, _______, + _______, _______, _______, _______, _______, _______, KC_MINS, KC_4, KC_5, KC_6, KC_PLUS, _______, + _______, _______, _______, _______, _______, _______, KC_0, KC_1, KC_2, KC_3, KC_DOT, _______, + _______, _______, _______, _______ + ), + [4] = LAYOUT( + 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_GRV, KC_GRV, KC_TILDE,KC_HASH, KC_AMPR, KC_PIPE, KC_CIRC, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12, + KC_EUNDO,KC_EXLM, KC_UNDS, KC_COLN, KC_EQL, KC_DLR, KC_AT, KC_LPRN, KC_RPRN, KC_UNDS, KC_SCLN, KC_BSPC, + _______, KC_PERC, KC_QUES, KC_ASTR, KC_PLUS, KC_BSLS, KC_SLSH, KC_MINUS,KC_LT, KC_GT, KC_DQT, KC_ENT, + MO(5), _______, _______, _______ + ), + [5] = LAYOUT( + RM_TOGG, QK_KB, RM_NEXT, RGB_M_P, RM_VALD, RM_VALU, _______, _______, _______, _______, _______, QK_BOOT, + _______, _______, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, _______, _______, + _______, WAYHALF, WAYFULL, KC_CAD, KC_AENTER, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, + _______, _______, _______, _______, _______, _______, _______, C(S(KC_TAB)), C(KC_TAB), _______, _______, _______, + _______, _______, _______, _______ + ), +}; + +extern bool set_scrolling; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case HR_L: + if (record->event.pressed && record->tap.count && layer_state_is(1)) { + uint8_t mods = get_mods(); + uint8_t weak = get_weak_mods(); + uint8_t oneshot = get_oneshot_mods(); + + if ((mods | weak | oneshot) & MOD_MASK_GUI) { + // GUI is already held; just tap N so the host sees GUI+N. + tap_code(KC_N); + return false; + } + } + break; + case DRAG_SCROLL: + set_scrolling = record->event.pressed; + return false; + case NAVIGATOR_INC_CPI: + if (record->event.pressed) { + pointing_device_set_cpi(1); + } + return false; + case NAVIGATOR_DEC_CPI: + if (record->event.pressed) { + pointing_device_set_cpi(0); + } + return false; + } + + return true; +} + +void pointing_device_init_user(void) { + set_auto_mouse_enable(true); +} diff --git a/keyboards/zsa/voyager/keymaps/ball/keymap.json b/keyboards/zsa/voyager/keymaps/ball/keymap.json new file mode 100644 index 0000000000000000000000000000000000000000..1588584bb03a7c5c7dd7713d554485e288a9a1d9 --- /dev/null +++ b/keyboards/zsa/voyager/keymaps/ball/keymap.json @@ -0,0 +1,5 @@ +{ + "modules": [ + "zsa/defaults" + ] +} diff --git a/keyboards/zsa/voyager/keymaps/ball/rules.mk b/keyboards/zsa/voyager/keymaps/ball/rules.mk new file mode 100644 index 0000000000000000000000000000000000000000..c0c2ba519286ffe8271f7442e525d736cc8f3b5b --- /dev/null +++ b/keyboards/zsa/voyager/keymaps/ball/rules.mk @@ -0,0 +1,5 @@ +CAPS_WORD_ENABLE = yes +TAP_DANCE_ENABLE = yes +COMBO_ENABLE = yes +POINTING_DEVICE_ENABLE = yes +POINTING_DEVICE_DRIVER = navigator_trackball diff --git a/keyboards/zsa/voyager/keymaps/mod/keymap.c b/keyboards/zsa/voyager/keymaps/mod/keymap.c index 5223aef3145cf5d7e6d428a1b3efc838780bd5be..4ca4a4f0e695551f3035f1c8e1cc8ab047c32bfa 100644 --- a/keyboards/zsa/voyager/keymaps/mod/keymap.c +++ b/keyboards/zsa/voyager/keymaps/mod/keymap.c @@ -14,6 +14,8 @@ #define HR_L MT(MOD_RALT, KC_L) #define HR_SCLN KC_SCLN +#define LR_E LT(2, KC_E) + #define KC_EUNDO LCTL(LSFT(KC_MINUS)) #define KC_AENTER LCTL(LALT(KC_ENT)) #define WAYFULL LGUI(LSFT(KC_F)) @@ -24,6 +26,13 @@ enum { TD_UNDO, }; +// Combo for caps word +const uint16_t PROGMEM capsword_combo[] = {HR_D, HR_K, COMBO_END}; + +combo_t key_combos[] = { + COMBO(capsword_combo, QK_CAPS_WORD_TOGGLE), +}; + tap_dance_action_t tap_dance_actions[] = { [TD_UNDO] = ACTION_TAP_DANCE_DOUBLE(KC_U, KC_EUNDO), }; @@ -31,10 +40,10 @@ tap_dance_action_t tap_dance_actions[] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( KC_EQUAL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, TD(TD_UNDO), KC_I, KC_O, KC_P, KC_BSLS, + KC_TAB, KC_Q, KC_W, LR_E, KC_R, KC_T, KC_Y, TD(TD_UNDO), KC_I, KC_O, KC_P, KC_BSLS, KC_ESCAPE,HR_A, HR_S, HR_D, HR_F, KC_G, KC_H, HR_J, HR_K, HR_L, HR_SCLN, RSFT_T(KC_QUOT), - MO(3), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA,KC_DOT, KC_SLSH, TG(1), - LT(2, KC_BSPC), KC_LGUI, MT(MOD_RGUI, KC_ENT), LT(2, KC_SPC) + MO(4), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA,KC_DOT, KC_SLSH, TG(1), + LT(3, KC_BSPC), KC_LGUI, MT(MOD_RGUI, KC_ENT), LT(3, KC_SPC) ), [1] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -44,13 +53,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______ ), [2] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, KC_SLSH, KC_7, KC_8, KC_9, KC_ASTR, _______, + _______, _______, _______, _______, _______, _______, KC_MINS, KC_4, KC_5, KC_6, KC_PLUS, _______, + _______, _______, _______, _______, _______, _______, KC_0, KC_1, KC_2, KC_3, KC_DOT, _______, + _______, _______, _______, _______ + ), + [3] = LAYOUT( 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_GRV, KC_GRV, KC_TILDE,KC_HASH, KC_AMPR, KC_PIPE, KC_CIRC, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12, KC_EUNDO,KC_EXLM, KC_UNDS, KC_COLN, KC_EQL, KC_DLR, KC_AT, KC_LPRN, KC_RPRN, KC_UNDS, KC_SCLN, KC_BSPC, _______, KC_PERC, KC_QUES, KC_ASTR, KC_PLUS, KC_BSLS, KC_SLSH, KC_MINUS,KC_LT, KC_GT, KC_DQT, KC_ENT, - MO(3), _______, _______, _______ + MO(4), _______, _______, _______ ), - [3] = LAYOUT( + [4] = LAYOUT( RM_TOGG, QK_KB, RM_NEXT, RGB_M_P, RM_VALD, RM_VALU, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, _______, _______, _______, WAYHALF, WAYFULL, KC_CAD, KC_AENTER, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, diff --git a/keyboards/zsa/voyager/keymaps/mod/rules.mk b/keyboards/zsa/voyager/keymaps/mod/rules.mk index 4d34509a1744dc266359b0109e8062e193746488..cc5043483a8ae7d338304aedcb46fc1e06ccb5d4 100644 --- a/keyboards/zsa/voyager/keymaps/mod/rules.mk +++ b/keyboards/zsa/voyager/keymaps/mod/rules.mk @@ -1,2 +1,3 @@ CAPS_WORD_ENABLE = yes TAP_DANCE_ENABLE = yes +COMBO_ENABLE = yes diff --git a/qmk.json b/qmk.json index 3b0654b781ef4736292bfe15536b7a3662627547..7912c1aabd404a699795a317cd8c8eca5060974b 100644 --- a/qmk.json +++ b/qmk.json @@ -3,6 +3,7 @@ "build_targets": [ ["ploopyco/trackball/rev1_007", "pers"], ["zsa/voyager", "pers"], - ["ploopyco/trackball/rev1_005", "pers"] + ["ploopyco/trackball/rev1_005", "pers"], + ["keyball/keyball39", "init"] ] } \ No newline at end of file