@ -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 |