qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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