jack.c (4992B)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | // Copyright 2026 jack@pngu.org // SPDX-License-Identifier: GPL-2.0-or-later #include "jack.h" void keyboard_post_init_user(void) { #ifdef AUTOCORRECT_ENABLE if (!autocorrect_is_enabled()) autocorrect_enable(); #endif keyboard_post_init_keymap(); } #ifdef OS_DETECTION_ENABLE typedef struct { bool swap_ctl_gui; uint8_t unicode_input_mode; } os_detection_config; bool process_detected_host_os_user(os_variant_t detected_os) { os_detection_config os_config = {.swap_ctl_gui = true, .unicode_input_mode = UNICODE_MODE_MACOS}; if (detected_os == OS_LINUX) os_config = (os_detection_config){.swap_ctl_gui = false, .unicode_input_mode = UNICODE_MODE_LINUX}; keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = os_config.swap_ctl_gui; eeconfig_update_keymap(&keymap_config); #ifdef UNICODE_COMMON_ENABLE set_unicode_input_mode(os_config.unicode_input_mode); #endif return true; } #endif uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case ESC_L1: case REP_L2: case SPC_L1: case BSPC_L2: return TAPPING_TERM - 40; case TD(PLY_NXT_PRV): return TAPPING_TERM + 60; default: return TAPPING_TERM; } } #ifdef TAP_DANCE_ENABLE void ply_nxt_prv(tap_dance_state_t *state, void *user_data) { switch (state->count) { case 1: tap_code(KC_MPLY); break; case 2: tap_code(KC_MNXT); break; case 3: tap_code(KC_MPRV); break; } } tap_dance_action_t tap_dance_actions[] = { [PLY_NXT_PRV] = ACTION_TAP_DANCE_FN(ply_nxt_prv), }; #endif #ifdef COMBO_ENABLE const uint16_t PROGMEM enter_combo[] = {RSFT_T(KC_J), RCTL_T(KC_K), COMBO_END}; const uint16_t PROGMEM unds_combo[] = {LCTL_T(KC_D), LSFT_T(KC_F), COMBO_END}; combo_t key_combos[] = { COMBO(enter_combo, KC_ENT), COMBO(unds_combo, KC_UNDS), }; #endif #ifdef KEY_OVERRIDE_ENABLE const key_override_t volume_key_override = ko_make_basic(MOD_MASK_SHIFT, KC_VOLU, KC_VOLD); const key_override_t bspc_del_override = ko_make_basic(MOD_MASK_SHIFT, KC_DEL, KC_BSPC); const key_override_t *key_overrides[] = { &volume_key_override, &bspc_del_override, }; #endif bool remember_last_key_user(uint16_t keycode, keyrecord_t *record, uint8_t *remembered_mods) { if (keycode == REP_L2) return false; return true; } bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (!process_record_keymap(keycode, record)) return false; const mod_t mods = get_mod_state(); bool shifted = mods.left_shift || mods.right_shift; switch (keycode) { case KC_MINS: #ifdef UNICODE_COMMON_ENABLE if (shifted) { if (record->event.pressed) register_unicode(0x2014); return false; } #endif break; case UPDIR: if (record->event.pressed) SEND_STRING("../"); break; case REMOVE: if (record->event.pressed) { SEND_STRING("```suggestion\n```"); tap_code(KC_UP); tap_code(KC_UP); tap_code(KC_ENT); tap_code(KC_UP); } break; case USRNME: if (record->event.pressed) SEND_STRING("jack@pngu.org"); break; case GEQ: if (record->event.pressed) SEND_STRING(">="); break; case LEQ: if (record->event.pressed) SEND_STRING("<="); break; case RECALL: if (record->event.pressed) SEND_STRING("$_"); break; case PM_ASGN: if (record->event.pressed) { if (shifted) clear_mods(), SEND_STRING("-="); else SEND_STRING("+="); } break; case REP_L2: if (record->tap.count) { repeat_key_invoke(&record->event); return false; } break; INTERCEPT_MOD_TAP(RALT_T, KC_CAPS) INTERCEPT_MOD_TAP(RSFT_T, KC_LPRN) INTERCEPT_MOD_TAP(RCTL_T, KC_RPRN) INTERCEPT_MOD_TAP(RALT_T, KC_DQUO) } return true; } #ifdef ENCODER_MAP_ENABLE const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [LAYER0] = {{KC_VOLU, KC_VOLD}, {KC_MNXT, KC_MPRV}}, [LAYER1] = {{XRGB_SAI, XRGB_SAD}, {XRGB_HUI, XRGB_HUD}}, [LAYER2] = {{_______, _______}, {_______, _______}}, [LAYER3] = {{_______, _______}, {_______, _______}}, }; #endif static bool scrolling = false; layer_state_t layer_state_set_user(layer_state_t state) { switch (get_highest_layer(state)) { case LAYER1: scrolling = true; #ifdef POINTING_DEVICE_ENABLE pointing_device_set_cpi(64); #endif break; default: if (scrolling) { scrolling = false; #ifdef POINTING_DEVICE_ENABLE pointing_device_set_cpi(1024); #endif } } return update_tri_layer_state(state, LAYER1, LAYER2, LAYER3); } #ifdef POINTING_DEVICE_ENABLE report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) { if (scrolling) { mouse_report.h = mouse_report.x; mouse_report.v = -mouse_report.y; mouse_report.x = 0; mouse_report.y = 0; } return mouse_report; } #endif |