// Copyright 2023 ZSA Technology Labs, Inc <@zsa>
// Copyright 2023 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
enum custom_keycodes {
DRAG_SCROLL = SAFE_RANGE,
DRG_TOG,
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_B LT(2, KC_B)
#define CPI_UP NAVIGATOR_INC_CPI
#define CPI_DN NAVIGATOR_DEC_CPI
#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(4), KC_Z, KC_X, KC_C, KC_V, LR_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(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______
),
// Mouse + Numpad layer
[2] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, KC_SLSH, KC_7, KC_8, KC_9, KC_ASTR, _______,
_______, _______, _______, _______, _______, _______, KC_MINS, KC_4, KC_5, KC_6, KC_PLUS, _______,
_______, DRG_TOG, DRAG_SCROLL, KC_MS_BTN2, KC_MS_BTN1, _______, 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(4), _______, _______, _______
),
[4] = LAYOUT(
RM_TOGG, QK_KB, RM_NEXT, RGB_M_P, RM_VALD, RM_VALU, _______, _______, _______, _______, _______, QK_BOOT,
_______, _______, _______, _______, _______, _______, CPI_UP, KC_HOME, KC_UP, KC_END, _______, _______,
_______, WAYHALF, WAYFULL, KC_CAD, KC_AENTER, _______, CPI_DN, 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 DRG_TOG:
if (record->event.pressed) {
set_scrolling = !set_scrolling;
}
return false;
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);
}