aboutsummaryrefslogtreecommitdiff
path: root/readme.md
diff options
context:
space:
mode:
authorGergely Nagy <algernon@madhouse-project.org>2016-07-20 12:04:14 +0200
committerGergely Nagy <algernon@madhouse-project.org>2016-07-22 09:10:17 +0200
commit13385f5691f1a28b1349577ad58d0816f026ee05 (patch)
treee31f7ca9b28abe19648eff8f565fc58b41ed6d76 /readme.md
parentfca34e2ad602b943a50c279d3b6e3a30c24dbc25 (diff)
downloadqmk_firmware-13385f5691f1a28b1349577ad58d0816f026ee05.tar.gz
qmk_firmware-13385f5691f1a28b1349577ad58d0816f026ee05.zip
readme.md: Update the tap dance docs
Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
Diffstat (limited to 'readme.md')
-rw-r--r--readme.md27
1 files changed, 15 insertions, 12 deletions
diff --git a/readme.md b/readme.md
index 734741230..4d6250f8e 100644
--- a/readme.md
+++ b/readme.md
@@ -389,7 +389,7 @@ First, you will need `TAP_DANCE_ENABLE=yes` in your `Makefile`, because the feat
389 389
390This array specifies what actions shall be taken when a tap-dance key is in action. Currently, there are three possible options: 390This array specifies what actions shall be taken when a tap-dance key is in action. Currently, there are three possible options:
391 391
392* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. 392* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
393* `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action. 393* `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action.
394* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function on when the dance action finishes (like the previous option), and the last function when the tap dance action resets. 394* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function on when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
395 395
@@ -397,8 +397,6 @@ The first option is enough for a lot of cases, that just want dual roles. For ex
397 397
398And that's the bulk of it! 398And that's the bulk of it!
399 399
400Do note, however, that this implementation does have some consequences: keys do not register until either they reach the tapping ceiling, or they time out. This means that if you hold the key, nothing happens, no repeat, no nothing. It is possible to detect held state, and register an action then too, but that's not implemented yet. Keys also unregister immediately after being registered, so you can't even hold the second tap. This is intentional, to be consistent.
401
402And now, on to the explanation of how it works! 400And now, on to the explanation of how it works!
403 401
404The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and the timer. 402The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and the timer.
@@ -421,20 +419,25 @@ enum {
421 419
422/* Have the above three on the keymap, TD(CT_SE), etc... */ 420/* Have the above three on the keymap, TD(CT_SE), etc... */
423 421
424void dance_cln (qk_tap_dance_state_t *state) { 422void dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
425 if (state->count == 1) { 423 if (state->count == 1) {
426 register_code (KC_RSFT); 424 register_code (KC_RSFT);
427 register_code (KC_SCLN); 425 register_code (KC_SCLN);
428 unregister_code (KC_SCLN);
429 unregister_code (KC_RSFT);
430 } else { 426 } else {
431 register_code (KC_SCLN); 427 register_code (KC_SCLN);
428 }
429}
430
431void dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
432 if (state->count == 1) {
433 unregister_code (KC_RSFT);
434 unregister_code (KC_SCLN);
435 } else {
432 unregister_code (KC_SCLN); 436 unregister_code (KC_SCLN);
433 reset_tap_dance (state);
434 } 437 }
435} 438}
436 439
437void dance_egg (qk_tap_dance_state_t *state) { 440void dance_egg (qk_tap_dance_state_t *state, void *user_data) {
438 if (state->count >= 100) { 441 if (state->count >= 100) {
439 SEND_STRING ("Safety dance!"); 442 SEND_STRING ("Safety dance!");
440 reset_tap_dance (state); 443 reset_tap_dance (state);
@@ -443,7 +446,7 @@ void dance_egg (qk_tap_dance_state_t *state) {
443 446
444// on each tap, light up one led, from right to left 447// on each tap, light up one led, from right to left
445// on the forth tap, turn them off from right to left 448// on the forth tap, turn them off from right to left
446void dance_flsh_each(qk_tap_dance_state_t *state) { 449void dance_flsh_each(qk_tap_dance_state_t *state, void *user_data) {
447 switch (state->count) { 450 switch (state->count) {
448 case 1: 451 case 1:
449 ergodox_right_led_3_on(); 452 ergodox_right_led_3_on();
@@ -464,7 +467,7 @@ void dance_flsh_each(qk_tap_dance_state_t *state) {
464} 467}
465 468
466// on the fourth tap, set the keyboard on flash state 469// on the fourth tap, set the keyboard on flash state
467void dance_flsh_finished(qk_tap_dance_state_t *state) { 470void dance_flsh_finished(qk_tap_dance_state_t *state, void *user_data) {
468 if (state->count >= 4) { 471 if (state->count >= 4) {
469 reset_keyboard(); 472 reset_keyboard();
470 reset_tap_dance(state); 473 reset_tap_dance(state);
@@ -472,7 +475,7 @@ void dance_flsh_finished(qk_tap_dance_state_t *state) {
472} 475}
473 476
474// if the flash state didnt happen, then turn off leds, left to right 477// if the flash state didnt happen, then turn off leds, left to right
475void dance_flsh_reset(qk_tap_dance_state_t *state) { 478void dance_flsh_reset(qk_tap_dance_state_t *state, void *user_data) {
476 ergodox_right_led_1_off(); 479 ergodox_right_led_1_off();
477 _delay_ms(50); 480 _delay_ms(50);
478 ergodox_right_led_2_off(); 481 ergodox_right_led_2_off();
@@ -482,7 +485,7 @@ void dance_flsh_reset(qk_tap_dance_state_t *state) {
482 485
483const qk_tap_dance_action_t tap_dance_actions[] = { 486const qk_tap_dance_action_t tap_dance_actions[] = {
484 [CT_SE] = ACTION_TAP_DANCE_DOUBLE (KC_SPC, KC_ENT) 487 [CT_SE] = ACTION_TAP_DANCE_DOUBLE (KC_SPC, KC_ENT)
485 ,[CT_CLN] = ACTION_TAP_DANCE_FN (dance_cln) 488 ,[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cln_finished, dance_cln_reset)
486 ,[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg) 489 ,[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg)
487 ,[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED (dance_flsh_each, dance_flsh_finished, dance_flsh_reset) 490 ,[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED (dance_flsh_each, dance_flsh_finished, dance_flsh_reset)
488}; 491};