From 8de028f1889da418de52bdc1da138687c4944378 Mon Sep 17 00:00:00 2001 From: Mats Nilsson Date: Sat, 19 Jun 2021 02:55:56 +0200 Subject: [Keymap] Add my keymaps for the Keebio Iris and Planck (#13005) --- users/mnil/config.h | 21 ++++++++ users/mnil/mnil.c | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++ users/mnil/mnil.h | 85 ++++++++++++++++++++++++++++++ users/mnil/readme.md | 23 ++++++++ users/mnil/rules.mk | 7 +++ 5 files changed, 282 insertions(+) create mode 100644 users/mnil/config.h create mode 100644 users/mnil/mnil.c create mode 100644 users/mnil/mnil.h create mode 100644 users/mnil/readme.md create mode 100644 users/mnil/rules.mk (limited to 'users') diff --git a/users/mnil/config.h b/users/mnil/config.h new file mode 100644 index 0000000000..3547785ff7 --- /dev/null +++ b/users/mnil/config.h @@ -0,0 +1,21 @@ +/* Copyright 2021 Mats Nilsson + * + * 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 . + */ + +#pragma once + +#define MK_3_SPEED +#define MK_MOMENTARY_ACCEL +#define PERMISSIVE_HOLD diff --git a/users/mnil/mnil.c b/users/mnil/mnil.c new file mode 100644 index 0000000000..11d5ee28df --- /dev/null +++ b/users/mnil/mnil.c @@ -0,0 +1,146 @@ +/* Copyright 2021 Mats Nilsson + * + * 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 . + */ + +#include "mnil.h" + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case M_TILD: // ~ + if (record->event.pressed) { + tap_code16(RALT(KC_RBRC)); + tap_code(KC_SPC); + } else { + } + break; + case M_CIRC: // ^ + if (record->event.pressed) { + tap_code16(S(KC_RBRC)); + tap_code(KC_SPC); + } else { + } + break; + case M_BTCK: // ` + if (record->event.pressed) { + tap_code16(S(KC_EQL)); + tap_code(KC_SPC); + } else { + } + break; + case QWE_COL: // Swap default keymap layer + if (record->event.pressed) { + if (get_highest_layer(default_layer_state) == _COLEMAK) { + default_layer_set(1UL << _QWERTY); + } else { + default_layer_set(1UL << _COLEMAK); + } + } + break; + } + return true; +}; + +// Tap Dance +// Determine the current tap dance state +int cur_dance(qk_tap_dance_state_t *state) { + if (state->count == 1) { + if (state->interrupted || !state->pressed) + return SINGLE_TAP; + else + return SINGLE_HOLD; + } else if (state->count == 2) { + if (state->interrupted) + return DOUBLE_SINGLE_TAP; + else if (state->pressed) + return DOUBLE_HOLD; + else + return DOUBLE_SINGLE_TAP; + } + if (state->count == 3) { + if (state->interrupted || !state->pressed) + return TRIPLE_TAP; + else + return TRIPLE_HOLD; + } else + return 8; +} + +static tap ae_tap_state = {.is_press_action = true, .state = 0}; + +void ae_finished(qk_tap_dance_state_t *state, void *user_data) { + ae_tap_state.state = cur_dance(state); + switch (ae_tap_state.state) { + case SINGLE_TAP: + register_code(KC_A); + break; + case SINGLE_HOLD: + tap_code(SE_AE); + break; + case DOUBLE_SINGLE_TAP: + tap_code(KC_A); + register_code(KC_A); + break; + } +} + +void ae_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (ae_tap_state.state) { + case SINGLE_TAP: + unregister_code(KC_A); + break; + case DOUBLE_SINGLE_TAP: + unregister_code(KC_A); + break; + } + ae_tap_state.state = 0; +} + +static tap aa_tap_state = {.is_press_action = true, .state = 0}; + +void aa_finished(qk_tap_dance_state_t *state, void *user_data) { + aa_tap_state.state = cur_dance(state); + switch (aa_tap_state.state) { + case SINGLE_TAP: + register_code(SE_OSLH); + break; + case SINGLE_HOLD: + register_code(SE_AA); + unregister_code(SE_AA); + break; + case DOUBLE_SINGLE_TAP: + tap_code(SE_OSLH); + register_code(SE_OSLH); + break; + } +} + +void aa_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (aa_tap_state.state) { + case SINGLE_TAP: + unregister_code(SE_OSLH); + break; + case DOUBLE_SINGLE_TAP: + unregister_code(SE_OSLH); + break; + } + aa_tap_state.state = 0; +} + +// clang-format off +qk_tap_dance_action_t tap_dance_actions[] = { + [AAE] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, ae_finished, ae_reset, 250), + [OAA] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, aa_finished, aa_reset, 250) +}; +// clang-format on diff --git a/users/mnil/mnil.h b/users/mnil/mnil.h new file mode 100644 index 0000000000..357acfe3ce --- /dev/null +++ b/users/mnil/mnil.h @@ -0,0 +1,85 @@ +/* Copyright 2021 Mats Nilsson + * + * 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 . + */ + +#pragma once + +#include QMK_KEYBOARD_H +#include "keymap_swedish.h" + +// Layers +enum layers { + _COLEMAK, + _QWERTY, + _SYMBOLS, + _NAVIGATION, + _NUMPAD, +}; + +// Custom Keycodes +#define _NAV_SPC LT(_NAVIGATION, KC_SPC) // _NAVIGATION when held, SPACE when tapped +#define _SYM_ENT LT(_SYMBOLS, KC_ENT) // _SYMBOLS when held, ENTER when tapped +#define CTL_BSPC MT(MOD_LCTL, KC_BSPC) // CTRL when held, BACKSPACE when tapped +#define ALT_DEL MT(MOD_LALT, KC_DEL) // ALT when held, DELETE when tapped +#define SFT_TAB MT(MOD_LSFT, KC_TAB) // SHIFT when held, TAB when tapped +#define C_TAB C(KC_TAB) // CTRL+TAB +#define CS_TAB C(S(KC_TAB)) // SHIFT+CTRL+TAB +#define CUT C(KC_X) // CTRL+X +#define COPY C(KC_INS) // CTRL+INSERT +#define PASTE S(KC_INS) // SHIFT+INSERT +#define AUTOFILL C(S(KC_L)) // Bitwarden Autofill, CTRL+SHIFT+L + +// i3 config +#define I3MOD KC_LGUI // $mod +#define OPEN G(KC_SPC) // $mod+SPACE +#define QUIT G(S(KC_Q)) // $mod+SHIFT+Q +#define WIN G(C(KC_SPC)) // $mod+CTRL+SPACE +#define BROWSER G(KC_ENTER) // $mod+ENTER +#define TERM G(S(KC_ENTER)) // $mod+CTRL+ENTER +#define NXTWS G(KC_TAB) // $mod+TAB +#define PRVWS G(S(KC_TAB)) // $mod+SHIFT+TAB +#define MOVWS G(KC_LSFT) // $mod+SHIFT+$X +#define CRYWS G(KC_LALT) // $mod+ALT+$X +#define MVWSL G(C(S(KC_LEFT))) // $mod+CTRL+SHIFT+LEFT +#define MVWSR G(C(S(KC_RGHT))) // $mod+CTRL+SHIFT+RIGHT + +enum custom_keycodes { + M_TILD = SAFE_RANGE, // ~ + M_CIRC, // ^ + M_BTCK, // ` + QWE_COL, // Swaps default layer +}; + +// Tap Dance +typedef struct { + bool is_press_action; + int state; +} tap; + +// Define a type for as many tap dance states as you need +enum { + SINGLE_TAP = 1, + SINGLE_HOLD = 2, + DOUBLE_TAP = 3, + DOUBLE_HOLD = 4, + DOUBLE_SINGLE_TAP = 5, // send two single taps + TRIPLE_TAP = 6, + TRIPLE_HOLD = 7 +}; + +enum { + AAE = 0, // a and ae + OAA, // o and aa +}; diff --git a/users/mnil/readme.md b/users/mnil/readme.md new file mode 100644 index 0000000000..f688ea388a --- /dev/null +++ b/users/mnil/readme.md @@ -0,0 +1,23 @@ +# mnil's user settings +This keymap consist of four primary layers, `_COLEMAK`, `_SYMBOL`, `_NAVIGATION` and `_NUMPAD`. +Colemak layout for less finger travel distance and to reduce RSI. +The `_SYMBOL` layer is optimized for programming, specifically in `C++`. +Space and Enter do double duties as layer toggle on hold where the `_NUMPAD` is entered when both are held down. +`ALT+TAB` and `SHIFT+ALT+TAB` keys is implemented to register `ALT` and then `TAB` on each subsequent key press one leaves the `_NUMPAD`-layer. +The Swedish characters `åäöÅÄÖ` are added as a tap dances on top of the Colemak layer since they are rarely needed. + +# License +Copyright 2021 Mats Nilsson matni403@gmail.com @mnil + +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 . diff --git a/users/mnil/rules.mk b/users/mnil/rules.mk new file mode 100644 index 0000000000..22cebfaeeb --- /dev/null +++ b/users/mnil/rules.mk @@ -0,0 +1,7 @@ +SRC += mnil.c +MOUSEKEY_ENABLE = yes # Enable mouse keys +LTO_ENABLE = yes # Enable link time optimization +BACKLIGHT_ENABLE = no +CONSOLE_ENABLE = no +AUTO_SHIFT_ENABLE = no +TAP_DANCE_ENABLE = yes -- cgit v1.2.3