From 3e3eaf7dfe520c6ccc3bb0ac778d831436539367 Mon Sep 17 00:00:00 2001 From: Franz Kuntke Date: Fri, 24 Oct 2025 16:00:36 +0200 Subject: [PATCH] feat: Add qwerty_inward for rev3.5 --- .../rev3_5/keymaps/qwerty_inward/config.h | 4 + .../rev3_5/keymaps/qwerty_inward/keymap.c | 181 ++++++++++++++++++ .../rev3_5/keymaps/qwerty_inward/readme.md | 14 ++ .../rev3_5/keymaps/qwerty_inward/rules.mk | 1 + 4 files changed, 200 insertions(+) create mode 100644 qmk/snappy/rev3_5/keymaps/qwerty_inward/config.h create mode 100644 qmk/snappy/rev3_5/keymaps/qwerty_inward/keymap.c create mode 100644 qmk/snappy/rev3_5/keymaps/qwerty_inward/readme.md create mode 100644 qmk/snappy/rev3_5/keymaps/qwerty_inward/rules.mk diff --git a/qmk/snappy/rev3_5/keymaps/qwerty_inward/config.h b/qmk/snappy/rev3_5/keymaps/qwerty_inward/config.h new file mode 100644 index 0000000..a519f8a --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/qwerty_inward/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define OLED_DISPLAY_128X64 +#define OLED_UPDATE_INTERVAL 10 diff --git a/qmk/snappy/rev3_5/keymaps/qwerty_inward/keymap.c b/qmk/snappy/rev3_5/keymaps/qwerty_inward/keymap.c new file mode 100644 index 0000000..d4d44b9 --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/qwerty_inward/keymap.c @@ -0,0 +1,181 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _QWERTY_INWARD, + _SPECIAL, +}; + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + UM_PARN, + UM_CURL, + UM_BRAC, +}; + + +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) + +#define ____ _______ +#define OS_LSFT OSM(MOD_LSFT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /*************************************************************************** + * QWERTY inward (based on ISO layouts) + ***************************************************************************/ +#define _FN1__FN2__FN3__FN4__FN5 KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define SP__SP____1_____2_____3_____4___5 QK_GESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5 +#define SP__SP____Q_____W_____E_____R___T KC_TAB, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T +#define SP__SP____A_____S_____D_____F___G KC_CAPS, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G +#define SP__SP____Z_____X_____C_____V___B KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B + +#define _FN8__FN9__FN10__FN11__FN12_ KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 +#define _6__7_____8_____9_____0____SP__SP KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL +#define Y___U_____I_____O_____P____SP__SP KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC +#define H___J_____K_____L____OE____SP__SP KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS +#define N___M____COMM__DOT_DASH____SP__SP KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, OS_RSFT, KC_RSFT + +#define _______BOTTOM_LEFT________ KC_LCTL, OSL(_SPECIAL), UM_CURL, KC_DEL, KC_LGUI, KC_LALT, KC_SPC +#define _______BOTTOM_RIGHT_______ KC_SPC, KC_RALT, KC_ENT, KC_BSPC, OS_LCA, OSL(_SPECIAL), KC_RCTL + + [_QWERTY_INWARD] = + LAYOUT_wrapper( + _FN1__FN2__FN3__FN4__FN5, _FN8__FN9__FN10__FN11__FN12_, + SP__SP____1_____2_____3_____4___5, _6__7_____8_____9_____0____SP__SP, + SP__SP____Q_____W_____E_____R___T, Y___U_____I_____O_____P____SP__SP, + SP__SP____A_____S_____D_____F___G, H___J_____K_____L____OE____SP__SP, + SP__SP____Z_____X_____C_____V___B, N___M____COMM__DOT_DASH____SP__SP, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + + /*************************************************************************** + * SPECIAL + ***************************************************************************/ + +#define ___________SPECIAL_L0___________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7 +#define ___________SPECIAL_L1___________ ____, ____, KC_PGUP, ____, KC_UP, ____, KC_PGDN +#define ___________SPECIAL_L2___________ ____, ____, ____, KC_LEFT, KC_DOWN, KC_RIGHT, ____ +#define ___________SPECIAL_L3___________ KC_LSFT, ____, ____, ____, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK +#define ___________SPECIAL_R0___________ KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_F14 +#define ___________SPECIAL_R1___________ ____, ____, LCA(KC_UP), ____, KC_PAUS, ____, ____ +#define ___________SPECIAL_R2___________ ____, LCA(KC_LEFT), LCA(KC_DOWN), LCA(KC_RIGHT), ____, ____, ____ +#define ___________SPECIAL_R3___________ KC_KB_VOLUME_DOWN, KC_KB_VOLUME_UP, KC_KB_MUTE, ____, ____, QK_BOOT, ____ + + [_SPECIAL]= + LAYOUT_wrapper( + _FN1__FN2__FN3__FN4__FN5, _FN8__FN9__FN10__FN11__FN12_, + ___________SPECIAL_L0___________, ___________SPECIAL_R0___________, + ___________SPECIAL_L1___________, ___________SPECIAL_R1___________, + ___________SPECIAL_L2___________, ___________SPECIAL_R2___________, + ___________SPECIAL_L3___________, ___________SPECIAL_R3___________, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + +}; + +void matrix_scan_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("matrix_scan_user\n"); */ +#endif +} + +#ifdef OLED_ENABLE +static void render_logo(void) { + static const char PROGMEM raw_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,192,224,240,240,248,248,252,252,254,254,252,252,248,248,240,224,224,192,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 64,224,240,240,248,248,252,252,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,252,252,120, 56, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 3, 3, 7, 7, 15, 31, 31, 63, 63,127,127,255,255,255,255,255,255,255,255,255,255,255,127, 63, 63, 31, 31,143,143,135,131, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,129,131,195,195,227,241,241,248,248,252,254,254,255,255,255,255,255,255,255,255,254,254,252,252,248,240,240,224,224,192,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 60, 60,126,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,127, 63, 63, 31, 31, 14, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 7, 15, 15, 31, 31, 63, 63,127,255,255,255,127, 63, 63, 31, 31, 15, 15, 7, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + oled_write_raw_P(raw_logo, sizeof(raw_logo)); +} + +bool oled_task_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("oled_task_user\n"); */ +#endif + if (is_keyboard_master()) { + const char *layer_names[3]; // or { "DVORAK", "SPECIAL", "GAMING" }; + layer_names[_QWERTY_INWARD] = "QWERTY"; + layer_names[_SPECIAL] = "SPECIAL"; + + render_logo(); + // Align right + size_t layer = get_highest_layer(layer_state); + oled_set_cursor(oled_max_chars() - 1 - strlen(layer_names[layer]), 1); + oled_write(layer_names[layer], false); + } else { + // Center logo on second screen + oled_set_cursor(6, 0); + render_logo(); + } + return false; +} +#endif + +void keyboard_post_init_user(void) { + oled_init(OLED_ROTATION_180); + /* render_logo(); */ + // Customise these values to desired behaviour + /* debug_enable=true; */ + /* debug_matrix=true; */ + /* debug_keyboard=true; */ + //debug_mouse=true; + +} + +uint8_t mods; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + mods = get_mods(); + switch (keycode) { + case UM_CURL: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + del_mods(MOD_MASK_SHIFT); + SEND_STRING(SS_RALT("0")); + } else { + SEND_STRING(SS_RALT("7")); + } + set_mods(mods); + } + return false; + break; + case UM_BRAC: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + del_mods(MOD_MASK_SHIFT); + SEND_STRING(SS_RALT("9")); + } else { + SEND_STRING(SS_RALT("8")); + } + set_mods(mods); + } + return false; + break; + case UM_PARN: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + del_mods(MOD_MASK_SHIFT); + SEND_STRING(SS_LSFT("9")); + } else { + SEND_STRING(SS_LSFT("8")); + } + set_mods(mods); + } + return false; + break; + default: + return true; + } +} diff --git a/qmk/snappy/rev3_5/keymaps/qwerty_inward/readme.md b/qmk/snappy/rev3_5/keymaps/qwerty_inward/readme.md new file mode 100644 index 0000000..66eb3ef --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/qwerty_inward/readme.md @@ -0,0 +1,14 @@ +# The qwerty inward keymap for snappy + +This layout is a plain QWERTY layout, but in contrast to the regular QWERTY layout shifted to the center, i.e., the inner keys on the home row are `G` and `H`. +Reason is the compatibilty with OS-level layouts that require two extra columns for the pinky (little finger). This includes NEO layouts, like NEO Bone. + +The "special" layer has following features: + +- arrow keys on the left hand (on `E`,`S`,`D`,`F` not `W`,`A`,`S`,`D`) + - if you need plain arrow keys +- arrow keys + CTRL + ALT on the right hand (on `I`, `J`, `K`, `L`) + - for example virtual screen switch on KDE Plasma +- media keys + - volume down, up and mute (on `N`, `M`, `,`) + - pause, previous, next (on `C`, `V`, `B`) diff --git a/qmk/snappy/rev3_5/keymaps/qwerty_inward/rules.mk b/qmk/snappy/rev3_5/keymaps/qwerty_inward/rules.mk new file mode 100644 index 0000000..fcfd222 --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/qwerty_inward/rules.mk @@ -0,0 +1 @@ +EXTRAKEY_ENABLE = yes