From 0e74521428d11614da68d56d1dfe8029900061e0 Mon Sep 17 00:00:00 2001 From: "mr. JULY" Date: Thu, 10 Mar 2022 16:20:02 +0100 Subject: [PATCH 01/34] introduce support for Royal Kludge RK61 non-hotswap rgb edition (PID 0x24F) This is improved version of euwbah (see https://github.com/euwbah/qmk_firmware/tree/sn32/keyboards/royal_kludge/rk61_rgb): - better organized directory structure - add support for ISO layout - implement a keymap, which supports Neo Layout (https://www.neo-layout.org/) layers 3 and 4 --- .../rk61/keymaps/default/keymap.c | 31 ++ .../rk61/keymaps/default/keymap.h | 50 +++ .../rk61/keymaps/iso-neo-l3l4/combo.c | 29 ++ .../rk61/keymaps/iso-neo-l3l4/config.h | 22 ++ .../rk61/keymaps/iso-neo-l3l4/keymap.c | 48 +++ .../rk61/keymaps/iso-neo-l3l4/rules.mk | 3 + .../royal_kludge/rk61/keymaps/iso/config.h | 20 ++ .../royal_kludge/rk61/keymaps/iso/keymap.c | 18 + keyboards/royal_kludge/rk61/rgb/config.h | 106 ++++++ keyboards/royal_kludge/rk61/rgb/config_led.c | 121 +++++++ keyboards/royal_kludge/rk61/rgb/config_led.h | 34 ++ keyboards/royal_kludge/rk61/rgb/info.json | 332 ++++++++++++++++++ keyboards/royal_kludge/rk61/rgb/readme.md | 57 +++ keyboards/royal_kludge/rk61/rgb/rgb.h | 4 + keyboards/royal_kludge/rk61/rgb/rules.mk | 31 ++ 15 files changed, 906 insertions(+) create mode 100644 keyboards/royal_kludge/rk61/keymaps/default/keymap.c create mode 100644 keyboards/royal_kludge/rk61/keymaps/default/keymap.h create mode 100644 keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/combo.c create mode 100644 keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/config.h create mode 100644 keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/keymap.c create mode 100644 keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/rules.mk create mode 100644 keyboards/royal_kludge/rk61/keymaps/iso/config.h create mode 100644 keyboards/royal_kludge/rk61/keymaps/iso/keymap.c create mode 100644 keyboards/royal_kludge/rk61/rgb/config.h create mode 100644 keyboards/royal_kludge/rk61/rgb/config_led.c create mode 100644 keyboards/royal_kludge/rk61/rgb/config_led.h create mode 100644 keyboards/royal_kludge/rk61/rgb/info.json create mode 100644 keyboards/royal_kludge/rk61/rgb/readme.md create mode 100644 keyboards/royal_kludge/rk61/rgb/rgb.h create mode 100644 keyboards/royal_kludge/rk61/rgb/rules.mk diff --git a/keyboards/royal_kludge/rk61/keymaps/default/keymap.c b/keyboards/royal_kludge/rk61/keymaps/default/keymap.c new file mode 100644 index 000000000000..51abe1bda823 --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/default/keymap.c @@ -0,0 +1,31 @@ +/* +Copyright 2022 mr. JULY + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include QMK_KEYBOARD_H +#include "keymap.h" + +enum layer_names { + _BASE, // default layer + _RMODS, // right modifiers: Alt, context menu, Ctrl instead of arrows + _FN, // functional layer (F1-F10, backlight controls etc.) +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = BASE_KEYMAP, + [_RMODS] = RMODS_KEYMAP, + [_FN] = FN_KEYMAP +}; diff --git a/keyboards/royal_kludge/rk61/keymaps/default/keymap.h b/keyboards/royal_kludge/rk61/keymaps/default/keymap.h new file mode 100644 index 000000000000..07a9a7bf823a --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/default/keymap.h @@ -0,0 +1,50 @@ +/* +Copyright 2022 mr. JULY + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#pragma once + +/* Row: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 */ + +// default layer +#define BASE_KEYMAP_(caps, nuhs, nubs) { \ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, }, \ + { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, }, \ + { caps, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, nuhs, KC_ENT, }, \ + { KC_LSFT, nubs, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RSFT, XXXXXXX, }, \ + { KC_LCTL, KC_LGUI, KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX, MO(_FN), } \ + } +#define BASE_KEYMAP BASE_KEYMAP_(KC_CAPS, KC_NUHS, KC_NUBS) + +// snap right hand modifiers: Alt, context menu, Ctrl instead of arrows +#define RMODS_KEYMAP_(ralt) { \ + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, }, \ + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, }, \ + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, }, \ + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_SLSH, _______, _______, }, \ + { _______, _______, _______, _______, _______, _______, _______, _______, _______, ralt, KC_APP, KC_RCTL, _______, _______, } \ + } + +#define RMODS_KEYMAP RMODS_KEYMAP_(KC_RALT) + +// functional layer (F1-F10, backlight controls etc.) +#define FN_KEYMAP { \ + { KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, }, \ + { KC_TRNS, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, }, \ + { RESET, KC_VOLU, KC_BRIU, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME, KC_PGUP, KC_TRNS, RGB_SPD, RGB_SPI, RGB_MOD, TG(_RMODS), }, \ + { _______, _______, KC_VOLD, KC_BRID, _______, _______, _______, KC_DEL, KC_END, KC_PGDN, _______, KC_SLSH, _______, _______, }, \ + { _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RALT, KC_APP, KC_RCTL, _______, _______, } \ + } diff --git a/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/combo.c b/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/combo.c new file mode 100644 index 000000000000..c331763ca4cd --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/combo.c @@ -0,0 +1,29 @@ +/* +Copyright 2022 mr. JULY + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "quantum.h" + +enum combo_event { + CAPS_COMBO, +}; + +const uint16_t PROGMEM caps_combo[] = {KC_LSFT, KC_RSFT, COMBO_END}; // Combo: both Shift keys together for CAPS_LOCK + +// Register the combo action +combo_t key_combos[COMBO_COUNT] = { + [CAPS_COMBO] = COMBO(caps_combo, KC_CAPS), +}; diff --git a/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/config.h b/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/config.h new file mode 100644 index 000000000000..862b8f7a7419 --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/config.h @@ -0,0 +1,22 @@ +/* +Copyright 2022 mr. JULY + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#pragma once + +#define KEYMAP_ISO 1 + +#define COMBO_COUNT 1 // Number of defined combos diff --git a/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/keymap.c b/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/keymap.c new file mode 100644 index 000000000000..5220aad11bf4 --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/keymap.c @@ -0,0 +1,48 @@ +/* +Copyright 2022 mr. JULY + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include QMK_KEYBOARD_H +#include "keymap_german.h" +#include "../default/keymap.h" + +enum layer_names { + _BASE, // default layer + _RMODS, // right modifiers: Alt, context menu, Ctrl instead of arrows + _L3, // neo layout layer 3 (special symbols: punctuation, braces etc.) + _L4, // neo layout layer 4 (navigation and numbers) + _FN, // functional layer (F1-F10, backlight controls etc.) +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = BASE_KEYMAP_(MO(_L3), MO(_L3), MO(_L4)), + [_RMODS] = RMODS_KEYMAP_(MO(_L4)), + [_L3] = { + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, }, + { _______, RALT(KC_DOT),DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LABK, DE_RABK, DE_EQL, DE_AMPR, _______, _______, _______, }, + { _______, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QUES, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, DE_AT, _______, _______, }, + { _______, _______, DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_GRV, DE_PLUS, DE_PERC, DE_DQUO, DE_QUOT, DE_SCLN, _______, _______, }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, } + }, + [_L4] = { + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, }, + { _______, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, _______, _______, _______, }, + { _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_END, KC_PAST, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, _______, _______, }, + { _______, _______, KC_ESC, KC_TAB, KC_INS, KC_ENTER, LCTL(DE_Z), KC_NLCK, KC_P1, KC_P2, KC_P3, KC_PDOT, _______, _______, }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, } + }, + [_FN] = FN_KEYMAP +}; diff --git a/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/rules.mk b/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/rules.mk new file mode 100644 index 000000000000..437819311203 --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/rules.mk @@ -0,0 +1,3 @@ +COMBO_ENABLE = yes # Used to allow chording of keys to trigger an action + +SRC += combo.c diff --git a/keyboards/royal_kludge/rk61/keymaps/iso/config.h b/keyboards/royal_kludge/rk61/keymaps/iso/config.h new file mode 100644 index 000000000000..ad4df11bad84 --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/iso/config.h @@ -0,0 +1,20 @@ +/* +Copyright 2022 mr. JULY + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#pragma once + +#define KEYMAP_ISO 1 \ No newline at end of file diff --git a/keyboards/royal_kludge/rk61/keymaps/iso/keymap.c b/keyboards/royal_kludge/rk61/keymaps/iso/keymap.c new file mode 100644 index 000000000000..0c992e59d37e --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/iso/keymap.c @@ -0,0 +1,18 @@ +/* +Copyright 2022 mr. JULY + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "../default/keymap.c" diff --git a/keyboards/royal_kludge/rk61/rgb/config.h b/keyboards/royal_kludge/rk61/rgb/config.h new file mode 100644 index 000000000000..8098133b016e --- /dev/null +++ b/keyboards/royal_kludge/rk61/rgb/config.h @@ -0,0 +1,106 @@ +/* Copyright 2020 euwbah +* +* Copyright 2022 mr. JULY +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +//#define VENDOR_ID 0x0C45 +#define VENDOR_ID 0x05AC +#define PRODUCT_ID 0x024F +//#define DEVICE_VER 0x0001 +#define DEVICE_VER 0x0121 + +//#define MANUFACTURER Royal Kludge +//#define PRODUCT RK61 RGB +#define MANUFACTURER SONiX +#define PRODUCT USB DEVICE +//#define DESCRIPTION RK61 QMK OpenRGB mod + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +/* The rk 61 retrieves all columns at once, scanning one row at a time*/ +#define DIODE_DIRECTION COL2ROW + +#define MATRIX_COL_PINS { A8, A9, A10, A11, A12, A13, A14, A15, B0, B1, B2, B3, B4, B5 } +#define MATRIX_ROW_PINS { D11, D10, D9, D8, D7 } + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 5 + +/* Enable NKRO - Up to 248 keys at the same time. */ +#define FORCE_NKRO + +/* RGB Non-Reactive Effects */ +#define ENABLE_RGB_MATRIX_ALPHAS_MODS +#define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN +#define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT +#define ENABLE_RGB_MATRIX_BREATHING +#define ENABLE_RGB_MATRIX_BAND_SAT +#define ENABLE_RGB_MATRIX_BAND_VAL +#define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT +#define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL +#define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT +#define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL +#define ENABLE_RGB_MATRIX_CYCLE_ALL +#define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT +#define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN +#define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON +#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN +#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL +#define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL +#define ENABLE_RGB_MATRIX_CYCLE_SPIRAL +#define ENABLE_RGB_MATRIX_DUAL_BEACON +#define ENABLE_RGB_MATRIX_RAINBOW_BEACON +#define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS +#define ENABLE_RGB_MATRIX_RAINDROPS +#define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS +#define ENABLE_RGB_MATRIX_HUE_BREATHING +#define ENABLE_RGB_MATRIX_HUE_PENDULUM +#define ENABLE_RGB_MATRIX_HUE_WAVE +#define ENABLE_RGB_MATRIX_PIXEL_FRACTAL +#define ENABLE_RGB_MATRIX_PIXEL_RAIN +#define ENABLE_RGB_MATRIX_TYPING_HEATMAP +#define ENABLE_RGB_MATRIX_DIGITAL_RAIN + +/* RGB Reactive Effects Toggle */ +#define RGB_MATRIX_FRAMEBUFFER_EFFECTS +#define RGB_MATRIX_KEYPRESSES +//#define RGB_MATRIX_KEYRELEASES + +/* RGB Reactive Effects */ +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS +#define ENABLE_RGB_MATRIX_SPLASH +#define ENABLE_RGB_MATRIX_MULTISPLASH +#define ENABLE_RGB_MATRIX_SOLID_SPLASH +#define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH + +#include "config_led.h" + +/* Enable RGB sleep */ +#define RGB_DISABLE_WHEN_USB_SUSPENDED true diff --git a/keyboards/royal_kludge/rk61/rgb/config_led.c b/keyboards/royal_kludge/rk61/rgb/config_led.c new file mode 100644 index 000000000000..795b926d3c0a --- /dev/null +++ b/keyboards/royal_kludge/rk61/rgb/config_led.c @@ -0,0 +1,121 @@ +/* +Copyright 2020 euwbah + +Copyright 2022 mr. JULY + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifdef RGB_MATRIX_ENABLE + +# include "rgb_matrix.h" +# include "config_led.h" + +// readability +#define NA NO_LED + +#ifdef KEYMAP_ISO +// CAPS LED number +#define CL 27 +/* ISO keymap */ +/* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ │ │ │ │ │ │ │ │ │ │ │ │ │     │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │     │   │  │  │  │  │  │  │  │  │  │  │  │     │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐   │ + * │ CAPS │   │  │ │  │  │  │  │  │  │  │  │  │    │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┤ + * │    │  │  │  │  │  │  │  │  │  │  │  │    │ │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴──┬┴──┬┴──┬───┼───┤ + * │ │  │  │                      │ │ │ │ │ │ + * └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘ + */ +led_config_t g_led_config = { + { + { 0, 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, NA,}, + {CL, 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, NA,}, + {54, 55, 56, NA, NA, NA, 57, NA, NA, 58, 59, 60, NA, 61,} + }, + { + {8, 0}, {24, 0}, {39, 0}, {55, 0}, {70, 0}, {86, 0}, {101, 0}, {117, 0}, {132, 0}, {148, 0}, {164, 0}, {180, 0}, {195, 0}, {218, 0}, + {11, 16}, {31, 16}, {47, 16}, {62, 16}, {78, 16}, {93, 16}, {109, 16}, {124, 16}, {140, 16}, {155, 16}, {171, 16}, {186, 16}, {202, 16}, + {13, 32}, {34, 32}, {50, 32}, {65, 32}, {81, 32}, {96, 32}, {112, 32}, {128, 32}, {143, 32}, {159, 32}, {174, 32}, {190, 32}, {206, 32}, {215, 32}, + {17, 48}, {27, 48}, {42, 48}, {57, 48}, {73, 48}, {88, 48}, {104, 48}, {119, 48}, {135, 48}, {150, 48}, {166, 48}, {182, 48}, {211, 48}, + {10, 64}, {29, 64}, {49, 64}, {107, 64}, {165, 64}, {185, 64}, {204, 64}, {224, 64}, + }, + { + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4, + } +}; +#else +/* ANSI (default) keymap */ +/* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ │ │ │ │ │ │ │ │ │ │ │ │ │     │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │     │   │  │  │  │  │  │  │  │  │  │  │  │     │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │ CAPS │   │  │ │  │  │  │  │  │  │  │  │       │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ + * │      │  │  │  │  │  │  │  │  │  │  │    │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │ │  │  │                      │ │ │ │ │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ +// CAPS LED number +#define CL 27 +led_config_t g_led_config = { + { + { 0, 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,}, + {CL, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, NA, 40,}, + {41, NA, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, NA,}, + {53, 54, 55, NA, NA, NA, 56, NA, NA, 57, 58, 59, NA, 60,} + }, + { + {8, 0}, {24, 0}, {39, 0}, {55, 0}, {70, 0}, {86, 0}, {101, 0}, {117, 0}, {132, 0}, {148, 0}, {164, 0}, {180, 0}, {195, 0}, {218, 0}, + {11, 16}, {31, 16}, {47, 16}, {62, 16}, {78, 16}, {93, 16}, {109, 16}, {124, 16}, {140, 16}, {155, 16}, {171, 16}, {186, 16}, {202, 16}, {221, 16}, + {13, 32}, {34, 32}, {50, 32}, {65, 32}, {81, 32}, {96, 32}, {112, 32}, {128, 32}, {143, 32}, {159, 32}, {174, 32}, {190, 32}, {215, 32}, + {17, 48}, {42, 48}, {57, 48}, {73, 48}, {88, 48}, {104, 48}, {119, 48}, {135, 48}, {150, 48}, {166, 48}, {182, 48}, {211, 48}, + {10, 64}, {29, 64}, {49, 64}, {107, 64}, {165, 64}, {185, 64}, {204, 64}, {224, 64}, + }, + { + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4, + } +}; +#endif + +void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { + if (host_keyboard_led_state().caps_lock) { + // Set capslock key to orange (capslock is led number defined as `CL`) + rgb_matrix_set_color(CL, 255, 130, 15); + } +} + +#endif diff --git a/keyboards/royal_kludge/rk61/rgb/config_led.h b/keyboards/royal_kludge/rk61/rgb/config_led.h new file mode 100644 index 000000000000..b72e6ceac7d4 --- /dev/null +++ b/keyboards/royal_kludge/rk61/rgb/config_led.h @@ -0,0 +1,34 @@ +/* +Copyright 2020 euwbah + +Copyright 2022 mr. JULY + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#pragma once +#include "config.h" + +// Backlight configuration +#define BACKLIGHT_LEVELS 8 + +#define LED_MATRIX_ROWS MATRIX_ROWS +#define LED_MATRIX_ROW_CHANNELS 3 +#define LED_MATRIX_ROWS_HW (LED_MATRIX_ROWS * LED_MATRIX_ROW_CHANNELS) +#define LED_MATRIX_ROW_PINS { C5, C4, C6, C8, C7, C9, C11, C10, C12, C14, C13, B13, B15, D3, B14 } + +#define LED_MATRIX_COLS MATRIX_COLS +#define LED_MATRIX_COL_PINS MATRIX_COL_PINS + +#define DRIVER_LED_TOTAL (70) diff --git a/keyboards/royal_kludge/rk61/rgb/info.json b/keyboards/royal_kludge/rk61/rgb/info.json new file mode 100644 index 000000000000..6f7aaa82ca90 --- /dev/null +++ b/keyboards/royal_kludge/rk61/rgb/info.json @@ -0,0 +1,332 @@ +{ + "keyboard_name": "RK61 RGB", + "url": "https://www.lazada.sg/products/royal-kludge-rk61-usb-wired-bluetooth-dual-mode-60-rgb-backlit-mechanical-gaming-keyboard-i1341602754.html", + "maintainer": "euwbah", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_default": { + "layout": [ + { + "label": "~", + "x": 0, + "y": 0 + }, + { + "label": "!", + "x": 1, + "y": 0 + }, + { + "label": "@", + "x": 2, + "y": 0 + }, + { + "label": "#", + "x": 3, + "y": 0 + }, + { + "label": "$", + "x": 4, + "y": 0 + }, + { + "label": "%", + "x": 5, + "y": 0 + }, + { + "label": "^", + "x": 6, + "y": 0 + }, + { + "label": "&", + "x": 7, + "y": 0 + }, + { + "label": "*", + "x": 8, + "y": 0 + }, + { + "label": "(", + "x": 9, + "y": 0 + }, + { + "label": ")", + "x": 10, + "y": 0 + }, + { + "label": "_", + "x": 11, + "y": 0 + }, + { + "label": "+", + "x": 12, + "y": 0 + }, + { + "label": "Bksp", + "x": 13, + "y": 0, + "w": 2 + }, + { + "label": "Tab", + "x": 0, + "y": 1, + "w": 1.5 + }, + { + "label": "Q", + "x": 1.5, + "y": 1 + }, + { + "label": "W", + "x": 2.5, + "y": 1 + }, + { + "label": "E", + "x": 3.5, + "y": 1 + }, + { + "label": "R", + "x": 4.5, + "y": 1 + }, + { + "label": "T", + "x": 5.5, + "y": 1 + }, + { + "label": "Y", + "x": 6.5, + "y": 1 + }, + { + "label": "U", + "x": 7.5, + "y": 1 + }, + { + "label": "I", + "x": 8.5, + "y": 1 + }, + { + "label": "O", + "x": 9.5, + "y": 1 + }, + { + "label": "P", + "x": 10.5, + "y": 1 + }, + { + "label": "{", + "x": 11.5, + "y": 1 + }, + { + "label": "}", + "x": 12.5, + "y": 1 + }, + { + "label": "|", + "x": 13.5, + "y": 1, + "w": 1.5 + }, + { + "label": "Caps Lock", + "x": 0, + "y": 2, + "w": 1.75 + }, + { + "label": "A", + "x": 1.75, + "y": 2 + }, + { + "label": "S", + "x": 2.75, + "y": 2 + }, + { + "label": "D", + "x": 3.75, + "y": 2 + }, + { + "label": "F", + "x": 4.75, + "y": 2 + }, + { + "label": "G", + "x": 5.75, + "y": 2 + }, + { + "label": "H", + "x": 6.75, + "y": 2 + }, + { + "label": "J", + "x": 7.75, + "y": 2 + }, + { + "label": "K", + "x": 8.75, + "y": 2 + }, + { + "label": "L", + "x": 9.75, + "y": 2 + }, + { + "label": ":", + "x": 10.75, + "y": 2 + }, + { + "label": "\"", + "x": 11.75, + "y": 2 + }, + { + "label": "Enter", + "x": 12.75, + "y": 2, + "w": 2.25 + }, + { + "label": "Shift", + "x": 0, + "y": 3, + "w": 2.25 + }, + { + "label": "Z", + "x": 2.25, + "y": 3 + }, + { + "label": "X", + "x": 3.25, + "y": 3 + }, + { + "label": "C", + "x": 4.25, + "y": 3 + }, + { + "label": "V", + "x": 5.25, + "y": 3 + }, + { + "label": "B", + "x": 6.25, + "y": 3 + }, + { + "label": "N", + "x": 7.25, + "y": 3 + }, + { + "label": "M", + "x": 8.25, + "y": 3 + }, + { + "label": "<", + "x": 9.25, + "y": 3 + }, + { + "label": ">", + "x": 10.25, + "y": 3 + }, + { + "label": "?", + "x": 11.25, + "y": 3 + }, + { + "label": "Shift", + "x": 12.25, + "y": 3, + "w": 2.75 + }, + { + "label": "Ctrl", + "x": 0, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 1.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Alt", + "x": 2.5, + "y": 4, + "w": 1.25 + }, + { + "x": 3.75, + "y": 4, + "w": 6.25 + }, + { + "label": "Alt", + "x": 10, + "y": 4, + "w": 1.25 + }, + { + "label": "Menu", + "x": 11.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Ctrl", + "x": 12.5, + "y": 4, + "w": 1.25 + }, + { + "label": "Fn", + "x": 13.75, + "y": 4, + "w": 1.25 + } + ] + } + } +} diff --git a/keyboards/royal_kludge/rk61/rgb/readme.md b/keyboards/royal_kludge/rk61/rgb/readme.md new file mode 100644 index 000000000000..1a05059c545c --- /dev/null +++ b/keyboards/royal_kludge/rk61/rgb/readme.md @@ -0,0 +1,57 @@ +# RK61 RGB + +![RK61 RGB](https://i.pinimg.com/originals/01/e2/1f/01e21f1ba56526a0f2fe5047b6d25f11.png) + +Royal Kludge RK61 non-hotswap rgb edition, original PID 0x24F. + +Tested on the Royal Kludge RK61 non-hotswap RGB dual-mode edition, original PID 0x24F +(RK61 firmware v1.03.000n, purchased after May 2020). + +- MCU: HFD2201KBA (rebrand SN32F248BF) +- PCB: RK61-JX-RGB-HFD; REV: 01; 2019/08/13 +- Wired only, no bluetooth support. + +Keyboard Maintainer: [euwbah](https://github.com/euwbah) + +For the white-backlit non-rgb version of the RK61, check out [Diff-fusion's repo](https://github.com/Diff-fusion/qmk_firmware) + + +Note: keymap differs slightly from stock firmware for FN combinations +configuring RGB settings. Also adds ability to control volume and display +brightness + additional FN keys. +See [keymap.c](keymaps/default/keymap.c), and refer to the [list +of QMK keycodes](https://beta.docs.qmk.fm/using-qmk/simple-keycodes/keycodes). + +----------------- + + +Make example for this keyboard (after setting up your build environment): + + make royal_kludge/rk61_rgb:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader: + +- Physical reset: short the two contacts to the left of the space bar switch with a wire/paperclip, accessible from the bottom of PCB. + ![HW bootloader](imgs/enter-bootloader.jpg) + After shorting, just connect the USB cable. The keyboard started in bootloader mode and is ready to be flashed. +- Layout (after loading QMK): FN + CapsLock + +## Flashing + +### Option 1. SONiX USB MCU ISP Tool + +Download the [SONiX USB MCU ISP Tool](https://www.sonix.com.tw/files/1/B6648B8BB74030BDE050007F01002479) from the [MCU SN32F248B page](https://www.sonix.com.tw/article-en-4336-30356) and use the program, included in archive. +More detailed instructions may be found in this [Video](https://youtu.be/2MHtLEiXaXg?t=940). + +### Option 2. Sonix Flasher + +Use the Python program from [this repository](https://github.com/SonixQMK/sonix-flasher) + +### Option 3. SonixFlasherC + +Use the Python program from [this repository](https://github.com/SonixQMK/SonixFlasherC) + diff --git a/keyboards/royal_kludge/rk61/rgb/rgb.h b/keyboards/royal_kludge/rk61/rgb/rgb.h new file mode 100644 index 000000000000..00bdf1e032ff --- /dev/null +++ b/keyboards/royal_kludge/rk61/rgb/rgb.h @@ -0,0 +1,4 @@ +#pragma once + +#include "quantum.h" + diff --git a/keyboards/royal_kludge/rk61/rgb/rules.mk b/keyboards/royal_kludge/rk61/rgb/rules.mk new file mode 100644 index 000000000000..c5a65999270b --- /dev/null +++ b/keyboards/royal_kludge/rk61/rgb/rules.mk @@ -0,0 +1,31 @@ +# project specific files +SRC = ../../../drivers/led/sn32/matrix_sn32f24xx.c +SRC += config_led.c + +# MCU name +MCU = SN32F248BF + +# Build Options +# comment out to disable the options. +# +LTO_ENABLE = no +BACKLIGHT_ENABLE = no +MAGIC_ENABLE = yes +MAGIC_KEYCODE_ENABLE = yes +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration +MOUSEKEY_ENABLE = no # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = no +SERIAL_LINK_ENABLE = no +WAIT_FOR_USB = no +CUSTOM_MATRIX = yes +KEYBOARD_SHARED_EP = yes + +# Custom RGB matrix handling +RGB_MATRIX_ENABLE = yes +RGB_MATRIX_DRIVER = SN32F24xB From c1cbd580ac5752e28377b793f1a4427f42c584d6 Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Mon, 14 Mar 2022 10:44:56 +0100 Subject: [PATCH 02/34] add missed "0" to the Neo layer 4 --- keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/keymap.c b/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/keymap.c index 5220aad11bf4..24dada369a6e 100644 --- a/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/keymap.c @@ -42,7 +42,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { { _______, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, _______, _______, _______, }, { _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_END, KC_PAST, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, _______, _______, }, { _______, _______, KC_ESC, KC_TAB, KC_INS, KC_ENTER, LCTL(DE_Z), KC_NLCK, KC_P1, KC_P2, KC_P3, KC_PDOT, _______, _______, }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, } + { _______, _______, _______, _______, _______, _______, KC_P0, _______, _______, _______, _______, _______, _______, _______, } }, [_FN] = FN_KEYMAP }; From 0b986ba87648624d6c64f537b729c91761570644 Mon Sep 17 00:00:00 2001 From: "mr. JULY" Date: Mon, 14 Mar 2022 23:30:38 +0100 Subject: [PATCH 03/34] improve keymap definiton consistence use `_______` instead of `KC_TRNS` to improve readability --- keyboards/royal_kludge/rk61/keymaps/default/keymap.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/default/keymap.h b/keyboards/royal_kludge/rk61/keymaps/default/keymap.h index 07a9a7bf823a..5d2c8448be68 100644 --- a/keyboards/royal_kludge/rk61/keymaps/default/keymap.h +++ b/keyboards/royal_kludge/rk61/keymaps/default/keymap.h @@ -43,8 +43,8 @@ along with this program. If not, see . // functional layer (F1-F10, backlight controls etc.) #define FN_KEYMAP { \ { KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, }, \ - { KC_TRNS, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, }, \ - { RESET, KC_VOLU, KC_BRIU, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME, KC_PGUP, KC_TRNS, RGB_SPD, RGB_SPI, RGB_MOD, TG(_RMODS), }, \ + { _______, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_PSCR, KC_SLCK, KC_PAUS, _______, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, }, \ + { RESET, KC_VOLU, KC_BRIU, _______, _______, _______, KC_INS, KC_HOME, KC_PGUP, _______, RGB_SPD, RGB_SPI, RGB_MOD, TG(_RMODS), }, \ { _______, _______, KC_VOLD, KC_BRID, _______, _______, _______, KC_DEL, KC_END, KC_PGDN, _______, KC_SLSH, _______, _______, }, \ { _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RALT, KC_APP, KC_RCTL, _______, _______, } \ } From c9fe2bb0b6bc94926eaa53dd13502d2c2683d6ba Mon Sep 17 00:00:00 2001 From: "mr. JULY" Date: Sun, 20 Mar 2022 13:58:46 +0100 Subject: [PATCH 04/34] add the PCB picture with marked contacts to be shorted for bootloader --- .../rk61/rgb/imgs/enter-bootloader.jpg | Bin 0 -> 176618 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 keyboards/royal_kludge/rk61/rgb/imgs/enter-bootloader.jpg diff --git a/keyboards/royal_kludge/rk61/rgb/imgs/enter-bootloader.jpg b/keyboards/royal_kludge/rk61/rgb/imgs/enter-bootloader.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bc20fbdc7dd38f19a082bcb9f758430d504c0776 GIT binary patch literal 176618 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%0A#q%3zw0EeurglXx-OIRb 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

Q??U8XL$cV{kNY`s$c0Kt?@0WX7Q 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 Pi(r|D*~<|QSMdMYH@ Date: Sun, 20 Mar 2022 14:14:50 +0100 Subject: [PATCH 05/34] change vendor ID, manufacturer and product description --- keyboards/royal_kludge/rk61/rgb/config.h | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/keyboards/royal_kludge/rk61/rgb/config.h b/keyboards/royal_kludge/rk61/rgb/config.h index 8098133b016e..ec285b5666ee 100644 --- a/keyboards/royal_kludge/rk61/rgb/config.h +++ b/keyboards/royal_kludge/rk61/rgb/config.h @@ -21,23 +21,19 @@ #include "config_common.h" /* USB Device descriptor parameter */ -//#define VENDOR_ID 0x0C45 -#define VENDOR_ID 0x05AC +#define VENDOR_ID 0x0C45 #define PRODUCT_ID 0x024F -//#define DEVICE_VER 0x0001 #define DEVICE_VER 0x0121 -//#define MANUFACTURER Royal Kludge -//#define PRODUCT RK61 RGB -#define MANUFACTURER SONiX -#define PRODUCT USB DEVICE -//#define DESCRIPTION RK61 QMK OpenRGB mod +#define MANUFACTURER Royal Kludge +#define PRODUCT RK61 RGB +#define DESCRIPTION RK61 QMK OpenRGB mod /* key matrix size */ #define MATRIX_ROWS 5 #define MATRIX_COLS 14 -/* The rk 61 retrieves all columns at once, scanning one row at a time*/ +/* The rk 61 retrieves all columns at once, scanning one row at a time */ #define DIODE_DIRECTION COL2ROW #define MATRIX_COL_PINS { A8, A9, A10, A11, A12, A13, A14, A15, B0, B1, B2, B3, B4, B5 } From 91537aa841ac5c7beeae63985e40796d0b1c60d4 Mon Sep 17 00:00:00 2001 From: "mr. JULY" Date: Sun, 20 Mar 2022 15:41:30 +0100 Subject: [PATCH 06/34] add the section about original firmware to the documentation --- keyboards/royal_kludge/rk61/rgb/readme.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/keyboards/royal_kludge/rk61/rgb/readme.md b/keyboards/royal_kludge/rk61/rgb/readme.md index 1a05059c545c..1a71ab7d59ef 100644 --- a/keyboards/royal_kludge/rk61/rgb/readme.md +++ b/keyboards/royal_kludge/rk61/rgb/readme.md @@ -55,3 +55,13 @@ Use the Python program from [this repository](https://github.com/SonixQMK/sonix- Use the Python program from [this repository](https://github.com/SonixQMK/SonixFlasherC) +## Original firmware + +### Unchanged + +The original firmware can be found on [Google Drive](https://drive.google.com/drive/folders/1Qx_4Ql_n_4TafIpe-guBf9F-IfuuVHOy) + +### Patched + +There is a version of original firmware, which was patched to be able to start the keyboard in bootloader mode by holding the `Esc` button while connecting the USB cable. The patched files are available on [Dropbox](https://www.dropbox.com/sh/jy1741tsamyjt6a/AAA58nafcQ_wCTlKke11ck30a?dl=0). +With this firmware it is possible to switch from QMK to original firmware and back without shorting contacts on PCB. From f9cbd3db14ce1a4cee7ba7d62df065ef88467263 Mon Sep 17 00:00:00 2001 From: mr-july Date: Tue, 22 Mar 2022 09:00:54 +0100 Subject: [PATCH 07/34] make the keyboard functional in some BIOSes, which do not implement Boot Keyboard protocol switching Co-authored-by: vjdato21 --- keyboards/royal_kludge/rk61/rgb/rules.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/royal_kludge/rk61/rgb/rules.mk b/keyboards/royal_kludge/rk61/rgb/rules.mk index c5a65999270b..46573bc4de55 100644 --- a/keyboards/royal_kludge/rk61/rgb/rules.mk +++ b/keyboards/royal_kludge/rk61/rgb/rules.mk @@ -24,7 +24,7 @@ RGBLIGHT_ENABLE = no SERIAL_LINK_ENABLE = no WAIT_FOR_USB = no CUSTOM_MATRIX = yes -KEYBOARD_SHARED_EP = yes +KEYBOARD_SHARED_EP = no # Custom RGB matrix handling RGB_MATRIX_ENABLE = yes From 5a8307645d35dbde785402bc7bcd01deee096f92 Mon Sep 17 00:00:00 2001 From: mr-july Date: Tue, 22 Mar 2022 09:11:16 +0100 Subject: [PATCH 08/34] improve keyboard description Co-authored-by: vjdato21 --- keyboards/royal_kludge/rk61/rgb/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/royal_kludge/rk61/rgb/config.h b/keyboards/royal_kludge/rk61/rgb/config.h index ec285b5666ee..5e016252f464 100644 --- a/keyboards/royal_kludge/rk61/rgb/config.h +++ b/keyboards/royal_kludge/rk61/rgb/config.h @@ -27,7 +27,7 @@ #define MANUFACTURER Royal Kludge #define PRODUCT RK61 RGB -#define DESCRIPTION RK61 QMK OpenRGB mod +#define DESCRIPTION RK61 QMK OpenRGB /* key matrix size */ #define MATRIX_ROWS 5 From 8821650bc952e56bcc05d83b2b3bc36946c437f0 Mon Sep 17 00:00:00 2001 From: mr-july Date: Tue, 22 Mar 2022 09:14:49 +0100 Subject: [PATCH 09/34] add GUI toggle key to functional layer Co-authored-by: vjdato21 --- keyboards/royal_kludge/rk61/keymaps/default/keymap.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/default/keymap.h b/keyboards/royal_kludge/rk61/keymaps/default/keymap.h index 5d2c8448be68..90a77d2e1ffa 100644 --- a/keyboards/royal_kludge/rk61/keymaps/default/keymap.h +++ b/keyboards/royal_kludge/rk61/keymaps/default/keymap.h @@ -46,5 +46,5 @@ along with this program. If not, see . { _______, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_PSCR, KC_SLCK, KC_PAUS, _______, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, }, \ { RESET, KC_VOLU, KC_BRIU, _______, _______, _______, KC_INS, KC_HOME, KC_PGUP, _______, RGB_SPD, RGB_SPI, RGB_MOD, TG(_RMODS), }, \ { _______, _______, KC_VOLD, KC_BRID, _______, _______, _______, KC_DEL, KC_END, KC_PGDN, _______, KC_SLSH, _______, _______, }, \ - { _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RALT, KC_APP, KC_RCTL, _______, _______, } \ + { _______, GUI_TOG, _______, _______, _______, _______, _______, _______, _______, KC_RALT, KC_APP, KC_RCTL, _______, _______, } \ } From 7077747ad6bd020ecdd53208e74ddc28d8473946 Mon Sep 17 00:00:00 2001 From: mr-july Date: Tue, 22 Mar 2022 09:17:34 +0100 Subject: [PATCH 10/34] change keyboard maintainer for RK61 rgb --- keyboards/royal_kludge/rk61/rgb/info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/royal_kludge/rk61/rgb/info.json b/keyboards/royal_kludge/rk61/rgb/info.json index 6f7aaa82ca90..4402085c54be 100644 --- a/keyboards/royal_kludge/rk61/rgb/info.json +++ b/keyboards/royal_kludge/rk61/rgb/info.json @@ -1,7 +1,7 @@ { "keyboard_name": "RK61 RGB", "url": "https://www.lazada.sg/products/royal-kludge-rk61-usb-wired-bluetooth-dual-mode-60-rgb-backlit-mechanical-gaming-keyboard-i1341602754.html", - "maintainer": "euwbah", + "maintainer": "mr-july", "width": 15, "height": 5, "layouts": { From 9276e897d80a6c58ae1d47a7f18750649cd0f866 Mon Sep 17 00:00:00 2001 From: mr-july Date: Tue, 22 Mar 2022 09:18:59 +0100 Subject: [PATCH 11/34] change keyboard maintainer for RK61 rgb --- keyboards/royal_kludge/rk61/rgb/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/royal_kludge/rk61/rgb/readme.md b/keyboards/royal_kludge/rk61/rgb/readme.md index 1a71ab7d59ef..657514ffe276 100644 --- a/keyboards/royal_kludge/rk61/rgb/readme.md +++ b/keyboards/royal_kludge/rk61/rgb/readme.md @@ -11,7 +11,7 @@ Tested on the Royal Kludge RK61 non-hotswap RGB dual-mode edition, original PID - PCB: RK61-JX-RGB-HFD; REV: 01; 2019/08/13 - Wired only, no bluetooth support. -Keyboard Maintainer: [euwbah](https://github.com/euwbah) +Keyboard Maintainer: [mr-july](https://github.com/mr-july) For the white-backlit non-rgb version of the RK61, check out [Diff-fusion's repo](https://github.com/Diff-fusion/qmk_firmware) From fa95a18772f904647e1a3f6b650adbcb2818b686 Mon Sep 17 00:00:00 2001 From: mr-july Date: Tue, 22 Mar 2022 09:56:47 +0100 Subject: [PATCH 12/34] fix: `SonixFlasherC` is a `C` programm --- keyboards/royal_kludge/rk61/rgb/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/royal_kludge/rk61/rgb/readme.md b/keyboards/royal_kludge/rk61/rgb/readme.md index 657514ffe276..b8f8dc5e5196 100644 --- a/keyboards/royal_kludge/rk61/rgb/readme.md +++ b/keyboards/royal_kludge/rk61/rgb/readme.md @@ -53,7 +53,7 @@ Use the Python program from [this repository](https://github.com/SonixQMK/sonix- ### Option 3. SonixFlasherC -Use the Python program from [this repository](https://github.com/SonixQMK/SonixFlasherC) +Use the C program from [this repository](https://github.com/SonixQMK/SonixFlasherC) ## Original firmware From 0d77f2592f054e6a1f489a57ec0b7118dbcb1b2a Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Tue, 22 Mar 2022 11:48:31 +0100 Subject: [PATCH 13/34] implement GUI key highlighting if it is disabled --- keyboards/royal_kludge/rk61/rgb/config_led.c | 23 +++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/keyboards/royal_kludge/rk61/rgb/config_led.c b/keyboards/royal_kludge/rk61/rgb/config_led.c index 795b926d3c0a..1949dc24b614 100644 --- a/keyboards/royal_kludge/rk61/rgb/config_led.c +++ b/keyboards/royal_kludge/rk61/rgb/config_led.c @@ -28,6 +28,8 @@ along with this program. If not, see . #ifdef KEYMAP_ISO // CAPS LED number #define CL 27 +// GUI LED number +#define GL 55 /* ISO keymap */ /* * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ @@ -39,7 +41,7 @@ along with this program. If not, see . * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┤ * │    │  │  │  │  │  │  │  │  │  │  │  │    │ │ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴──┬┴──┬┴──┬───┼───┤ - * │ │  │  │                      │ │ │ │ │ │ + * │ │ GUI│  │                      │ │ │ │ │ │ * └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘ */ led_config_t g_led_config = { @@ -48,7 +50,7 @@ led_config_t g_led_config = { {14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, NA,}, {CL, 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, NA,}, - {54, 55, 56, NA, NA, NA, 57, NA, NA, 58, 59, 60, NA, 61,} + {54, GL, 56, NA, NA, NA, 57, NA, NA, 58, 59, 60, NA, 61,} }, { {8, 0}, {24, 0}, {39, 0}, {55, 0}, {70, 0}, {86, 0}, {101, 0}, {117, 0}, {132, 0}, {148, 0}, {164, 0}, {180, 0}, {195, 0}, {218, 0}, @@ -79,18 +81,20 @@ led_config_t g_led_config = { * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ * │      │  │  │  │  │  │  │  │  │  │  │    │ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ - * │ │  │  │                      │ │ │ │ │ + * │ │ GUI│  │                      │ │ │ │ │ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ */ // CAPS LED number #define CL 27 +// GUI LED number +#define GL 54 led_config_t g_led_config = { { { 0, 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,}, {CL, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, NA, 40,}, {41, NA, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, NA,}, - {53, 54, 55, NA, NA, NA, 56, NA, NA, 57, 58, 59, NA, 60,} + {53, GL, 55, NA, NA, NA, 56, NA, NA, 57, 58, 59, NA, 60,} }, { {8, 0}, {24, 0}, {39, 0}, {55, 0}, {70, 0}, {86, 0}, {101, 0}, {117, 0}, {132, 0}, {148, 0}, {164, 0}, {180, 0}, {195, 0}, {218, 0}, @@ -112,10 +116,17 @@ led_config_t g_led_config = { #endif void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { - if (host_keyboard_led_state().caps_lock) { - // Set capslock key to orange (capslock is led number defined as `CL`) + led_t led_state = host_keyboard_led_state(); + + if (led_state.caps_lock) { + // Set capslock key to (capslock is led number defined as `CL`) rgb_matrix_set_color(CL, 255, 130, 15); } + + if (keymap_config.no_gui) { + // Set GUI key to lemon (GUI is led number defined as `GL`) + rgb_matrix_set_color(GL, 255, 230, 15); + } } #endif From e1e69c00d8e57373793ba680e67aac17dd26ed20 Mon Sep 17 00:00:00 2001 From: mr-july Date: Mon, 28 Mar 2022 09:45:06 +0200 Subject: [PATCH 14/34] fix `make` call for building default keymap Co-authored-by: vjdato21 --- keyboards/royal_kludge/rk61/rgb/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/royal_kludge/rk61/rgb/readme.md b/keyboards/royal_kludge/rk61/rgb/readme.md index b8f8dc5e5196..adfcb54aabcb 100644 --- a/keyboards/royal_kludge/rk61/rgb/readme.md +++ b/keyboards/royal_kludge/rk61/rgb/readme.md @@ -27,7 +27,7 @@ of QMK keycodes](https://beta.docs.qmk.fm/using-qmk/simple-keycodes/keycodes). Make example for this keyboard (after setting up your build environment): - make royal_kludge/rk61_rgb:default + make royal_kludge/rk61/rgb:default See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). From a65a8d8d350969c72ec299484f13954f23b14c28 Mon Sep 17 00:00:00 2001 From: "mr. JULY" Date: Mon, 28 Mar 2022 20:32:09 +0200 Subject: [PATCH 15/34] rename "keymap.h" to "layout.h" to prevent compile problems --- keyboards/royal_kludge/rk61/keymaps/default/keymap.c | 2 +- .../royal_kludge/rk61/keymaps/default/{keymap.h => layout.h} | 0 keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/keymap.c | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename keyboards/royal_kludge/rk61/keymaps/default/{keymap.h => layout.h} (100%) diff --git a/keyboards/royal_kludge/rk61/keymaps/default/keymap.c b/keyboards/royal_kludge/rk61/keymaps/default/keymap.c index 51abe1bda823..10a9cf4f6e64 100644 --- a/keyboards/royal_kludge/rk61/keymaps/default/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/default/keymap.c @@ -16,7 +16,7 @@ along with this program. If not, see . */ #include QMK_KEYBOARD_H -#include "keymap.h" +#include "layout.h" enum layer_names { _BASE, // default layer diff --git a/keyboards/royal_kludge/rk61/keymaps/default/keymap.h b/keyboards/royal_kludge/rk61/keymaps/default/layout.h similarity index 100% rename from keyboards/royal_kludge/rk61/keymaps/default/keymap.h rename to keyboards/royal_kludge/rk61/keymaps/default/layout.h diff --git a/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/keymap.c b/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/keymap.c index 24dada369a6e..0eeea3e3f22d 100644 --- a/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/iso-neo-l3l4/keymap.c @@ -17,7 +17,7 @@ along with this program. If not, see . #include QMK_KEYBOARD_H #include "keymap_german.h" -#include "../default/keymap.h" +#include "../default/layout.h" enum layer_names { _BASE, // default layer From 7c2cb28d14c1a63d2fbc82635395a664b6d61b0e Mon Sep 17 00:00:00 2001 From: mr-july Date: Thu, 31 Mar 2022 09:43:19 +0200 Subject: [PATCH 16/34] introduce entering bootloader with the aid of Sonix Flasher --- keyboards/royal_kludge/rk61/rgb/readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/keyboards/royal_kludge/rk61/rgb/readme.md b/keyboards/royal_kludge/rk61/rgb/readme.md index adfcb54aabcb..48a63ac6b168 100644 --- a/keyboards/royal_kludge/rk61/rgb/readme.md +++ b/keyboards/royal_kludge/rk61/rgb/readme.md @@ -35,6 +35,7 @@ See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_to Enter the bootloader: +- [Sonix Flasher](https://github.com/SonixQMK/sonix-flasher): if you have the original firmware, just start the program and click the "Reboot to Bootloader [HFD]" button. - Physical reset: short the two contacts to the left of the space bar switch with a wire/paperclip, accessible from the bottom of PCB. ![HW bootloader](imgs/enter-bootloader.jpg) After shorting, just connect the USB cable. The keyboard started in bootloader mode and is ready to be flashed. From 2fe8a3fef7217579eb2ac0ad6ed85a6dbc2858c4 Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Fri, 20 May 2022 15:54:25 +0200 Subject: [PATCH 17/34] introduce the layout definnition macro for RK61 --- .../rk61/keymaps/default/layout.h | 58 ++++++++++++------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/default/layout.h b/keyboards/royal_kludge/rk61/keymaps/default/layout.h index 90a77d2e1ffa..4be4db465181 100644 --- a/keyboards/royal_kludge/rk61/keymaps/default/layout.h +++ b/keyboards/royal_kludge/rk61/keymaps/default/layout.h @@ -17,34 +17,48 @@ along with this program. If not, see . #pragma once -/* Row: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 */ +/* +Row: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 */ +#define RK61_LAYOUT( \ + k0_00, k0_01, k0_02, k0_03, k0_04, k0_05, k0_06, k0_07, k0_08, k0_09, k0_10, k0_11, k0_12, k0_13, \ + k1_00, k1_01, k1_02, k1_03, k1_04, k1_05, k1_06, k1_07, k1_08, k1_09, k1_10, k1_11, k1_12, k1_13, \ + k2_00, k2_01, k2_02, k2_03, k2_04, k2_05, k2_06, k2_07, k2_08, k2_09, k2_10, k2_11, k2_12, k2_13, \ + k3_00, k3_01, k3_02, k3_03, k3_04, k3_05, k3_06, k3_07, k3_08, k3_09, k3_10, k3_11, k3_12, k3_13, \ + k4_00, k4_01, k4_02, k4_03, k4_04, k4_05, k4_06, k4_07, k4_08, k4_09, k4_10, k4_11, k4_12, k4_13 \ + ) { \ + { k0_00, k0_01, k0_02, k0_03, k0_04, k0_05, k0_06, k0_07, k0_08, k0_09, k0_10, k0_11, k0_12, k0_13, }, \ + { k1_00, k1_01, k1_02, k1_03, k1_04, k1_05, k1_06, k1_07, k1_08, k1_09, k1_10, k1_11, k1_12, k1_13, }, \ + { k2_00, k2_01, k2_02, k2_03, k2_04, k2_05, k2_06, k2_07, k2_08, k2_09, k2_10, k2_11, k2_12, k2_13, }, \ + { k3_00, k3_01, k3_02, k3_03, k3_04, k3_05, k3_06, k3_07, k3_08, k3_09, k3_10, k3_11, k3_12, k3_13, }, \ + { k4_00, k4_01, k4_02, k4_03, k4_04, k4_05, k4_06, k4_07, k4_08, k4_09, k4_10, k4_11, k4_12, k4_13, } \ +} // default layer -#define BASE_KEYMAP_(caps, nuhs, nubs) { \ - { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, }, \ - { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, }, \ - { caps, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, nuhs, KC_ENT, }, \ - { KC_LSFT, nubs, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RSFT, XXXXXXX, }, \ - { KC_LCTL, KC_LGUI, KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX, MO(_FN), } \ - } +#define BASE_KEYMAP_(caps, nuhs, nubs) RK61_LAYOUT( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + caps, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, nuhs, KC_ENT, \ + KC_LSFT, nubs, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RSFT, XXXXXXX, \ + KC_LCTL, KC_LGUI, KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX, MO(_FN) \ +) #define BASE_KEYMAP BASE_KEYMAP_(KC_CAPS, KC_NUHS, KC_NUBS) // snap right hand modifiers: Alt, context menu, Ctrl instead of arrows -#define RMODS_KEYMAP_(ralt) { \ - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, }, \ - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, }, \ - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, }, \ - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_SLSH, _______, _______, }, \ - { _______, _______, _______, _______, _______, _______, _______, _______, _______, ralt, KC_APP, KC_RCTL, _______, _______, } \ - } +#define RMODS_KEYMAP_(ralt) RK61_LAYOUT( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_SLSH, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, ralt, KC_APP, KC_RCTL, _______, _______ \ +} #define RMODS_KEYMAP RMODS_KEYMAP_(KC_RALT) // functional layer (F1-F10, backlight controls etc.) -#define FN_KEYMAP { \ - { KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, }, \ - { _______, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_PSCR, KC_SLCK, KC_PAUS, _______, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, }, \ - { RESET, KC_VOLU, KC_BRIU, _______, _______, _______, KC_INS, KC_HOME, KC_PGUP, _______, RGB_SPD, RGB_SPI, RGB_MOD, TG(_RMODS), }, \ - { _______, _______, KC_VOLD, KC_BRID, _______, _______, _______, KC_DEL, KC_END, KC_PGDN, _______, KC_SLSH, _______, _______, }, \ - { _______, GUI_TOG, _______, _______, _______, _______, _______, _______, _______, KC_RALT, KC_APP, KC_RCTL, _______, _______, } \ - } +#define FN_KEYMAP RK61_LAYOUT( \ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + _______, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_PSCR, KC_SLCK, KC_PAUS, _______, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, \ + RESET, KC_VOLU, KC_BRIU, _______, _______, _______, KC_INS, KC_HOME, KC_PGUP, _______, RGB_SPD, RGB_SPI, RGB_MOD, TG(_RMODS), \ + _______, _______, KC_VOLD, KC_BRID, _______, _______, _______, KC_DEL, KC_END, KC_PGDN, _______, KC_SLSH, _______, _______, \ + _______, GUI_TOG, _______, _______, _______, _______, _______, _______, _______, KC_RALT, KC_APP, KC_RCTL, _______, _______ \ +) From b310fe7dc67ec030805728093b26b46b0e680cb9 Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Fri, 20 May 2022 15:55:53 +0200 Subject: [PATCH 18/34] introduce custom layout inspired by "miryoku" and "neo", using just 35 keys --- .../rk61/keymaps/mr-july/config.h | 23 ++ .../rk61/keymaps/mr-july/features/caps_word.c | 159 +++++++++++++ .../rk61/keymaps/mr-july/features/caps_word.h | 136 +++++++++++ .../keymaps/mr-july/features/layer_lock.c | 95 ++++++++ .../keymaps/mr-july/features/layer_lock.h | 88 +++++++ .../rk61/keymaps/mr-july/keymap.c | 225 ++++++++++++++++++ .../rk61/keymaps/mr-july/rules.mk | 4 + 7 files changed, 730 insertions(+) create mode 100644 keyboards/royal_kludge/rk61/keymaps/mr-july/config.h create mode 100644 keyboards/royal_kludge/rk61/keymaps/mr-july/features/caps_word.c create mode 100644 keyboards/royal_kludge/rk61/keymaps/mr-july/features/caps_word.h create mode 100644 keyboards/royal_kludge/rk61/keymaps/mr-july/features/layer_lock.c create mode 100644 keyboards/royal_kludge/rk61/keymaps/mr-july/features/layer_lock.h create mode 100644 keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c create mode 100644 keyboards/royal_kludge/rk61/keymaps/mr-july/rules.mk diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/config.h b/keyboards/royal_kludge/rk61/keymaps/mr-july/config.h new file mode 100644 index 000000000000..42d44d227e4b --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/config.h @@ -0,0 +1,23 @@ +/* +Copyright 2022 mr. JULY + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#pragma once + +#define KEYMAP_ISO 1 + +#define IGNORE_MOD_TAP_INTERRUPT // allow fast typing on home row mods + diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/features/caps_word.c b/keyboards/royal_kludge/rk61/keymaps/mr-july/features/caps_word.c new file mode 100644 index 000000000000..a858fd58a7e8 --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/features/caps_word.c @@ -0,0 +1,159 @@ +// Copyright 2021-2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +// For full documentation, see +// https://getreuer.info/posts/keyboards/caps-word + +#include "caps_word.h" + +static bool caps_word_active = false; + +// Many keyboards enable the Command feature, which by default is also activated +// by Left Shift + Right Shift. It can be configured to use a different key +// combination by defining IS_COMMAND(). We make a non-fatal warning if Command +// is enabled but IS_COMMAND() is *not* defined. +#if defined(COMMAND_ENABLE) && !defined(IS_COMMAND) +#pragma message "Caps Word and Command should not be enabled at the same time, since both use the Left Shift + Right Shift key combination. Please disable Command, or ensure that `IS_COMMAND` is not set to (get_mods() == MOD_MASK_SHIFT)." +#endif // defined(COMMAND_ENABLE) && !defined(IS_COMMAND) + +#if CAPS_WORD_IDLE_TIMEOUT > 0 +#if CAPS_WORD_IDLE_TIMEOUT < 100 || CAPS_WORD_IDLE_TIMEOUT > 30000 +// Constrain timeout to a sensible range. With the 16-bit timer, the longest +// representable timeout is 32768 ms, rounded here to 30000 ms = half a minute. +#error "caps_word: CAPS_WORD_IDLE_TIMEOUT must be between 100 and 30000 ms" +#endif + +static uint16_t idle_timer = 0; + +void caps_word_task(void) { + if (caps_word_active && timer_expired(timer_read(), idle_timer)) { + caps_word_set(false); + } +} +#endif // CAPS_WORD_IDLE_TIMEOUT > 0 + +bool process_caps_word(uint16_t keycode, keyrecord_t* record) { +#ifndef NO_ACTION_ONESHOT + const uint8_t mods = get_mods() | get_oneshot_mods(); +#else + const uint8_t mods = get_mods(); +#endif // NO_ACTION_ONESHOT + + if (!caps_word_active) { + // Pressing both shift keys at the same time enables caps word. + if (mods == MOD_MASK_SHIFT) { + caps_word_set(true); // Activate Caps Word. + return false; + } + return true; + } else { +#if CAPS_WORD_IDLE_TIMEOUT > 0 + idle_timer = record->event.time + CAPS_WORD_IDLE_TIMEOUT; +#endif // CAPS_WORD_IDLE_TIMEOUT > 0 + } + + if (!record->event.pressed) { return true; } + + if (!(mods & ~MOD_MASK_SHIFT)) { + switch (keycode) { + // Ignore MO, TO, TG, TT, and OSL layer switch keys. + case QK_MOMENTARY ... QK_MOMENTARY_MAX: + case QK_TO ... QK_TO_MAX: + case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX: + case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX: + case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX: + return true; + +#ifndef NO_ACTION_TAPPING + case QK_MOD_TAP ... QK_MOD_TAP_MAX: + if (record->tap.count == 0) { + // Deactivate if a mod becomes active through holding a mod-tap key. + caps_word_set(false); + return true; + } + keycode &= 0xff; + break; + +#ifndef NO_ACTION_LAYER + case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: +#endif // NO_ACTION_LAYER + if (record->tap.count == 0) { return true; } + keycode &= 0xff; + break; +#endif // NO_ACTION_TAPPING + +#ifdef SWAP_HANDS_ENABLE + case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX: + if (keycode > 0x56F0 || record->tap.count == 0) { return true; } + keycode &= 0xff; + break; +#endif // SWAP_HANDS_ENABLE + } + + clear_weak_mods(); + if (caps_word_press_user(keycode)) { + send_keyboard_report(); + return true; + } + } + + caps_word_set(false); // Deactivate Caps Word. + return true; +} + +void caps_word_set(bool active) { + if (active != caps_word_active) { + if (active) { + clear_mods(); +#ifndef NO_ACTION_ONESHOT + clear_oneshot_mods(); +#endif // NO_ACTION_ONESHOT +#if CAPS_WORD_IDLE_TIMEOUT > 0 + idle_timer = timer_read() + CAPS_WORD_IDLE_TIMEOUT; +#endif // CAPS_WORD_IDLE_TIMEOUT > 0 + } else { + // Make sure weak shift is off. + unregister_weak_mods(MOD_BIT(KC_LSFT)); + } + + caps_word_active = active; + caps_word_set_user(active); + } +} + +bool caps_word_get(void) { return caps_word_active; } + +__attribute__((weak)) void caps_word_set_user(bool active) {} + +__attribute__((weak)) bool caps_word_press_user(uint16_t keycode) { + switch (keycode) { + // Keycodes that continue Caps Word, with shift applied. + case KC_A ... KC_Z: + case KC_MINS: + add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to the next key. + return true; + + // Keycodes that continue Caps Word, without shifting. + case KC_1 ... KC_0: + case KC_BSPC: + case KC_DEL: + case KC_UNDS: + return true; + + default: + return false; // Deactivate Caps Word. + } +} + diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/features/caps_word.h b/keyboards/royal_kludge/rk61/keymaps/mr-july/features/caps_word.h new file mode 100644 index 000000000000..adec54f61b24 --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/features/caps_word.h @@ -0,0 +1,136 @@ +// Copyright 2021-2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +// Caps Word, activated by pressing both shift keys at the same time. +// +// This library implements "Caps Word", which is like conventional Caps Lock, +// but automatically disables itself at the end of the word. This is useful for +// typing all-caps identifiers like `MOD_MASK_ALT`. +// +// Caps Word is activated by pressing the left and right shift keys at the same +// time. This way you don't need a dedicated key for using Caps Word. I've +// tested that this works as expected with one-shot mods and Space Cadet Shift. +// If your shift keys are mod-taps, activate Caps Word by holding both shift +// mod-tap keys until the tapping term, release them, then begin typing. +// +// Optionally, Caps Word may be configured to deactivate if the keyboard is idle +// for some time. This is useful to mitigate unintended shifting when you get +// interrupted or switch to the mouse while Caps Word is active. In your +// config.h, define `CAPS_WORD_IDLE_TIMEOUT` with a time in milliseconds: +// +// #define CAPS_WORD_IDLE_TIMEOUT 5000 // Turn off Caps Word after 5 seconds. +// +// and in your keymap.c, define (or add to) `matrix_scan_user()` as +// +// void matrix_scan_user(void) { +// caps_word_task(); +// // Other tasks... +// } +// +// For full documentation, see +// https://getreuer.info/posts/keyboards/caps-word + +#pragma once + +#include "quantum.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Call this function from `process_record_user()` to implement Caps Word. +bool process_caps_word(uint16_t keycode, keyrecord_t* record); + +// If CAPS_WORD_IDLE_TIMEOUT is set, call `caps_word_task()` from +// `matrix_scan_user()` as described above. +// +// If CAPS_WORD_IDLE_TIMEOUT isn't set, calling this function has no effect (but +// will still compile). +#if CAPS_WORD_IDLE_TIMEOUT > 0 +void caps_word_task(void); +#else +static inline void caps_word_task(void) {} +#endif + +// Activates or deactivates Caps Word. For instance activate Caps Word with a +// combo by defining a `COMBO_ACTION` that calls `caps_word_set(true)`: +// +// void process_combo_event(uint16_t combo_index, bool pressed) { +// switch(combo_index) { +// case CAPS_COMBO: +// if (pressed) { +// caps_word_set(true); // Activate Caps Word. +// } +// break; +// +// // Other combos... +// } +// } +void caps_word_set(bool active); + +// Returns whether Caps Word is currently active. +bool caps_word_get(void); + +// An optional callback that gets called when Caps Word turns on or off. This is +// useful to represent the current Caps Word state, e.g. by setting an LED or +// playing a sound. In your keymap, define +// +// void caps_word_set_user(bool active) { +// if (active) { +// // Do something when Caps Word activates. +// } else { +// // Do something when Caps Word deactivates. +// } +// } +void caps_word_set_user(bool active); + +// An optional callback which is called on every key press while Caps Word is +// active. When the key should be shifted (that is, a letter key), the callback +// should call `add_weak_mods(MOD_BIT(KC_LSFT))` to shift the key. The callback +// also determines whether the key should continue Caps Word. Returning true +// continues the current "word", while returning false is "word breaking" and +// deactivates Caps Word. The default callback is +// +// bool caps_word_press_user(uint16_t keycode) { +// switch (keycode) { +// // Keycodes that continue Caps Word, with shift applied. +// case KC_A ... KC_Z: +// case KC_MINS: +// add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to the next key. +// return true; +// +// // Keycodes that continue Caps Word, without shifting. +// case KC_1 ... KC_0: +// case KC_BSPC: +// case KC_DEL: +// case KC_UNDS: +// return true; +// +// default: +// return false; // Deactivate Caps Word. +// } +// } +// +// To customize, copy the above function into your keymap and add/remove +// keycodes to the above cases. +// +// NOTE: Outside of this callback, you can use `caps_word_set(false)` to +// deactivate Caps Word. +bool caps_word_press_user(uint16_t keycode); + +#ifdef __cplusplus +} +#endif + diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/features/layer_lock.c b/keyboards/royal_kludge/rk61/keymaps/mr-july/features/layer_lock.c new file mode 100644 index 000000000000..8ca74d3d7fa7 --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/features/layer_lock.c @@ -0,0 +1,95 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +// For full documentation, see +// https://getreuer.info/posts/keyboards/layer-lock + +#include "layer_lock.h" + +// The current lock state. The kth bit is on if layer k is locked. +static layer_state_t locked_layers = 0; + +bool process_layer_lock(uint16_t keycode, keyrecord_t* record, + uint16_t lock_keycode) { + // The intention is that locked layers remain on. If something outside of + // this feature turned any locked layers off, unlock them. + if ((locked_layers & ~layer_state) != 0) { + layer_lock_set_user(locked_layers &= layer_state); + } + + if (keycode == lock_keycode) { + if (record->event.pressed) { // The layer lock key was pressed. + layer_lock_invert(get_highest_layer(layer_state)); + } + return false; + } + + switch (keycode) { + case QK_MOMENTARY ... QK_MOMENTARY_MAX: // `MO(layer)` keys. + case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX: { // `TT(layer)`. + const uint8_t layer = keycode & 255; + if (is_layer_locked(layer)) { + // Event on `MO` or `TT` key where layer is locked. + if (record->event.pressed) { // On press, unlock the layer. + layer_lock_invert(layer); + } + return false; // Skip default handling. + } + } break; + +#ifndef NO_ACTION_TAPPING + case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: // `LT(layer, key)` keys. + if (record->tap.count == 0 && !record->event.pressed && + is_layer_locked((keycode >> 8) & 15)) { + // Release event on a held layer-tap key where the layer is locked. + return false; // Skip default handling so that layer stays on. + } + break; +#endif // NO_ACTION_TAPPING + } + + return true; +} + +bool is_layer_locked(uint8_t layer) { + return locked_layers & ((layer_state_t)1 << layer); +} + +void layer_lock_invert(uint8_t layer) { + const layer_state_t mask = (layer_state_t)1 << layer; + if ((locked_layers & mask) == 0) { // Layer is being locked. +#ifndef NO_ACTION_ONESHOT + if (layer == get_oneshot_layer()) { + reset_oneshot_layer(); // Reset so that OSL doesn't turn layer off. + } +#endif // NO_ACTION_ONESHOT + layer_on(layer); + } else { // Layer is being unlocked. + layer_off(layer); + } + layer_lock_set_user(locked_layers ^= mask); +} + +// Implement layer_lock_on/off by deferring to layer_lock_invert. +void layer_lock_on(uint8_t layer) { + if (!is_layer_locked(layer)) { layer_lock_invert(layer); } +} + +void layer_lock_off(uint8_t layer) { + if (is_layer_locked(layer)) { layer_lock_invert(layer); } +} + +__attribute__((weak)) void layer_lock_set_user(layer_state_t locked_layers) {} + diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/features/layer_lock.h b/keyboards/royal_kludge/rk61/keymaps/mr-july/features/layer_lock.h new file mode 100644 index 000000000000..ee57e4209bca --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/features/layer_lock.h @@ -0,0 +1,88 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +// Layer Lock, a key to stay in the current layer. +// +// Layers are often accessed by holding a button, e.g. with a momentary layer +// switch `MO(layer)` or layer tap `LT(layer, key)` key. But you may sometimes +// want to "lock" or "toggle" the layer so that it stays on without having to +// hold down a button. One way to do that is with a tap-toggle `TT` layer key, +// but here is an alternative. +// +// This library implements a "Layer Lock key". When tapped, it "locks" the +// highest layer to stay active, assuming the layer was activated by one of the +// following keys: +// +// * `MO(layer)` momentary layer switch +// * `LT(layer, key)` layer tap +// * `OSL(layer)` one-shot layer +// * `TT(layer)` layer tap toggle +// +// Tapping the Layer Lock key again unlocks and turns off the layer. +// +// NOTE: When a layer is "locked", other layer keys such as `TO(layer)` or +// manually calling `layer_off(layer)` will override and unlock the layer. +// +// For full documentation, see +// https://getreuer.info/posts/keyboards/layer-lock + +#pragma once + +#include "quantum.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// In your keymap, define a custom keycode to use for Layer Lock. Then handle +// Layer Lock from your `process_record_user` function by calling +// `process_layer_lock`, passing your custom keycode for the `lock_keycode` arg: +// +// #include "features/layer_lock.h" +// +// bool process_record_user(uint16_t keycode, keyrecord_t* record) { +// if (!process_layer_lock(keycode, record, LLOCK)) { return false; } +// // Your macros ... +// +// return true; +// } +bool process_layer_lock(uint16_t keycode, keyrecord_t* record, + uint16_t lock_keycode); + +// Returns true if `layer` is currently locked. +bool is_layer_locked(uint8_t layer); + +// Locks and turns on `layer`. +void layer_lock_on(uint8_t layer); + +// Unlocks and turns off `layer`. +void layer_lock_off(uint8_t layer); + +// Toggles whether `layer` is locked. +void layer_lock_invert(uint8_t layer); + +// An optional callback that gets called when a layer is locked or unlocked. +// This is useful to represent the current lock state, e.g. by setting an LED or +// playing a sound. In your keymap, define +// +// void layer_lock_set_user(layer_state_t locked_layers) { +// // Do something like `set_led(is_layer_locked(NAV));` +// } +void layer_lock_set_user(layer_state_t locked_layers); + +#ifdef __cplusplus +} +#endif + diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c new file mode 100644 index 000000000000..1ce80beb3fc2 --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c @@ -0,0 +1,225 @@ +/* +Copyright 2022 mr. JULY + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include QMK_KEYBOARD_H +#include "keymap_german.h" +#include "../default/layout.h" + + +// Caps Word +// see https://getreuer.info/posts/keyboards/caps-word/ +#include "features/caps_word.h" + +// Layer Lock key +// see https://getreuer.info/posts/keyboards/layer-lock/ +#include "features/layer_lock.h" + +enum custom_keycodes { + LLOCK = SAFE_RANGE, +}; + +bool process_record_user(uint16_t keycode, keyrecord_t* record) { + if (!process_caps_word(keycode, record)) { return false; } + + if (!process_layer_lock(keycode, record, LLOCK)) { return false; } + + switch (keycode) { + case RGUI_T(DE_QUES): + if (record->tap.count && record->event.pressed) { + if (get_mods() & MOD_MASK_SHIFT) { + tap_code16(DE_EXLM); // Send DE_EXLM on shift tap + } else { + tap_code16(DE_QUES); // Send DE_QUES on tap + } + return false; // Return false to ignore further processing of key + } + break; + } + + return true; +} + +// Key overrides (https://docs.qmk.fm/#/feature_key_overrides) +// shift + '[' = ']' +const key_override_t lbrc_key_override = ko_make_basic(MOD_MASK_SHIFT, DE_LBRC, DE_RBRC); +// shift + '{' = '}' +const key_override_t lcbr_key_override = ko_make_basic(MOD_MASK_SHIFT, DE_LCBR, DE_RCBR); + +// This globally defines all key overrides to be used +const key_override_t **key_overrides = (const key_override_t *[]){ + &lbrc_key_override, + &lcbr_key_override, + NULL // Null terminate the array of overrides! +}; + +// foreign languages support for CAPS_WORD +bool caps_word_press_user(uint16_t keycode) { + switch (keycode) { + // Keycodes that continue Caps Word, with shift applied. + case KC_A ... KC_Z: + case DE_ADIA: + case DE_ODIA: + case DE_UDIA: + case KC_MINS: + case DE_MINS: + add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to the next key. + return true; + + // Keycodes that continue Caps Word, without shifting. + case KC_1 ... KC_0: + case KC_BSPC: + case KC_DEL: + case KC_UNDS: + case DE_UNDS: + return true; + + default: + return false; // Deactivate Caps Word. + } +} + +#define CPS_WRD LSFT(KC_RSFT) +#define Q_LNG LT(_LNG, KC_Q) + +// Left-hand home row mods +#define HOME_L6 LT(_FUN, KC_TAB) +#define HOME_L5 LGUI_T(KC_A) +#define HOME_L4 LALT_T(KC_S) +#define HOME_L3 LCTL_T(KC_D) +#define HOME_L2 LSFT_T(KC_F) + +// Right-hand home row mods +#define HOME_R2 RSFT_T(KC_J) +#define HOME_R3 RCTL_T(KC_K) +#define HOME_R4 LALT_T(KC_L) +#define HOME_R5 RGUI_T(DE_QUES) + +#define ESC_NUM LT(_NUM, KC_ESC) +#define SPC_SYM LT(_SYM, KC_SPC) +#define BSP_NAV LT(_NAV, KC_BSPC) + +#define U_RDO C(S(DE_Z)) +#define U_PST S(KC_INS) +#define U_CPY C(KC_INS) +#define U_CUT S(KC_DEL) +#define U_UND C(DE_Z) + +#define LAYOUT_RK61_PATCH_10x3( \ + k0_00, k0_01, k0_02, k0_03, k0_04, k0_05, k0_06, k0_07, k0_08, k0_09, k0_10, k0_11, k0_12, k0_13, \ + k1_00, k1_11, k1_12, k1_13, \ + k2_00, k2_11, k2_12, k2_13, \ + k3_00, k3_01, k3_12, k3_13, \ + k4_00, k4_01, k4_02, k4_03, k4_04, k4_05, k4_06, k4_07, k4_08, k4_09, k4_10, k4_11, k4_12, k4_13, \ + p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ + p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ + p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ + ) RK61_LAYOUT(\ + k0_00, k0_01, k0_02, k0_03, k0_04, k0_05, k0_06, k0_07, k0_08, k0_09, k0_10, k0_11, k0_12, k0_13, \ + k1_00, p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, k1_11, k1_12, k1_13, \ + k2_00, p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, k2_11, k2_12, k2_13, \ + k3_00, k3_01, p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, k3_12, k3_13, \ + k4_00, k4_01, k4_02, k4_03, k4_04, k4_05, k4_06, k4_07, k4_08, k4_09, k4_10, k4_11, k4_12, k4_13 \ +) + +#define LAYOUT_RK61_10x3_BASE( \ + p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ + p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ + p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ +) LAYOUT_RK61_PATCH_10x3( \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + HOME_L6, XXXXXXX, XXXXXXX, KC_ENT, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, ESC_NUM, XXXXXXX, XXXXXXX, XXXXXXX, SPC_SYM, XXXXXXX, XXXXXXX, BSP_NAV, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ + p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ + p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ + p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ +) + +#define LAYOUT_RK61_10x3_TRANSPARENT( \ + p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ + p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ + p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, \ + space \ +) LAYOUT_RK61_PATCH_10x3( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, \ + _______, _______, _______, _______, \ + _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, space, _______, _______, _______, _______, _______, _______, _______, \ + p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ + p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ + p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ +) + +#define LAYOUT_RK61_10x3( \ + p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ + p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ + p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ +) LAYOUT_RK61_10x3_TRANSPARENT( \ + p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ + p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ + p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, \ + SPC_SYM \ +) + +enum layer_names { + _STD, // default layer (QWERTY) + _RMODS, // custom base layer + _SYM, // special symbols: punctuation, braces etc. + _NAV, // navigation + _NUM, // numbers + _FUN, // functional layer for right hand (F1-F12) + _LNG, // foreign languages support + _FN, // functional layer (F1-F10, backlight controls etc.) +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_STD] = BASE_KEYMAP, + [_RMODS] = LAYOUT_RK61_10x3_BASE( \ + Q_LNG, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, HOME_R5, + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH + ), + [_SYM] = LAYOUT_RK61_10x3( + DE_AT, DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LABK, DE_RABK, DE_EQL, DE_AMPR, + DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QUES, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, + DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_GRV, DE_PLUS, DE_PERC, DE_DQUO, DE_QUOT, DE_SCLN + ), + [_NAV] = LAYOUT_RK61_10x3( + KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, U_RDO, U_PST, U_CPY, U_CUT, U_UND, + KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_END, XXXXXXX, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, + KC_CAPS, KC_TAB, KC_INS, KC_ENT, CPS_WRD, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ), + [_NUM] = LAYOUT_RK61_10x3_TRANSPARENT( + U_UND, U_CUT, U_CPY, U_PST, U_RDO, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, + KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PAST, KC_P4, KC_P5, KC_P6, KC_PPLS, + XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, KC_NLCK, KC_P1, KC_P2, KC_P3, KC_PDOT, + KC_P0 + ), + [_FUN] = LAYOUT_RK61_10x3( + U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F12, + KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_F4, KC_F5, KC_F6, KC_F11, + XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F10 + ), + [_LNG] = LAYOUT_RK61_10x3( + U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, DE_CIRC, DE_LBRC, DE_LCBR, XXXXXXX, + KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, DE_EURO, DE_ODIA, DE_UDIA, DE_ADIA, DE_SS, + XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ), + [_FN] = FN_KEYMAP +}; diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/rules.mk b/keyboards/royal_kludge/rk61/keymaps/mr-july/rules.mk new file mode 100644 index 000000000000..7671bbbfd7a0 --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/rules.mk @@ -0,0 +1,4 @@ +KEY_OVERRIDE_ENABLE = yes + +SRC += features/caps_word.c +SRC += features/layer_lock.c From f033dcc33a15ea0370b0130cefeb404f1cf7ad30 Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Mon, 23 May 2022 17:16:13 +0200 Subject: [PATCH 19/34] rename german layout specific definitions --- .../rk61/keymaps/mr-july/keymap.c | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c index 1ce80beb3fc2..95a47e713a3e 100644 --- a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c @@ -93,7 +93,7 @@ bool caps_word_press_user(uint16_t keycode) { } #define CPS_WRD LSFT(KC_RSFT) -#define Q_LNG LT(_LNG, KC_Q) +#define DE_Q_LN LT(_DE_LNG, KC_Q) // Left-hand home row mods #define HOME_L6 LT(_FUN, KC_TAB) @@ -106,10 +106,10 @@ bool caps_word_press_user(uint16_t keycode) { #define HOME_R2 RSFT_T(KC_J) #define HOME_R3 RCTL_T(KC_K) #define HOME_R4 LALT_T(KC_L) -#define HOME_R5 RGUI_T(DE_QUES) +#define DE_H_R5 RGUI_T(DE_QUES) #define ESC_NUM LT(_NUM, KC_ESC) -#define SPC_SYM LT(_SYM, KC_SPC) +#define DE__SYM LT(_DE_SYM, KC_SPC) #define BSP_NAV LT(_NAV, KC_BSPC) #define U_RDO C(S(DE_Z)) @@ -144,7 +144,7 @@ bool caps_word_press_user(uint16_t keycode) { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ HOME_L6, XXXXXXX, XXXXXXX, KC_ENT, \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ - XXXXXXX, XXXXXXX, ESC_NUM, XXXXXXX, XXXXXXX, XXXXXXX, SPC_SYM, XXXXXXX, XXXXXXX, BSP_NAV, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ + XXXXXXX, XXXXXXX, ESC_NUM, XXXXXXX, XXXXXXX, XXXXXXX, DE__SYM, XXXXXXX, XXXXXXX, BSP_NAV, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ @@ -174,28 +174,28 @@ bool caps_word_press_user(uint16_t keycode) { p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, \ - SPC_SYM \ + _______ \ ) enum layer_names { _STD, // default layer (QWERTY) _RMODS, // custom base layer - _SYM, // special symbols: punctuation, braces etc. + _DE_SYM,// special symbols: punctuation, braces etc. _NAV, // navigation _NUM, // numbers _FUN, // functional layer for right hand (F1-F12) - _LNG, // foreign languages support + _DE_LNG,// foreign languages support _FN, // functional layer (F1-F10, backlight controls etc.) }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_STD] = BASE_KEYMAP, [_RMODS] = LAYOUT_RK61_10x3_BASE( \ - Q_LNG, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, - HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, HOME_R5, + DE_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, DE_H_R5, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH ), - [_SYM] = LAYOUT_RK61_10x3( + [_DE_SYM] = LAYOUT_RK61_10x3( DE_AT, DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LABK, DE_RABK, DE_EQL, DE_AMPR, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QUES, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_GRV, DE_PLUS, DE_PERC, DE_DQUO, DE_QUOT, DE_SCLN @@ -216,7 +216,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_F4, KC_F5, KC_F6, KC_F11, XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F10 ), - [_LNG] = LAYOUT_RK61_10x3( + [_DE_LNG] = LAYOUT_RK61_10x3( U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, DE_CIRC, DE_LBRC, DE_LCBR, XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, DE_EURO, DE_ODIA, DE_UDIA, DE_ADIA, DE_SS, XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX From 3ceab340fb65141cba379b772104637505ef0639 Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Tue, 24 May 2022 14:32:39 +0200 Subject: [PATCH 20/34] add initial support for US international software layout --- .../rk61/keymaps/mr-july/keymap.c | 70 +++++++++++++++++-- 1 file changed, 64 insertions(+), 6 deletions(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c index 95a47e713a3e..9045bdd48c8d 100644 --- a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c @@ -48,6 +48,16 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) { return false; // Return false to ignore further processing of key } break; + case RGUI_T(KC_QUES): + if (record->tap.count && record->event.pressed) { + if (get_mods() & MOD_MASK_SHIFT) { + tap_code16(KC_EXLM); // Send KC_EXLM on shift tap + } else { + tap_code16(KC_QUES); // Send KC_QUES on tap + } + return false; // Return false to ignore further processing of key + } + break; } return true; @@ -58,11 +68,17 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) { const key_override_t lbrc_key_override = ko_make_basic(MOD_MASK_SHIFT, DE_LBRC, DE_RBRC); // shift + '{' = '}' const key_override_t lcbr_key_override = ko_make_basic(MOD_MASK_SHIFT, DE_LCBR, DE_RCBR); +// shift + ',' = ';' +//const key_override_t comm_key_override = ko_make_basic(MOD_MASK_SHIFT, KC_COMM, KC_SCLN); +// shift + '.' = ':' +//const key_override_t dot_key_override = ko_make_basic(MOD_MASK_SHIFT, KC_DOT, KC_COLN); // This globally defines all key overrides to be used const key_override_t **key_overrides = (const key_override_t *[]){ &lbrc_key_override, &lcbr_key_override, + //&comm_key_override, + //&dot_key_override, NULL // Null terminate the array of overrides! }; @@ -94,6 +110,13 @@ bool caps_word_press_user(uint16_t keycode) { #define CPS_WRD LSFT(KC_RSFT) #define DE_Q_LN LT(_DE_LNG, KC_Q) +#define EN_Q_LN LT(_EN_LNG, KC_Q) + +#define EN_EURO RALT(KC_5) +#define EN_ODIA RALT(KC_P) +#define EN_UDIA RALT(KC_Y) +#define EN_ADIA RALT(KC_Q) +#define EN_SS RALT(KC_S) // Left-hand home row mods #define HOME_L6 LT(_FUN, KC_TAB) @@ -107,9 +130,11 @@ bool caps_word_press_user(uint16_t keycode) { #define HOME_R3 RCTL_T(KC_K) #define HOME_R4 LALT_T(KC_L) #define DE_H_R5 RGUI_T(DE_QUES) +#define EN_H_R5 RGUI_T(KC_QUES) #define ESC_NUM LT(_NUM, KC_ESC) #define DE__SYM LT(_DE_SYM, KC_SPC) +#define EN__SYM LT(_EN_SYM, KC_SPC) #define BSP_NAV LT(_NAV, KC_BSPC) #define U_RDO C(S(DE_Z)) @@ -135,7 +160,7 @@ bool caps_word_press_user(uint16_t keycode) { k4_00, k4_01, k4_02, k4_03, k4_04, k4_05, k4_06, k4_07, k4_08, k4_09, k4_10, k4_11, k4_12, k4_13 \ ) -#define LAYOUT_RK61_10x3_BASE( \ +#define LAYOUT_RK61_10x3_DE_BASE( \ p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ @@ -150,6 +175,21 @@ bool caps_word_press_user(uint16_t keycode) { p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ ) +#define LAYOUT_RK61_10x3_EN_BASE( \ + p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ + p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ + p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ +) LAYOUT_RK61_PATCH_10x3( \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + HOME_L6, XXXXXXX, XXXXXXX, KC_ENT, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, ESC_NUM, XXXXXXX, XXXXXXX, XXXXXXX, EN__SYM, XXXXXXX, XXXXXXX, BSP_NAV, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ + p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ + p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ + p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ +) + #define LAYOUT_RK61_10x3_TRANSPARENT( \ p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ @@ -179,18 +219,21 @@ bool caps_word_press_user(uint16_t keycode) { enum layer_names { _STD, // default layer (QWERTY) - _RMODS, // custom base layer - _DE_SYM,// special symbols: punctuation, braces etc. + _RMODS, // custom base layer (DE_) + _EN_BAS,// custom base layer (EN_) + _DE_SYM,// special symbols: punctuation, braces etc. (DE_) + _EN_SYM,// special symbols: punctuation, braces etc. (EN_) _NAV, // navigation _NUM, // numbers _FUN, // functional layer for right hand (F1-F12) - _DE_LNG,// foreign languages support + _DE_LNG,// foreign languages support (DE_) + _EN_LNG,// foreign languages support (EN_) _FN, // functional layer (F1-F10, backlight controls etc.) }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_STD] = BASE_KEYMAP, - [_RMODS] = LAYOUT_RK61_10x3_BASE( \ + [_RMODS] = LAYOUT_RK61_10x3_DE_BASE( \ DE_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, DE_H_R5, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH @@ -200,6 +243,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QUES, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_GRV, DE_PLUS, DE_PERC, DE_DQUO, DE_QUOT, DE_SCLN ), + [_EN_BAS] = LAYOUT_RK61_10x3_EN_BASE( \ + EN_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, EN_H_R5, + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_MINS + ), + [_EN_SYM] = LAYOUT_RK61_10x3( + KC_AT, KC_UNDS, KC_LBRC, KC_RBRC, KC_CIRC, KC_EXLM, KC_LABK, KC_RABK, KC_EQL, KC_AMPR, + KC_BSLS, KC_SLSH, KC_LCBR, KC_RCBR, KC_ASTR, KC_QUES, KC_LPRN, KC_RPRN, KC_MINS, KC_COLN, + KC_HASH, KC_DLR, KC_PIPE, KC_TILD, KC_GRV, KC_PLUS, KC_PERC, KC_DQUO, KC_QUOT, KC_SCLN + ), [_NAV] = LAYOUT_RK61_10x3( KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, U_RDO, U_PST, U_CPY, U_CUT, U_UND, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_END, XXXXXXX, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, @@ -214,12 +267,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FUN] = LAYOUT_RK61_10x3( U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F12, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_F4, KC_F5, KC_F6, KC_F11, - XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F10 + TO(_RMODS), TO(_EN_BAS),XXXXXXX, KC_ENT, LLOCK, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F10 ), [_DE_LNG] = LAYOUT_RK61_10x3( U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, DE_CIRC, DE_LBRC, DE_LCBR, XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, DE_EURO, DE_ODIA, DE_UDIA, DE_ADIA, DE_SS, XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX ), + [_EN_LNG] = LAYOUT_RK61_10x3( + U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, DE_CIRC, DE_LBRC, DE_LCBR, XXXXXXX, + KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, EN_EURO, EN_ODIA, EN_UDIA, EN_ADIA, EN_SS, + XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ), [_FN] = FN_KEYMAP }; From b40373d4580439c5ddedb30bcd271a78f61cf7d1 Mon Sep 17 00:00:00 2001 From: "mr. JULY" Date: Tue, 24 May 2022 22:50:41 +0200 Subject: [PATCH 21/34] improve formatting --- .../rk61/keymaps/mr-july/keymap.c | 170 +++++++++--------- 1 file changed, 85 insertions(+), 85 deletions(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c index 9045bdd48c8d..e04fb6a6f6d8 100644 --- a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c @@ -38,26 +38,26 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) { if (!process_layer_lock(keycode, record, LLOCK)) { return false; } switch (keycode) { - case RGUI_T(DE_QUES): - if (record->tap.count && record->event.pressed) { - if (get_mods() & MOD_MASK_SHIFT) { - tap_code16(DE_EXLM); // Send DE_EXLM on shift tap - } else { - tap_code16(DE_QUES); // Send DE_QUES on tap - } - return false; // Return false to ignore further processing of key - } - break; - case RGUI_T(KC_QUES): - if (record->tap.count && record->event.pressed) { - if (get_mods() & MOD_MASK_SHIFT) { - tap_code16(KC_EXLM); // Send KC_EXLM on shift tap - } else { - tap_code16(KC_QUES); // Send KC_QUES on tap - } - return false; // Return false to ignore further processing of key - } - break; + case RGUI_T(DE_QUES): + if (record->tap.count && record->event.pressed) { + if (get_mods() & MOD_MASK_SHIFT) { + tap_code16(DE_EXLM); // Send DE_EXLM on shift tap + } else { + tap_code16(DE_QUES); // Send DE_QUES on tap + } + return false; // Return false to ignore further processing of key + } + break; + case RGUI_T(KC_QUES): + if (record->tap.count && record->event.pressed) { + if (get_mods() & MOD_MASK_SHIFT) { + tap_code16(KC_EXLM); // Send KC_EXLM on shift tap + } else { + tap_code16(KC_QUES); // Send KC_QUES on tap + } + return false; // Return false to ignore further processing of key + } + break; } return true; @@ -75,11 +75,11 @@ const key_override_t lcbr_key_override = ko_make_basic(MOD_MASK_SHIFT, DE_LCBR, // This globally defines all key overrides to be used const key_override_t **key_overrides = (const key_override_t *[]){ - &lbrc_key_override, - &lcbr_key_override, - //&comm_key_override, - //&dot_key_override, - NULL // Null terminate the array of overrides! + &lbrc_key_override, + &lcbr_key_override, + //&comm_key_override, + //&dot_key_override, + NULL // Null terminate the array of overrides! }; // foreign languages support for CAPS_WORD @@ -95,7 +95,7 @@ bool caps_word_press_user(uint16_t keycode) { add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to the next key. return true; - // Keycodes that continue Caps Word, without shifting. + // Keycodes that continue Caps Word, without shifting. case KC_1 ... KC_0: case KC_BSPC: case KC_DEL: @@ -218,66 +218,66 @@ bool caps_word_press_user(uint16_t keycode) { ) enum layer_names { - _STD, // default layer (QWERTY) - _RMODS, // custom base layer (DE_) - _EN_BAS,// custom base layer (EN_) - _DE_SYM,// special symbols: punctuation, braces etc. (DE_) - _EN_SYM,// special symbols: punctuation, braces etc. (EN_) - _NAV, // navigation - _NUM, // numbers - _FUN, // functional layer for right hand (F1-F12) - _DE_LNG,// foreign languages support (DE_) - _EN_LNG,// foreign languages support (EN_) - _FN, // functional layer (F1-F10, backlight controls etc.) + _STD, // default layer (QWERTY) + _RMODS, // custom base layer (DE_) + _EN_BAS,// custom base layer (EN_) + _DE_SYM,// special symbols: punctuation, braces etc. (DE_) + _EN_SYM,// special symbols: punctuation, braces etc. (EN_) + _NAV, // navigation + _NUM, // numbers + _FUN, // functional layer for right hand (F1-F12) + _DE_LNG,// foreign languages support (DE_) + _EN_LNG,// foreign languages support (EN_) + _FN, // functional layer (F1-F10, backlight controls etc.) }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_STD] = BASE_KEYMAP, - [_RMODS] = LAYOUT_RK61_10x3_DE_BASE( \ - DE_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, - HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, DE_H_R5, - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH - ), - [_DE_SYM] = LAYOUT_RK61_10x3( - DE_AT, DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LABK, DE_RABK, DE_EQL, DE_AMPR, - DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QUES, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, - DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_GRV, DE_PLUS, DE_PERC, DE_DQUO, DE_QUOT, DE_SCLN - ), - [_EN_BAS] = LAYOUT_RK61_10x3_EN_BASE( \ - EN_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, - HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, EN_H_R5, - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_MINS - ), - [_EN_SYM] = LAYOUT_RK61_10x3( - KC_AT, KC_UNDS, KC_LBRC, KC_RBRC, KC_CIRC, KC_EXLM, KC_LABK, KC_RABK, KC_EQL, KC_AMPR, - KC_BSLS, KC_SLSH, KC_LCBR, KC_RCBR, KC_ASTR, KC_QUES, KC_LPRN, KC_RPRN, KC_MINS, KC_COLN, - KC_HASH, KC_DLR, KC_PIPE, KC_TILD, KC_GRV, KC_PLUS, KC_PERC, KC_DQUO, KC_QUOT, KC_SCLN - ), - [_NAV] = LAYOUT_RK61_10x3( - KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, U_RDO, U_PST, U_CPY, U_CUT, U_UND, - KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_END, XXXXXXX, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, - KC_CAPS, KC_TAB, KC_INS, KC_ENT, CPS_WRD, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX - ), - [_NUM] = LAYOUT_RK61_10x3_TRANSPARENT( - U_UND, U_CUT, U_CPY, U_PST, U_RDO, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, - KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PAST, KC_P4, KC_P5, KC_P6, KC_PPLS, - XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, KC_NLCK, KC_P1, KC_P2, KC_P3, KC_PDOT, - KC_P0 - ), - [_FUN] = LAYOUT_RK61_10x3( - U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F12, - KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_F4, KC_F5, KC_F6, KC_F11, - TO(_RMODS), TO(_EN_BAS),XXXXXXX, KC_ENT, LLOCK, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F10 - ), - [_DE_LNG] = LAYOUT_RK61_10x3( - U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, DE_CIRC, DE_LBRC, DE_LCBR, XXXXXXX, - KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, DE_EURO, DE_ODIA, DE_UDIA, DE_ADIA, DE_SS, - XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX - ), - [_EN_LNG] = LAYOUT_RK61_10x3( - U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, DE_CIRC, DE_LBRC, DE_LCBR, XXXXXXX, - KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, EN_EURO, EN_ODIA, EN_UDIA, EN_ADIA, EN_SS, - XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX - ), - [_FN] = FN_KEYMAP + [_STD] = BASE_KEYMAP, + [_RMODS] = LAYOUT_RK61_10x3_DE_BASE( \ + DE_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, DE_H_R5, + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH + ), + [_DE_SYM] = LAYOUT_RK61_10x3( + DE_AT, DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LABK, DE_RABK, DE_EQL, DE_AMPR, + DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QUES, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, + DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_GRV, DE_PLUS, DE_PERC, DE_DQUO, DE_QUOT, DE_SCLN + ), + [_EN_BAS] = LAYOUT_RK61_10x3_EN_BASE( \ + EN_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, EN_H_R5, + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_MINS + ), + [_EN_SYM] = LAYOUT_RK61_10x3( + KC_AT, KC_UNDS, KC_LBRC, KC_RBRC, KC_CIRC, KC_EXLM, KC_LABK, KC_RABK, KC_EQL, KC_AMPR, + KC_BSLS, KC_SLSH, KC_LCBR, KC_RCBR, KC_ASTR, KC_QUES, KC_LPRN, KC_RPRN, KC_MINS, KC_COLN, + KC_HASH, KC_DLR, KC_PIPE, KC_TILD, KC_GRV, KC_PLUS, KC_PERC, KC_DQUO, KC_QUOT, KC_SCLN + ), + [_NAV] = LAYOUT_RK61_10x3( + KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, U_RDO, U_PST, U_CPY, U_CUT, U_UND, + KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_END, XXXXXXX, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, + KC_CAPS, KC_TAB, KC_INS, KC_ENT, CPS_WRD, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ), + [_NUM] = LAYOUT_RK61_10x3_TRANSPARENT( + U_UND, U_CUT, U_CPY, U_PST, U_RDO, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, + KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PAST, KC_P4, KC_P5, KC_P6, KC_PPLS, + XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, KC_NLCK, KC_P1, KC_P2, KC_P3, KC_PDOT, + KC_P0 + ), + [_FUN] = LAYOUT_RK61_10x3( + U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F12, + KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_F4, KC_F5, KC_F6, KC_F11, + TO(_RMODS), TO(_EN_BAS),XXXXXXX, KC_ENT, LLOCK, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F10 + ), + [_DE_LNG] = LAYOUT_RK61_10x3( + U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, DE_CIRC, DE_LBRC, DE_LCBR, XXXXXXX, + KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, DE_EURO, DE_ODIA, DE_UDIA, DE_ADIA, DE_SS, + XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ), + [_EN_LNG] = LAYOUT_RK61_10x3( + U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, DE_CIRC, DE_LBRC, DE_LCBR, XXXXXXX, + KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, EN_EURO, EN_ODIA, EN_UDIA, EN_ADIA, EN_SS, + XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ), + [_FN] = FN_KEYMAP }; From 565c696ffc8cbfeaff418ffcf17114ad42c3345b Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Wed, 25 May 2022 09:19:22 +0200 Subject: [PATCH 22/34] generalie handling of '?'/'!' on home row --- .../rk61/keymaps/mr-july/keymap.c | 51 +++++++------------ .../rk61/keymaps/mr-july/keymap.h | 24 +++++++++ 2 files changed, 41 insertions(+), 34 deletions(-) create mode 100644 keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.h diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c index e04fb6a6f6d8..94969ec40863 100644 --- a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c @@ -28,9 +28,9 @@ along with this program. If not, see . // see https://getreuer.info/posts/keyboards/layer-lock/ #include "features/layer_lock.h" -enum custom_keycodes { - LLOCK = SAFE_RANGE, -}; +bool is_german() { + return IS_LAYER_ON(_RMODS); +} bool process_record_user(uint16_t keycode, keyrecord_t* record) { if (!process_caps_word(keycode, record)) { return false; } @@ -38,22 +38,20 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) { if (!process_layer_lock(keycode, record, LLOCK)) { return false; } switch (keycode) { - case RGUI_T(DE_QUES): + case RGUI_T(CU_QUES): if (record->tap.count && record->event.pressed) { - if (get_mods() & MOD_MASK_SHIFT) { - tap_code16(DE_EXLM); // Send DE_EXLM on shift tap - } else { - tap_code16(DE_QUES); // Send DE_QUES on tap + uint16_t exlm = KC_EXLM; + uint16_t ques = KC_QUES; + + if (is_german()) { + exlm = DE_EXLM; + ques = DE_QUES; } - return false; // Return false to ignore further processing of key - } - break; - case RGUI_T(KC_QUES): - if (record->tap.count && record->event.pressed) { + if (get_mods() & MOD_MASK_SHIFT) { - tap_code16(KC_EXLM); // Send KC_EXLM on shift tap + tap_code16(exlm); // Send '!' on shift tap } else { - tap_code16(KC_QUES); // Send KC_QUES on tap + tap_code16(ques); // Send '?' on tap } return false; // Return false to ignore further processing of key } @@ -109,7 +107,7 @@ bool caps_word_press_user(uint16_t keycode) { } #define CPS_WRD LSFT(KC_RSFT) -#define DE_Q_LN LT(_DE_LNG, KC_Q) +#define DE_Q_LN LT(_DE_LNG, DE_Q) #define EN_Q_LN LT(_EN_LNG, KC_Q) #define EN_EURO RALT(KC_5) @@ -129,8 +127,7 @@ bool caps_word_press_user(uint16_t keycode) { #define HOME_R2 RSFT_T(KC_J) #define HOME_R3 RCTL_T(KC_K) #define HOME_R4 LALT_T(KC_L) -#define DE_H_R5 RGUI_T(DE_QUES) -#define EN_H_R5 RGUI_T(KC_QUES) +#define HOME_R5 RGUI_T(CU_QUES) #define ESC_NUM LT(_NUM, KC_ESC) #define DE__SYM LT(_DE_SYM, KC_SPC) @@ -217,25 +214,11 @@ bool caps_word_press_user(uint16_t keycode) { _______ \ ) -enum layer_names { - _STD, // default layer (QWERTY) - _RMODS, // custom base layer (DE_) - _EN_BAS,// custom base layer (EN_) - _DE_SYM,// special symbols: punctuation, braces etc. (DE_) - _EN_SYM,// special symbols: punctuation, braces etc. (EN_) - _NAV, // navigation - _NUM, // numbers - _FUN, // functional layer for right hand (F1-F12) - _DE_LNG,// foreign languages support (DE_) - _EN_LNG,// foreign languages support (EN_) - _FN, // functional layer (F1-F10, backlight controls etc.) -}; - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_STD] = BASE_KEYMAP, [_RMODS] = LAYOUT_RK61_10x3_DE_BASE( \ DE_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, - HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, DE_H_R5, + HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, HOME_R5, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH ), [_DE_SYM] = LAYOUT_RK61_10x3( @@ -245,7 +228,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_EN_BAS] = LAYOUT_RK61_10x3_EN_BASE( \ EN_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, - HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, EN_H_R5, + HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, HOME_R5, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_MINS ), [_EN_SYM] = LAYOUT_RK61_10x3( diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.h b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.h new file mode 100644 index 000000000000..dbb7418e0804 --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.h @@ -0,0 +1,24 @@ +#pragma once + +bool is_german(void); + +enum custom_keycodes { + LLOCK = SAFE_RANGE, + CU_QUES, + CU_EXLM, +}; + +enum layer_names { + _STD, // default layer (QWERTY) + _RMODS, // custom base layer (DE_) + _EN_BAS,// custom base layer (EN_) + _DE_SYM,// special symbols: punctuation, braces etc. (DE_) + _EN_SYM,// special symbols: punctuation, braces etc. (EN_) + _NAV, // navigation + _NUM, // numbers + _FUN, // functional layer for right hand (F1-F12) + _DE_LNG,// foreign languages support (DE_) + _EN_LNG,// foreign languages support (EN_) + _FN, // functional layer (F1-F10, backlight controls etc.) +}; + From 29ec65be974a25c613a4f2a7a7ee39cef6174943 Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Wed, 25 May 2022 11:47:55 +0200 Subject: [PATCH 23/34] change layout definition macro name fix `RMODS_KEYMAP_` definition ('}' was used instead of ')') --- .../rk61/keymaps/default/layout.h | 10 ++--- .../rk61/keymaps/mr-july/keymap.c | 38 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/default/layout.h b/keyboards/royal_kludge/rk61/keymaps/default/layout.h index 4be4db465181..17ce86d037e9 100644 --- a/keyboards/royal_kludge/rk61/keymaps/default/layout.h +++ b/keyboards/royal_kludge/rk61/keymaps/default/layout.h @@ -20,7 +20,7 @@ along with this program. If not, see . /* Row: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 */ -#define RK61_LAYOUT( \ +#define LAYOUT( \ k0_00, k0_01, k0_02, k0_03, k0_04, k0_05, k0_06, k0_07, k0_08, k0_09, k0_10, k0_11, k0_12, k0_13, \ k1_00, k1_01, k1_02, k1_03, k1_04, k1_05, k1_06, k1_07, k1_08, k1_09, k1_10, k1_11, k1_12, k1_13, \ k2_00, k2_01, k2_02, k2_03, k2_04, k2_05, k2_06, k2_07, k2_08, k2_09, k2_10, k2_11, k2_12, k2_13, \ @@ -34,7 +34,7 @@ Row: 0 1 2 3 4 5 { k4_00, k4_01, k4_02, k4_03, k4_04, k4_05, k4_06, k4_07, k4_08, k4_09, k4_10, k4_11, k4_12, k4_13, } \ } // default layer -#define BASE_KEYMAP_(caps, nuhs, nubs) RK61_LAYOUT( \ +#define BASE_KEYMAP_(caps, nuhs, nubs) LAYOUT( \ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ caps, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, nuhs, KC_ENT, \ @@ -44,18 +44,18 @@ Row: 0 1 2 3 4 5 #define BASE_KEYMAP BASE_KEYMAP_(KC_CAPS, KC_NUHS, KC_NUBS) // snap right hand modifiers: Alt, context menu, Ctrl instead of arrows -#define RMODS_KEYMAP_(ralt) RK61_LAYOUT( \ +#define RMODS_KEYMAP_(ralt) LAYOUT( \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_SLSH, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, ralt, KC_APP, KC_RCTL, _______, _______ \ -} +) #define RMODS_KEYMAP RMODS_KEYMAP_(KC_RALT) // functional layer (F1-F10, backlight controls etc.) -#define FN_KEYMAP RK61_LAYOUT( \ +#define FN_KEYMAP LAYOUT( \ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ _______, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_PSCR, KC_SLCK, KC_PAUS, _______, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, \ RESET, KC_VOLU, KC_BRIU, _______, _______, _______, KC_INS, KC_HOME, KC_PGUP, _______, RGB_SPD, RGB_SPI, RGB_MOD, TG(_RMODS), \ diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c index 94969ec40863..d27ad59ea631 100644 --- a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c @@ -140,7 +140,7 @@ bool caps_word_press_user(uint16_t keycode) { #define U_CUT S(KC_DEL) #define U_UND C(DE_Z) -#define LAYOUT_RK61_PATCH_10x3( \ +#define LAYOUT_PATCH_10x3( \ k0_00, k0_01, k0_02, k0_03, k0_04, k0_05, k0_06, k0_07, k0_08, k0_09, k0_10, k0_11, k0_12, k0_13, \ k1_00, k1_11, k1_12, k1_13, \ k2_00, k2_11, k2_12, k2_13, \ @@ -149,7 +149,7 @@ bool caps_word_press_user(uint16_t keycode) { p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ - ) RK61_LAYOUT(\ + ) LAYOUT(\ k0_00, k0_01, k0_02, k0_03, k0_04, k0_05, k0_06, k0_07, k0_08, k0_09, k0_10, k0_11, k0_12, k0_13, \ k1_00, p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, k1_11, k1_12, k1_13, \ k2_00, p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, k2_11, k2_12, k2_13, \ @@ -157,11 +157,11 @@ bool caps_word_press_user(uint16_t keycode) { k4_00, k4_01, k4_02, k4_03, k4_04, k4_05, k4_06, k4_07, k4_08, k4_09, k4_10, k4_11, k4_12, k4_13 \ ) -#define LAYOUT_RK61_10x3_DE_BASE( \ +#define LAYOUT_10x3_DE_BASE( \ p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ -) LAYOUT_RK61_PATCH_10x3( \ +) LAYOUT_PATCH_10x3( \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ HOME_L6, XXXXXXX, XXXXXXX, KC_ENT, \ @@ -172,11 +172,11 @@ bool caps_word_press_user(uint16_t keycode) { p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ ) -#define LAYOUT_RK61_10x3_EN_BASE( \ +#define LAYOUT_10x3_EN_BASE( \ p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ -) LAYOUT_RK61_PATCH_10x3( \ +) LAYOUT_PATCH_10x3( \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ HOME_L6, XXXXXXX, XXXXXXX, KC_ENT, \ @@ -187,12 +187,12 @@ bool caps_word_press_user(uint16_t keycode) { p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ ) -#define LAYOUT_RK61_10x3_TRANSPARENT( \ +#define LAYOUT_10x3_TRANSPARENT( \ p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, \ space \ -) LAYOUT_RK61_PATCH_10x3( \ +) LAYOUT_PATCH_10x3( \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, \ _______, _______, _______, _______, \ @@ -203,11 +203,11 @@ bool caps_word_press_user(uint16_t keycode) { p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ ) -#define LAYOUT_RK61_10x3( \ +#define LAYOUT_10x3( \ p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ -) LAYOUT_RK61_10x3_TRANSPARENT( \ +) LAYOUT_10x3_TRANSPARENT( \ p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, \ @@ -216,48 +216,48 @@ bool caps_word_press_user(uint16_t keycode) { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_STD] = BASE_KEYMAP, - [_RMODS] = LAYOUT_RK61_10x3_DE_BASE( \ + [_RMODS] = LAYOUT_10x3_DE_BASE( \ DE_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, HOME_R5, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH ), - [_DE_SYM] = LAYOUT_RK61_10x3( + [_DE_SYM] = LAYOUT_10x3( DE_AT, DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LABK, DE_RABK, DE_EQL, DE_AMPR, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QUES, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_GRV, DE_PLUS, DE_PERC, DE_DQUO, DE_QUOT, DE_SCLN ), - [_EN_BAS] = LAYOUT_RK61_10x3_EN_BASE( \ + [_EN_BAS] = LAYOUT_10x3_EN_BASE( \ EN_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, HOME_R5, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_MINS ), - [_EN_SYM] = LAYOUT_RK61_10x3( + [_EN_SYM] = LAYOUT_10x3( KC_AT, KC_UNDS, KC_LBRC, KC_RBRC, KC_CIRC, KC_EXLM, KC_LABK, KC_RABK, KC_EQL, KC_AMPR, KC_BSLS, KC_SLSH, KC_LCBR, KC_RCBR, KC_ASTR, KC_QUES, KC_LPRN, KC_RPRN, KC_MINS, KC_COLN, KC_HASH, KC_DLR, KC_PIPE, KC_TILD, KC_GRV, KC_PLUS, KC_PERC, KC_DQUO, KC_QUOT, KC_SCLN ), - [_NAV] = LAYOUT_RK61_10x3( + [_NAV] = LAYOUT_10x3( KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, U_RDO, U_PST, U_CPY, U_CUT, U_UND, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_END, XXXXXXX, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, KC_CAPS, KC_TAB, KC_INS, KC_ENT, CPS_WRD, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX ), - [_NUM] = LAYOUT_RK61_10x3_TRANSPARENT( + [_NUM] = LAYOUT_10x3_TRANSPARENT( U_UND, U_CUT, U_CPY, U_PST, U_RDO, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PAST, KC_P4, KC_P5, KC_P6, KC_PPLS, XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, KC_NLCK, KC_P1, KC_P2, KC_P3, KC_PDOT, KC_P0 ), - [_FUN] = LAYOUT_RK61_10x3( + [_FUN] = LAYOUT_10x3( U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F12, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_F4, KC_F5, KC_F6, KC_F11, TO(_RMODS), TO(_EN_BAS),XXXXXXX, KC_ENT, LLOCK, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F10 ), - [_DE_LNG] = LAYOUT_RK61_10x3( + [_DE_LNG] = LAYOUT_10x3( U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, DE_CIRC, DE_LBRC, DE_LCBR, XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, DE_EURO, DE_ODIA, DE_UDIA, DE_ADIA, DE_SS, XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX ), - [_EN_LNG] = LAYOUT_RK61_10x3( + [_EN_LNG] = LAYOUT_10x3( U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, DE_CIRC, DE_LBRC, DE_LCBR, XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, EN_EURO, EN_ODIA, EN_UDIA, EN_ADIA, EN_SS, XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX From e4a03286403c1cb8dd677eda32f464b915ed1788 Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Mon, 30 May 2022 09:51:30 +0200 Subject: [PATCH 24/34] use general key codes for special symbols on english language support layer --- keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c index d27ad59ea631..c412b7f440f3 100644 --- a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c @@ -258,7 +258,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX ), [_EN_LNG] = LAYOUT_10x3( - U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, DE_CIRC, DE_LBRC, DE_LCBR, XXXXXXX, + U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, KC_CIRC, KC_LBRC, KC_LCBR, XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, EN_EURO, EN_ODIA, EN_UDIA, EN_ADIA, EN_SS, XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX ), From b1275a91f56b147600657ac8dc48d42402304e1d Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Tue, 31 May 2022 12:55:36 +0200 Subject: [PATCH 25/34] =?UTF-8?q?prepare=20new=20keyboard=20layout=20"K?= =?UTF-8?q?=C3=96RKEM"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rk61/keymaps/mr-july/keymap.c | 326 ++++++++---------- .../rk61/keymaps/mr-july/keymap.h | 24 -- .../rk61/keymaps/mr-july/korkem.h | 57 +++ .../rk61/keymaps/mr-july/rules.mk | 2 + 4 files changed, 210 insertions(+), 199 deletions(-) delete mode 100644 keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.h create mode 100644 keyboards/royal_kludge/rk61/keymaps/mr-july/korkem.h diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c index c412b7f440f3..8dccfde258f8 100644 --- a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c @@ -17,96 +17,41 @@ along with this program. If not, see . #include QMK_KEYBOARD_H #include "keymap_german.h" -#include "../default/layout.h" - - -// Caps Word -// see https://getreuer.info/posts/keyboards/caps-word/ -#include "features/caps_word.h" +#include "korkem.h" // Layer Lock key // see https://getreuer.info/posts/keyboards/layer-lock/ #include "features/layer_lock.h" -bool is_german() { - return IS_LAYER_ON(_RMODS); -} - -bool process_record_user(uint16_t keycode, keyrecord_t* record) { - if (!process_caps_word(keycode, record)) { return false; } - - if (!process_layer_lock(keycode, record, LLOCK)) { return false; } - - switch (keycode) { - case RGUI_T(CU_QUES): - if (record->tap.count && record->event.pressed) { - uint16_t exlm = KC_EXLM; - uint16_t ques = KC_QUES; - - if (is_german()) { - exlm = DE_EXLM; - ques = DE_QUES; - } - - if (get_mods() & MOD_MASK_SHIFT) { - tap_code16(exlm); // Send '!' on shift tap - } else { - tap_code16(ques); // Send '?' on tap - } - return false; // Return false to ignore further processing of key - } - break; - } - - return true; -} - -// Key overrides (https://docs.qmk.fm/#/feature_key_overrides) -// shift + '[' = ']' -const key_override_t lbrc_key_override = ko_make_basic(MOD_MASK_SHIFT, DE_LBRC, DE_RBRC); -// shift + '{' = '}' -const key_override_t lcbr_key_override = ko_make_basic(MOD_MASK_SHIFT, DE_LCBR, DE_RCBR); -// shift + ',' = ';' -//const key_override_t comm_key_override = ko_make_basic(MOD_MASK_SHIFT, KC_COMM, KC_SCLN); -// shift + '.' = ':' -//const key_override_t dot_key_override = ko_make_basic(MOD_MASK_SHIFT, KC_DOT, KC_COLN); +// Caps Word +// see https://getreuer.info/posts/keyboards/caps-word/ +// remove after merge of official CAPS_WORD support +#include "features/caps_word.h" -// This globally defines all key overrides to be used -const key_override_t **key_overrides = (const key_override_t *[]){ - &lbrc_key_override, - &lcbr_key_override, - //&comm_key_override, - //&dot_key_override, - NULL // Null terminate the array of overrides! +enum custom_keycodes { + LLOCK = SAFE_RANGE, + CU_QUES, }; -// foreign languages support for CAPS_WORD -bool caps_word_press_user(uint16_t keycode) { - switch (keycode) { - // Keycodes that continue Caps Word, with shift applied. - case KC_A ... KC_Z: - case DE_ADIA: - case DE_ODIA: - case DE_UDIA: - case KC_MINS: - case DE_MINS: - add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to the next key. - return true; - - // Keycodes that continue Caps Word, without shifting. - case KC_1 ... KC_0: - case KC_BSPC: - case KC_DEL: - case KC_UNDS: - case DE_UNDS: - return true; +enum layer_names { + _STD, // default layer (QWERTY) + _DE_BAS,// custom base layer (DE_) + _EN_BAS,// custom base layer (EN_) + _DE_SYM,// special symbols: punctuation, braces etc. (DE_) + _EN_SYM,// special symbols: punctuation, braces etc. (EN_) + _NAV, // navigation + _MOU, // mouse + _NUM, // numbers + _FUN, // functional layer for right hand (F1-F12) + _DE_LNG,// foreign languages support (DE_) + _EN_LNG,// foreign languages support (EN_) + _FN, // functional layer (F1-F10, backlight controls etc.) +}; - default: - return false; // Deactivate Caps Word. - } -} +#define IS_GERMAN IS_LAYER_ON(_DE_BAS) -#define CPS_WRD LSFT(KC_RSFT) +// remove after merge of official CAPS_WORD support +#define CAPSWRD LSFT(KC_RSFT) #define DE_Q_LN LT(_DE_LNG, DE_Q) #define EN_Q_LN LT(_EN_LNG, KC_Q) @@ -133,6 +78,7 @@ bool caps_word_press_user(uint16_t keycode) { #define DE__SYM LT(_DE_SYM, KC_SPC) #define EN__SYM LT(_EN_SYM, KC_SPC) #define BSP_NAV LT(_NAV, KC_BSPC) +#define ENT_MOU LT(_MOU, KC_ENT) #define U_RDO C(S(DE_Z)) #define U_PST S(KC_INS) @@ -140,127 +86,157 @@ bool caps_word_press_user(uint16_t keycode) { #define U_CUT S(KC_DEL) #define U_UND C(DE_Z) -#define LAYOUT_PATCH_10x3( \ - k0_00, k0_01, k0_02, k0_03, k0_04, k0_05, k0_06, k0_07, k0_08, k0_09, k0_10, k0_11, k0_12, k0_13, \ - k1_00, k1_11, k1_12, k1_13, \ - k2_00, k2_11, k2_12, k2_13, \ - k3_00, k3_01, k3_12, k3_13, \ - k4_00, k4_01, k4_02, k4_03, k4_04, k4_05, k4_06, k4_07, k4_08, k4_09, k4_10, k4_11, k4_12, k4_13, \ - p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ - p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ - p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ - ) LAYOUT(\ - k0_00, k0_01, k0_02, k0_03, k0_04, k0_05, k0_06, k0_07, k0_08, k0_09, k0_10, k0_11, k0_12, k0_13, \ - k1_00, p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, k1_11, k1_12, k1_13, \ - k2_00, p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, k2_11, k2_12, k2_13, \ - k3_00, k3_01, p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, k3_12, k3_13, \ - k4_00, k4_01, k4_02, k4_03, k4_04, k4_05, k4_06, k4_07, k4_08, k4_09, k4_10, k4_11, k4_12, k4_13 \ -) - -#define LAYOUT_10x3_DE_BASE( \ - p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ - p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ - p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ -) LAYOUT_PATCH_10x3( \ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ - HOME_L6, XXXXXXX, XXXXXXX, KC_ENT, \ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ - XXXXXXX, XXXXXXX, ESC_NUM, XXXXXXX, XXXXXXX, XXXXXXX, DE__SYM, XXXXXXX, XXXXXXX, BSP_NAV, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ - p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ - p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ - p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ -) - -#define LAYOUT_10x3_EN_BASE( \ - p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ - p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ - p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ -) LAYOUT_PATCH_10x3( \ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ - HOME_L6, XXXXXXX, XXXXXXX, KC_ENT, \ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ - XXXXXXX, XXXXXXX, ESC_NUM, XXXXXXX, XXXXXXX, XXXXXXX, EN__SYM, XXXXXXX, XXXXXXX, BSP_NAV, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ - p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ - p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ - p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ -) - -#define LAYOUT_10x3_TRANSPARENT( \ - p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ - p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ - p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, \ - space \ -) LAYOUT_PATCH_10x3( \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, \ - _______, _______, _______, _______, \ - _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, space, _______, _______, _______, _______, _______, _______, _______, \ - p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ - p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ - p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ -) - -#define LAYOUT_10x3( \ - p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ - p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ - p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10 \ -) LAYOUT_10x3_TRANSPARENT( \ - p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ - p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ - p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, \ - _______ \ -) +// needed for BASE_KEYMAP functionality +#define _RMODS _DE_BAS const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_STD] = BASE_KEYMAP, - [_RMODS] = LAYOUT_10x3_DE_BASE( \ - DE_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, - HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, HOME_R5, - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH + [_DE_BAS] = LAYOUT_korkem( \ + DE_Q_LN, DE_W, DE_E, DE_R, DE_T, DE_Z, DE_U, DE_I, DE_O, DE_P, + HOME_L5, HOME_L4, HOME_L3, HOME_L2, DE_G, DE_H, HOME_R2, HOME_R3, HOME_R4, HOME_R5, + DE_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, DE_COMM, DE_DOT, DE_MINS, + HOME_L6, ESC_NUM, DE__SYM, BSP_NAV, ENT_MOU ), - [_DE_SYM] = LAYOUT_10x3( + [_DE_SYM] = LAYOUT_korkem( DE_AT, DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LABK, DE_RABK, DE_EQL, DE_AMPR, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QUES, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, - DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_GRV, DE_PLUS, DE_PERC, DE_DQUO, DE_QUOT, DE_SCLN + DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_GRV, DE_PLUS, DE_PERC, DE_DQUO, DE_QUOT, DE_SCLN, + KC_TAB, KC_ESC, XXXXXXX, KC_BSPC, KC_ENT ), - [_EN_BAS] = LAYOUT_10x3_EN_BASE( \ + [_EN_BAS] = LAYOUT_korkem( \ EN_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, HOME_R5, - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_MINS + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_MINS, + HOME_L6, ESC_NUM, EN__SYM, BSP_NAV, KC_ENT ), - [_EN_SYM] = LAYOUT_10x3( + [_EN_SYM] = LAYOUT_korkem( KC_AT, KC_UNDS, KC_LBRC, KC_RBRC, KC_CIRC, KC_EXLM, KC_LABK, KC_RABK, KC_EQL, KC_AMPR, KC_BSLS, KC_SLSH, KC_LCBR, KC_RCBR, KC_ASTR, KC_QUES, KC_LPRN, KC_RPRN, KC_MINS, KC_COLN, - KC_HASH, KC_DLR, KC_PIPE, KC_TILD, KC_GRV, KC_PLUS, KC_PERC, KC_DQUO, KC_QUOT, KC_SCLN + KC_HASH, KC_DLR, KC_PIPE, KC_TILD, KC_GRV, KC_PLUS, KC_PERC, KC_DQUO, KC_QUOT, KC_SCLN, + KC_TAB, KC_ESC, XXXXXXX, KC_BSPC, KC_ENT ), - [_NAV] = LAYOUT_10x3( + [_NAV] = LAYOUT_korkem( KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, U_RDO, U_PST, U_CPY, U_CUT, U_UND, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_END, XXXXXXX, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, - KC_CAPS, KC_TAB, KC_INS, KC_ENT, CPS_WRD, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + KC_CAPS, KC_TAB, KC_INS, KC_ENT, CAPSWRD, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_TAB, KC_ESC, KC_SPC, XXXXXXX, KC_ENT + ), + [_MOU] = LAYOUT_korkem( + KC_WH_U, KC_WH_U, KC_MS_U, KC_WH_D, KC_WH_D, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, + KC_WH_L, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_R, XXXXXXX, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, + U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_TAB, KC_ESC, KC_SPC, KC_BSPC, XXXXXXX ), - [_NUM] = LAYOUT_10x3_TRANSPARENT( + [_NUM] = LAYOUT_korkem( U_UND, U_CUT, U_CPY, U_PST, U_RDO, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PAST, KC_P4, KC_P5, KC_P6, KC_PPLS, XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, KC_NLCK, KC_P1, KC_P2, KC_P3, KC_PDOT, - KC_P0 + KC_TAB, XXXXXXX, KC_P0, KC_BSPC, KC_ENT ), - [_FUN] = LAYOUT_10x3( + [_FUN] = LAYOUT_korkem( U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F12, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_F4, KC_F5, KC_F6, KC_F11, - TO(_RMODS), TO(_EN_BAS),XXXXXXX, KC_ENT, LLOCK, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F10 + TO(_DE_BAS), TO(_EN_BAS),XXXXXXX, KC_ENT, LLOCK, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F10, + XXXXXXX, KC_ESC, KC_SPC, KC_BSPC, KC_ENT ), - [_DE_LNG] = LAYOUT_10x3( - U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, DE_CIRC, DE_LBRC, DE_LCBR, XXXXXXX, + [_DE_LNG] = LAYOUT_korkem( + XXXXXXX, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, DE_CIRC, DE_LBRC, DE_LCBR, XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, DE_EURO, DE_ODIA, DE_UDIA, DE_ADIA, DE_SS, - XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_TAB, KC_ESC, KC_SPC, KC_BSPC, KC_ENT ), - [_EN_LNG] = LAYOUT_10x3( - U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, KC_CIRC, KC_LBRC, KC_LCBR, XXXXXXX, + [_EN_LNG] = LAYOUT_korkem( + XXXXXXX, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, KC_CIRC, KC_LBRC, KC_LCBR, XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, EN_EURO, EN_ODIA, EN_UDIA, EN_ADIA, EN_SS, - XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_TAB, KC_ESC, KC_SPC, KC_BSPC, KC_ENT ), [_FN] = FN_KEYMAP }; + + +bool process_custom_mod_tap(uint16_t keycode, keyrecord_t* record) { + switch (keycode) { + case HOME_R5: + if (record->tap.count && record->event.pressed) { + bool is_german = IS_GERMAN; + uint16_t exlm = is_german ? DE_EXLM : KC_EXLM; + uint16_t ques = is_german ? DE_QUES : KC_QUES; + + if (get_mods() & MOD_MASK_SHIFT) { + tap_code16(exlm); // Send '!' on shift tap + } else { + tap_code16(ques); // Send '?' on tap + } + return false; // Return false to ignore further processing of key + } + break; + } + + return true; +} + +bool process_record_user(uint16_t keycode, keyrecord_t* record) { + return + process_caps_word(keycode, record) && + process_layer_lock(keycode, record, LLOCK) && + process_custom_mod_tap(keycode, record) && + true; +} + +// Key overrides (https://docs.qmk.fm/#/feature_key_overrides) +// shift + '[' = ']' +const key_override_t ko_de_s_lbrc = ko_make_basic(MOD_MASK_SHIFT, DE_LBRC, DE_RBRC); +// shift + '{' = '}' +const key_override_t ko_de_s_lcbr = ko_make_basic(MOD_MASK_SHIFT, DE_LCBR, DE_RCBR); +// shift + ',' = ';' on main english layer +const key_override_t ko_en_s_comm = ko_make_with_layers(MOD_MASK_SHIFT, KC_COMM, KC_SCLN, 1 << _EN_BAS); +// shift + '.' = ':' on main english layer +const key_override_t ko_en_s_dot = ko_make_with_layers(MOD_MASK_SHIFT, KC_DOT, KC_COLN, 1 << _EN_BAS); + +// This globally defines all key overrides to be used +const key_override_t **key_overrides = (const key_override_t *[]){ + &ko_de_s_lbrc, + &ko_de_s_lcbr, + &ko_en_s_comm, + &ko_en_s_dot, + NULL // Null terminate the array of overrides! +}; + +// foreign languages support for CAPS_WORD +bool caps_word_press_user(uint16_t keycode) { + switch (keycode) { + // Keycodes that continue Caps Word, with shift applied. + case KC_A ... KC_Z: + add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to the next key. + // Keycodes that continue Caps Word, without shifting. + case KC_1 ... KC_0: + case KC_BSPC: + case KC_DEL: + return true; + } + + if (IS_GERMAN) { + switch (keycode) { + case DE_ADIA: + case DE_ODIA: + case DE_UDIA: + case DE_MINS: + add_weak_mods(MOD_BIT(KC_LSFT)); + case DE_UNDS: + return true; + } + } else { + switch (keycode) { + case EN_ADIA: + case EN_ODIA: + case EN_UDIA: + case KC_MINS: + add_weak_mods(MOD_BIT(KC_LSFT)); + case KC_UNDS: + return true; + } + } + + return false; // Deactivate Caps Word. +} diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.h b/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.h deleted file mode 100644 index dbb7418e0804..000000000000 --- a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -bool is_german(void); - -enum custom_keycodes { - LLOCK = SAFE_RANGE, - CU_QUES, - CU_EXLM, -}; - -enum layer_names { - _STD, // default layer (QWERTY) - _RMODS, // custom base layer (DE_) - _EN_BAS,// custom base layer (EN_) - _DE_SYM,// special symbols: punctuation, braces etc. (DE_) - _EN_SYM,// special symbols: punctuation, braces etc. (EN_) - _NAV, // navigation - _NUM, // numbers - _FUN, // functional layer for right hand (F1-F12) - _DE_LNG,// foreign languages support (DE_) - _EN_LNG,// foreign languages support (EN_) - _FN, // functional layer (F1-F10, backlight controls etc.) -}; - diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/korkem.h b/keyboards/royal_kludge/rk61/keymaps/mr-july/korkem.h new file mode 100644 index 000000000000..0e8e4a392bdf --- /dev/null +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/korkem.h @@ -0,0 +1,57 @@ +/* +Copyright 2022 mr. JULY + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#pragma once + +#include "../default/layout.h" + + +#define LAYOUT_PATCH_korkem( \ + k0_00, k0_01, k0_02, k0_03, k0_04, k0_05, k0_06, k0_07, k0_08, k0_09, k0_10, k0_11, k0_12, k0_13, \ + k1_00, k1_01, k1_02, k1_03, k1_04, k1_05, k1_06, k1_07, k1_08, k1_09, k1_10, k1_11, k1_12, k1_13, \ + k2_00, k2_01, k2_02, k2_03, k2_04, k2_05, k2_06, k2_07, k2_08, k2_09, k2_10, k2_11, k2_12, k2_13, \ + k3_00, k3_01, k3_02, k3_03, k3_04, k3_05, k3_06, k3_07, k3_08, k3_09, k3_10, k3_11, k3_12, k3_13, \ + k4_00, k4_01, k4_02, k4_03, k4_04, k4_05, k4_06, k4_07, k4_08, k4_09, k4_10, k4_11, k4_12, k4_13, \ + p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ + p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ + p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, \ + p4_01, p4_02, p4_03, p4_04, p4_05 \ + ) LAYOUT(\ + k0_00, k0_01, k0_02, k0_03, k0_04, k0_05, k0_06, k0_07, k0_08, k0_09, k0_10, k0_11, k0_12, k0_13, \ + k1_00, p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, k1_11, k1_12, k1_13, \ + p4_01, p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, k2_11, k2_12, p4_05, \ + k3_00, k3_01, p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, k3_12, k3_13, \ + k4_00, k4_01, p4_02, k4_03, k4_04, k4_05, p4_03, k4_07, k4_08, p4_04, k4_10, k4_11, k4_12, k4_13 \ +) + +#define LAYOUT_korkem( \ + p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ + p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ + p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, \ + p4_01, p4_02, p4_03, p4_04, p4_05 \ +) LAYOUT_PATCH_korkem( \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ + p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ + p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ + p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, \ + p4_01, p4_02, p4_03, p4_04, p4_05 \ +) + diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/rules.mk b/keyboards/royal_kludge/rk61/keymaps/mr-july/rules.mk index 7671bbbfd7a0..3a125003966a 100644 --- a/keyboards/royal_kludge/rk61/keymaps/mr-july/rules.mk +++ b/keyboards/royal_kludge/rk61/keymaps/mr-july/rules.mk @@ -1,4 +1,6 @@ KEY_OVERRIDE_ENABLE = yes +#CAPS_WORD_ENABLE = yes +# remove after merge of official CAPS_WORD support SRC += features/caps_word.c SRC += features/layer_lock.c From 24c13fb23439d715ee135ef104e1bd9efcee6f65 Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Tue, 31 May 2022 12:58:12 +0200 Subject: [PATCH 26/34] =?UTF-8?q?initial=20verssion=20of=20the=20new=20key?= =?UTF-8?q?board=20layout=20"K=C3=96RKEM"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keyboards/royal_kludge/rk61/keymaps/{mr-july => korkem}/config.h | 0 .../rk61/keymaps/{mr-july => korkem}/features/caps_word.c | 0 .../rk61/keymaps/{mr-july => korkem}/features/caps_word.h | 0 .../rk61/keymaps/{mr-july => korkem}/features/layer_lock.c | 0 .../rk61/keymaps/{mr-july => korkem}/features/layer_lock.h | 0 keyboards/royal_kludge/rk61/keymaps/{mr-july => korkem}/keymap.c | 0 keyboards/royal_kludge/rk61/keymaps/{mr-july => korkem}/korkem.h | 0 keyboards/royal_kludge/rk61/keymaps/{mr-july => korkem}/rules.mk | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename keyboards/royal_kludge/rk61/keymaps/{mr-july => korkem}/config.h (100%) rename keyboards/royal_kludge/rk61/keymaps/{mr-july => korkem}/features/caps_word.c (100%) rename keyboards/royal_kludge/rk61/keymaps/{mr-july => korkem}/features/caps_word.h (100%) rename keyboards/royal_kludge/rk61/keymaps/{mr-july => korkem}/features/layer_lock.c (100%) rename keyboards/royal_kludge/rk61/keymaps/{mr-july => korkem}/features/layer_lock.h (100%) rename keyboards/royal_kludge/rk61/keymaps/{mr-july => korkem}/keymap.c (100%) rename keyboards/royal_kludge/rk61/keymaps/{mr-july => korkem}/korkem.h (100%) rename keyboards/royal_kludge/rk61/keymaps/{mr-july => korkem}/rules.mk (100%) diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/config.h b/keyboards/royal_kludge/rk61/keymaps/korkem/config.h similarity index 100% rename from keyboards/royal_kludge/rk61/keymaps/mr-july/config.h rename to keyboards/royal_kludge/rk61/keymaps/korkem/config.h diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/features/caps_word.c b/keyboards/royal_kludge/rk61/keymaps/korkem/features/caps_word.c similarity index 100% rename from keyboards/royal_kludge/rk61/keymaps/mr-july/features/caps_word.c rename to keyboards/royal_kludge/rk61/keymaps/korkem/features/caps_word.c diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/features/caps_word.h b/keyboards/royal_kludge/rk61/keymaps/korkem/features/caps_word.h similarity index 100% rename from keyboards/royal_kludge/rk61/keymaps/mr-july/features/caps_word.h rename to keyboards/royal_kludge/rk61/keymaps/korkem/features/caps_word.h diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/features/layer_lock.c b/keyboards/royal_kludge/rk61/keymaps/korkem/features/layer_lock.c similarity index 100% rename from keyboards/royal_kludge/rk61/keymaps/mr-july/features/layer_lock.c rename to keyboards/royal_kludge/rk61/keymaps/korkem/features/layer_lock.c diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/features/layer_lock.h b/keyboards/royal_kludge/rk61/keymaps/korkem/features/layer_lock.h similarity index 100% rename from keyboards/royal_kludge/rk61/keymaps/mr-july/features/layer_lock.h rename to keyboards/royal_kludge/rk61/keymaps/korkem/features/layer_lock.h diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c similarity index 100% rename from keyboards/royal_kludge/rk61/keymaps/mr-july/keymap.c rename to keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/korkem.h b/keyboards/royal_kludge/rk61/keymaps/korkem/korkem.h similarity index 100% rename from keyboards/royal_kludge/rk61/keymaps/mr-july/korkem.h rename to keyboards/royal_kludge/rk61/keymaps/korkem/korkem.h diff --git a/keyboards/royal_kludge/rk61/keymaps/mr-july/rules.mk b/keyboards/royal_kludge/rk61/keymaps/korkem/rules.mk similarity index 100% rename from keyboards/royal_kludge/rk61/keymaps/mr-july/rules.mk rename to keyboards/royal_kludge/rk61/keymaps/korkem/rules.mk From cdb76dfbfbfc96a570af9fecd6dde10089756564 Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Tue, 31 May 2022 13:25:29 +0200 Subject: [PATCH 27/34] improve keymap configuration parameters --- keyboards/royal_kludge/rk61/keymaps/korkem/config.h | 5 ++++- keyboards/royal_kludge/rk61/keymaps/korkem/rules.mk | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/korkem/config.h b/keyboards/royal_kludge/rk61/keymaps/korkem/config.h index 42d44d227e4b..0cabf116a457 100644 --- a/keyboards/royal_kludge/rk61/keymaps/korkem/config.h +++ b/keyboards/royal_kludge/rk61/keymaps/korkem/config.h @@ -19,5 +19,8 @@ along with this program. If not, see . #define KEYMAP_ISO 1 -#define IGNORE_MOD_TAP_INTERRUPT // allow fast typing on home row mods +// allow fast typing on home row mods +#define IGNORE_MOD_TAP_INTERRUPT +// enable rapid switch from tap to hold, disables double tap hold auto-repeat +#define TAPPING_FORCE_HOLD diff --git a/keyboards/royal_kludge/rk61/keymaps/korkem/rules.mk b/keyboards/royal_kludge/rk61/keymaps/korkem/rules.mk index 3a125003966a..e27f16f57dac 100644 --- a/keyboards/royal_kludge/rk61/keymaps/korkem/rules.mk +++ b/keyboards/royal_kludge/rk61/keymaps/korkem/rules.mk @@ -1,4 +1,9 @@ -KEY_OVERRIDE_ENABLE = yes +KEY_OVERRIDE_ENABLE = yes # Enable send different key codes depending on the modifiers + +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control + +COMMAND_ENABLE = no # Enable the way to change keyboard’s behavior without having to flash or unplug it #CAPS_WORD_ENABLE = yes # remove after merge of official CAPS_WORD support From 87a9149c96cb1cf7c9bd3295c54d9451e45d5c4c Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Tue, 31 May 2022 13:52:37 +0200 Subject: [PATCH 28/34] small restructuring, add some comments --- .../royal_kludge/rk61/keymaps/korkem/keymap.c | 69 +++++++++++-------- .../royal_kludge/rk61/keymaps/korkem/rules.mk | 2 +- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c index 8dccfde258f8..a5d89dce8561 100644 --- a/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c @@ -50,11 +50,10 @@ enum layer_names { #define IS_GERMAN IS_LAYER_ON(_DE_BAS) -// remove after merge of official CAPS_WORD support +// TODO: remove after merge of official CAPS_WORD support #define CAPSWRD LSFT(KC_RSFT) -#define DE_Q_LN LT(_DE_LNG, DE_Q) -#define EN_Q_LN LT(_EN_LNG, KC_Q) +// german specific symbol keys available on english international keyboard #define EN_EURO RALT(KC_5) #define EN_ODIA RALT(KC_P) #define EN_UDIA RALT(KC_Y) @@ -74,12 +73,18 @@ enum layer_names { #define HOME_R4 LALT_T(KC_L) #define HOME_R5 RGUI_T(CU_QUES) +// layer activation #define ESC_NUM LT(_NUM, KC_ESC) #define DE__SYM LT(_DE_SYM, KC_SPC) #define EN__SYM LT(_EN_SYM, KC_SPC) #define BSP_NAV LT(_NAV, KC_BSPC) #define ENT_MOU LT(_MOU, KC_ENT) +// foreign languages support activation +#define DE_Q_LN LT(_DE_LNG, DE_Q) +#define EN_Q_LN LT(_EN_LNG, KC_Q) + +// shortcuts #define U_RDO C(S(DE_Z)) #define U_PST S(KC_INS) #define U_CPY C(KC_INS) @@ -155,6 +160,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; +// Key overrides (https://docs.qmk.fm/#/feature_key_overrides) +// shift + '[' = ']' +const key_override_t ko_de_s_lbrc = ko_make_basic(MOD_MASK_SHIFT, DE_LBRC, DE_RBRC); +// shift + '{' = '}' +const key_override_t ko_de_s_lcbr = ko_make_basic(MOD_MASK_SHIFT, DE_LCBR, DE_RCBR); +// shift + ',' = ';' on main english layer +const key_override_t ko_en_s_comm = ko_make_with_layers(MOD_MASK_SHIFT, KC_COMM, KC_SCLN, 1 << _EN_BAS); +// shift + '.' = ':' on main english layer +const key_override_t ko_en_s_dot = ko_make_with_layers(MOD_MASK_SHIFT, KC_DOT, KC_COLN, 1 << _EN_BAS); + +// This globally defines all key overrides to be used +const key_override_t **key_overrides = (const key_override_t *[]){ + &ko_de_s_lbrc, + &ko_de_s_lcbr, + &ko_en_s_comm, + &ko_en_s_dot, + NULL // Null terminate the array of overrides! +}; + +// allow different keys for normal and shifted states on mod-tap modifiers bool process_custom_mod_tap(uint16_t keycode, keyrecord_t* record) { switch (keycode) { case HOME_R5: @@ -176,33 +201,6 @@ bool process_custom_mod_tap(uint16_t keycode, keyrecord_t* record) { return true; } -bool process_record_user(uint16_t keycode, keyrecord_t* record) { - return - process_caps_word(keycode, record) && - process_layer_lock(keycode, record, LLOCK) && - process_custom_mod_tap(keycode, record) && - true; -} - -// Key overrides (https://docs.qmk.fm/#/feature_key_overrides) -// shift + '[' = ']' -const key_override_t ko_de_s_lbrc = ko_make_basic(MOD_MASK_SHIFT, DE_LBRC, DE_RBRC); -// shift + '{' = '}' -const key_override_t ko_de_s_lcbr = ko_make_basic(MOD_MASK_SHIFT, DE_LCBR, DE_RCBR); -// shift + ',' = ';' on main english layer -const key_override_t ko_en_s_comm = ko_make_with_layers(MOD_MASK_SHIFT, KC_COMM, KC_SCLN, 1 << _EN_BAS); -// shift + '.' = ':' on main english layer -const key_override_t ko_en_s_dot = ko_make_with_layers(MOD_MASK_SHIFT, KC_DOT, KC_COLN, 1 << _EN_BAS); - -// This globally defines all key overrides to be used -const key_override_t **key_overrides = (const key_override_t *[]){ - &ko_de_s_lbrc, - &ko_de_s_lcbr, - &ko_en_s_comm, - &ko_en_s_dot, - NULL // Null terminate the array of overrides! -}; - // foreign languages support for CAPS_WORD bool caps_word_press_user(uint16_t keycode) { switch (keycode) { @@ -240,3 +238,14 @@ bool caps_word_press_user(uint16_t keycode) { return false; // Deactivate Caps Word. } + +// custom event processing +bool process_record_user(uint16_t keycode, keyrecord_t* record) { + return + // TODO: remove after merge of official CAPS_WORD support + process_caps_word(keycode, record) && + process_layer_lock(keycode, record, LLOCK) && + process_custom_mod_tap(keycode, record) && + true; +} + diff --git a/keyboards/royal_kludge/rk61/keymaps/korkem/rules.mk b/keyboards/royal_kludge/rk61/keymaps/korkem/rules.mk index e27f16f57dac..c9d9ba08f21e 100644 --- a/keyboards/royal_kludge/rk61/keymaps/korkem/rules.mk +++ b/keyboards/royal_kludge/rk61/keymaps/korkem/rules.mk @@ -6,6 +6,6 @@ EXTRAKEY_ENABLE = yes # Audio control and System control COMMAND_ENABLE = no # Enable the way to change keyboard’s behavior without having to flash or unplug it #CAPS_WORD_ENABLE = yes -# remove after merge of official CAPS_WORD support +# TODO: remove after merge of official CAPS_WORD support SRC += features/caps_word.c SRC += features/layer_lock.c From 3129892189c14b2aa082407fa25f50ff3579d7ca Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Tue, 31 May 2022 14:49:49 +0200 Subject: [PATCH 29/34] fix formatting --- keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c index a5d89dce8561..1c76f1458f5b 100644 --- a/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c @@ -96,7 +96,7 @@ enum layer_names { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_STD] = BASE_KEYMAP, - [_DE_BAS] = LAYOUT_korkem( \ + [_DE_BAS] = LAYOUT_korkem( DE_Q_LN, DE_W, DE_E, DE_R, DE_T, DE_Z, DE_U, DE_I, DE_O, DE_P, HOME_L5, HOME_L4, HOME_L3, HOME_L2, DE_G, DE_H, HOME_R2, HOME_R3, HOME_R4, HOME_R5, DE_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, DE_COMM, DE_DOT, DE_MINS, @@ -108,7 +108,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_GRV, DE_PLUS, DE_PERC, DE_DQUO, DE_QUOT, DE_SCLN, KC_TAB, KC_ESC, XXXXXXX, KC_BSPC, KC_ENT ), - [_EN_BAS] = LAYOUT_korkem( \ + [_EN_BAS] = LAYOUT_korkem( EN_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, HOME_R5, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_MINS, From 3593e4e2b13b3e25b66925c031f11637cf279685 Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Tue, 31 May 2022 16:57:17 +0200 Subject: [PATCH 30/34] improve bottom row alignment --- .../royal_kludge/rk61/keymaps/korkem/keymap.c | 30 +++++++++++-------- .../royal_kludge/rk61/keymaps/korkem/korkem.h | 6 ++-- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c index 1c76f1458f5b..ff4b8649e6f3 100644 --- a/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c @@ -84,6 +84,10 @@ enum layer_names { #define DE_Q_LN LT(_DE_LNG, DE_Q) #define EN_Q_LN LT(_EN_LNG, KC_Q) +// layer toggle +#define DE_BASE TO(_DE_BAS) +#define EN_BASE TO(_EN_BAS) + // shortcuts #define U_RDO C(S(DE_Z)) #define U_PST S(KC_INS) @@ -100,61 +104,61 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { DE_Q_LN, DE_W, DE_E, DE_R, DE_T, DE_Z, DE_U, DE_I, DE_O, DE_P, HOME_L5, HOME_L4, HOME_L3, HOME_L2, DE_G, DE_H, HOME_R2, HOME_R3, HOME_R4, HOME_R5, DE_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, DE_COMM, DE_DOT, DE_MINS, - HOME_L6, ESC_NUM, DE__SYM, BSP_NAV, ENT_MOU + HOME_L6, ESC_NUM, DE__SYM, BSP_NAV, ENT_MOU ), [_DE_SYM] = LAYOUT_korkem( DE_AT, DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LABK, DE_RABK, DE_EQL, DE_AMPR, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QUES, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_GRV, DE_PLUS, DE_PERC, DE_DQUO, DE_QUOT, DE_SCLN, - KC_TAB, KC_ESC, XXXXXXX, KC_BSPC, KC_ENT + KC_TAB, KC_ESC, XXXXXXX, KC_BSPC, KC_ENT ), [_EN_BAS] = LAYOUT_korkem( - EN_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + EN_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Z, KC_U, KC_I, KC_O, KC_P, HOME_L5, HOME_L4, HOME_L3, HOME_L2, KC_G, KC_H, HOME_R2, HOME_R3, HOME_R4, HOME_R5, - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_MINS, - HOME_L6, ESC_NUM, EN__SYM, BSP_NAV, KC_ENT + KC_Y, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_MINS, + HOME_L6, ESC_NUM, EN__SYM, BSP_NAV, KC_ENT ), [_EN_SYM] = LAYOUT_korkem( KC_AT, KC_UNDS, KC_LBRC, KC_RBRC, KC_CIRC, KC_EXLM, KC_LABK, KC_RABK, KC_EQL, KC_AMPR, KC_BSLS, KC_SLSH, KC_LCBR, KC_RCBR, KC_ASTR, KC_QUES, KC_LPRN, KC_RPRN, KC_MINS, KC_COLN, KC_HASH, KC_DLR, KC_PIPE, KC_TILD, KC_GRV, KC_PLUS, KC_PERC, KC_DQUO, KC_QUOT, KC_SCLN, - KC_TAB, KC_ESC, XXXXXXX, KC_BSPC, KC_ENT + KC_TAB, KC_ESC, XXXXXXX, KC_BSPC, KC_ENT ), [_NAV] = LAYOUT_korkem( KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, U_RDO, U_PST, U_CPY, U_CUT, U_UND, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_END, XXXXXXX, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, KC_CAPS, KC_TAB, KC_INS, KC_ENT, CAPSWRD, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_TAB, KC_ESC, KC_SPC, XXXXXXX, KC_ENT + KC_TAB, KC_ESC, KC_SPC, XXXXXXX, KC_ENT ), [_MOU] = LAYOUT_korkem( KC_WH_U, KC_WH_U, KC_MS_U, KC_WH_D, KC_WH_D, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, KC_WH_L, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_R, XXXXXXX, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_TAB, KC_ESC, KC_SPC, KC_BSPC, XXXXXXX + KC_TAB, KC_ESC, KC_SPC, KC_BSPC, XXXXXXX ), [_NUM] = LAYOUT_korkem( U_UND, U_CUT, U_CPY, U_PST, U_RDO, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PAST, KC_P4, KC_P5, KC_P6, KC_PPLS, XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, KC_NLCK, KC_P1, KC_P2, KC_P3, KC_PDOT, - KC_TAB, XXXXXXX, KC_P0, KC_BSPC, KC_ENT + KC_TAB, XXXXXXX, KC_P0, KC_BSPC, KC_ENT ), [_FUN] = LAYOUT_korkem( U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F12, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_F4, KC_F5, KC_F6, KC_F11, - TO(_DE_BAS), TO(_EN_BAS),XXXXXXX, KC_ENT, LLOCK, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F10, - XXXXXXX, KC_ESC, KC_SPC, KC_BSPC, KC_ENT + DE_BASE, EN_BASE, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F10, + XXXXXXX, KC_ESC, KC_SPC, KC_BSPC, KC_ENT ), [_DE_LNG] = LAYOUT_korkem( XXXXXXX, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, DE_CIRC, DE_LBRC, DE_LCBR, XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, DE_EURO, DE_ODIA, DE_UDIA, DE_ADIA, DE_SS, XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_TAB, KC_ESC, KC_SPC, KC_BSPC, KC_ENT + KC_TAB, KC_ESC, KC_SPC, KC_BSPC, KC_ENT ), [_EN_LNG] = LAYOUT_korkem( XXXXXXX, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, KC_CIRC, KC_LBRC, KC_LCBR, XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, EN_EURO, EN_ODIA, EN_UDIA, EN_ADIA, EN_SS, XXXXXXX, XXXXXXX, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_TAB, KC_ESC, KC_SPC, KC_BSPC, KC_ENT + KC_TAB, KC_ESC, KC_SPC, KC_BSPC, KC_ENT ), [_FN] = FN_KEYMAP }; diff --git a/keyboards/royal_kludge/rk61/keymaps/korkem/korkem.h b/keyboards/royal_kludge/rk61/keymaps/korkem/korkem.h index 0e8e4a392bdf..5cdd2a8df1bb 100644 --- a/keyboards/royal_kludge/rk61/keymaps/korkem/korkem.h +++ b/keyboards/royal_kludge/rk61/keymaps/korkem/korkem.h @@ -29,7 +29,7 @@ along with this program. If not, see . p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, \ - p4_01, p4_02, p4_03, p4_04, p4_05 \ + p4_01, p4_02, p4_03, p4_04, p4_05 \ ) LAYOUT(\ k0_00, k0_01, k0_02, k0_03, k0_04, k0_05, k0_06, k0_07, k0_08, k0_09, k0_10, k0_11, k0_12, k0_13, \ k1_00, p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, k1_11, k1_12, k1_13, \ @@ -42,7 +42,7 @@ along with this program. If not, see . p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, \ - p4_01, p4_02, p4_03, p4_04, p4_05 \ + p4_01, p4_02, p4_03, p4_04, p4_05 \ ) LAYOUT_PATCH_korkem( \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ @@ -52,6 +52,6 @@ along with this program. If not, see . p1_01, p1_02, p1_03, p1_04, p1_05, p1_06, p1_07, p1_08, p1_09, p1_10, \ p2_01, p2_02, p2_03, p2_04, p2_05, p2_06, p2_07, p2_08, p2_09, p2_10, \ p3_01, p3_02, p3_03, p3_04, p3_05, p3_06, p3_07, p3_08, p3_09, p3_10, \ - p4_01, p4_02, p4_03, p4_04, p4_05 \ + p4_01, p4_02, p4_03, p4_04, p4_05 \ ) From f6ce336ac4b0a316c435d6f5f9d15977e6cc3722 Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Tue, 31 May 2022 17:37:05 +0200 Subject: [PATCH 31/34] add "Print Screen", "Screen Lock" and "Pause" keys to functional layer --- keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c index ff4b8649e6f3..9ee923761d13 100644 --- a/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c @@ -143,9 +143,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, XXXXXXX, KC_P0, KC_BSPC, KC_ENT ), [_FUN] = LAYOUT_korkem( - U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F12, - KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_F4, KC_F5, KC_F6, KC_F11, - DE_BASE, EN_BASE, XXXXXXX, KC_ENT, LLOCK, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F10, + U_UND, U_CUT, U_CPY, U_PST, U_RDO, KC_PSCR, KC_F7, KC_F8, KC_F9, KC_F12, + KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_SLCK, KC_F4, KC_F5, KC_F6, KC_F11, + DE_BASE, EN_BASE, XXXXXXX, KC_ENT, LLOCK, KC_PAUS, KC_F1, KC_F2, KC_F3, KC_F10, XXXXXXX, KC_ESC, KC_SPC, KC_BSPC, KC_ENT ), [_DE_LNG] = LAYOUT_korkem( From 65b6616f422733760f5f40a02148e430ff720f3e Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Tue, 31 May 2022 17:42:28 +0200 Subject: [PATCH 32/34] add mouse buttons to mouse layer --- keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c index 9ee923761d13..24b46927c59d 100644 --- a/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c @@ -134,7 +134,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_WH_U, KC_WH_U, KC_MS_U, KC_WH_D, KC_WH_D, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, KC_WH_L, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_R, XXXXXXX, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, U_UND, U_CUT, U_CPY, U_PST, U_RDO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_TAB, KC_ESC, KC_SPC, KC_BSPC, XXXXXXX + KC_BTN2, KC_BTN3, KC_BTN1, KC_BSPC, XXXXXXX ), [_NUM] = LAYOUT_korkem( U_UND, U_CUT, U_CPY, U_PST, U_RDO, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, From 7df3f2c49297a2f584ba076ae0ed798196c61993 Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Wed, 1 Jun 2022 08:24:13 +0200 Subject: [PATCH 33/34] improve thumbs cluster on symbol layer --- keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c index 24b46927c59d..085e51935c95 100644 --- a/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c @@ -110,7 +110,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { DE_AT, DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LABK, DE_RABK, DE_EQL, DE_AMPR, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QUES, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_GRV, DE_PLUS, DE_PERC, DE_DQUO, DE_QUOT, DE_SCLN, - KC_TAB, KC_ESC, XXXXXXX, KC_BSPC, KC_ENT + KC_TAB, CAPSWRD, XXXXXXX, KC_DEL, KC_ENT ), [_EN_BAS] = LAYOUT_korkem( EN_Q_LN, KC_W, KC_E, KC_R, KC_T, KC_Z, KC_U, KC_I, KC_O, KC_P, @@ -122,7 +122,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_AT, KC_UNDS, KC_LBRC, KC_RBRC, KC_CIRC, KC_EXLM, KC_LABK, KC_RABK, KC_EQL, KC_AMPR, KC_BSLS, KC_SLSH, KC_LCBR, KC_RCBR, KC_ASTR, KC_QUES, KC_LPRN, KC_RPRN, KC_MINS, KC_COLN, KC_HASH, KC_DLR, KC_PIPE, KC_TILD, KC_GRV, KC_PLUS, KC_PERC, KC_DQUO, KC_QUOT, KC_SCLN, - KC_TAB, KC_ESC, XXXXXXX, KC_BSPC, KC_ENT + KC_TAB, CAPSWRD, XXXXXXX, KC_DEL, KC_ENT ), [_NAV] = LAYOUT_korkem( KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, U_RDO, U_PST, U_CPY, U_CUT, U_UND, From 84c12ea6a49f3195dd0f68a325fb3a9f1f9a056a Mon Sep 17 00:00:00 2001 From: Igor Lubimov Date: Wed, 1 Jun 2022 08:53:21 +0200 Subject: [PATCH 34/34] remove unused statement --- keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c | 1 - 1 file changed, 1 deletion(-) diff --git a/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c index 085e51935c95..a8f89cb77cb1 100644 --- a/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c +++ b/keyboards/royal_kludge/rk61/keymaps/korkem/keymap.c @@ -199,7 +199,6 @@ bool process_custom_mod_tap(uint16_t keycode, keyrecord_t* record) { } return false; // Return false to ignore further processing of key } - break; } return true;