From 38288cc88b0fa874920f1f106648d96f9a8af263 Mon Sep 17 00:00:00 2001 From: Andreas Tsouchlos Date: Thu, 12 Mar 2026 14:36:01 +0100 Subject: [PATCH] Modify keymap to work with german keyboard layout on OS side --- .../keymaps/default/keymap.c | 400 +++++++----------- 1 file changed, 156 insertions(+), 244 deletions(-) diff --git a/keyboards/keyboardeeroy_jenkins/keymaps/default/keymap.c b/keyboards/keyboardeeroy_jenkins/keymaps/default/keymap.c index 3e780a9..429822b 100644 --- a/keyboards/keyboardeeroy_jenkins/keymaps/default/keymap.c +++ b/keyboards/keyboardeeroy_jenkins/keymaps/default/keymap.c @@ -1,270 +1,182 @@ -#include "keymap_german.h" #include QMK_KEYBOARD_H +#include "keymap_german.h" -enum layer_names { - _BL, - _LOWER, - _RAISE, - _FUNC -}; +enum layer_names { _BL, _LOWER, _RAISE, _FUNC, _SHIFT }; +enum custom_keycodes { LOWER = SAFE_RANGE, RAISE }; -#define BL PDF(_BL) +// clang-format off const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | GUI | GUI | Alt |Lower | Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ + +// Base Layer (QWERTY logical layout, German OS) +// ,-----------------------------------------------------------------------------------. +// | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | +// |------+------+------+------+------+------+------+------+------+------+------+------| +// | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | +// |------+------+------+------+------+-------------+------+------+------+------+------| +// | Esc | A | S | D | F | G | H | J | K | L | ; | ' | +// |------+------+------+------+------+------|------+------+------+------+------+------| +// | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | +// |------+------+------+------+------+------+------+------+------+------+------+------| +// | Ctrl | GUI | GUI | Alt |Lower | Space |Raise | Left | Down | Up |Right | +// `-----------------------------------------------------------------------------------' +// [_BL] = LAYOUT( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, - KC_LCTL, KC_LGUI, KC_LGUI, KC_LALT, MO(_LOWER), KC_SPC, KC_SPC, MO(_RAISE), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + KC_ESC, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7, DE_8, DE_9, DE_0, KC_DEL, + KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, DE_Y, DE_U, DE_I, DE_O, DE_P, KC_BSPC, + KC_ESC, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, DE_SCLN, DE_QUOT, + KC_LSFT, DE_Z, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, DE_COMM, DE_DOT, DE_SLSH, KC_ENT, + KC_LCTL, KC_LGUI, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ +// Lower +// ,-----------------------------------------------------------------------------------. +// | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | +// |------+------+------+------+------+-------------+------+------+------+------+------| +// | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | +// |------+------+------+------+------+-------------+------+------+------+------+------| +// | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | +// |------+------+------+------+------+------|------+------+------+------+------+------| +// | | F7 | F8 | F9 | F10 | F11 | F12 | ~ | | | Home | End | | +// |------+------+------+------+------+------+------+------+------+------+------+------| +// | | | | | | | | Next | Vol- | Vol+ | Play | +// `-----------------------------------------------------------------------------------' +// [_LOWER] = LAYOUT( - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_HOME, KC_END, _______, - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + DE_TILD, DE_EXLM, DE_AT, DE_HASH, DE_DLR, DE_PERC, DE_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, KC_DEL, + DE_TILD, DE_EXLM, DE_AT, DE_HASH, DE_DLR, DE_PERC, DE_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DE_TILD, DE_PIPE, KC_HOME, KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | Pg Up| Pg Dn| | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ +// Raise +// ,-----------------------------------------------------------------------------------. +// | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | +// |------+------+------+------+------+------+------+------+------+------+------+------| +// | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | +// |------+------+------+------+------+-------------+------+------+------+------+------| +// | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | +// |------+------+------+------+------+------|------+------+------+------+------+------| +// | | F7 | F8 | F9 | F10 | F11 | F12 | # | / | Pg Up| Pg Dn| | +// |------+------+------+------+------+------+------+------+------+------+------+------| +// | | | | | | | | Next | Vol- | Vol+ | Play | +// `-----------------------------------------------------------------------------------' +// [_RAISE] = LAYOUT( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + DE_GRV, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7, DE_8, DE_9, DE_0, KC_DEL, + DE_GRV, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7, DE_8, DE_9, DE_0, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, DE_EQL, DE_LBRC, DE_RBRC, DE_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DE_HASH, DE_SLSH, KC_PGUP, KC_PGDN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | Y | Ü | I | Ö | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | Ä | ß | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | GUI | GUI | Alt |Lower | Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ +// Func (Lower + Raise = German characters) +// ,-----------------------------------------------------------------------------------. +// | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | +// |------+------+------+------+------+------+------+------+------+------+------+------| +// | Tab | Q | W | E | R | T | Y | Ü | I | Ö | P | Bksp | +// |------+------+------+------+------+-------------+------+------+------+------+------| +// | Esc | Ä | ß | D | F | G | H | J | K | L | ; | ' | +// |------+------+------+------+------+------|------+------+------+------+------+------| +// | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | +// |------+------+------+------+------+------+------+------+------+------+------+------| +// | Ctrl | GUI | GUI | Alt |Lower | Space |Raise | Left | Down | Up |Right | +// `-----------------------------------------------------------------------------------' +// [_FUNC] = LAYOUT( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, DE_UDIA, KC_I, DE_ODIA, KC_P, KC_BSPC, - KC_ESC, DE_ADIA, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, - KC_LCTL, KC_LGUI, KC_LGUI, KC_LALT, MO(_LOWER), KC_SPC, KC_SPC, MO(_RAISE), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + KC_ESC, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7, DE_8, DE_9, DE_0, KC_DEL, + KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, DE_Y, DE_UDIA, DE_I, DE_ODIA, DE_P, KC_BSPC, + KC_ESC, DE_ADIA, DE_SS, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, DE_SCLN, DE_QUOT, + KC_LSFT, DE_Z, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, DE_COMM, DE_DOT, DE_SLSH, KC_ENT, + KC_LCTL, KC_LGUI, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | Reset| Debug| | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | |Aud cy|Aud on|AudOff|AGnorm|AGswap|Qwerty|Qwerty|Qwerty| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff| | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -// [_ADJUST] = LAYOUT( -// KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, -// _______, QK_BOOT, DB_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, -// _______, _______, MU_NEXT, AU_ON, AU_OFF, AG_NORM, AG_SWAP, BL, BL, BL, _______, _______, -// _______, AU_PREV, AU_NEXT, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, -// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ -// ) - +// Shift (US-style symbol overrides) +// +// Shift is NOT registered at the OS level. This layer only has entries +// for keys where US shifted output differs from German shifted output. +// Everything else is transparent and gets Shift added back automatically +// in process_record_user. +// +// ,-----------------------------------------------------------------------------------. +// | | | @ | # | | | ^ | & | * | ( | ) | | +// |------+------+------+------+------+------+------+------+------+------+------+------| +// | | | | | | | | | | | | | +// |------+------+------+------+------+-------------+------+------+------+------+------| +// | | | | | | | | | | | : | " | +// |------+------+------+------+------+------|------+------+------+------+------+------| +// | | | | | | | | | < | > | ? | | +// |------+------+------+------+------+------+------+------+------+------+------+------| +// | | | | | | | | | | | | +// `-----------------------------------------------------------------------------------' +// +[_SHIFT] = LAYOUT( + _______, _______, DE_AT, DE_HASH, _______, _______, DE_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, DE_COLN, DE_DQUO, + _______, _______, _______, _______, _______, _______, _______, _______, DE_LABK, DE_RABK, DE_QUES, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) }; -// bool process_record_user(uint16_t keycode, keyrecord_t *record) { -// switch (keycode) { -// case LOWER: -// if (record->event.pressed) { -// layer_on(_LOWER); -// update_tri_layer(_LOWER, _RAISE, _ADJUST); -// } else { -// layer_off(_LOWER); -// update_tri_layer(_LOWER, _RAISE, _ADJUST); -// } -// return false; -// break; -// case RAISE: -// if (record->event.pressed) { -// layer_on(_RAISE); -// update_tri_layer(_LOWER, _RAISE, _ADJUST); -// } else { -// layer_off(_RAISE); -// update_tri_layer(_LOWER, _RAISE, _ADJUST); -// } -// return false; -// break; -// case BACKLIT: -// if (record->event.pressed) { -// register_code(KC_RSFT); -// #ifdef BACKLIGHT_ENABLE -// backlight_step(); -// #endif -// #ifdef RGBLIGHT_ENABLE -// rgblight_step(); -// #endif -// #ifdef __AVR__ -// gpio_write_pin_low(E6); -// #endif -// } else { -// unregister_code(KC_RSFT); -// #ifdef __AVR__ -// gpio_write_pin_high(E6); -// #endif -// } -// return false; -// break; -// } -// return true; -// }; -// -// bool muse_mode = false; -// uint8_t last_muse_note = 0; -// uint16_t muse_counter = 0; -// uint8_t muse_offset = 70; -// uint16_t muse_tempo = 50; -// -// bool encoder_update_user(uint8_t index, bool clockwise) { -// if (muse_mode) { -// if (IS_LAYER_ON(_RAISE)) { -// if (clockwise) { -// muse_offset++; -// } else { -// muse_offset--; -// } -// } else { -// if (clockwise) { -// muse_tempo+=1; -// } else { -// muse_tempo-=1; -// } -// } -// } else { -// if (clockwise) { -// register_code(KC_PGDN); -// unregister_code(KC_PGDN); -// } else { -// register_code(KC_PGUP); -// unregister_code(KC_PGUP); -// } -// } -// return true; -// } -// -// bool dip_switch_update_user(uint8_t index, bool active) { -// switch (index) { -// case 0: -// if (active) { -// layer_on(_ADJUST); -// } else { -// layer_off(_ADJUST); -// } -// break; -// case 1: -// if (active) { -// muse_mode = true; -// } else { -// muse_mode = false; -// } -// } -// return true; -// } -// -// -// void matrix_scan_user(void) { -// #ifdef AUDIO_ENABLE -// if (muse_mode) { -// if (muse_counter == 0) { -// uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()]; -// if (muse_note != last_muse_note) { -// stop_note(compute_freq_for_midi_note(last_muse_note)); -// play_note(compute_freq_for_midi_note(muse_note), 0xF); -// last_muse_note = muse_note; -// } -// } -// muse_counter = (muse_counter + 1) % muse_tempo; -// } else { -// if (muse_counter) { -// stop_all_notes(); -// muse_counter = 0; -// } -// } -// #endif -// } -// -// bool music_mask_user(uint16_t keycode) { -// switch (keycode) { -// case RAISE: -// case LOWER: -// return false; -// default: -// return true; -// } -// } +// clang-format on +// Check whether a key at a given row/col has an explicit (non-transparent) +// entry on the _SHIFT layer. +static bool is_shift_layer_key(uint8_t row, uint8_t col) { + uint16_t kc = keymaps[_SHIFT][row][col]; + return kc != KC_TRNS && kc != KC_NO; +} +bool process_record_user(uint16_t keycode, keyrecord_t* record) { + switch (keycode) { + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _FUNC); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _FUNC); + } + return false; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _FUNC); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _FUNC); + } + return false; -// // Copyright 2023 QMK -// // SPDX-License-Identifier: GPL-2.0-or-later -// -// #include QMK_KEYBOARD_H -// -// const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -// [0] = LAYOUT( -// KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, -// KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, -// KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, -// KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, -// KC_LCTL, KC_LGUI, KC_LGUI, KC_LALT, KC_ENT, KC_SPC, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT -// ) -// }; + case KC_LSFT: + if (record->event.pressed) { + layer_on(_SHIFT); + } else { + layer_off(_SHIFT); + } + // Do NOT register shift — we handle it ourselves + return false; + + default: + // When _SHIFT layer is active and the key fell through + // (transparent on _SHIFT), add Shift so it behaves normally + if (IS_LAYER_ON(_SHIFT) && record->event.pressed) { + if (!is_shift_layer_key(record->event.key.row, + record->event.key.col)) { + register_mods(MOD_BIT(KC_LSFT)); + tap_code16(keycode); + unregister_mods(MOD_BIT(KC_LSFT)); + return false; + } + } + break; + } + + return true; +}