1
0
Fork 0

move melody96 to ymdk vendor folder (#15680)

Co-authored-by: Nick Brassel <nick@tzarc.org>
This commit is contained in:
peepeetee 2022-04-20 03:19:16 +08:00 committed by GitHub
parent 40a7714ce5
commit 314865f833
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 1 additions and 1 deletions

View file

@ -0,0 +1,55 @@
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0x594d // "YM"
#define PRODUCT_ID 0x4D96 // "M" + 96
#define DEVICE_VER 0x0001
#define MANUFACTURER YMDK
#define PRODUCT Melody96
/* key matrix size */
#define MATRIX_ROWS 12
#define MATRIX_COLS 9
/* key matrix pins */
#define MATRIX_ROW_PINS { B7, B3, B2, B1, B0, E6, F0, F1, F4, F5, F6, F7 }
#define MATRIX_COL_PINS { D0, D1, D2, D3, D5, D4, D6, D7, B4 }
#define UNUSED_PINS
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION ROW2COL
#define LED_NUM_LOCK_PIN C6
#define LED_CAPS_LOCK_PIN C7
#define LED_SCROLL_LOCK_PIN B5
#define LED_PIN_ON_STATE 0
/* number of backlight levels */
#define BACKLIGHT_PIN B6
#ifdef BACKLIGHT_PIN
#define BACKLIGHT_LEVELS 5
#endif
/* Set location for BootMagic key*/
#define BOOTMAGIC_LITE_ROW 5
#define BOOTMAGIC_LITE_COLUMN 0
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
#define RGB_DI_PIN E2
#ifdef RGB_DI_PIN
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 18
#define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_VAL_STEP 8
#endif

View file

@ -0,0 +1,884 @@
{
"keyboard_name": "melody96",
"url": "",
"maintainer": "qmk",
"layout_aliases": {
"LAYOUT": "LAYOUT_all",
"LAYOUT_hotswap": "LAYOUT_96_ansi"
},
"layouts": {
"LAYOUT_all": {
"layout": [
{"x": 0, "y": 0},
{"x": 1, "y": 0},
{"x": 2, "y": 0},
{"x": 3, "y": 0},
{"x": 4, "y": 0},
{"x": 5, "y": 0},
{"x": 6, "y": 0},
{"x": 7, "y": 0},
{"x": 8, "y": 0},
{"x": 9, "y": 0},
{"x": 10, "y": 0},
{"x": 11, "y": 0},
{"x": 12, "y": 0},
{"x": 13, "y": 0},
{"x": 14, "y": 0},
{"x": 15, "y": 0},
{"x": 16, "y": 0},
{"x": 17, "y": 0},
{"x": 18, "y": 0},
{"x": 0, "y": 1},
{"x": 1, "y": 1},
{"x": 2, "y": 1},
{"x": 3, "y": 1},
{"x": 4, "y": 1},
{"x": 5, "y": 1},
{"x": 6, "y": 1},
{"x": 7, "y": 1},
{"x": 8, "y": 1},
{"x": 9, "y": 1},
{"x": 10, "y": 1},
{"x": 11, "y": 1},
{"x": 12, "y": 1},
{"x": 13, "y": 1},
{"x": 14, "y": 1},
{"x": 15, "y": 1},
{"x": 16, "y": 1},
{"x": 17, "y": 1},
{"x": 18, "y": 1},
{"x": 0, "y": 2, "w": 1.5},
{"x": 1.5, "y": 2},
{"x": 2.5, "y": 2},
{"x": 3.5, "y": 2},
{"x": 4.5, "y": 2},
{"x": 5.5, "y": 2},
{"x": 6.5, "y": 2},
{"x": 7.5, "y": 2},
{"x": 8.5, "y": 2},
{"x": 9.5, "y": 2},
{"x": 10.5, "y": 2},
{"x": 11.5, "y": 2},
{"x": 12.5, "y": 2},
{"x": 13.5, "y": 2, "w": 1.5},
{"x": 15, "y": 2},
{"x": 16, "y": 2},
{"x": 17, "y": 2},
{"x": 18, "y": 2},
{"x": 0, "y": 3, "w": 1.75},
{"x": 1.75, "y": 3},
{"x": 2.75, "y": 3},
{"x": 3.75, "y": 3},
{"x": 4.75, "y": 3},
{"x": 5.75, "y": 3},
{"x": 6.75, "y": 3},
{"x": 7.75, "y": 3},
{"x": 8.75, "y": 3},
{"x": 9.75, "y": 3},
{"x": 10.75, "y": 3},
{"x": 11.75, "y": 3},
{"x": 12.75, "y": 3, "w": 2.25},
{"x": 15, "y": 3},
{"x": 16, "y": 3},
{"x": 17, "y": 3},
{"x": 18, "y": 3},
{"x": 0, "y": 4, "w": 1.25},
{"x": 1.25, "y": 4},
{"x": 2.25, "y": 4},
{"x": 3.25, "y": 4},
{"x": 4.25, "y": 4},
{"x": 5.25, "y": 4},
{"x": 6.25, "y": 4},
{"x": 7.25, "y": 4},
{"x": 8.25, "y": 4},
{"x": 9.25, "y": 4},
{"x": 10.25, "y": 4},
{"x": 11.25, "y": 4},
{"x": 12.25, "y": 4, "w": 1.75},
{"x": 14, "y": 4},
{"x": 15, "y": 4},
{"x": 16, "y": 4},
{"x": 17, "y": 4},
{"x": 18, "y": 4},
{"x": 0, "y": 5, "w": 1.25},
{"x": 1.25, "y": 5, "w": 1.25},
{"x": 2.5, "y": 5, "w": 1.25},
{"x": 3.75, "y": 5, "w": 6.25},
{"x": 10, "y": 5},
{"x": 11, "y": 5},
{"x": 12, "y": 5},
{"x": 13, "y": 5},
{"x": 14, "y": 5},
{"x": 15, "y": 5},
{"x": 16, "y": 5},
{"x": 17, "y": 5},
{"x": 18, "y": 5}
]
},
"LAYOUT_96_ansi": {
"layout": [
{"x": 0, "y": 0},
{"x": 1, "y": 0},
{"x": 2, "y": 0},
{"x": 3, "y": 0},
{"x": 4, "y": 0},
{"x": 5, "y": 0},
{"x": 6, "y": 0},
{"x": 7, "y": 0},
{"x": 8, "y": 0},
{"x": 9, "y": 0},
{"x": 10, "y": 0},
{"x": 11, "y": 0},
{"x": 12, "y": 0},
{"x": 13, "y": 0},
{"x": 14, "y": 0},
{"x": 15, "y": 0},
{"x": 16, "y": 0},
{"x": 17, "y": 0},
{"x": 18, "y": 0},
{"x": 0, "y": 1},
{"x": 1, "y": 1},
{"x": 2, "y": 1},
{"x": 3, "y": 1},
{"x": 4, "y": 1},
{"x": 5, "y": 1},
{"x": 6, "y": 1},
{"x": 7, "y": 1},
{"x": 8, "y": 1},
{"x": 9, "y": 1},
{"x": 10, "y": 1},
{"x": 11, "y": 1},
{"x": 12, "y": 1},
{"x": 13, "y": 1, "w": 2},
{"x": 15, "y": 1},
{"x": 16, "y": 1},
{"x": 17, "y": 1},
{"x": 18, "y": 1},
{"x": 0, "y": 2, "w": 1.5},
{"x": 1.5, "y": 2},
{"x": 2.5, "y": 2},
{"x": 3.5, "y": 2},
{"x": 4.5, "y": 2},
{"x": 5.5, "y": 2},
{"x": 6.5, "y": 2},
{"x": 7.5, "y": 2},
{"x": 8.5, "y": 2},
{"x": 9.5, "y": 2},
{"x": 10.5, "y": 2},
{"x": 11.5, "y": 2},
{"x": 12.5, "y": 2},
{"x": 13.5, "y": 2, "w": 1.5},
{"x": 15, "y": 2},
{"x": 16, "y": 2},
{"x": 17, "y": 2},
{"x": 18, "y": 2, "h": 2},
{"x": 0, "y": 3, "w": 1.75},
{"x": 1.75, "y": 3},
{"x": 2.75, "y": 3},
{"x": 3.75, "y": 3},
{"x": 4.75, "y": 3},
{"x": 5.75, "y": 3},
{"x": 6.75, "y": 3},
{"x": 7.75, "y": 3},
{"x": 8.75, "y": 3},
{"x": 9.75, "y": 3},
{"x": 10.75, "y": 3},
{"x": 11.75, "y": 3},
{"x": 12.75, "y": 3, "w": 2.25},
{"x": 15, "y": 3},
{"x": 16, "y": 3},
{"x": 17, "y": 3},
{"x": 0, "y": 4, "w": 2.25},
{"x": 2.25, "y": 4},
{"x": 3.25, "y": 4},
{"x": 4.25, "y": 4},
{"x": 5.25, "y": 4},
{"x": 6.25, "y": 4},
{"x": 7.25, "y": 4},
{"x": 8.25, "y": 4},
{"x": 9.25, "y": 4},
{"x": 10.25, "y": 4},
{"x": 11.25, "y": 4},
{"x": 12.25, "y": 4, "w": 1.75},
{"x": 14, "y": 4},
{"x": 15, "y": 4},
{"x": 16, "y": 4},
{"x": 17, "y": 4},
{"x": 18, "y": 4, "h": 2},
{"x": 0, "y": 5, "w": 1.25},
{"x": 1.25, "y": 5, "w": 1.25},
{"x": 2.5, "y": 5, "w": 1.25},
{"x": 3.75, "y": 5, "w": 6.25},
{"x": 10, "y": 5},
{"x": 11, "y": 5},
{"x": 12, "y": 5},
{"x": 13, "y": 5},
{"x": 14, "y": 5},
{"x": 15, "y": 5},
{"x": 16, "y": 5},
{"x": 17, "y": 5}
]
},
"LAYOUT_96_ansi_splitbs": {
"layout": [
{"x": 0, "y": 0},
{"x": 1, "y": 0},
{"x": 2, "y": 0},
{"x": 3, "y": 0},
{"x": 4, "y": 0},
{"x": 5, "y": 0},
{"x": 6, "y": 0},
{"x": 7, "y": 0},
{"x": 8, "y": 0},
{"x": 9, "y": 0},
{"x": 10, "y": 0},
{"x": 11, "y": 0},
{"x": 12, "y": 0},
{"x": 13, "y": 0},
{"x": 14, "y": 0},
{"x": 15, "y": 0},
{"x": 16, "y": 0},
{"x": 17, "y": 0},
{"x": 18, "y": 0},
{"x": 0, "y": 1},
{"x": 1, "y": 1},
{"x": 2, "y": 1},
{"x": 3, "y": 1},
{"x": 4, "y": 1},
{"x": 5, "y": 1},
{"x": 6, "y": 1},
{"x": 7, "y": 1},
{"x": 8, "y": 1},
{"x": 9, "y": 1},
{"x": 10, "y": 1},
{"x": 11, "y": 1},
{"x": 12, "y": 1},
{"x": 13, "y": 1},
{"x": 14, "y": 1},
{"x": 15, "y": 1},
{"x": 16, "y": 1},
{"x": 17, "y": 1},
{"x": 18, "y": 1},
{"x": 0, "y": 2, "w": 1.5},
{"x": 1.5, "y": 2},
{"x": 2.5, "y": 2},
{"x": 3.5, "y": 2},
{"x": 4.5, "y": 2},
{"x": 5.5, "y": 2},
{"x": 6.5, "y": 2},
{"x": 7.5, "y": 2},
{"x": 8.5, "y": 2},
{"x": 9.5, "y": 2},
{"x": 10.5, "y": 2},
{"x": 11.5, "y": 2},
{"x": 12.5, "y": 2},
{"x": 13.5, "y": 2, "w": 1.5},
{"x": 15, "y": 2},
{"x": 16, "y": 2},
{"x": 17, "y": 2},
{"x": 18, "y": 2, "h": 2},
{"x": 0, "y": 3, "w": 1.75},
{"x": 1.75, "y": 3},
{"x": 2.75, "y": 3},
{"x": 3.75, "y": 3},
{"x": 4.75, "y": 3},
{"x": 5.75, "y": 3},
{"x": 6.75, "y": 3},
{"x": 7.75, "y": 3},
{"x": 8.75, "y": 3},
{"x": 9.75, "y": 3},
{"x": 10.75, "y": 3},
{"x": 11.75, "y": 3},
{"x": 12.75, "y": 3, "w": 2.25},
{"x": 15, "y": 3},
{"x": 16, "y": 3},
{"x": 17, "y": 3},
{"x": 0, "y": 4, "w": 2.25},
{"x": 2.25, "y": 4},
{"x": 3.25, "y": 4},
{"x": 4.25, "y": 4},
{"x": 5.25, "y": 4},
{"x": 6.25, "y": 4},
{"x": 7.25, "y": 4},
{"x": 8.25, "y": 4},
{"x": 9.25, "y": 4},
{"x": 10.25, "y": 4},
{"x": 11.25, "y": 4},
{"x": 12.25, "y": 4, "w": 1.75},
{"x": 14, "y": 4},
{"x": 15, "y": 4},
{"x": 16, "y": 4},
{"x": 17, "y": 4},
{"x": 18, "y": 4, "h": 2},
{"x": 0, "y": 5, "w": 1.25},
{"x": 1.25, "y": 5, "w": 1.25},
{"x": 2.5, "y": 5, "w": 1.25},
{"x": 3.75, "y": 5, "w": 6.25},
{"x": 10, "y": 5},
{"x": 11, "y": 5},
{"x": 12, "y": 5},
{"x": 13, "y": 5},
{"x": 14, "y": 5},
{"x": 15, "y": 5},
{"x": 16, "y": 5},
{"x": 17, "y": 5}
]
},
"LAYOUT_96_iso": {
"layout": [
{"x": 0, "y": 0},
{"x": 1, "y": 0},
{"x": 2, "y": 0},
{"x": 3, "y": 0},
{"x": 4, "y": 0},
{"x": 5, "y": 0},
{"x": 6, "y": 0},
{"x": 7, "y": 0},
{"x": 8, "y": 0},
{"x": 9, "y": 0},
{"x": 10, "y": 0},
{"x": 11, "y": 0},
{"x": 12, "y": 0},
{"x": 13, "y": 0},
{"x": 14, "y": 0},
{"x": 15, "y": 0},
{"x": 16, "y": 0},
{"x": 17, "y": 0},
{"x": 18, "y": 0},
{"x": 0, "y": 1},
{"x": 1, "y": 1},
{"x": 2, "y": 1},
{"x": 3, "y": 1},
{"x": 4, "y": 1},
{"x": 5, "y": 1},
{"x": 6, "y": 1},
{"x": 7, "y": 1},
{"x": 8, "y": 1},
{"x": 9, "y": 1},
{"x": 10, "y": 1},
{"x": 11, "y": 1},
{"x": 12, "y": 1},
{"x": 13, "y": 1, "w": 2},
{"x": 15, "y": 1},
{"x": 16, "y": 1},
{"x": 17, "y": 1},
{"x": 18, "y": 1},
{"x": 0, "y": 2, "w": 1.5},
{"x": 1.5, "y": 2},
{"x": 2.5, "y": 2},
{"x": 3.5, "y": 2},
{"x": 4.5, "y": 2},
{"x": 5.5, "y": 2},
{"x": 6.5, "y": 2},
{"x": 7.5, "y": 2},
{"x": 8.5, "y": 2},
{"x": 9.5, "y": 2},
{"x": 10.5, "y": 2},
{"x": 11.5, "y": 2},
{"x": 12.5, "y": 2},
{"x": 15, "y": 2},
{"x": 16, "y": 2},
{"x": 17, "y": 2},
{"x": 18, "y": 2, "h": 2},
{"x": 0, "y": 3, "w": 1.75},
{"x": 1.75, "y": 3},
{"x": 2.75, "y": 3},
{"x": 3.75, "y": 3},
{"x": 4.75, "y": 3},
{"x": 5.75, "y": 3},
{"x": 6.75, "y": 3},
{"x": 7.75, "y": 3},
{"x": 8.75, "y": 3},
{"x": 9.75, "y": 3},
{"x": 10.75, "y": 3},
{"x": 11.75, "y": 3},
{"x": 12.75, "y": 3},
{"x": 13.75, "y": 2, "w": 1.25, "h": 2},
{"x": 15, "y": 3},
{"x": 16, "y": 3},
{"x": 17, "y": 3},
{"x": 0, "y": 4, "w": 1.25},
{"x": 1.25, "y": 4},
{"x": 2.25, "y": 4},
{"x": 3.25, "y": 4},
{"x": 4.25, "y": 4},
{"x": 5.25, "y": 4},
{"x": 6.25, "y": 4},
{"x": 7.25, "y": 4},
{"x": 8.25, "y": 4},
{"x": 9.25, "y": 4},
{"x": 10.25, "y": 4},
{"x": 11.25, "y": 4},
{"x": 12.25, "y": 4, "w": 1.75},
{"x": 14, "y": 4},
{"x": 15, "y": 4},
{"x": 16, "y": 4},
{"x": 17, "y": 4},
{"x": 18, "y": 4, "h": 2},
{"x": 0, "y": 5, "w": 1.25},
{"x": 1.25, "y": 5, "w": 1.25},
{"x": 2.5, "y": 5, "w": 1.25},
{"x": 3.75, "y": 5, "w": 6.25},
{"x": 10, "y": 5},
{"x": 11, "y": 5},
{"x": 12, "y": 5},
{"x": 13, "y": 5},
{"x": 14, "y": 5},
{"x": 15, "y": 5},
{"x": 16, "y": 5},
{"x": 17, "y": 5}
]
},
"LAYOUT_96_iso_splitbs": {
"layout": [
{"x": 0, "y": 0},
{"x": 1, "y": 0},
{"x": 2, "y": 0},
{"x": 3, "y": 0},
{"x": 4, "y": 0},
{"x": 5, "y": 0},
{"x": 6, "y": 0},
{"x": 7, "y": 0},
{"x": 8, "y": 0},
{"x": 9, "y": 0},
{"x": 10, "y": 0},
{"x": 11, "y": 0},
{"x": 12, "y": 0},
{"x": 13, "y": 0},
{"x": 14, "y": 0},
{"x": 15, "y": 0},
{"x": 16, "y": 0},
{"x": 17, "y": 0},
{"x": 18, "y": 0},
{"x": 0, "y": 1},
{"x": 1, "y": 1},
{"x": 2, "y": 1},
{"x": 3, "y": 1},
{"x": 4, "y": 1},
{"x": 5, "y": 1},
{"x": 6, "y": 1},
{"x": 7, "y": 1},
{"x": 8, "y": 1},
{"x": 9, "y": 1},
{"x": 10, "y": 1},
{"x": 11, "y": 1},
{"x": 12, "y": 1},
{"x": 13, "y": 1},
{"x": 14, "y": 1},
{"x": 15, "y": 1},
{"x": 16, "y": 1},
{"x": 17, "y": 1},
{"x": 18, "y": 1},
{"x": 0, "y": 2, "w": 1.5},
{"x": 1.5, "y": 2},
{"x": 2.5, "y": 2},
{"x": 3.5, "y": 2},
{"x": 4.5, "y": 2},
{"x": 5.5, "y": 2},
{"x": 6.5, "y": 2},
{"x": 7.5, "y": 2},
{"x": 8.5, "y": 2},
{"x": 9.5, "y": 2},
{"x": 10.5, "y": 2},
{"x": 11.5, "y": 2},
{"x": 12.5, "y": 2},
{"x": 15, "y": 2},
{"x": 16, "y": 2},
{"x": 17, "y": 2},
{"x": 18, "y": 2, "h": 2},
{"x": 0, "y": 3, "w": 1.75},
{"x": 1.75, "y": 3},
{"x": 2.75, "y": 3},
{"x": 3.75, "y": 3},
{"x": 4.75, "y": 3},
{"x": 5.75, "y": 3},
{"x": 6.75, "y": 3},
{"x": 7.75, "y": 3},
{"x": 8.75, "y": 3},
{"x": 9.75, "y": 3},
{"x": 10.75, "y": 3},
{"x": 11.75, "y": 3},
{"x": 12.75, "y": 3},
{"x": 13.75, "y": 2, "w": 1.25, "h": 2},
{"x": 15, "y": 3},
{"x": 16, "y": 3},
{"x": 17, "y": 3},
{"x": 0, "y": 4, "w": 1.25},
{"x": 1.25, "y": 4},
{"x": 2.25, "y": 4},
{"x": 3.25, "y": 4},
{"x": 4.25, "y": 4},
{"x": 5.25, "y": 4},
{"x": 6.25, "y": 4},
{"x": 7.25, "y": 4},
{"x": 8.25, "y": 4},
{"x": 9.25, "y": 4},
{"x": 10.25, "y": 4},
{"x": 11.25, "y": 4},
{"x": 12.25, "y": 4, "w": 1.75},
{"x": 14, "y": 4},
{"x": 15, "y": 4},
{"x": 16, "y": 4},
{"x": 17, "y": 4},
{"x": 18, "y": 4, "h": 2},
{"x": 0, "y": 5, "w": 1.25},
{"x": 1.25, "y": 5, "w": 1.25},
{"x": 2.5, "y": 5, "w": 1.25},
{"x": 3.75, "y": 5, "w": 6.25},
{"x": 10, "y": 5},
{"x": 11, "y": 5},
{"x": 12, "y": 5},
{"x": 13, "y": 5},
{"x": 14, "y": 5},
{"x": 15, "y": 5},
{"x": 16, "y": 5},
{"x": 17, "y": 5}
]
},
"LAYOUT_96_with60": {
"layout": [
{"x": 0, "y": 0},
{"x": 1, "y": 0},
{"x": 2, "y": 0},
{"x": 3, "y": 0},
{"x": 4, "y": 0},
{"x": 5, "y": 0},
{"x": 6, "y": 0},
{"x": 7, "y": 0},
{"x": 8, "y": 0},
{"x": 9, "y": 0},
{"x": 10, "y": 0},
{"x": 11, "y": 0},
{"x": 12, "y": 0},
{"x": 13, "y": 0},
{"x": 14, "y": 0},
{"x": 15, "y": 0},
{"x": 16, "y": 0},
{"x": 17, "y": 0},
{"x": 18, "y": 0},
{"x": 0, "y": 1},
{"x": 1, "y": 1},
{"x": 2, "y": 1},
{"x": 3, "y": 1},
{"x": 4, "y": 1},
{"x": 5, "y": 1},
{"x": 6, "y": 1},
{"x": 7, "y": 1},
{"x": 8, "y": 1},
{"x": 9, "y": 1},
{"x": 10, "y": 1},
{"x": 11, "y": 1},
{"x": 12, "y": 1},
{"x": 13, "y": 1, "w": 2},
{"x": 15, "y": 1},
{"x": 16, "y": 1},
{"x": 17, "y": 1},
{"x": 18, "y": 1},
{"x": 0, "y": 2, "w": 1.5},
{"x": 1.5, "y": 2},
{"x": 2.5, "y": 2},
{"x": 3.5, "y": 2},
{"x": 4.5, "y": 2},
{"x": 5.5, "y": 2},
{"x": 6.5, "y": 2},
{"x": 7.5, "y": 2},
{"x": 8.5, "y": 2},
{"x": 9.5, "y": 2},
{"x": 10.5, "y": 2},
{"x": 11.5, "y": 2},
{"x": 12.5, "y": 2},
{"x": 13.5, "y": 2, "w": 1.5},
{"x": 15, "y": 2},
{"x": 16, "y": 2},
{"x": 17, "y": 2},
{"x": 18, "y": 2, "h": 2},
{"x": 0, "y": 3, "w": 1.75},
{"x": 1.75, "y": 3},
{"x": 2.75, "y": 3},
{"x": 3.75, "y": 3},
{"x": 4.75, "y": 3},
{"x": 5.75, "y": 3},
{"x": 6.75, "y": 3},
{"x": 7.75, "y": 3},
{"x": 8.75, "y": 3},
{"x": 9.75, "y": 3},
{"x": 10.75, "y": 3},
{"x": 11.75, "y": 3},
{"x": 12.75, "y": 3, "w": 2.25},
{"x": 15, "y": 3},
{"x": 16, "y": 3},
{"x": 17, "y": 3},
{"x": 0, "y": 4, "w": 2.25},
{"x": 2.25, "y": 4},
{"x": 3.25, "y": 4},
{"x": 4.25, "y": 4},
{"x": 5.25, "y": 4},
{"x": 6.25, "y": 4},
{"x": 7.25, "y": 4},
{"x": 8.25, "y": 4},
{"x": 9.25, "y": 4},
{"x": 10.25, "y": 4},
{"x": 11.25, "y": 4},
{"x": 12.25, "y": 4, "w": 2.75},
{"x": 15, "y": 4},
{"x": 16, "y": 4},
{"x": 17, "y": 4},
{"x": 18, "y": 4, "h": 2}
{"x": 0, "y": 5, "w": 1.25},
{"x": 1.25, "y": 5, "w": 1.25},
{"x": 2.5, "y": 5, "w": 1.25},
{"x": 3.75, "y": 5, "w": 6.25},
{"x": 10, "y": 5, "w": 1.25},
{"x": 11.25, "y": 5, "w": 1.25},
{"x": 12.5, "y": 5, "w": 1.25},
{"x": 13.75, "y": 5, "w": 1.25},
{"x": 15, "y": 5, "w": 2},
{"x": 17, "y": 5},
]
},
"LAYOUT_96_with60_splitbs": {
"layout": [
{"x": 0, "y": 0},
{"x": 1, "y": 0},
{"x": 2, "y": 0},
{"x": 3, "y": 0},
{"x": 4, "y": 0},
{"x": 5, "y": 0},
{"x": 6, "y": 0},
{"x": 7, "y": 0},
{"x": 8, "y": 0},
{"x": 9, "y": 0},
{"x": 10, "y": 0},
{"x": 11, "y": 0},
{"x": 12, "y": 0},
{"x": 13, "y": 0},
{"x": 14, "y": 0},
{"x": 15, "y": 0},
{"x": 16, "y": 0},
{"x": 17, "y": 0},
{"x": 18, "y": 0},
{"x": 0, "y": 1},
{"x": 1, "y": 1},
{"x": 2, "y": 1},
{"x": 3, "y": 1},
{"x": 4, "y": 1},
{"x": 5, "y": 1},
{"x": 6, "y": 1},
{"x": 7, "y": 1},
{"x": 8, "y": 1},
{"x": 9, "y": 1},
{"x": 10, "y": 1},
{"x": 11, "y": 1},
{"x": 12, "y": 1},
{"x": 13, "y": 1},
{"x": 14, "y": 1},
{"x": 15, "y": 1},
{"x": 16, "y": 1},
{"x": 17, "y": 1},
{"x": 18, "y": 1},
{"x": 0, "y": 2, "w": 1.5},
{"x": 1.5, "y": 2},
{"x": 2.5, "y": 2},
{"x": 3.5, "y": 2},
{"x": 4.5, "y": 2},
{"x": 5.5, "y": 2},
{"x": 6.5, "y": 2},
{"x": 7.5, "y": 2},
{"x": 8.5, "y": 2},
{"x": 9.5, "y": 2},
{"x": 10.5, "y": 2},
{"x": 11.5, "y": 2},
{"x": 12.5, "y": 2},
{"x": 13.5, "y": 2, "w": 1.5},
{"x": 15, "y": 2},
{"x": 16, "y": 2},
{"x": 17, "y": 2},
{"x": 18, "y": 2, "h": 2},
{"x": 0, "y": 3, "w": 1.75},
{"x": 1.75, "y": 3},
{"x": 2.75, "y": 3},
{"x": 3.75, "y": 3},
{"x": 4.75, "y": 3},
{"x": 5.75, "y": 3},
{"x": 6.75, "y": 3},
{"x": 7.75, "y": 3},
{"x": 8.75, "y": 3},
{"x": 9.75, "y": 3},
{"x": 10.75, "y": 3},
{"x": 11.75, "y": 3},
{"x": 12.75, "y": 3, "w": 2.25},
{"x": 15, "y": 3},
{"x": 16, "y": 3},
{"x": 17, "y": 3},
{"x": 0, "y": 4, "w": 2.25},
{"x": 2.25, "y": 4},
{"x": 3.25, "y": 4},
{"x": 4.25, "y": 4},
{"x": 5.25, "y": 4},
{"x": 6.25, "y": 4},
{"x": 7.25, "y": 4},
{"x": 8.25, "y": 4},
{"x": 9.25, "y": 4},
{"x": 10.25, "y": 4},
{"x": 11.25, "y": 4},
{"x": 12.25, "y": 4, "w": 2.75},
{"x": 15, "y": 4},
{"x": 16, "y": 4},
{"x": 17, "y": 4},
{"x": 18, "y": 4, "h": 2}
{"x": 0, "y": 5, "w": 1.25},
{"x": 1.25, "y": 5, "w": 1.25},
{"x": 2.5, "y": 5, "w": 1.25},
{"x": 3.75, "y": 5, "w": 6.25},
{"x": 10, "y": 5, "w": 1.25},
{"x": 11.25, "y": 5, "w": 1.25},
{"x": 12.5, "y": 5, "w": 1.25},
{"x": 13.75, "y": 5, "w": 1.25},
{"x": 15, "y": 5, "w": 2},
{"x": 17, "y": 5},
]
},
"LAYOUT_96_with60_split_num0": {
"layout": [
{"x": 0, "y": 0},
{"x": 1, "y": 0},
{"x": 2, "y": 0},
{"x": 3, "y": 0},
{"x": 4, "y": 0},
{"x": 5, "y": 0},
{"x": 6, "y": 0},
{"x": 7, "y": 0},
{"x": 8, "y": 0},
{"x": 9, "y": 0},
{"x": 10, "y": 0},
{"x": 11, "y": 0},
{"x": 12, "y": 0},
{"x": 13, "y": 0},
{"x": 14, "y": 0},
{"x": 15, "y": 0},
{"x": 16, "y": 0},
{"x": 17, "y": 0},
{"x": 18, "y": 0},
{"x": 0, "y": 1},
{"x": 1, "y": 1},
{"x": 2, "y": 1},
{"x": 3, "y": 1},
{"x": 4, "y": 1},
{"x": 5, "y": 1},
{"x": 6, "y": 1},
{"x": 7, "y": 1},
{"x": 8, "y": 1},
{"x": 9, "y": 1},
{"x": 10, "y": 1},
{"x": 11, "y": 1},
{"x": 12, "y": 1},
{"x": 13, "y": 1, "w": 2},
{"x": 15, "y": 1},
{"x": 16, "y": 1},
{"x": 17, "y": 1},
{"x": 18, "y": 1},
{"x": 0, "y": 2, "w": 1.5},
{"x": 1.5, "y": 2},
{"x": 2.5, "y": 2},
{"x": 3.5, "y": 2},
{"x": 4.5, "y": 2},
{"x": 5.5, "y": 2},
{"x": 6.5, "y": 2},
{"x": 7.5, "y": 2},
{"x": 8.5, "y": 2},
{"x": 9.5, "y": 2},
{"x": 10.5, "y": 2},
{"x": 11.5, "y": 2},
{"x": 12.5, "y": 2},
{"x": 13.5, "y": 2, "w": 1.5},
{"x": 15, "y": 2},
{"x": 16, "y": 2},
{"x": 17, "y": 2},
{"x": 18, "y": 2, "h": 2},
{"x": 0, "y": 3, "w": 1.75},
{"x": 1.75, "y": 3},
{"x": 2.75, "y": 3},
{"x": 3.75, "y": 3},
{"x": 4.75, "y": 3},
{"x": 5.75, "y": 3},
{"x": 6.75, "y": 3},
{"x": 7.75, "y": 3},
{"x": 8.75, "y": 3},
{"x": 9.75, "y": 3},
{"x": 10.75, "y": 3},
{"x": 11.75, "y": 3},
{"x": 12.75, "y": 3, "w": 2.25},
{"x": 15, "y": 3},
{"x": 16, "y": 3},
{"x": 17, "y": 3},
{"x": 0, "y": 4, "w": 2.25},
{"x": 2.25, "y": 4},
{"x": 3.25, "y": 4},
{"x": 4.25, "y": 4},
{"x": 5.25, "y": 4},
{"x": 6.25, "y": 4},
{"x": 7.25, "y": 4},
{"x": 8.25, "y": 4},
{"x": 9.25, "y": 4},
{"x": 10.25, "y": 4},
{"x": 11.25, "y": 4},
{"x": 12.25, "y": 4, "w": 2.75},
{"x": 15, "y": 4},
{"x": 16, "y": 4},
{"x": 17, "y": 4},
{"x": 18, "y": 4, "h": 2},
{"x": 0, "y": 5, "w": 1.25},
{"x": 1.25, "y": 5, "w": 1.25},
{"x": 2.5, "y": 5, "w": 1.25},
{"x": 3.75, "y": 5, "w": 6.25},
{"x": 10, "y": 5, "w": 1.25},
{"x": 11.25, "y": 5, "w": 1.25},
{"x": 12.5, "y": 5, "w": 1.25},
{"x": 13.75, "y": 5, "w": 1.25},
{"x": 15, "y": 5},
{"x": 16, "y": 5},
{"x": 17, "y": 5}
]
}
}
}

View file

@ -0,0 +1,38 @@
#include QMK_KEYBOARD_H
enum custom_keycodes {
QWERTY = SAFE_RANGE,
DYNAMIC_MACRO_RANGE,
};
#include "dynamic_macro.h"
#define KC_REC DYN_REC_START1
#define KC_DONE DYN_REC_STOP
#define KC_PLAY DYN_MACRO_PLAY1
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT(
KC_ESC, 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_PSCR, KC_HOME, KC_END, KC_PGUP, KC_PGDN, 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_MINS, KC_EQL, KC_BSLS, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
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, KC_P7, KC_P8, KC_P9, KC_PPLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, TT(1), KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT),
LAYOUT(
RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_CALC, _______, _______, _______,
_______, RGB_TOG, _______, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, KC_TAB,
BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_TAB,
_______, _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, KC_PLAY, _______, KC_REC, KC_DONE, _______, _______, _______, _______, _______, _______),
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (!process_record_dynamic_macro(keycode, record)) {
return false;
}
return true;
}

View file

@ -0,0 +1,20 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_all(
KC_ESC, 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_PSCR, KC_HOME, KC_END, KC_PGUP, KC_PGDN, 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_MINS, KC_EQL, KC_BSLS, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
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, KC_P7, KC_P8, KC_P9, KC_PMNS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
),
[1] = LAYOUT_all(
RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, RGB_TOG, _______, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______,
BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};

View file

@ -0,0 +1,36 @@
#include QMK_KEYBOARD_H
enum custom_keycodes {
KC_P00 = SAFE_RANGE
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_96_with60_split_num0(
KC_ESC, 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_PSCR, KC_HOME, KC_END, KC_PGUP, KC_PGDN, 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_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
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, KC_P7, KC_P8, KC_P9, KC_PPLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_P1, KC_P2, KC_P3, KC_PENT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL, KC_P0, KC_P00, KC_PDOT
),
[1] = LAYOUT_96_with60_split_num0(
RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, RGB_TOG, _______, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______,
BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_P00:
if (record->event.pressed) {
tap_code(KC_P0);
tap_code(KC_P0);
}
return false;
}
return true;
}

View file

@ -0,0 +1,34 @@
/* Copyright 2021 Milan Düwel
*
* 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 <http://www.gnu.org/licenses/>.
*/
#pragma once
#define COMBO_COUNT 4
#define COMBO_TERM 100
//#define UNICODE_SELECTED_MODES UC_WINC
#define RGBLIGHT_LAYERS
#define RGBLIGHT_LAYER_BLINK
#undef RGBLIGHT_ANIMATIONS
#define RGBLIGHT_EFFECT_ALTERNATING
#define RGBLIGHT_EFFECT_BREATHING
#define RGBLIGHT_EFFECT_CHRISTMAS
#define RGBLIGHT_EFFECT_KNIGHT
#define RGBLIGHT_EFFECT_SNAKE
#define RGBLIGHT_EFFECT_TWINKLE

View file

@ -0,0 +1,161 @@
/* Copyright 2021 Milan Düwel
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
/* This keymap is designed for use with a German keyboard layout.
* It is essentially the same as the default via keymap but adds combo functionality to type umlauts as well as lighting layers for various actions.
* Toggling the combo feature also disables KC_LGUI so both can be turned off for gaming. If you want to get rid of it without reflashing new firmware, use KC_RGUI instead.
* Layers 2 and 3 are currently unused but are configurable within via.
*/
enum combos {
UML_AE,
UML_OE,
UML_UE,
UML_SZ
};
const uint16_t PROGMEM ae_combo[] = {KC_A, KC_E, COMBO_END};
const uint16_t PROGMEM oe_combo[] = {KC_O, KC_E, COMBO_END};
const uint16_t PROGMEM ue_combo[] = {KC_U, KC_E, COMBO_END};
const uint16_t PROGMEM sz_combo[] = {KC_S, KC_Y, COMBO_END};
combo_t key_combos[COMBO_COUNT] = {
[UML_AE] = COMBO(ae_combo, KC_QUOT),
[UML_OE] = COMBO(oe_combo, KC_SCLN),
[UML_UE] = COMBO(ue_combo, KC_LBRC),
[UML_SZ] = COMBO(sz_combo, KC_MINS)
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_ESC, 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_PSCR, KC_HOME, KC_END, KC_PGUP, KC_PGDN, 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_MINS, KC_EQL, KC_BSLS, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
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, KC_P7, KC_P8, KC_P9, KC_PMNS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT),
[1] = LAYOUT(
RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD,
KC_TRNS, RGB_TOG, KC_TRNS, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD,
BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, CMB_TOG, BL_TOGG, BL_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END, KC_TRNS, KC_TRNS, KC_MUTE),
[2] = LAYOUT(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
[3] = LAYOUT(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
};
/* The lighting layers feature a caps indicator as well as layer blinks for mute and the function layer (blink only to allow unhindered adjustment of the RGB backlight settings).
Sadly these colours can not be customized within VIA.
*/
const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 1, HSV_RED},
{15, 17, HSV_RED}
);
const rgblight_segment_t PROGMEM my_function_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{10, 12, HSV_YELLOW}
);
const rgblight_segment_t PROGMEM my_f2_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 17, HSV_CYAN}
);
const rgblight_segment_t PROGMEM my_f3_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 17, HSV_PURPLE}
);
const rgblight_segment_t PROGMEM my_flash_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 17, HSV_RED}
);
// Now define the array of layers. Later layers take precedence
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
my_capslock_layer,
my_function_layer, // Overrides caps lock layer
my_f2_layer,
my_f3_layer,
my_flash_layer
);
void keyboard_post_init_user(void) {
// Enable the LED layers
rgblight_layers = my_rgb_layers;
};
bool led_update_user(led_t led_state) {
rgblight_set_layer_state(0, led_state.caps_lock);
return true;
};
layer_state_t layer_state_set_user(layer_state_t state) {
//rgblight_set_layer_state(1, layer_state_cmp(state, 1));
rgblight_set_layer_state(2, layer_state_cmp(state, 2));
rgblight_set_layer_state(3, layer_state_cmp(state, 3));
return state;
};
// Note we user post_process_record_user because we want the state
// after the flag has been flipped...
void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_CAPS:
case KC_MUTE:
case CMB_TOG:
if (record->event.pressed) {
rgblight_blink_layer(4, 250);
}
break;
case MO(1):
if (record->event.pressed) {
rgblight_blink_layer(1, 250);
}
break;
}
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_LGUI: //use combo toggle to disable the win key while gaming
if (record->event.pressed) {
if (is_combo_enabled()==false) {
return false;
}
}
return true; // Let QMK send the enter press/release events
default:
return true; // Process all other keycodes normally
}
};

View file

@ -0,0 +1,3 @@
# DvZ's VIA compatible keymap with rolling umlauts for german typists
Added by: [devilzmods](https://github.com/devilzmods)

View file

@ -0,0 +1,5 @@
VIA_ENABLE = yes
LTO_ENABLE = yes # reduce firmware size
COMBO_ENABLE = yes
#UNICODE_ENABLE = yes
BOOTLOADER = caterina

View file

@ -0,0 +1,3 @@
#pragma once
#define LAYER_FN

View file

@ -0,0 +1,77 @@
#include QMK_KEYBOARD_H
#include "konstantin.h"
static const HSV *colors[] = { &godspeed_blue, &godspeed_yellow };
static const size_t cnum = sizeof colors / sizeof *colors;
static size_t cidx = 0;
enum keycodes_keymap {
RGB_SET = RANGE_KEYMAP,
};
void eeconfig_init_keymap(void) {
rgblight_sethsv(colors[cidx]->h, colors[cidx]->s, colors[cidx]->v);
}
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case RGB_SET:
if (record->event.pressed) {
cidx = (cidx + 1) % cnum;
rgblight_sethsv(colors[cidx]->h, colors[cidx]->s, colors[cidx]->v);
}
break;
}
return true;
}
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Base layer
*
* EscF1 F2 F3 F4 F5 F6 F7 F8 F9 F10F11F12PScInsHomEndPgUPgD
*
* ` 1 2 3 4 5 6 7 8 9 0 - = \ DelNLkP/ P* P-
*
* Tab Q W E R T Y U I O P [ ] Bspc P7 P8 P9
* P+
* FnCaps A S D F G H J K L ; ' Enter P4 P5 P6
*
* LSftRAG Z X C V B N M , . / RSfRCt P1 P2 P3
* PEn
* LCtlLGuiLAlt Space RAlGuFnFLk P0 P.
*
*/
[L_BASE] = LAYOUT(
KC_ESC, 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_PSCR, KC_INS, KC_HOME, KC_END, KC_PGUP, KC_PGDN,
KC_GRV, 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_BSLS, KC_DEL, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
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_BSPC, KC_P7, KC_P8, KC_P9, XXXXXXX,
FN_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, RAL_RGU, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSF_RCT, KC_UP, KC_P1, KC_P2, KC_P3, XXXXXXX,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, RAL_RGU, XXXXXXX, FN_FNLK, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
),
/* Fn layer
*
* SysSLkPauBrkTopBtm
*
* F1 F2 F3 F4 F5 F6 F7 F8 F9 F10F11F12 RTg ÷ ×
*
* M4 M2 M M1 M3 M5 UCM StpPlyPrvNxtClearRH+RS+RV+
* RSt
* M M M MW RH-RS-RV-
*
* MA0MA2MWMW AppVo-Vo+Mut PgURMRRMSRMB
* RMP
* DtPRDtNA MW HomPgDEndRM-RM+
*
*/
[L_FN] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, SYSRQ, KC_SLCK, KC_PAUS, BREAK, TOP, BOTTOM,
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, RGB_TOG, DIVIDE, TIMES, MINUS,
KC_BTN4, KC_BTN2, KC_MS_U, KC_BTN1, KC_BTN3, KC_BTN5, _______, UC_MOD, _______, KC_MSTP, KC_MPLY, KC_MPRV, KC_MNXT, CLEAR, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX,
_______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SET,
_______, _______, KC_ACL0, KC_ACL2, KC_WH_L, KC_WH_R, _______, _______, KC_APP, KC_VOLD, KC_VOLU, KC_MUTE, _______, KC_PGUP, RGB_M_R, RGB_M_SN,RGB_M_B, XXXXXXX,
_______, DST_P_R, DST_N_A, KC_WH_D, _______, XXXXXXX, _______, KC_HOME, KC_PGDN, KC_END, RGB_RMOD,RGB_MOD, RGB_M_P
),
};

View file

@ -0,0 +1,19 @@
# Generic features
BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
COMMAND_ENABLE = yes
CONSOLE_ENABLE = yes
EXTRAKEY_ENABLE = yes
MOUSEKEY_ENABLE = yes
NKRO_ENABLE = yes
TAP_DANCE_ENABLE = yes
UNICODEMAP_ENABLE = yes
# Keyboard-specific features
BACKLIGHT_ENABLE = no
RGBLIGHT_ENABLE = yes
VIA_ENABLE = yes
# Firmware size reduction
GRAVE_ESC_ENABLE = no
MAGIC_ENABLE = no
SPACE_CADET_ENABLE = no

View file

@ -0,0 +1,36 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_all(
KC_ESC, 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_PSCR, KC_HOME, KC_END, KC_PGUP, KC_PGDN, 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_MINS, KC_EQL, KC_BSLS, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
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, KC_P7, KC_P8, KC_P9, KC_PMNS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
),
[1] = LAYOUT_all(
RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, RGB_TOG, _______, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______,
BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
[2] = LAYOUT_all(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
[3] = LAYOUT_all(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};

View file

@ -0,0 +1,2 @@
VIA_ENABLE = yes
LTO_ENABLE = yes

View file

@ -0,0 +1,22 @@
/* Copyright 2018 MechMerlin
*
* 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 <http://www.gnu.org/licenses/>.
*/
#pragma once
// Enable cmd-option-escape on mac.
#define GRAVE_ESC_ALT_OVERRIDE
// place overrides here

View file

@ -0,0 +1,489 @@
/* Copyright 2019 Yonatan Zunger
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include <assert.h>
// This keymap is designed to make it easy to type in a wide variety of languages, as well as
// generate mathematical symbols (à la Space Cadet).
//
// LAYER MAGIC (aka, typing in many alphabets)
// This keyboard has three "base" layers: QWERTY, GREEK, and CADET. The GREEK and CADET layers
// are actually full of Unicode points, and so which point they generate depends on things like
// whether the shift key is down. To handle this, each of those layers is actually *two* layers, one
// with and one without shift. In our main loop, we manage modifier state detection, as well as
// layer switch detection, and pick the right layer on the fly.
// Layers are selected with a combination of three keys. The "Greek" and "Cadet" keys act like
// modifiers: When held down, they transiently select the indicated base layer. The "Layer Lock" key
// locks the value of the base layer at whatever is currently held; so e.g., if you hold Greek +
// Layer Lock, you'll stay in Greek mode until you hit Layer Lock again without any of the mods
// held.
// TODO: This system of layer selection is nice for math, but it's not very nice for actually
// typing in multiple languages. It seems like a better plan will be to reserve one key for each
// base layer -- maybe fn + F(n) -- which can either be held as a modifier or tapped to switch
// layers. That will open up adding some more languages, like Yiddish, but to do this effectively
// we'll need to find a good UI with which to show the currently selected layer. Need to check what
// the melody96 has in the way of outputs (LEDs, sound, etc).
//
// ACCENT MAGIC (aka, typing conveniently in Romance languages)
// We want to support easy typing of diacritical marks. We can't rely on the host OS for this,
// because (e.g.) on MacOS, to make any of the other stuff work, we need to be using the Unicode
// input method at the OS level, which breaks all the normal accent stuff on that end. So we do it
// ourselves. Accents can actually be invoked in two different ways: one fast and very compatible,
// one very versatile but with occasional compatibility problems.
//
// THE MAIN WAY: You can hit one of the "accent request" key patterns immediately *before* typing
// a letter to be accented. It will emit the corresponding accented Unicode. For example, you can
// hit fn-e to request an acute accent, followed by i, and it will output í, U+00ED LATIN SMALL
// LETTER I WITH ACUTE. These "combined characters" are in Unicode normal form C (NFKC), which is
// important because many European websites and apps, in particular, tend to behave very badly
// (misunderstanding and/or crashing) when presented with characters in other forms! The catch is
// that this only works for the various combinations of letters and accents found in the Latin-1
// supplement block of Unicode -- basically, things you need for Western European languages.
//
// (NB: If you make an accent request followed by a letter which can't take the corresponding
// accent, it will output the uncombined form of the accent followed by whatever you typed; so
// e.g., if you hit fn-e followed by f, it will output ´f, U+00B4 ACUTE ACCENT followed by an
// ordinary f. This is very similar to the default behavior of MacOS.)
//
// THE FLEXIBLE WAY: If you hit the accent request with a shift -- e.g., fn-shift-e -- it will
// instead immediately output the corresponding *combining* Unicode accent mark, which will modify
// the *previous* character you typed. For example, if you type i followed by fn-shift-e, it will
// generate í. But don't be fooled by visual similarity: unlike the previous example, this one is
// an ordinary i followed by U+0301 COMBINING ACUTE ACCENT. It's actually *two symbols*, and this
// is Unicode normal form D (NFKD). Unlike NFKC, there are NFKD representations of far more
// combinations of letters and accents, and it's easy to add more of these if you need. (The NFKC
// representation of such combinations is identical to their NFKD representation)
//
// Programs that try to compare Unicode strings *should* first normalize them by converting them
// all into one normal form or another, and there are functions in every programming language to
// do this -- e.g., JavaScript's string.normalize() -- but lots of programmers fail to understand
// this, and so write code that massively freaks out when it encounters the wrong form.
//
// The current accent request codes are modeled on the ones in MacOS.
//
// fn+` Grave accent (`)
// fn+e Acute accent (´)
// fn+i Circumflex (^)
// fn+u Diaresis / umlaut / trema (¨)
// fn+c Cedilla (¸)
// fn+n Tilde (˜)
//
// Together, these functions make for a nice "polyglot" keyboard: one that can easily type in a wide
// variety of languages, which is very useful for people who, well, need to type in a bunch of
// languages.
//
// The major TODOs are:
// - Update the layer selection logic (and add visible layer cues);
// - Factor the code below so that the data layers are more clearly separated from the code logic,
// so that other users of this keymap can easily add whichever alphabets they need without
// having to deeply understand the implementation.
enum custom_keycodes {
// We provide special layer management keys:
// GREEK triggers the Greek (aka "Front") layer, or the SHIFTGREEK layer when shift is held.
// (Because we use Unicode, we need to implement shift-handling at the firmware level,
// rather than the OS level like we do in the QWERTY layer)
// CADET or GREEK+ALT triggers the Cadet (aka "Top") layer, or the SHIFTCADET layer when
// shift is held.
// LAYER_LOCK locks the "base" layer (i.e., QWERTY, GREEK, or CADET) to the value which is
// pressed at the moment that it is being released. When a layer lock is set, the
// analogous layer modifier key is reversed; e.g., if you lock the GREEK layer, then the
// GREEK button bounces you back to QWERTY.
//
// We also parse the shift, alt, and caps lock keys to provide management of those which is
// compatible with these various layers.
KC_GREEK = SAFE_RANGE,
KC_CADET,
KC_LAYER_LOCK,
// These are the keycodes generated by the various "accent request" keystrokes.
KC_ACCENT_START,
KC_CGRV = KC_ACCENT_START, // Grave accent
KC_CAGU, // Acute accent
KC_CDIA, // Diaresis / umlaut / trema
KC_CCIR, // Circumflex
KC_CCED, // Cedilla
KC_CTIL, // Tilde
KC_ACCENT_END,
};
enum layers_keymap {
_QWERTY = 0,
_FUNCTION,
_GREEK,
_SHIFTGREEK,
_CADET,
_SHIFTCADET,
};
// This is so that H(xxxx) has the same width as _______, which makes the grids more legible.
#define H(x) UC(0x##x)
#define MO_FN MO(_FUNCTION)
#define KC_LLCK KC_LAYER_LOCK
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// NB: Using GESC for escape in the QWERTY layer as a temporary hack because I messed up the
// switch on the KC_GRV key; change back to KC_ESC once this is fixed.
[_QWERTY] = LAYOUT_hotswap(
KC_GESC, 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_HOME, KC_END, KC_PGUP, KC_PGDN, KC_MPLY, KC_BRK,
KC_GRV, 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_LLCK, KC_PSLS, KC_PAST, KC_PMNS,
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, KC_P7, KC_P8, KC_P9,
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3,
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, MO_FN, KC_GREEK,KC_CADET,KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT),
/* The Greek layers. Shown here are the QWERTY layer (for visual reference) and the two Greek
* layers.
* ,----------------------------------------------------------------------------
* | ` |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|HOM|END|PGU|PGD|MUT|BRK| QWERTY
* | ` | | | | | | | | | | | | | | | | | | | SHIFTGREEK
* | ` | ¹ | ² | ³ | | | | | | | | | | | | | | | | GREEK
* |---------------------------------------------------------------------------|
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | + | BKSPC |LCK| / | * | - |
* | ` | ¿ | | | | | | | | | | | | BKSPC |LCK| | | |
* | | | | | | | | | | | | | | BKSPC |LCK| | | |
* |---------------------------------------------------------------------------|
* | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | 7 | 8 | 9 | |
* | | Θ | Ω | Ε | Ρ | Τ | Ψ | Υ | Ι | Ο | Π | | | | | | | |
* | | θ | ω | ε | ρ | τ | ψ | υ | ι | ο | π | | | | | | | |
* |-----------------------------------------------------------------------| + |
* | CTRL | A | S | D | F | G | H | J | K | L | ; | ' | RET | 4 | 5 | 6 | |
* | CTRL | Α | Σ | Δ | Φ | Γ | Η | | Κ | Λ | | | RET | | | | |
* | CTRL | α | σ | δ | φ | γ | η | ϑ | κ | λ | | | RET | | | | |
* |-----------------------------------------------------------------------|---|
* | SHIFT | Z | X | C | V | B | N | M | , | . | / |SHFT | | 1 | 2 | 3 | |
* | SHIFT | Ζ | Ξ | Χ | | Β | Ν | Μ | | | |SHFT | | | | | |
* | SHIFT | ζ | ξ | χ | ς | β | ν | μ | | | |SHFT | | | | | |
* |-----------------------------------------------------------------------|ENT|
* | CTL | ALT| CMD| SPACE | α | β | γ | | | | 0 | . | |
* | CTL | ALT| CMD| SPACE | α | β | γ | | | | | | |
* | CTL | ALT| CMD| SPACE | α | β | γ | | | | | | |
* `---------------------------------------------------------------------------'
*/
[_GREEK] = LAYOUT_hotswap(
KC_GRV, H(00b9), H(00b2), H(00b3), H(2074), H(2075), H(2076), H(2077), H(2078), H(2079), H(2070), H(207b), H(207a), H(207d), H(207e), XXXXXXX, XXXXXXX, XXXXXXX, _______,
KC_GRV, _______, _______, _______, _______, _______, _______, _______, H(00b0), _______, _______, H(221d), H(223c), _______, _______, H(2298), H(2299), H(2296),
_______, H(03b8), H(03c9), H(03b5), H(03c1), H(03c4), H(03c8), H(03c5), H(03b9), H(03bf), H(03c0), KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9,
_______, H(03b1), H(03c3), H(03b4), H(03c6), H(03b3), H(03b7), H(03d1), H(03ba), H(03bb), H(22ef), H(22c5), _______, KC_P4, KC_P5, KC_P6, H(2295),
_______, H(03b6), H(03be), H(03c7), H(03c2), H(03b2), H(03bd), H(03bc), H(226a), H(226b), H(222b), _______, _______, KC_P1, KC_P2, KC_P3,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_PENT),
[_SHIFTGREEK] = LAYOUT_hotswap(
KC_GRV, H(2081), H(2082), H(2083), H(2084), H(2085), H(2086), H(2087), H(2088), H(2089), H(2080), H(208b), H(208a), H(208d), H(208e), XXXXXXX, XXXXXXX, XXXXXXX, _______,
KC_GRV, H(00bf), _______, H(20ac), _______, _______, _______, _______, _______, _______, _______, XXXXXXX, H(2241), _______, _______, XXXXXXX, H(2297), XXXXXXX,
_______, H(0398), H(03a9), H(0395), H(03a1), H(03a4), H(03a8), H(03a5), H(0399), H(039f), H(03a0), KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9,
_______, H(0391), H(03a3), H(0394), H(03a6), H(0393), H(0397), XXXXXXX, H(039a), H(039b), H(2026), H(2234), _______, KC_P4, KC_P5, KC_P6, H(2295),
_______, H(0396), H(039e), H(03a7), H(2714), H(0392), H(039d), H(039c), H(2272), H(2273), XXXXXXX, _______, _______, KC_P1, KC_P2, KC_P3,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_PENT),
/* The Cadet layers. Again, we show the QWERTY layer and the two cadet layers.
* ,----------------------------------------------------------------------------
* | ` |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|HOM|END|PGU|PGD|MUT|BRK| QWERTY
* | | | | | | | | | | | | | | | | | | | | SHIFTCADET
* | ¬ | | | | | | | | | | | | | | | | | | | CADET
* |---------------------------------------------------------------------------|
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | + | BKSPC |LCK| / | * | - |
* | ` | ¡ | | £ | | | | | ° | | | * | | BKSPC |LCK| | | |
* | | | | | | | | | | | | | ± | BKSPC |LCK| | × | |
* |---------------------------------------------------------------------------|
* | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | 7 | 8 | 9 | |
* | | | | | | | | | | | | | | | * | * | * | |
* | | | | | | | | | | | | | | | * | * | * | | [1]
* |-----------------------------------------------------------------------| + |
* | CTRL | A | S | D | F | G | H | J | K | L | ; | ' | RET | 4 | 5 | 6 | |
* | CTRL | | | | | | | | | | | | RET | * | * | * | |
* | CTRL | | | | | | | | | | | | RET | * | * | * | | [1]
* |-----------------------------------------------------------------------|---|
* | SHIFT | Z | X | C | V | B | N | M | , | . | / |SHFT | | 1 | 2 | 3 | |
* | SHIFT | | | | | | | | | | |SHFT | | * | * | * | |
* | SHIFT | | | | | | | | | | ÷ |SHFT | | * | * | * | | [1]
* |-----------------------------------------------------------------------|ENT|
* | CTL | ALT| CMD| SPACE | α | β | γ | | | | 0 | . | |
* | CTL | ALT| CMD| SPACE | α | β | γ | | | | | | |
* | CTL | ALT| CMD| SPACE | α | β | γ | | | | | | |
* `---------------------------------------------------------------------------'
* [1] CADET + numpad moves the mouse. SHIFT+CADET+NUMPAD moves it more quickly. CADET+5
* clicks the mouse, and SHIFT+CADET+FIVE right-clicks.
*/
[_CADET] = LAYOUT_hotswap(
H(00AC), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
KC_GRV, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, H(00b1), _______, _______, XXXXXXX, H(00d7), XXXXXXX,
_______, H(2227), H(2228), H(2229), H(222a), H(2282), H(2283), H(2200), H(221e), H(2203), H(2202), H(2208), XXXXXXX, XXXXXXX, KC_P7, KC_P8, KC_P9,
_______, H(22a5), H(22a4), H(22a2), H(22a3), H(2191), H(2193), H(2190), H(2192), H(2194), XXXXXXX, XXXXXXX, _______, KC_P4, KC_P5, KC_P6, XXXXXXX,
_______, XXXXXXX, H(2260), XXXXXXX, H(2248), H(2261), H(2264), H(2265), XXXXXXX, XXXXXXX, H(00f7), _______, _______, KC_P1, KC_P2, KC_P3,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_PENT),
[_SHIFTCADET] = LAYOUT_hotswap(
H(2205), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
KC_GRV, H(00a1), XXXXXXX, H(00a3), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, H(2213), _______, _______, XXXXXXX, XXXXXXX, XXXXXXX,
_______, H(211a), XXXXXXX, XXXXXXX, H(211d), H(2286), H(2287), XXXXXXX, H(2135), H(2204), XXXXXXX, H(2209), XXXXXXX, XXXXXXX, KC_P7, KC_P8, KC_P9,
_______, H(212b), XXXXXXX, H(2207), XXXXXXX, H(21d1), H(21d3), H(21d0), H(21d2), H(21d4), XXXXXXX, XXXXXXX, _______, KC_P4, KC_P5, KC_P6, XXXXXXX,
_______, H(2124), H(2102), XXXXXXX, H(2249), H(2262), H(2115), XXXXXXX, XXXXXXX, XXXXXXX, H(00f7), _______, _______, KC_P1, KC_P2, KC_P3,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_PENT),
// Function layer is mostly for keyboard meta-control operations, but also contains the combining
// accent marks. These are deliberately placed to match where the analogous controls go on Mac OS.
[_FUNCTION] = LAYOUT_hotswap(
KC_CGRV, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RESET,
KC_CGRV, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, KC_CAGU, _______, _______, _______, KC_CDIA, KC_CCIR, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, UC_M_OS, UC_M_LN, UC_M_WI, UC_M_BS, UC_M_WC, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, KC_CCED, _______, _______, KC_CTIL, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
};
////////////////////////////////////////////////////////////////////////////////////////////////////
// Accent implementation
//
// In the body of process_record_user, we store an "accent_request", which is the accent keycode if
// one was just selected, or zero otherwise. When the *next* key is hit, we look up whether the
// accent request plus that next keycode (plus the state of the shift key) together amount to an
// interesting combined (NFKC) character, and if so, emit it; otherwise, we emit the accent as a
// separate character and then process the next key normally. The resulting UI behavior is similar
// to that of the combining accent keys in MacOS.
//
// We store two arrays, depending on whether shift is or isn't held. Each is two-dimensional, with
// its outer key by the next keycode struck, and the inner key by the accent requested. The outer
// array has KC_Z + 1 as its upper bound, so that we can save memory by only coding alphabetic keys.
// The contents are either Unicode code points, or zero to indicate that we don't have a point for
// this combination.
#define KC_NUM_ACCENTS (KC_ACCENT_END - KC_ACCENT_START)
#define KC_NUM_SLOTS (KC_Z + 1)
const uint16_t PROGMEM unshifted_accents[KC_NUM_SLOTS][KC_NUM_ACCENTS] = {
// KC_CGRV, KC_CAGU, KC_CDIA, KC_CCIR, KC_CCED, KC_CTIL
[KC_A] = { 0x00e0, 0x00e1, 0x00e4, 0x00e2, 0, 0x00e3 },
[KC_E] = { 0x00e8, 0x00e9, 0x00eb, 0x00ea, 0, 0 },
[KC_I] = { 0x00ec, 0x00ed, 0x00ef, 0x00ee, 0, 0 },
[KC_O] = { 0x00f2, 0x00f3, 0x00f6, 0x00f4, 0, 0x00f5 },
[KC_U] = { 0x00f9, 0x00fa, 0x00fc, 0x00fb, 0, 0 },
[KC_Y] = { 0, 0, 0x00ff, 0, 0, 0 },
[KC_N] = { 0, 0, 0, 0, 0, 0x00f1 },
[KC_C] = { 0, 0, 0, 0, 0x00e7, 0 },
};
const uint16_t PROGMEM shifted_accents[KC_NUM_SLOTS][KC_NUM_ACCENTS] = {
// KC_CGRV, KC_CAGU, KC_CDIA, KC_CCIR, KC_CCED, KC_CTIL
[KC_A] = { 0x00c0, 0x00c1, 0x00c4, 0x00c2, 0, 0x00c3 },
[KC_E] = { 0x00c8, 0x00c9, 0x00cb, 0x00ca, 0, 0 },
[KC_I] = { 0x00cc, 0x00cd, 0x00cf, 0x00ce, 0, 0 },
[KC_O] = { 0x00d2, 0x00d3, 0x00d6, 0x00d4, 0, 0x00d5 },
[KC_U] = { 0x00d9, 0x00da, 0x00dc, 0x00db, 0, 0 },
[KC_Y] = { 0, 0, 0x00df, 0, 0, 0 },
[KC_N] = { 0, 0, 0, 0, 0, 0x00d1 },
[KC_C] = { 0, 0, 0, 0, 0x00c7, 0 },
};
// The uncombined and combined forms of the accents, for when we want to emit them as single
// characters.
const uint16_t PROGMEM uncombined_accents[KC_NUM_ACCENTS] = {
[KC_CGRV - KC_ACCENT_START] = 0x0060,
[KC_CAGU - KC_ACCENT_START] = 0x00b4,
[KC_CDIA - KC_ACCENT_START] = 0x00a8,
[KC_CCIR - KC_ACCENT_START] = 0x005e,
[KC_CCED - KC_ACCENT_START] = 0x00b8,
[KC_CTIL - KC_ACCENT_START] = 0x02dc,
};
const uint16_t PROGMEM combined_accents[KC_NUM_ACCENTS] = {
[KC_CGRV - KC_ACCENT_START] = 0x0300,
[KC_CAGU - KC_ACCENT_START] = 0x0301,
[KC_CDIA - KC_ACCENT_START] = 0x0308,
[KC_CCIR - KC_ACCENT_START] = 0x0302,
[KC_CCED - KC_ACCENT_START] = 0x0327,
[KC_CTIL - KC_ACCENT_START] = 0x0303,
};
// This function manages keypresses that happen after an accent has been selected by an earlier
// keypress.
// Args:
// accent_key: The accent key which was earlier selected. This must be in the range
// [KC_ACCENT_START, KC_ACCENT_END).
// keycode: The keycode which was just pressed.
// is_shifted: The current shift state (as set by a combination of shift and caps lock)
// force_no_accent: If true, we're in a situation where we want to force there to be no
// accent combination -- if e.g. we're in a non-QWERTY layer, or if other modifier keys
// are held.
//
// Returns true if the keycode has been completely handled by this function (and so should not be
// processed further by process_record_user) or false otherwise.
bool process_key_after_accent(
uint16_t accent_key,
uint16_t keycode,
bool is_shifted,
bool force_no_accent
) {
assert(accent_key >= KC_ACCENT_START);
assert(accent_key < KC_ACCENT_END);
const int accent_index = accent_key - KC_ACCENT_START;
// If the keycode is outside A..Z, or force_no_accent is set, we know we shouldn't even bother
// with a table lookup.
if (keycode <= KC_Z && !force_no_accent) {
// Pick the correct array. Because this is progmem, we're going to need to do the
// two-dimensional array indexing by hand, and so we just cast it to a single-dimensional array.
const uint16_t *points = (const uint16_t*)(is_shifted ? shifted_accents : unshifted_accents);
const uint16_t code_point = pgm_read_word_near(points + KC_NUM_ACCENTS * keycode + accent_index);
if (code_point) {
register_unicode(code_point);
return true;
}
}
// If we get here, there was no accent match. Emit the accent as its own character, and then let
// the caller figure out what to do next.
register_unicode(pgm_read_word_near(uncombined_accents + accent_index));
return false;
}
// Layer bitfields.
#define GREEK_LAYER (1UL << _GREEK)
#define SHIFTGREEK_LAYER (1UL << _SHIFTGREEK)
#define CADET_LAYER (1UL << _CADET)
#define SHIFTCADET_LAYER (1UL << _SHIFTCADET)
// The layers we don't touch.
#define LAYER_MASK ~(GREEK_LAYER|SHIFTGREEK_LAYER|CADET_LAYER|SHIFTCADET_LAYER)
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
// We track these persistent globals and manage them on our own, rather than trying to rely on
// get_mods or the like, because this function is called *before* that's updated!
static bool shift_held = false;
static bool alt_held = false;
static bool ctrl_held = false;
static bool super_held = false;
static bool greek_held = false;
static bool cadet_held = false;
// These are where we remember the values of lock states.
static bool shift_lock = false;
static int layer_lock = _QWERTY;
// The accent request, or zero if there isn't one.
static uint16_t accent_request = 0;
// If this is set to true, don't trigger any handling of pending accent requests. That's what we
// want to do if e.g. the user just hit the shift key or something.
bool ignore_accent_change = !record->event.pressed;
// Step 1: Process any modifier key state changes, so we can maintain that state.
if (keycode == KC_LSHIFT || keycode == KC_RSHIFT) {
shift_held = record->event.pressed;
ignore_accent_change = true;
} else if (keycode == KC_LALT || keycode == KC_RALT) {
alt_held = record->event.pressed;
ignore_accent_change = true;
} else if (keycode == KC_LCTRL || keycode == KC_RCTRL) {
ctrl_held = record->event.pressed;
ignore_accent_change = true;
} else if (keycode == KC_LGUI || keycode == KC_RGUI) {
super_held = record->event.pressed;
ignore_accent_change = true;
} else if (keycode == KC_GREEK) {
greek_held = record->event.pressed;
ignore_accent_change = true;
} else if (keycode == KC_CADET) {
cadet_held = record->event.pressed;
ignore_accent_change = true;
}
// Step 2: Figure out which layer we're supposed to be in, by transforming all the prior stuff
// into layer requests.
const bool greek_request = (greek_held && !alt_held);
const bool cadet_request = (cadet_held || (greek_held && alt_held));
// Now, handle the lock keys. We store next_layer_lock in a local variable so that we can
// determine the layer to pick right now before we update layer_lock.
int next_layer_lock = layer_lock;
if (keycode == KC_CAPS) {
// If we're in QWERTY mode, caps lock is already going to be managed by the host OS, but by
// tracking it ourselves we can also usefully apply it to the GREEK and CADET layers.
if (record->event.pressed) {
shift_lock = !shift_lock;
}
} else if (keycode == KC_LAYER_LOCK) {
if (record->event.pressed) {
if (cadet_request) {
next_layer_lock = _CADET;
} else if (greek_request) {
next_layer_lock = _GREEK;
} else {
next_layer_lock = _QWERTY;
}
}
}
// OK! Now we know which buttons are being held, and the current and upcoming states of the locks.
// We can compute our new base layer. Remember that the CADET and GREEK keys act as their own
// antonyms if they match the layer lock -- e.g., if you have CADET locked, then CADET+X generates
// QWERTY-X.
int base_layer;
if (cadet_request) {
base_layer = (layer_lock == _CADET ? _QWERTY : _CADET);
} else if (greek_request) {
base_layer = (layer_lock == _GREEK ? _QWERTY : _GREEK);
} else {
base_layer = layer_lock;
}
const bool shifted = (shift_held != shift_lock);
int actual_layer;
if (base_layer == _CADET) {
actual_layer = (shifted ? _SHIFTCADET : _CADET);
} else if (base_layer == _GREEK) {
actual_layer = (shifted ? _SHIFTGREEK : _GREEK);
} else {
// We don't do shifting for the QWERTY layer, since for that we emit USB HID codes and shifting
// is managed by the host OS.
actual_layer = _QWERTY;
}
// And now we can update the layer lock and the actual firmware layer selector.
layer_lock = next_layer_lock;
layer_state_t new_layer_state = (layer_state & LAYER_MASK) | (1UL << actual_layer);
if (new_layer_state != layer_state) {
layer_state_set(new_layer_state);
}
// Step 3: Handle accents. If there's a pending accent request, process it. If what the user just
// hit creates a new accent request, update the pending state for the next keypress.
if (!ignore_accent_change && accent_request && record->event.pressed) {
// Only do the accent stuff if we're in the QWERTY layer and we aren't modifying something.
const bool force_no_accent = (
actual_layer != _QWERTY ||
ctrl_held ||
super_held ||
alt_held
);
const uint16_t old_accent = accent_request;
accent_request = 0;
if (process_key_after_accent(old_accent, keycode, shifted, force_no_accent)) {
return false;
}
}
// And if a new accent request just arrived, update accent_request.
if (keycode >= KC_ACCENT_START && keycode < KC_ACCENT_END && record->event.pressed) {
if (shifted) {
// Shift + accent request generates the combining accent key, and leaves accent_request alone.
register_unicode(pgm_read_word_near(combined_accents + keycode - KC_ACCENT_START));
return false;
} else {
accent_request = keycode;
}
}
return true;
}

View file

@ -0,0 +1,78 @@
* The "Cadet-Style" keymap for the melody96.
* Author: Yonatan Zunger (zunger@gmail.com)
This is an experimental keymap being used both for practical reasons (as my daily driver) and to
work out the ideas of a "space-cadet-style" keyboard which can type text and mathematical symbols
with equal ease. It's designed for anyone who frequently needs to do this outside of a LaTeX
environment, or for anyone who loves the old "Space Cadet" keyboard! And it works at its best when
you have actual Cadet keycaps (like SA Symbolics) installed, because those keycaps will actually
show what you get.
The core idea of this keyboard is that, in addition to a QWERTY base layer and a function layer, it
supports two additional base layers -- the GREEK layer (the analogue of the Space Cadet "Greek," or
"Front," keys) and the CADET layer (the analogue of the Space Cadet "Top" keys). These layers use
Unicode to generate all of the mathematical symbols you can find on a traditional Space Cadet
layout, plus a bunch of extras.
Because Unicode can't be encoded using the traditional USB HID protocol, QMK does some clever but
horrifying things to fool your OS. One consequence of this is that the shift key needs to be handled
by the keyboard firmware, not the host OS. To handle this, we have two additional layers --
SHIFTGREEK and SHIFTCADET -- and handle the flipping between all of these layers here in the
firmware.
*The simple bit: Using this layout on a Melody96*
At the core of this layout are three special modifier keys and two special lock keys:
* The GREEK key, to the right of the spacebar, activates the GREEK layer. GREEK+SHIFT activates
SHIFTGREEK. These keys generate Greek letters on the letter keys (thus the name), and a few
mathematical symbols on other keys. They correspond to the notations on the front of traditional
Space Cadet keys; if your capset doesn't include those (alas, most don't), they're the "pretty
obvious" mappings.
* The CADET key, to the right of GREEK, activates the CADET layer. These are the symbols above the
letters on a Space Cadet layout. CADET+SHIFT activates the SHIFTCADET layer, with even more
symbols.
* The FUNCTION key, to the right of CADET, activates the function layer. This is where you have a
reset mechanism, a selector for which Unicode input type you want, and so on.
Additionally, GREEK+ALT is equivalent to CADET. This is handy for other keyboards where you don't
have room for this many modifiers.
The lock keys are:
* Caps lock, if you use it, will also act as a "shift lock" for the Greek and Cadet layers. Shift
lock is slightly different, in that while it is engaged shift will _dis_engage it; that's actually
pretty useful when typing math.
* An additional "layer lock" key, by default where "num lock" usually goes, will lock the choice of
base layer. To use it, hold down any invocation of the GREEK or CADET layers, or none at all, and
hit lock; it will then put you in that layer. The corresponding modifier key will then toggle you
back to the QWERTY layer. (So for example, if you hit GREEK+LAYER_LOCK and release them, you're
now typing in Greek; the GREEK modifier would cause you to type QWERTY momentarily. To go back to
ordinary QWERTY mode, you'd just hit LAYER_LOCK again with no modifiers held)
To see the full layout, check out the big comment in keymap.c.
*A less-simple bit: Adapting this to other keyboards*
This is really a canary for generic Cadet implementations. Before this can be made generic, a few
things will have to happen:
(1) Instead of a fixed keymap, this has to be refactored into some kind of array showing the
mappings of QWERTY-layer keys onto the appropriate code points in the GREEK and CADET layers, and
some preprocessor magic needs to auto-transform this plus a traditional keymap for the QWERTY layer
into keymaps for all five of the core layers. (Function layers would presumably be handled on a
per-keyboard basis)
(2) The standard mapping of those should have some #define's to control things like whether there
are physical F-keys (you would probably want to move superscript and subscripts onto the numbers if
there weren't, and figure out what to do with the non-numeric super/sub keys), whether you actually
want to enable GREEK+ALT=CADET, and so on;
(3) There should be support for controlling indicator LEDs based on the base layer selection,
caps/shift lock state, and layer lock state, as well as for triggering audio on transitions;
(4) All the core fancy logic in process_record_user which implements the layer handling should be
factored out into its own function, so that keyboards can easily reuse that, too.
This is a lovely TODO for future work, and could be particularly fun to go along with new releases
of SA Symbolics and the like. Anyone interested in such things, ping me!

View file

@ -0,0 +1,2 @@
# You need Unicode for this map.
UNICODE_ENABLE = yes # Unicode

View file

@ -0,0 +1 @@
#include "melody96.h"

View file

@ -0,0 +1,233 @@
#pragma once
#include "quantum.h"
#define XXX KC_NO
/*
*
* 10 11 A3 A6
*
*
* 50 51 52 53 54 55 56 57 58 B8 B7 B5 B4 B3 B6 B2 B1 B0 63
*
* 40 41 42 43 44 45 46 47 48 A8 A7 A5 A4 A6 A2 A1 A0 64
*
* 30 31 32 33 34 35 36 37 38 98 97 95 94 93 96 92 91 80 93 90
*
* 20 21 22 23 24 25 26 27 28 88 87 85 84 86 82 81 84 80
*
* 10 12 13 14 15 16 17 18 78 77 75 74 73 76 72 71 60 70
*
* 00 01 02 06 08 07 05 04 03 62 61 60
*
*
* 74 66 62
*
*
* 00 01 02 06 08 05 04 03
*
*
* 00 01 02 06 08 07 04 03
*
*
* 00 01 06 08 05 04 03
*
*
* 00 01 06 08 07 04 03
*
*
* 00 01 06 08 07 05 04 03
*
*
* 00 01 02 06 07 04 03
*
*
* 00 01 02 06 07 05 04 03
*
*
* 00 01 02 06 08 05 04 03
*
*
* 00 01 02 06 08 07 05 04 03
*
*
* 00 01 02 06 08 07 04 03
*
*/
#define LAYOUT_all( \
k50, k51, k52, k53, k54, k55, k56, k57, k58, kB8, kB7, kB5, kB4, kB3, kB6, kB2, kB1, kB0, k63, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, kA8, kA7, kA5, kA4, kA3, kA6, kA2, kA1, kA0, k64, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k98, k97, k95, k94, k93, k96, k92, k91, k90, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k88, k87, k85, k84, k86, k82, k81, k80, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k78, k77, k75, k74, k73, k76, k72, k71, k70, \
k00, k01, k02, k06, k08, k07, k05, k04, k03, k66, k62, k61, k60 \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08 }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18 }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28 }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38 }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48 }, \
{ k50, k51, k52, k53, k54, k55, k56, k57, k58 }, \
{ k60, k61, k62, k63, k64, XXX, k66, XXX, XXX }, \
{ k70, k71, k72, k73, k74, k75, k76, k77, k78 }, \
{ k80, k81, k82, XXX, k84, k85, k86, k87, k88 }, \
{ k90, k91, k92, k93, k94, k95, k96, k97, k98 }, \
{ kA0, kA1, kA2, kA3, kA4, kA5, kA6, kA7, kA8 }, \
{ kB0, kB1, kB2, kB3, kB4, kB5, kB6, kB7, kB8 } \
}
#define LAYOUT_96_ansi( \
k50, k51, k52, k53, k54, k55, k56, k57, k58, kB8, kB7, kB5, kB4, kB3, kB6, kB2, kB1, kB0, k63, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, kA8, kA7, kA5, kA4, kA6, kA2, kA1, kA0, k64, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k98, k97, k95, k94, k93, k96, k92, k91, k80, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k88, k87, k85, k84, k86, k82, k81, \
k10, k12, k13, k14, k15, k16, k17, k18, k78, k77, k75, k74, k73, k76, k72, k71, k60, \
k00, k01, k02, k06, k08, k07, k05, k04, k03, k66, k62, k61 \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08 }, \
{ k10, XXX, k12, k13, k14, k15, k16, k17, k18 }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28 }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38 }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48 }, \
{ k50, k51, k52, k53, k54, k55, k56, k57, k58 }, \
{ k60, k61, k62, k63, k64, XXX, k66, XXX, XXX }, \
{ XXX, k71, k72, k73, k74, k75, k76, k77, k78 }, \
{ k80, k81, k82, XXX, k84, k85, k86, k87, k88 }, \
{ XXX, k91, k92, k93, k94, k95, k96, k97, k98 }, \
{ kA0, kA1, kA2, XXX, kA4, kA5, kA6, kA7, kA8 }, \
{ kB0, kB1, kB2, kB3, kB4, kB5, kB6, kB7, kB8 } \
}
#define LAYOUT_96_ansi_splitbs( \
k50, k51, k52, k53, k54, k55, k56, k57, k58, kB8, kB7, kB5, kB4, kB3, kB6, kB2, kB1, kB0, k63, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, kA8, kA7, kA5, kA4, kA3, kA6, kA2, kA1, kA0, k64, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k98, k97, k95, k94, k93, k96, k92, k91, k80, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k88, k87, k85, k84, k86, k82, k81, \
k10, k12, k13, k14, k15, k16, k17, k18, k78, k77, k75, k74, k73, k76, k72, k71, k60, \
k00, k01, k02, k06, k08, k07, k05, k04, k03, k66, k62, k61 \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08 }, \
{ k10, XXX, k12, k13, k14, k15, k16, k17, k18 }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28 }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38 }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48 }, \
{ k50, k51, k52, k53, k54, k55, k56, k57, k58 }, \
{ k60, k61, k62, k63, k64, XXX, k66, XXX, XXX }, \
{ XXX, k71, k72, k73, k74, k75, k76, k77, k78 }, \
{ k80, k81, k82, XXX, k84, k85, k86, k87, k88 }, \
{ XXX, k91, k92, k93, k94, k95, k96, k97, k98 }, \
{ kA0, kA1, kA2, XXX, kA4, kA5, kA6, kA7, kA8 }, \
{ kB0, kB1, kB2, kB3, kB4, kB5, kB6, kB7, kB8 } \
}
#define LAYOUT_96_iso( \
k50, k51, k52, k53, k54, k55, k56, k57, k58, kB8, kB7, kB5, kB4, kB3, kB6, kB2, kB1, kB0, k63, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, kA8, kA7, kA5, kA4, kA6, kA2, kA1, kA0, k64, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k98, k97, k95, k94, k96, k92, k91, k80, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k88, k87, k85, k84, k93, k86, k82, k81, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k78, k77, k75, k74, k73, k76, k72, k71, k60, \
k00, k01, k02, k06, k08, k07, k05, k04, k03, k66, k62, k61 \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08 }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18 }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28 }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38 }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48 }, \
{ k50, k51, k52, k53, k54, k55, k56, k57, k58 }, \
{ k60, k61, k62, k63, k64, XXX, k66, XXX, XXX }, \
{ XXX, k71, k72, k73, k74, k75, k76, k77, k78 }, \
{ k80, k81, k82, XXX, k84, k85, k86, k87, k88 }, \
{ XXX, k91, k92, k93, k94, k95, k96, k97, k98 }, \
{ kA0, kA1, kA2, XXX, kA4, kA5, kA6, kA7, kA8 }, \
{ kB0, kB1, kB2, kB3, kB4, kB5, kB6, kB7, kB8 } \
}
#define LAYOUT_96_iso_splitbs( \
k50, k51, k52, k53, k54, k55, k56, k57, k58, kB8, kB7, kB5, kB4, kB3, kB6, kB2, kB1, kB0, k63, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, kA8, kA7, kA5, kA4, kA3, kA6, kA2, kA1, kA0, k64, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k98, k97, k95, k94, k96, k92, k91, k80, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k88, k87, k85, k84, k93, k86, k82, k81, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k78, k77, k75, k74, k73, k76, k72, k71, k60, \
k00, k01, k02, k06, k08, k07, k05, k04, k03, k66, k62, k61 \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08 }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18 }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28 }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38 }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48 }, \
{ k50, k51, k52, k53, k54, k55, k56, k57, k58 }, \
{ k60, k61, k62, k63, k64, XXX, k66, XXX, XXX }, \
{ XXX, k71, k72, k73, k74, k75, k76, k77, k78 }, \
{ k80, k81, k82, XXX, k84, k85, k86, k87, k88 }, \
{ XXX, k91, k92, k93, k94, k95, k96, k97, k98 }, \
{ kA0, kA1, kA2, kA3, kA4, kA5, kA6, kA7, kA8 }, \
{ kB0, kB1, kB2, kB3, kB4, kB5, kB6, kB7, kB8 } \
}
#define LAYOUT_96_with60( \
k50, k51, k52, k53, k54, k55, k56, k57, k58, kB8, kB7, kB5, kB4, kB3, kB6, kB2, kB1, kB0, k63, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, kA8, kA7, kA5, kA4, kA6, kA2, kA1, kA0, k64, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k98, k97, k95, k94, k84, k96, k92, k91, k80, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k88, k87, k85, k93, k86, k82, k81, \
k10, k12, k13, k14, k15, k16, k17, k18, k78, k77, k75, k74, k76, k72, k71, k60,\
k00, k01, k02, k06, k08, k07, k04, k03, k62, k61 \
) { \
{ k00, k01, k02, k03, k04, XXX, k06, k07, k08 }, \
{ k10, XXX, k12, k13, k14, k15, k16, k17, k18 }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28 }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38 }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48 }, \
{ k50, k51, k52, k53, k54, k55, k56, k57, k58 }, \
{ k60, k61, k62, k63, k64, XXX, XXX, XXX, XXX }, \
{ XXX, k71, k72, XXX, k74, k75, k76, k77, k78 }, \
{ k80, k81, k82, XXX, k84, k85, k86, k87, k88 }, \
{ XXX, k91, k92, k93, k94, k95, k96, k97, k98 }, \
{ kA0, kA1, kA2, XXX, kA4, kA5, kA6, kA7, kA8 }, \
{ kB0, kB1, kB2, kB3, kB4, kB5, kB6, kB7, kB8 } \
}
#define LAYOUT_96_with60_splitbs( \
k50, k51, k52, k53, k54, k55, k56, k57, k58, kB8, kB7, kB5, kB4, kB3, kB6, kB2, kB1, kB0, k63, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, kA8, kA7, kA5, kA4, kA3, kA6, kA2, kA1, kA0, k64, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k98, k97, k95, k94, k84, k96, k92, k91, k80, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k88, k87, k85, k93, k86, k82, k81, \
k10, k12, k13, k14, k15, k16, k17, k18, k78, k77, k75, k74, k76, k72, k71, k60, \
k00, k01, k02, k06, k08, k07, k04, k03, k62, k61 \
) { \
{ k00, k01, k02, k03, k04, XXX, k06, k07, k08 }, \
{ k10, XXX, k12, k13, k14, k15, k16, k17, k18 }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28 }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38 }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48 }, \
{ k50, k51, k52, k53, k54, k55, k56, k57, k58 }, \
{ k60, k61, k62, k63, k64, XXX, XXX, XXX, XXX }, \
{ XXX, k71, k72, XXX, k74, k75, k76, k77, k78 }, \
{ k80, k81, k82, XXX, k84, k85, k86, k87, k88 }, \
{ XXX, k91, k92, k93, k94, k95, k96, k97, k98 }, \
{ kA0, kA1, kA2, kA3, kA4, kA5, kA6, kA7, kA8 }, \
{ kB0, kB1, kB2, kB3, kB4, kB5, kB6, kB7, kB8 } \
}
#define LAYOUT_96_with60_split_num0( \
k50, k51, k52, k53, k54, k55, k56, k57, k58, kB8, kB7, kB5, kB4, kB3, kB6, kB2, kB1, kB0, k63, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, kA8, kA7, kA5, kA4, kA6, kA2, kA1, kA0, k64, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k98, k97, k95, k94, k84, k96, k92, k91, k80,\
k20, k21, k22, k23, k24, k25, k26, k27, k28, k88, k87, k85, k93, k86, k82, k81, \
k10, k12, k13, k14, k15, k16, k17, k18, k78, k77, k75, k74, k76, k72, k71, k60, \
k00, k01, k02, k06, k08, k07, k04, k03, k66, k62, k61 \
) { \
{ k00, k01, k02, k03, k04, XXX, k06, k07, k08 }, \
{ k10, XXX, k12, k13, k14, k15, k16, k17, k18 }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28 }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38 }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48 }, \
{ k50, k51, k52, k53, k54, k55, k56, k57, k58 }, \
{ k60, k61, k62, k63, k64, XXX, k66, XXX, XXX }, \
{ XXX, k71, k72, XXX, k74, k75, k76, k77, k78 }, \
{ k80, k81, k82, XXX, k84, k85, k86, k87, k88 }, \
{ XXX, k91, k92, k93, k94, k95, k96, k97, k98 }, \
{ kA0, kA1, kA2, XXX, kA4, kA5, kA6, kA7, kA8 }, \
{ kB0, kB1, kB2, kB3, kB4, kB5, kB6, kB7, kB8 } \
}

View file

@ -0,0 +1,19 @@
# YMDK Melody96
![melody96](https://i.imgur.com/9o0a6XFh.png)
96-key Keyboard from YMDK. The PCB for this board is also commonly used in the NYM96.
* Keyboard Maintainer: [superuser41](https://github.com/kaylanm)
* Hardware Supported: melody96
* Hardware Availability: [YMDK on Geekhack, group buy closed](https://geekhack.org/index.php?topic=93614.0), [NYM96 on Massdrop](https://www.massdrop.com/buy/nym96-aluminum-mechanical-keyboard?mode=guest_open)
Make example for this keyboard (after setting up your build environment):
make ymdk/melody96:default
Flashing example for this keyboard:
make melody96:default:flash
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).

View file

@ -0,0 +1,18 @@
# MCU name
MCU = atmega32u4
# Bootloader selection
BOOTLOADER = atmel-dfu
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = no # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = yes # Enable N-Key Rollover
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output