summaryrefslogtreecommitdiffstats
path: root/quantum/process_keycode
Commit message (Collapse)AuthorAgeFilesLines
* quantum: Move qk_ucis_state to process_unicode.cGergely Nagy2016-08-242-2/+6
| | | | | | | | | | | | In order to not declare the same variable in multiple objects (which happens when building UCIS-enabled keymap for both the ErgoDox EZ and the ErgoDox Infinity), move the declaration to the .c file, and keep only an extern reference in the header. Many thanks to @fredizzimo for spotting the error in Travis, and suggesting the fix. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* Drop method to set Unicode input key and declare start and finish methods as ↵coderkun2016-08-212-13/+4
| | | | “weak” instead
* Add method to set Unicode input key for ISO 14755coderkun2016-08-212-2/+13
| | | | https://github.com/jackhumbert/qmk_firmware/issues/672
* Add a register/unregister_code16 pair of functionsGergely Nagy2016-08-181-4/+4
| | | | | | | | | | | | | | These functions register not only the 8bit keycode, but the modifiers too. It doesn't handle the full range of the upper 8bits, just the mods, but that's a good start. Changed the tap-dance pair functions to use these, so one can do: `ACTION_TAP_DANCE_DOUBLE (KC_COLN, KC_SCLN)` ...and that will do the right thing. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* tap-dance: Major rework, to make it more reliableGergely Nagy2016-08-172-64/+66
| | | | | | | | | | | | | | | | | | | | | | | | | | | | This reworks how the tap-dance feature works: instead of one global state, we have a state for each tap-dance key, so we can cancel them when another tap-dance key is in flight. This fixes #527. Since we have a state for each key, we can avoid situation where a keyup would mess with our global state. This fixes #563. And while here, we also make sure to fire events only once, and this fixes #574. There is one breaking change, though: tap-dance debugging support was removed, because dumping the whole state would increase the firmware size too much. Any keymap that made use of this, will have to be updated (but there's no such keymap in the repo). Also, there's a nice trick used in this rework: we need to iterate through tap_dance_actions in a few places, to check for timeouts, and so on. For this, we'd need to know the size of the array. We can't discover that at compile-time, because tap-dance gets compiled separately. We'd like to avoid having to terminate the list with a sentinel value, because that would require updates to all keymaps that use the feature. So, we keep track of the highest tap-dance code seen so far, and iterate until that index. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* tap-dance: Include action_tapping.h for TAPPING_TERMGergely Nagy2016-08-171-0/+1
| | | | | | | Include `action_tapping.h`, so the keymap does not have to define a `TAPPING_TERM` for us, and we can use the default. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* process_unicode: Introduce a slight delayGergely Nagy2016-08-152-0/+8
| | | | | | | | When entering unicode codes, use some delay, so the OS has time to process the information. This is not needed on all systems, but some seem to require it. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* process_unicode: Replace register_hex32Gergely Nagy2016-08-152-13/+32
| | | | | | | | | It turns out that register_hex32 did not work reliably, and some systems only allow 7 chars after the unicode magic sequence, while others allow 8. To remedy the situation, store the codes as strings, and type those in instead of doing bit shifting magic. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* process_unicode: Use uint32_t for UCIS purposesGergely Nagy2016-08-152-6/+13
| | | | | | | Use a single uint32_t to store the unicode of a symbol, instead of an array of uint16_ts. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* process_unicode: Make the startup overridableGergely Nagy2016-08-152-0/+6
| | | | | | | Extract out the part of `qk_ucis_start` that inputs the placeholder symbol, and make it weak, so it can be overridden. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* process_unicode: Call process_ucis() automaticallyGergely Nagy2016-08-152-2/+2
| | | | | | | If UCIS is enabled, call process_ucis() automatically from process_record_quantum(). Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* process_unicode: Handle too long UCIS symbol namesGergely Nagy2016-08-151-1/+9
| | | | | | | | If the symbol name being entered is longer than the max, stop recording it, and stop processing keycodes apart from the ones that can delete, finish or cancel the sequence. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* process_unicode: Add a way to enter unicode symbols by nameGergely Nagy2016-08-152-2/+120
| | | | | | | | | | | | | | | The purpose of this change is to allow keymaps to specify a dictionary of unicode symbol name to code mappings, and let the person at the keyboard enter unicode symbols by name. This is done by having a way to trigger unicode symbol input mode, when all keys are cached until Esc, Enter or Space are pressed. Once that happens, we try to look up the symbol from our lookup table. If found, we erase back, and type the unicode magic in to get that symbol. If not found, we still erase back, start unicode input mode, and replay what the user typed in. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* process_unicode: Small refactor & linux fixGergely Nagy2016-08-152-31/+48
| | | | | | | | | | | This moves the unicode input start / end sequences into their own functions, so keymaps and other functionality can build on it too. At the same time, it changes how the Linux variant works, to match reality: CTRL+SHIFT must be unregistered too, and we close the thing with a Space instead. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* process_unicode: Fix set_unicode_input_mode()Gergely Nagy2016-08-131-1/+1
| | | | | | | | In the header, this was defined as `set_unicode_input_mode`, but the implementation had `set_unicode_mode` for a name. Changed the implementation to match the header. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* tap-dance: Add some debugging supportGergely Nagy2016-07-272-0/+16
| | | | Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* Fixes midi functionalityJack Humbert2016-07-241-12/+12
|
* Merge pull request #552 from robertdale/music-play-fixJack Humbert2016-07-241-1/+6
|\ | | | | Fixes issue #551 - ensure there's a recording to play before playing
| * ensure there's a recording to play before playing; also enables the LGUI ↵Robert Dale2016-07-241-1/+6
| | | | | | | | button to play a tone
* | tap-dance: Code cleanupGergely Nagy2016-07-221-21/+24
| | | | | | | | | | | | | | | | Removes a number of duplicated code, by passing actions around instead of keycodes, so the various dance action functions do not have to look up the action, but the caller does that for them. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* | tap-dance: Support user_data for the callbacksGergely Nagy2016-07-222-64/+38
| | | | | | | | | | | | | | | | | | | | | | Refactored the code a little, so all callbacks now receive a `user_data` pointer, which can be anything. As an example, the key pairs from `ACTION_TAP_DANCE_DOUBLE` now use this, and custom, built-in functions. This makes it easier to extend the tap dance functionality, and also simplifies the code a little. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* | tap-dance: Support for holding keysGergely Nagy2016-07-222-1/+12
|/ | | | | | | | | | | | With this change, tap dance will now store the pressed state of the tap-dance key, and allow one to make an action sooner, while the key is still held, and only unregister when the key is released. The registration must happen in the `on_dance_finished` callback, while unregistering goes to `on_reset`. The surrounding code makes sure not to call either multiple times. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* add a couple of commentsPavlos Vinieratos2016-07-191-0/+2
|
* on_each_tap_fn is called on tap down and tap upPavlos Vinieratos2016-07-191-1/+1
|
* in the default case, it should be called if there is actually a tapPavlos Vinieratos2016-07-181-2/+2
| | | | | dance happening, and in the normal case, it should be called when the tap down is happening.
* change naming, and remove extraneous definitionPavlos Vinieratos2016-07-172-36/+23
|
* add an `anyway` and a `reset` callbackPavlos Vinieratos2016-07-162-5/+59
| | | | | | | when using tap dance, we have the `regular` callback that is called on the last tap. this commit adds an `anyway` callback that is called on every tap, and a `reset` callback that is called on reset of the tap dance taps.
* in case its NULLPavlos Vinieratos2016-07-161-1/+3
|
* Moves features to their own files (process_*), adds tap dance feature (#460)Jack Humbert2016-06-2912-0/+939
* non-working commit * working * subprojects implemented for planck * pass a subproject variable through to c * consolidates clueboard revisions * thanks for letting me know about conflicts.. * turn off audio for yang's * corrects starting paths for subprojects * messing around with travis * semicolon * travis script * travis script * script for travis * correct directory (probably), amend files to commit * remove origin before adding * git pull, correct syntax * git checkout * git pull origin branch * where are we? * where are we? * merging * force things to happen * adds commit message, adds add * rebase, no commit message * rebase branch * idk! * try just pull * fetch - merge * specify repo branch * checkout * goddammit * merge? idk * pls * after all * don't split up keyboards * syntax * adds quick for all-keyboards * trying out new script * script update * lowercase * all keyboards * stop replacing compiled.hex automatically * adds if statement * skip automated build branches * forces push to automated build branch * throw an add in there * upstream? * adds AUTOGEN * ignore all .hex files again * testing out new repo * global ident * generate script, keyboard_keymap.hex * skip generation for now, print pandoc info, submodule update * try trusty * and sudo * try generate * updates subprojects to keyboards * no idea * updates to keyboards * cleans up clueboard stuff * setup to use local readme * updates cluepad, planck experimental * remove extra led.c [ci skip] * audio and midi moved over to separate files * chording, leader, unicode separated * consolidate each [skip ci] * correct include * quantum: Add a tap dance feature (#451) * quantum: Add a tap dance feature With this feature one can specify keys that behave differently, based on the amount of times they have been tapped, and when interrupted, they get handled before the interrupter. To make it clear how this is different from `ACTION_FUNCTION_TAP`, lets explore a certain setup! We want one key to send `Space` on single tap, but `Enter` on double-tap. With `ACTION_FUNCTION_TAP`, it is quite a rain-dance to set this up, and has the problem that when the sequence is interrupted, the interrupting key will be send first. Thus, `SPC a` will result in `a SPC` being sent, if they are typed within `TAPPING_TERM`. With the tap dance feature, that'll come out as `SPC a`, correctly. The implementation hooks into two parts of the system, to achieve this: into `process_record_quantum()`, and the matrix scan. We need the latter to be able to time out a tap sequence even when a key is not being pressed, so `SPC` alone will time out and register after `TAPPING_TERM` time. But lets start with how to use it, first! First, you will need `TAP_DANCE_ENABLE=yes` in your `Makefile`, because the feature is disabled by default. This adds a little less than 1k to the firmware size. Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that - similar to `F()`, takes a number, which will later be used as an index into the `tap_dance_actions` array. This array specifies what actions shall be taken when a tap-dance key is in action. Currently, there are two possible options: * `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. * `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the current state of the tap-dance action. The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise. And that's the bulk of it! Do 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. And now, on to the explanation of how it works! The 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. This means that you have `TAPPING_TERM` time to tap the key again, you do not have to input all the taps within that timeframe. This allows for longer tap counts, with minimal impact on responsiveness. Our next stop is `matrix_scan_tap_dance()`. This handles the timeout of tap-dance keys. For the sake of flexibility, tap-dance actions can be either a pair of keycodes, or a user function. The latter allows one to handle higher tap counts, or do extra things, like blink the LEDs, fiddle with the backlighting, and so on. This is accomplished by using an union, and some clever macros. In the end, lets see a full example! ```c enum { CT_SE = 0, CT_CLN, CT_EGG }; /* Have the above three on the keymap, TD(CT_SE), etc... */ void dance_cln (qk_tap_dance_state_t *state) { if (state->count == 1) { register_code (KC_RSFT); register_code (KC_SCLN); unregister_code (KC_SCLN); unregister_code (KC_RSFT); } else { register_code (KC_SCLN); unregister_code (KC_SCLN); reset_tap_dance (state); } } void dance_egg (qk_tap_dance_state_t *state) { if (state->count >= 100) { SEND_STRING ("Safety dance!"); reset_tap_dance (state); } } const qk_tap_dance_action_t tap_dance_actions[] = { [CT_SE] = ACTION_TAP_DANCE_DOUBLE (KC_SPC, KC_ENT) ,[CT_CLN] = ACTION_TAP_DANCE_FN (dance_cln) ,[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg) }; ``` This addresses #426. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org> * hhkb: Fix the build with the new tap-dance feature Signed-off-by: Gergely Nagy <algernon@madhouse-project.org> * tap_dance: Move process_tap_dance further down Process the tap dance stuff after midi and audio, because those don't process keycodes, but row/col positions. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org> * tap_dance: Use conditionals instead of dummy functions To be consistent with how the rest of the quantum features are implemented, use ifdefs instead of dummy functions. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org> * Merge branch 'master' into quantum-keypress-process # Conflicts: # Makefile # keyboards/planck/rev3/config.h # keyboards/planck/rev4/config.h * update build script