182 lines
10 KiB
C
182 lines
10 KiB
C
|
// 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 {
|
||
|
_QWERTZ,
|
||
|
_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] = {
|
||
|
|
||
|
/***************************************************************************
|
||
|
* QWERTZ
|
||
|
***************************************************************************/
|
||
|
#define _FN1__FN2__FN3__FN4__FN5_ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
|
||
|
#define SP__1_____2_____3_____4_____5__SP QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DEL
|
||
|
#define SP__Q_____W_____E_____R_____T__SP KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, UM_CURL
|
||
|
#define SP__A_____S_____D_____F_____G__SP OS_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, UM_PARN
|
||
|
#define SP__Y_____X_____C_____V_____B__SP OS_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_NUBS
|
||
|
|
||
|
#define _FN6__FN7__FN8__FN9__FN0_ TO(_SPECIAL), KC_F8, KC_F10, KC_F12, KC_GRV
|
||
|
#define SP__6_____7_____8_____9_____0__SP KC_DEL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS
|
||
|
#define SP__Z_____U_____I_____O_____P__SP KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC
|
||
|
#define SP__H_____J_____K_____L____OE__SP KC_NUHS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT
|
||
|
#define SP__N_____M____COMM__DOT_DASH__SP UM_BRAC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, OS_LSFT
|
||
|
|
||
|
#define _______BOTTOM_LEFT________ KC_LCTL, KC_LALT, ____, OSL(_SPECIAL), KC_MINS, KC_BSPC, KC_ENT
|
||
|
#define _______BOTTOM_RIGHT_______ OS_LSFT, KC_SPC, KC_RALT, ____, ____, ____, KC_EQL
|
||
|
|
||
|
[_QWERTZ] =
|
||
|
LAYOUT_wrapper(
|
||
|
_FN1__FN2__FN3__FN4__FN5_, _FN6__FN7__FN8__FN9__FN0_,
|
||
|
SP__1_____2_____3_____4_____5__SP, SP__6_____7_____8_____9_____0__SP,
|
||
|
SP__Q_____W_____E_____R_____T__SP, SP__Z_____U_____I_____O_____P__SP,
|
||
|
SP__A_____S_____D_____F_____G__SP, SP__H_____J_____K_____L____OE__SP,
|
||
|
SP__Y_____X_____C_____V_____B__SP, SP__N_____M____COMM__DOT_DASH__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___________ ____, ____, ____, ____, ____, ____, ____
|
||
|
#define ___________SPECIAL_L2___________ ____, ____, ____, ____, ____, ____, ____
|
||
|
#define ___________SPECIAL_L3___________ ____, ____, ____, ____, ____, ____, ____
|
||
|
#define ___________SPECIAL_R0___________ KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_F14
|
||
|
#define ___________SPECIAL_R1___________ ____, ____, ____, KC_UP, ____, ____, ____
|
||
|
#define ___________SPECIAL_R2___________ ____, ____, KC_LEFT, KC_DOWN, KC_RIGHT, ____, ____
|
||
|
#define ___________SPECIAL_R3___________ ____, ____, ____, ____, ____, QK_BOOT, ____
|
||
|
|
||
|
[_SPECIAL]=
|
||
|
LAYOUT_wrapper(
|
||
|
_FN1__FN2__FN3__FN4__FN5_, _FN6__FN7__FN8__FN9__FN0_,
|
||
|
___________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[_QWERTZ] = "QWERTZ";
|
||
|
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;
|
||
|
}
|
||
|
}
|