SLASH and WHACK functions added (based on algernon's CT_TA)

This commit is contained in:
nstickney 2017-03-07 22:30:43 -06:00
parent eab0166f83
commit 4880e72b77
4 changed files with 157 additions and 33 deletions

View file

@ -34,4 +34,4 @@
#endif
#endif /* KEYBOARDS_ERGODOX_CONFIG_H_ */
#endif /* KEYBOARDS_ERGODOX_CONFIG_H_ */

View file

@ -0,0 +1,5 @@
TAP_DANCE_ENABLE = yes
ifndef QUANTUM_DIR
include ../../../../Makefile
endif

View file

@ -0,0 +1,37 @@
#ifndef KEYBOARDS_ERGODOX_CONFIG_H_
#define KEYBOARDS_ERGODOX_CONFIG_H_
#define MOUSEKEY_INTERVAL 20
#define MOUSEKEY_DELAY 0
#define MOUSEKEY_TIME_TO_MAX 5
#define MOUSEKEY_MAX_SPEED 2
#define MOUSEKEY_WHEEL_DELAY 0
#define TAPPING_TOGGLE 1
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
#define TAPPING_TERM 200
#define IGNORE_MOD_TAP_INTERRUPT // this makes it possible to do rolling combos (zx) with keys that convert to other keys on hold (z becomes ctrl when you hold it, and when this option isn't enabled, z rapidly followed by x actually sends Ctrl-x. That's bad.)
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)) || \
keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \
)
#ifdef SUBPROJECT_ez
#include "ez/config.h"
#endif
#ifdef SUBPROJECT_infinity
#include "infinity/config.h"
#endif
#endif /* KEYBOARDS_ERGODOX_CONFIG_H_ */

View file

@ -8,13 +8,14 @@
#define NUMP 2 // numpad
#define INTL 3 // international symbols
#define _______ KC_TRNS // Make the layouts easier to read
// Fillers to make layering more clear
#define _______ KC_TRNS
#define XXXXXXX KC_NO
enum custom_keycodes {
PLACEHOLDER = SAFE_RANGE, // can always be here
EPRM,
VRSN,
RGB_SLD
// Tap Dance Codes
enum {
SLASH,
WHACK,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@ -23,51 +24,51 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* layer 0 : default
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | BCKSPC |
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | BCKSPC |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | TAB | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | DELETE |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | INSERT | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER |
* | NOOP | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER |
* |--------+------+------+------+------+------| END | | PGDN |------+------+------+------+------+--------|
* | (/LSFT | Z | X | C | V | B | | | | N | M | , | . | / | )/RSFT |
* | (/LSFT | Z | X | C | V | B | | | | N | M | , | . | UP | )/RSFT |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | LCTRL | LGUI | | ' |PRTSCR| | [ | ] | \ | RGUI | RCTRL |
* | LCTRL | LGUI | MENU | ' | NOOP | | [ | ] | LEFT | DOWN | RIGHT |
* `------------------------------------' `------------------------------------'
* ,-------------. ,-------------.
* | VOL- | VOL+ | | BRT- | BRT+ |
* |PRTSCR| ESC | | VOL- | VOL+ |
* ,------|------|------| |------+------+------.
* | ALT/ | | MUTE | | NUMLK| | ALT/ |
* | SPC | LAY1 |------| |------| LAY1 | SPC |
* | ALT/ | | NUMLK| | MUTE | | ALT/ |
* | SPC | SLASH|------| |------|WHACK | SPC |
* | | | LAY3 | | LAY2 | | |
* `--------------------' `--------------------'
*/
[BASE] = KEYMAP(
// left hand
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME,
KC_INS, KC_A, KC_S, KC_D, KC_F, KC_G,
XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END,
KC_LCTL, KC_LGUI, _______, KC_QUOT, KC_PSCR,
KC_VOLD, KC_VOLU,
KC_MUTE,
ALT_T(KC_SPC), MO(ARRW), TG(INTL),
KC_LCTL, KC_LGUI, KC_MENU, KC_QUOT, XXXXXXX,
KC_INS, KC_ESC,
KC_NLCK,
ALT_T(KC_SPC), TD(SLASH), TG(INTL),
// right hand
KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_PGUP, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENTER,
KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC,
KC_LBRC, KC_RBRC, KC_BSLS, KC_RGUI, KC_RCTL,
KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RSPC,
KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_RGHT,
KC_VOLD, KC_VOLU,
KC_NLCK,
TG(NUMP), MO(ARRW), ALT_T(KC_SPC)
KC_MUTE,
TG(NUMP), TD(WHACK), ALT_T(KC_SPC)
),
/* layer 1 : functions and arrows
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | SYSREQ | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | PAUSE |
* | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | UP | | | | | | | | | | | |
* | | | | UP | | | | | | | | | | | INSERT |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | LEFT | DOWN |RIGHT | |------| |------| LEFT | DOWN | UP | RIGHT| | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
@ -76,26 +77,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | LEFT | DOWN | RIGHT |
* `------------------------------------' `------------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* |SYSREQ| PAUSE| | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | | SCRLK| | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[ARRW] = KEYMAP(
// left hand
KC_SYSREQ, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
_______, _______, _______, KC_UP, _______, _______, _______,
_______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
_______, _______,
_______,
KC_SYSREQ, KC_PAUSE,
KC_SLCK,
_______, _______, _______,
// right hand
KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUSE,
_______, _______, _______, _______, _______, _______, _______,
KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,
_______, _______, _______, _______, _______, _______, KC_INS,
KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______,
_______, _______, _______, _______, _______, KC_UP, _______,
_______, _______, KC_LEFT, KC_DOWN, KC_RGHT,
@ -189,6 +190,87 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
// See https://github.com/algernon/ergodox-layout/blob/master/keymap.c
// When holding the SLASH or WHACK key, the ARRW layer activates while the key is held.
// Tapping the key produces the / or \ key. Double-tapping it toggles the ARRW layer
// on until a third tap.
typedef struct {
bool layer_toggle;
bool sticky;
} td_ta_state_t;
static void ang_tap_dance_s_finished (qk_tap_dance_state_t *state, void *user_data) {
td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
if (td_ta->sticky) {
td_ta->sticky = false;
td_ta->layer_toggle = false;
layer_off (ARRW);
return;
}
if (state->count == 1 && !state->pressed) {
register_code (KC_SLSH);
td_ta->sticky = false;
td_ta->layer_toggle = false;
} else {
td_ta->layer_toggle = true;
layer_on (ARRW);
td_ta->sticky = (state->count == 2);
}
}
static void ang_tap_dance_s_reset (qk_tap_dance_state_t *state, void *user_data) {
td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
if (!td_ta->layer_toggle)
unregister_code (KC_SLSH);
if (!td_ta->sticky)
layer_off (ARRW);
}
static void ang_tap_dance_w_finished (qk_tap_dance_state_t *state, void *user_data) {
td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
if (td_ta->sticky) {
td_ta->sticky = false;
td_ta->layer_toggle = false;
layer_off (ARRW);
return;
}
if (state->count == 1 && !state->pressed) {
register_code (KC_BSLS);
td_ta->sticky = false;
td_ta->layer_toggle = false;
} else {
td_ta->layer_toggle = true;
layer_on (ARRW);
td_ta->sticky = (state->count == 2);
}
}
static void ang_tap_dance_w_reset (qk_tap_dance_state_t *state, void *user_data) {
td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
if (!td_ta->layer_toggle)
unregister_code (KC_BSLS);
if (!td_ta->sticky)
layer_off (ARRW);
}
qk_tap_dance_action_t tap_dance_actions[] = {
[SLASH] = {
.fn = { NULL, ang_tap_dance_s_finished, ang_tap_dance_s_reset },
.user_data = (void *)&((td_ta_state_t) { false, false })
},
[WHACK] = {
.fn = { NULL, ang_tap_dance_w_finished, ang_tap_dance_w_reset },
.user_data = (void *)&((td_ta_state_t) { false, false })
}
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {