// Copyright 2024 Patrick Mathern (@Patrickemm) // SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H // Define the keycode, `QK_USER` avoids collisions with existing keycodes enum keycodes { KC_CYCLE_LAYERS = QK_USER, }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( KC_0, KC_CYCLE_LAYERS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8 ), [1] = LAYOUT( KC_9, KC_CYCLE_LAYERS, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H ), [2] = LAYOUT( KC_I, KC_CYCLE_LAYERS, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q ), [3] = LAYOUT( KC_R, KC_CYCLE_LAYERS, KC_S, KC_T, KC_U, KC_V, KC_W, KC_X, KC_Y, KC_Z ), [4] = LAYOUT( KC_TRNS, KC_CYCLE_LAYERS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [5] = LAYOUT( KC_TRNS, KC_CYCLE_LAYERS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [6] = LAYOUT( KC_TRNS, KC_CYCLE_LAYERS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [7] = LAYOUT( KC_TRNS, KC_CYCLE_LAYERS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; // 1st layer on the cycle #define LAYER_CYCLE_START 0 // Last layer on the cycle #define LAYER_CYCLE_END 7 // Add the behaviour of this new keycode bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case KC_CYCLE_LAYERS: // Our logic will happen on presses, nothing is done on releases if (!record->event.pressed) { // We've already handled the keycode (doing nothing), let QMK know so no further code is run unnecessarily return false; } uint8_t current_layer = get_highest_layer(layer_state); // Check if we are within the range, if not quit if (current_layer > LAYER_CYCLE_END || current_layer < LAYER_CYCLE_START) { return false; } uint8_t next_layer = current_layer + 1; if (next_layer > LAYER_CYCLE_END) { next_layer = LAYER_CYCLE_START; } layer_move(next_layer); return false; // Process other keycodes normally default: return true; } } #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [0] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN) }, [1] = { ENCODER_CCW_CW(_______, _______) }, [2] = { ENCODER_CCW_CW(_______, _______) }, [3] = { ENCODER_CCW_CW(_______, _______) }, [4] = { ENCODER_CCW_CW(_______, _______) }, [5] = { ENCODER_CCW_CW(_______, _______) }, [6] = { ENCODER_CCW_CW(_______, _______) }, [7] = { ENCODER_CCW_CW(_______, _______) } }; #endif