@ -0,0 +1,96 @@ | |||||
/* Copyright 2022 Olly Hayes (@ollyhayes) | |||||
* | |||||
* 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 EE_HANDS | |||||
#define TAPPING_FORCE_HOLD | |||||
#define TAPPING_TERM 100 | |||||
#define NO_ACTION_ONESHOT | |||||
#define OLED_FONT_H "keyboards/crkbd/lib/glcdfont.c" | |||||
#define UNICODE_SELECTED_MODES UC_LNX | |||||
#ifdef RGB_MATRIX_ENABLE | |||||
# define RGB_MATRIX_KEYPRESSES // reacts to keypresses | |||||
// # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses) | |||||
// # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects | |||||
# define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended | |||||
# define RGB_MATRIX_FRAMEBUFFER_EFFECTS | |||||
// # define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness) | |||||
// # define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness) | |||||
# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150 // limits maximum brightness of LEDs to 150 out of 255. Higher may cause the controller to crash. | |||||
# define RGB_MATRIX_HUE_STEP 8 | |||||
# define RGB_MATRIX_SAT_STEP 8 | |||||
# define RGB_MATRIX_VAL_STEP 8 | |||||
# define RGB_MATRIX_SPD_STEP 10 | |||||
// RGB Matrix Animation modes. Explicitly enabled | |||||
// For full list of effects, see: | |||||
// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects | |||||
# define ENABLE_RGB_MATRIX_SOLID_COLOR | |||||
// # define ENABLE_RGB_MATRIX_ALPHAS_MODS | |||||
// # define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN | |||||
// # define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT | |||||
// # define ENABLE_RGB_MATRIX_BREATHING | |||||
// # define ENABLE_RGB_MATRIX_BAND_SAT | |||||
// # define ENABLE_RGB_MATRIX_BAND_VAL | |||||
// # define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT | |||||
// # define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL | |||||
// # define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT | |||||
// # define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL | |||||
// # define ENABLE_RGB_MATRIX_CYCLE_ALL | |||||
// # define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT | |||||
// # define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN | |||||
// # define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON | |||||
// # define ENABLE_RGB_MATRIX_CYCLE_OUT_IN | |||||
// # define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL | |||||
// # define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL | |||||
// # define ENABLE_RGB_MATRIX_CYCLE_SPIRAL | |||||
// # define ENABLE_RGB_MATRIX_DUAL_BEACON | |||||
// # define ENABLE_RGB_MATRIX_RAINBOW_BEACON | |||||
# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS | |||||
// # define ENABLE_RGB_MATRIX_RAINDROPS | |||||
// # define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS | |||||
// # define ENABLE_RGB_MATRIX_HUE_BREATHING | |||||
// # define ENABLE_RGB_MATRIX_HUE_PENDULUM | |||||
// # define ENABLE_RGB_MATRIX_HUE_WAVE | |||||
// # define ENABLE_RGB_MATRIX_PIXEL_RAIN | |||||
// # define ENABLE_RGB_MATRIX_PIXEL_FLOW | |||||
// # define ENABLE_RGB_MATRIX_PIXEL_FRACTAL | |||||
// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined | |||||
# define ENABLE_RGB_MATRIX_TYPING_HEATMAP | |||||
# define RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS 200 | |||||
// # define ENABLE_RGB_MATRIX_DIGITAL_RAIN | |||||
// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined | |||||
# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE | |||||
// # define ENABLE_RGB_MATRIX_SOLID_REACTIVE | |||||
// # define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE | |||||
// # define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE | |||||
// # define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS | |||||
// # define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS | |||||
// # define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS | |||||
// # define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS | |||||
// # define ENABLE_RGB_MATRIX_SPLASH | |||||
// # define ENABLE_RGB_MATRIX_MULTISPLASH | |||||
// # define ENABLE_RGB_MATRIX_SOLID_SPLASH | |||||
// # define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH | |||||
#endif |
@ -0,0 +1,112 @@ | |||||
/* Copyright 2022 Olly Hayes (@ollyhayes) | |||||
* | |||||
* 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 "ollyhayes.h" | |||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||||
[BASE] = LAYOUT_split_3x6_3( | |||||
// +------------+------+------+---------+----------+---------+--------+----------+---------+--------+---------+---------+ | |||||
NUM_SWITCH , KC_Q , KC_W , KC_F , KC_P , KC_G , KC_J , KC_L , KC_U , KC_Y , KC_SCLN , KC_BSPC , | |||||
KC_ESC , KC_A , KC_R , KC_S , KC_T , KC_D , KC_H , KC_N , KC_E , KC_I , KC_O , KC_ENT , | |||||
KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_K , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_RSFT , | |||||
KC_LCTL , MO(PUNC) , MO(ARR) , KC_SPC , MO(PUNC) , KC_RCTL | |||||
// +------------+------+------+---------+----------+---------+--------+----------+---------+--------+---------+---------+ | |||||
), | |||||
[QWERTY] = LAYOUT_split_3x6_3( | |||||
// +---------+------+------+---------+---------+---------+---------+---------+---------+--------+---------+---------+ | |||||
KC_TRNS , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_TRNS , | |||||
KC_TRNS , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_TRNS , | |||||
KC_TRNS , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_TRNS , | |||||
KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS | |||||
// +---------+------+------+---------+---------+---------+---------+---------+---------+--------+---------+---------+ | |||||
), | |||||
[GAMES] = LAYOUT_split_3x6_3( | |||||
// +---------+------+------+---------+---------+----------+---------+---------+---------+--------+---------+---------+ | |||||
KC_TRNS , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_TRNS , | |||||
KC_TRNS , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_TRNS , | |||||
KC_TRNS , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_TRNS , | |||||
KC_TRNS , KC_LALT , KC_SPACE , MO(ARR) , KC_TRNS , KC_TRNS | |||||
// +---------+------+------+---------+---------+----------+---------+---------+---------+--------+---------+---------+ | |||||
), | |||||
[NUM] = LAYOUT_split_3x6_3( | |||||
// +---------+---------------+------+--------+---------+-----------+-----------+------+--------+------+---------+---------+ | |||||
KC_TRNS , MO(FUNCTIONS) , KC_1 , KC_2 , KC_3 , DF(BASE) , C(KC_GRV) , KC_7 , KC_8 , KC_9 , KC_TRNS , KC_TRNS , | |||||
KC_TRNS , MO(MEDIA) , KC_4 , KC_5 , KC_6 , DF(GAMES) , KC_NO , KC_4 , KC_5 , KC_6 , KC_TRNS , KC_TRNS , | |||||
KC_TRNS , KC_0 , KC_7 , KC_8 , KC_9 , DF(QWERTY), KC_NO , KC_1 , KC_2 , KC_3 , KC_TRNS , KC_TRNS , | |||||
KC_DOT , KC_TRNS , KC_TAB , KC_TRNS , KC_0 , KC_DOT | |||||
// +---------+---------------+------+--------+---------+-----------+-----------+------+--------+------+---------+---------+ | |||||
), | |||||
[FUNCTIONS] = LAYOUT_split_3x6_3( | |||||
// +---------------+---------+---------+---------+---------+---------+---------+---------+---------+-------+---------+---------+ | |||||
KC_TRNS , KC_TRNS , KC_TRNS , KC_F8 , KC_F9 , KC_F12 , KC_F12 , KC_F7 , KC_F8 , KC_F9 , KC_TRNS , KC_TRNS , | |||||
TG(FUNCTIONS) , KC_TRNS , KC_F4 , KC_F5 , KC_F6 , KC_F11 , KC_F11 , KC_F4 , KC_F5 , KC_F6 , KC_TRNS , KC_TRNS , | |||||
KC_TRNS , KC_TRNS , KC_F1 , KC_F2 , KC_F3 , KC_F10 , KC_F10 , KC_F1 , KC_F2 , KC_F3 , KC_TRNS , KC_TRNS , | |||||
KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS | |||||
// +---------------+---------+---------+---------+---------+---------+---------+---------+---------+-------+---------+---------+ | |||||
), | |||||
[ARR] = LAYOUT_split_3x6_3( | |||||
// +---------+---------+-----------+---------+---------+------------+-----------+---------+---------+-----------+---------+---------+ | |||||
KC_TRNS , KC_TRNS , KC_HOME , KC_PGUP , KC_PGDN , KC_END , KC_HOME , KC_PGDN , KC_PGUP , KC_END , KC_TRNS , KC_TRNS , | |||||
KC_ENT , KC_DEL , KC_LEFT , KC_UP , KC_DOWN , KC_RGHT , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , KC_DEL , KC_TRNS , | |||||
KC_TRNS , KC_INS , C(KC_LEFT), KC_LGUI , KC_LALT , C(KC_RGHT) , C(KC_LEFT), DOWN4 , UP4 , C(KC_RGHT), KC_INS , KC_TRNS , | |||||
KC_TRNS , KC_F12 , KC_TRNS , KC_TRNS , KC_F12 , KC_TRNS | |||||
// +---------+---------+-----------+---------+---------+------------+-----------+---------+---------+-----------+---------+---------+ | |||||
), | |||||
[PUNC] = LAYOUT_split_3x6_3( | |||||
// +---------+------------+-----------+-----------+-------------+------------+------------+-------------+------------+------------+-----------+---------+ | |||||
ALTTAB , S(KC_1) , S(KC_2) , UC(0x20ac), S(KC_4) , S(KC_5) , S(KC_6) , S(KC_7) , S(KC_8) , S(KC_9) , S(KC_0) , KC_TRNS , | |||||
KC_TRNS , S(KC_NUBS) , S(KC_GRV) , KC_LBRC , KC_RBRC , S(KC_NUHS) , KC_QUOT , S(KC_LBRC) , S(KC_RBRC) , KC_MINS , S(KC_EQL) , KC_TRNS , | |||||
KC_TRNS , KC_NUBS , KC_GRV , KC_LGUI , KC_LALT , KC_NUHS , S(KC_QUOT) , KC_LALT , KC_LGUI , S(KC_MINS) , KC_EQL , KC_TRNS , | |||||
KC_TRNS , MO(DUBPUNC) , KC_MPLY , KC_TRNS , MO(DUBPUNC) , KC_TRNS | |||||
// +---------+------------+-----------+-----------+-------------+------------+------------+-------------+------------+------------+-----------+---------+ | |||||
), | |||||
[MEDIA] = LAYOUT_split_3x6_3( | |||||
// +------------+-----------+---------+---------+---------+----------------+----------------+---------+---------+---------+----------+---------+ | |||||
RESET , RGB_RMOD , RGB_MOD , RGB_TOG , RGB_HUD , RGB_HUI , RGB_HUD , RGB_HUI , RGB_TOG , RGB_RMOD, RGB_MOD , KC_SLEP , | |||||
KC_TRNS , KC_TRNS , KC_TRNS , KC_VOLD , KC_VOLU , RGB_MODE_PLAIN , RGB_MODE_PLAIN , KC_VOLD , KC_VOLU , KC_TRNS , KC_TRNS , KC_TRNS , | |||||
KC_TRNS , KC_TRNS , RGB_VAD , RGB_VAI , RGB_SAD , RGB_SAI , RGB_SAD , RGB_SAI , RGB_VAD , RGB_VAI , KC_TRNS , KC_TRNS , | |||||
KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS | |||||
// +------------+-----------+---------+---------+---------+----------------+----------------+---------+---------+---------+----------+---------+ | |||||
), | |||||
[DUBPUNC] = LAYOUT_split_3x6_3( | |||||
// +---------+----------+-----------+-----------+------------+---------+-----------+---------+----------+---------+----------+---------+ | |||||
KC_TRNS , KC_TRNS , KC_TRNS , UC(0x00a3), KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , U_UMLAUT , KC_TRNS , KC_TRNS , KC_TRNS , | |||||
KC_TRNS , A_UMLAUT , KC_TRNS , UC(0x00df), UC(0x2713) , KC_TRNS , UC(0x00b0), KC_TRNS , KC_TRNS , KC_TRNS , O_UMLAUT , KC_TRNS , | |||||
KC_TRNS , KC_TRNS , UC(0x2717), 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 | |||||
// +---------+----------+-----------+-----------+------------+---------+-----------+---------+----------+---------+----------+---------+ | |||||
) | |||||
}; | |||||
/* | |||||
[TEMPLATE] = LAYOUT_split_3x6_3( | |||||
// +--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+ | |||||
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 | |||||
// +--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+ | |||||
), | |||||
*/ |
@ -0,0 +1,112 @@ | |||||
/* Copyright 2022 Olly Hayes (@ollyhayes) | |||||
* | |||||
* 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 "ollyhayes.h" | |||||
oled_rotation_t oled_init_user(oled_rotation_t rotation) { | |||||
if (!is_keyboard_master()) { | |||||
return OLED_ROTATION_180; // flips the display 180 degrees if offhand | |||||
} | |||||
return rotation; | |||||
} | |||||
#define L_BASE 0 | |||||
#define L_NUM 8 | |||||
#define L_FUNCTIONS 16 | |||||
#define L_ARR 32 | |||||
#define L_PUNC 64 | |||||
#define L_DUBPUNC 128 | |||||
#define L_MEDIA 256 | |||||
#define DL_COLEMAK 1 | |||||
#define DL_QWERTY 2 | |||||
#define DL_GAMES 4 | |||||
void oled_render_layer_state(void) { | |||||
oled_write_P(PSTR("Layer: "), false); | |||||
switch (layer_state) { | |||||
case L_BASE: | |||||
switch (default_layer_state) { | |||||
case DL_QWERTY: | |||||
oled_write_ln_P(PSTR("Qwerty"), false); | |||||
break; | |||||
case DL_GAMES: | |||||
oled_write_ln_P(PSTR("Games"), false); | |||||
break; | |||||
case DL_COLEMAK: | |||||
default: | |||||
oled_write_ln_P(PSTR("Colemak"), false); | |||||
break; | |||||
} | |||||
break; | |||||
case L_NUM: | |||||
oled_write_ln_P(PSTR("Numbers"), false); | |||||
break; | |||||
case L_FUNCTIONS: | |||||
case L_FUNCTIONS|L_NUM: | |||||
oled_write_ln_P(PSTR("Functions"), false); | |||||
break; | |||||
case L_ARR: | |||||
oled_write_ln_P(PSTR("Navigation"), false); | |||||
break; | |||||
case L_PUNC: | |||||
oled_write_ln_P(PSTR("Punctuation"), false); | |||||
break; | |||||
case L_MEDIA: | |||||
case L_MEDIA|L_NUM: | |||||
oled_write_ln_P(PSTR("Media"), false); | |||||
break; | |||||
case L_DUBPUNC: | |||||
case L_DUBPUNC|L_PUNC: | |||||
oled_write_ln_P(PSTR("Specials"), false); | |||||
break; | |||||
} | |||||
} | |||||
void oled_render_timer(void) { | |||||
static uint16_t microticks = 0; | |||||
static uint16_t ticks = 0; | |||||
if (microticks++ % 1000 == 0) { | |||||
ticks++; | |||||
} | |||||
oled_write_P(PSTR("Ticks: "), false); | |||||
oled_write_ln(get_u16_str(ticks, ' '), false); | |||||
} | |||||
void oled_render_presses(void) { | |||||
oled_write_P(PSTR("Presses: "), false); | |||||
oled_write_ln(get_u16_str(key_presses, ' '), false); | |||||
} | |||||
void oled_render_rgb_mode(void) { | |||||
oled_write_P(PSTR("Animation: "), false); | |||||
oled_write_ln(get_u8_str(rgb_matrix_get_mode(), ' '), false); | |||||
} | |||||
bool oled_task_user(void) { | |||||
if (is_keyboard_master()) { | |||||
oled_render_layer_state(); | |||||
} | |||||
oled_render_timer(); | |||||
if (is_keyboard_master()) { | |||||
oled_render_presses(); | |||||
} | |||||
oled_render_rgb_mode(); | |||||
return false; | |||||
} |
@ -0,0 +1,67 @@ | |||||
# ollyhayes's keymap for [Corne Keyboard (crkbd)](https://github.com/foostan/crkbd) | |||||
## Keymap | |||||
After many years of changing my keymap often and reperatedly, I finally came to a stable version. I've been using this for a while now with only small tweaks every so often. | |||||
All layers are activated only whilst the layer key is held, except the default layers. | |||||
Lots of keys are repeated on both sides. I find this really useful for two reasons: | |||||
* I like to have the option to use the opposite hand to hold modifiers shift/ctrl etc as the hand pressing the key, I find this really comfortable. | |||||
* When using the mouse, I like to be able to do common things with just my left hand. | |||||
### Colemak | |||||
The base layer: | |||||
![colemak](https://i.imgur.com/uxLJzul.png) | |||||
### Navigation | |||||
All things for moving the cursor around, inspired by vim. | |||||
* `c←` is ctrl+left | |||||
* `↓↓↓↓` is ↓ pressed four times | |||||
![navigation](https://i.imgur.com/xfkA0ze.png) | |||||
### Symbols | |||||
The shifted number row and all brackets and other symbols. | |||||
* `a/t` is alt-tab for window switching in windows/linux. Using some special code to release alt when the punc key is released, this works quite nicely. | |||||
![symbols](https://i.imgur.com/t9Jygs1.png) | |||||
### Specials | |||||
Some extra symbols (linux only for now) that work by sending UTF sequences. Layer activated by holding both punctuation layer keys. | |||||
![specials](https://i.imgur.com/AtPWKrA.png) | |||||
### Numbers | |||||
Numbpads (left version is reversed so 1, 2, 3 are easy to reach with one hand (like on a regular keyboard). | |||||
Also the keys to switch the default layer are here. | |||||
![numbers](https://i.imgur.com/9XXcAXK.png) | |||||
### Functions | |||||
Function keys, nothing too interesting. | |||||
![functions](https://i.imgur.com/ttrw3FJ.png) | |||||
### Games (default layer) | |||||
Used for some games, qwerty with space bar and alt for the left hand. | |||||
![games](https://i.imgur.com/zVvHWKd.png) | |||||
### Qwerty (default layer) | |||||
Mostly for guests. | |||||
![qwerty](https://i.imgur.com/Bqs1bjV.png) |
@ -0,0 +1,17 @@ | |||||
SRC += oled.c | |||||
OLED_ENABLE = yes | |||||
OLED_DRIVER = SSD1306 | |||||
EXTRAKEY_ENABLE = yes | |||||
UNICODE_ENABLE = yes | |||||
RGBLIGHT_ENABLE = no | |||||
RGB_MATRIX_ENABLE = yes | |||||
# RGB_MATRIX_CUSTOM_USER = yes | |||||
VIRTSER_ENABLE = yes | |||||
LTO_ENABLE = yes | |||||
MOUSEKEY_ENABLE = no |
@ -0,0 +1,153 @@ | |||||
/* Copyright 2022 Olly Hayes (@ollyhayes) | |||||
* | |||||
* 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 "ollyhayes.h" | |||||
#ifdef VIRTSER_ENABLE | |||||
# include "virtser.h" | |||||
#endif | |||||
layer_state_t default_layer_state_set_kb(layer_state_t state) { | |||||
if (layer_state_cmp(state, BASE)) { | |||||
rgb_matrix_mode(3); | |||||
} else if (layer_state_cmp(state, GAMES)) { | |||||
rgb_matrix_mode(1); | |||||
} | |||||
return state; | |||||
} | |||||
uint16_t key_presses = 0; | |||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||||
// for tab/number layer switch | |||||
static bool key_pressed_since_switch = false; | |||||
static uint16_t switch_down_time = 0; | |||||
// for alt-tab on punc layer | |||||
static bool alt_tab_used = false; | |||||
// for capital umlauts | |||||
static bool shift_held = false; | |||||
#ifdef VIRTSER_ENABLE | |||||
if (record->event.pressed) { | |||||
uint8_t key_index = 40 + record->event.key.col + record->event.key.row * 6; | |||||
virtser_send(key_index); | |||||
} else { | |||||
uint8_t key_index = 90 + record->event.key.col + record->event.key.row * 6; | |||||
virtser_send(key_index); | |||||
} | |||||
#endif | |||||
if (record->event.pressed) { | |||||
key_pressed_since_switch = true; | |||||
key_presses++; | |||||
} | |||||
switch (keycode) { | |||||
case UP4: | |||||
if (record->event.pressed) { | |||||
tap_code(KC_UP); | |||||
tap_code(KC_UP); | |||||
tap_code(KC_UP); | |||||
tap_code(KC_UP); | |||||
return false; | |||||
} | |||||
break; | |||||
case DOWN4: | |||||
if (record->event.pressed) { | |||||
tap_code(KC_DOWN); | |||||
tap_code(KC_DOWN); | |||||
tap_code(KC_DOWN); | |||||
tap_code(KC_DOWN); | |||||
return false; | |||||
} | |||||
break; | |||||
case NUM_SWITCH: | |||||
if (record->event.pressed) { | |||||
layer_on(NUM); | |||||
key_pressed_since_switch = false; | |||||
switch_down_time = timer_read(); | |||||
} else { | |||||
layer_off(NUM); | |||||
if (!key_pressed_since_switch && timer_elapsed(switch_down_time) < 200) { | |||||
tap_code(KC_TAB); | |||||
} | |||||
} | |||||
return false; | |||||
case MO(PUNC): | |||||
if (!record->event.pressed) { | |||||
if (alt_tab_used) { | |||||
unregister_code(KC_LALT); | |||||
alt_tab_used = false; | |||||
} | |||||
} | |||||
return true; | |||||
case MO(FUNCTIONS): | |||||
if (!record->event.pressed) { | |||||
// if NUM_SWITCH has been lifted first, toggle to that layer | |||||
// (4 = 2^NUM) | |||||
if ((layer_state & 4) != 0) { | |||||
layer_on(FUNCTIONS); | |||||
return false; | |||||
} | |||||
} | |||||
return true; | |||||
case ALTTAB: | |||||
if (record->event.pressed) { | |||||
alt_tab_used = true; | |||||
register_code(KC_LALT); | |||||
tap_code(KC_TAB); | |||||
} | |||||
return false; | |||||
case KC_LSFT: | |||||
case KC_RSFT: | |||||
shift_held = record->event.pressed; | |||||
break; | |||||
case A_UMLAUT: | |||||
if (record->event.pressed) { | |||||
if (shift_held) | |||||
register_unicode(0x00c4); | |||||
else | |||||
register_unicode(0x00e4); | |||||
} | |||||
break; | |||||
case O_UMLAUT: | |||||
if (record->event.pressed) { | |||||
if (shift_held) | |||||
register_unicode(0x00d6); | |||||
else | |||||
register_unicode(0x00f6); | |||||
} | |||||
break; | |||||
case U_UMLAUT: | |||||
if (record->event.pressed) { | |||||
if (shift_held) | |||||
register_unicode(0x00dc); | |||||
else | |||||
register_unicode(0x00fc); | |||||
} | |||||
break; | |||||
} | |||||
return true; | |||||
} |
@ -0,0 +1,41 @@ | |||||
/* Copyright 2022 Olly Hayes (@ollyhayes) | |||||
* | |||||
* 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 | |||||
enum layers { | |||||
BASE, | |||||
QWERTY, | |||||
GAMES, | |||||
NUM, | |||||
FUNCTIONS, | |||||
ARR, | |||||
PUNC, | |||||
DUBPUNC, | |||||
MEDIA, | |||||
}; | |||||
enum custom_keycodes { | |||||
DOWN4 = SAFE_RANGE, | |||||
UP4, | |||||
NUM_SWITCH, | |||||
ALTTAB, | |||||
A_UMLAUT, | |||||
O_UMLAUT, | |||||
U_UMLAUT, | |||||
}; | |||||
extern uint16_t key_presses; |
@ -0,0 +1 @@ | |||||
SRC += ollyhayes.c |