summaryrefslogtreecommitdiffstats
path: root/layouts
diff options
context:
space:
mode:
authorHarry Mills <harry@haeg.in>2018-04-19 16:18:58 +0200
committerDrashna Jaelre <drashna@live.com>2018-04-19 16:18:58 +0200
commit8ec22695199e9f3ae52e83d945763ba892f5bcd9 (patch)
tree0f1f21a24487a61939ba5ceb723fd03e85b584dc /layouts
parent5226e4c79b3da327735f59344df7e402f254532d (diff)
downloadqmk_firmware-8ec22695199e9f3ae52e83d945763ba892f5bcd9.tar.gz
qmk_firmware-8ec22695199e9f3ae52e83d945763ba892f5bcd9.tar.xz
Add magic backspace to my layout (#2758)
* Add Haegin's keymap * Potential improvements to the keyboard * Add haegin minidox layout * Add Haegin's keyboard to ergodox layouts * Update Haegin's minidox keymap * Add home, end, and page up and down * Magic Backspace Backspace still acts as control when you hold it down, but if you tap it twice and hold it's a held backspace. Tapping it more than twice it continues to act as backspace, but it deletes more characters with each tap with the quantity deleted based on the fibonacci sequence. * Switch to deleting words after 4 taps When hitting backspace, after 4 taps this switches to deleting by word because if you're hitting backspace that frantically you must need to delete a lot of stuff. Holding backspace after 4 taps will delete words in the same way that holding alt+backspace deletes words on a normal keyboard.
Diffstat (limited to 'layouts')
-rw-r--r--layouts/community/ergodox/haegin/keymap.c90
-rw-r--r--layouts/community/ergodox/haegin/rules.mk1
2 files changed, 85 insertions, 6 deletions
diff --git a/layouts/community/ergodox/haegin/keymap.c b/layouts/community/ergodox/haegin/keymap.c
index 56aee727d..aa017c8ea 100644
--- a/layouts/community/ergodox/haegin/keymap.c
+++ b/layouts/community/ergodox/haegin/keymap.c
@@ -11,6 +11,10 @@
#define _______ KC_TRNS
+enum {
+ TD_BSPC = 0
+};
+
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
@@ -46,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LT(SYMBOLS,KC_GRV), KC_QUOT, KC_SLSH, KC_LALT, SFT_T(KC_RGHT),
KC_HOME, KC_END,
KC_PGUP,
- GUI_T(KC_SPC), CTL_T(KC_BSPC), LGUI(KC_SPC),
+ GUI_T(KC_SPC), TD(TD_BSPC), LGUI(KC_SPC),
// Right hand
KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, LGUI(KC_SPC),
@@ -136,17 +140,91 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______,
_______, _______, _______,
// right hand
- _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, KC_UP, _______, _______, _______,
- KC_VOLU, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_MPLY,
- _______, KC_VOLD, KC_MPRV, KC_MPLY, KC_MFFD, _______, _______,
- KC_MUTE, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, KC_HOME, KC_UP, KC_END, KC_PGUP, _______,
+ KC_VOLU, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_MPLY,
+ KC_MUTE, KC_VOLD, KC_MPRV, KC_MPLY, KC_MFFD, _______, _______,
+ _______, _______, _______, _______, _______,
_______, _______,
_______,
_______, _______, KC_WBAK
),
};
+enum {
+ BSPC_LETTER = 0,
+ BSPC_WORD = 1,
+ HOLD_CTRL = 2
+};
+
+typedef struct {
+ int a;
+ int b;
+ int state;
+} fib_tap;
+
+static fib_tap fib_bspc = {
+ .a = 0,
+ .b = 1,
+ .state = BSPC_LETTER
+};
+
+void cur_backspace (qk_tap_dance_state_t *state) {
+ int next_fib = fib_bspc.a + fib_bspc.b;
+ fib_bspc.a = fib_bspc.b;
+ fib_bspc.b = next_fib;
+ for (int i=0; i < next_fib; i++) {
+ unregister_code(KC_BSPC);
+ register_code(KC_BSPC);
+ }
+}
+
+void dance_backspace (qk_tap_dance_state_t *state, void *user_data) {
+ // If we're at the fifth tap, switch to deleting by words, and reset the fib
+ // counter
+ if (state->count == 4) {
+ register_code(KC_LALT);
+ fib_bspc.state = BSPC_WORD;
+ fib_bspc.a = 0;
+ fib_bspc.b = 1;
+ }
+ // If we're on the first press, wait to find out if it's being held
+ // If we're on the second tap, process the first tap, because we're past
+ // holding for ctrl now, then act normally
+ if (state->count == 2) {
+ register_code(KC_BSPC);
+ }
+ if (state->count > 1) {
+ cur_backspace(state);
+ }
+};
+
+void dance_backspace_ended (qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 1) {
+ if (state->pressed) {
+ fib_bspc.state = HOLD_CTRL;
+ register_code(KC_LCTRL);
+ } else {
+ register_code(KC_BSPC);
+ }
+ }
+};
+
+void dance_backspace_reset (qk_tap_dance_state_t *state, void *user_data) {
+ switch (fib_bspc.state) {
+ case HOLD_CTRL: unregister_code(KC_LCTRL); break;
+ case BSPC_WORD: unregister_code(KC_BSPC); unregister_code(KC_LALT); break;
+ case BSPC_LETTER: unregister_code(KC_BSPC); break;
+ }
+ fib_bspc.a = 0;
+ fib_bspc.b = 1;
+ fib_bspc.state = BSPC_LETTER;
+};
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_BSPC] = ACTION_TAP_DANCE_FN_ADVANCED (dance_backspace, dance_backspace_ended, dance_backspace_reset)
+};
+
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMBOLS) // FN1 - Momentary Layer 1 (Symbols)
};
diff --git a/layouts/community/ergodox/haegin/rules.mk b/layouts/community/ergodox/haegin/rules.mk
new file mode 100644
index 000000000..31e0fcf29
--- /dev/null
+++ b/layouts/community/ergodox/haegin/rules.mk
@@ -0,0 +1 @@
+TAP_DANCE_ENABLE=yes