keymap.c (2880B)
1 // Copyright 2024 Patrick Mathern (@Patrickemm) 2 // SPDX-License-Identifier: GPL-2.0-or-later 3 4 #include QMK_KEYBOARD_H 5 6 // Define the keycode, `QK_USER` avoids collisions with existing keycodes 7 enum keycodes { 8 KC_CYCLE_LAYERS = QK_USER, 9 }; 10 11 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 12 13 [0] = LAYOUT( 14 KC_0, KC_CYCLE_LAYERS, 15 KC_1, KC_2, KC_3, KC_4, 16 KC_5, KC_6, KC_7, KC_8 17 ), 18 [1] = LAYOUT( 19 KC_9, KC_CYCLE_LAYERS, 20 KC_A, KC_B, KC_C, KC_D, 21 KC_E, KC_F, KC_G, KC_H 22 ), 23 [2] = LAYOUT( 24 KC_I, KC_CYCLE_LAYERS, 25 KC_J, KC_K, KC_L, KC_M, 26 KC_N, KC_O, KC_P, KC_Q 27 ), 28 [3] = LAYOUT( 29 KC_R, KC_CYCLE_LAYERS, 30 KC_S, KC_T, KC_U, KC_V, 31 KC_W, KC_X, KC_Y, KC_Z 32 ), 33 [4] = LAYOUT( 34 KC_TRNS, KC_CYCLE_LAYERS, 35 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 36 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS 37 ), 38 [5] = LAYOUT( 39 KC_TRNS, KC_CYCLE_LAYERS, 40 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 41 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS 42 ), 43 [6] = LAYOUT( 44 KC_TRNS, KC_CYCLE_LAYERS, 45 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 46 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS 47 ), 48 [7] = LAYOUT( 49 KC_TRNS, KC_CYCLE_LAYERS, 50 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 51 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS 52 ) 53 }; 54 55 // 1st layer on the cycle 56 #define LAYER_CYCLE_START 0 57 // Last layer on the cycle 58 #define LAYER_CYCLE_END 7 59 60 // Add the behaviour of this new keycode 61 bool process_record_user(uint16_t keycode, keyrecord_t *record) { 62 switch (keycode) { 63 case KC_CYCLE_LAYERS: 64 // Our logic will happen on presses, nothing is done on releases 65 if (!record->event.pressed) { 66 // We've already handled the keycode (doing nothing), let QMK know so no further code is run unnecessarily 67 return false; 68 } 69 70 uint8_t current_layer = get_highest_layer(layer_state); 71 72 // Check if we are within the range, if not quit 73 if (current_layer > LAYER_CYCLE_END || current_layer < LAYER_CYCLE_START) { 74 return false; 75 } 76 77 uint8_t next_layer = current_layer + 1; 78 if (next_layer > LAYER_CYCLE_END) { 79 next_layer = LAYER_CYCLE_START; 80 } 81 layer_move(next_layer); 82 return false; 83 84 // Process other keycodes normally 85 default: 86 return true; 87 } 88 } 89 90 #if defined(ENCODER_MAP_ENABLE) 91 const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { 92 [0] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) }, 93 [1] = { ENCODER_CCW_CW(_______, _______) }, 94 [2] = { ENCODER_CCW_CW(_______, _______) }, 95 [3] = { ENCODER_CCW_CW(_______, _______) }, 96 [4] = { ENCODER_CCW_CW(_______, _______) }, 97 [5] = { ENCODER_CCW_CW(_______, _______) }, 98 [6] = { ENCODER_CCW_CW(_______, _______) }, 99 [7] = { ENCODER_CCW_CW(_______, _______) } 100 }; 101 #endif