From 5fc4a664dc0be3f380aba9480b710b9047f29fad Mon Sep 17 00:00:00 2001 From: Fredric Silberberg Date: Sun, 6 Aug 2017 02:09:34 -0700 Subject: Added initial key lock documentation. --- docs/_summary.md | 1 + docs/key_lock.md | 11 +++++++++++ docs/make_instructions.md | 4 ++++ docs/quantum_keycodes.md | 1 + 4 files changed, 17 insertions(+) create mode 100644 docs/key_lock.md (limited to 'docs') diff --git a/docs/_summary.md b/docs/_summary.md index 723377de9..0f65de0dd 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -17,6 +17,7 @@ * [Mouse keys](mouse_keys.md) * [Unicode](unicode.md) * [Stenography](stenography.md) + * [Key Lock](key_lock.md) * Reference * [Glossary](glossary.md) diff --git a/docs/key_lock.md b/docs/key_lock.md new file mode 100644 index 000000000..03cea2089 --- /dev/null +++ b/docs/key_lock.md @@ -0,0 +1,11 @@ +## Key Lock: Holding down keys for you + +Sometimes, you need to hold down a specific key for a long period of time. Whether this is while typing in ALL CAPS, or playing a video game that hasn't implemented auto-run, Key Lock is here to help. Key Lock adds a new keycode, `KC_LOCK`, that will hold down the next key you hit for you. The key is released when you hit it again. Here's an example: let's say you need to type in all caps for a few sentences. You hit KC_LOCK, and then shift. Now, shift will be considered held until you hit it again. You can think of key lock as caps lock, but supercharged. + +Here's how to use it: + +1. Pick a key on your keyboard. This will be the key lock key. Assign it the keycode `KC_LOCK`. This will be a single-action key: you won't be able to use it for anything else. +2. Enable key lock by including `KEY_LOCK_ENABLE = yes` in your Makefile. +3. That's it! + +Important: switching layers does not cancel the key lock. Additionally, key lock is only able to hold standard action keys. This does not include any of the QMK special functions, or shifted versions of keys such as KC_LPRN. If it's in the [basic_keycodes](basic_keycodes.md) list, it can be held. If it's not, then it can't be. diff --git a/docs/make_instructions.md b/docs/make_instructions.md index 64c1cb0f0..299c5785b 100644 --- a/docs/make_instructions.md +++ b/docs/make_instructions.md @@ -158,6 +158,10 @@ This enables using the Quantum SYSEX API to send strings (somewhere?) This consumes about 5390 bytes. +`KEY_LOCK_ENABLE` + +This enables [key lock](key_lock.md). This consumes an additional 260 bytes. + ## Customizing Makefile options on a per-keymap basis If your keymap directory has a file called `Makefile` (note the filename), any Makefile options you set in that file will take precedence over other Makefile options for your particular keyboard. diff --git a/docs/quantum_keycodes.md b/docs/quantum_keycodes.md index 36dbda7a9..f13801ef5 100644 --- a/docs/quantum_keycodes.md +++ b/docs/quantum_keycodes.md @@ -17,6 +17,7 @@ On this page we have documented keycodes between `0x00FF` and `0xFFFF` which are |`FUNC(n)`/`F(n)`|Call `fn_action(n)`| |`M(n)`|to call macro n| |`MACROTAP(n)`|to macro-tap n idk FIXME| +|`KC_LOCK`|The [lock key](key_lock.md)| ## Bootmagic Keycodes -- cgit v1.2.3-70-g09d2 From a3e1d9a8cc8b3d376d52f86aacae6315b15efebf Mon Sep 17 00:00:00 2001 From: Fredric Silberberg Date: Sun, 6 Aug 2017 14:14:27 -0700 Subject: Added support for locking One Shot modifiers. --- docs/key_lock.md | 2 +- keyboards/nyquist/keymaps/333fred/Makefile | 1 + quantum/process_keycode/process_key_lock.c | 41 ++++++++++++++++++++++-------- quantum/process_keycode/process_key_lock.h | 2 +- quantum/quantum.c | 2 +- 5 files changed, 34 insertions(+), 14 deletions(-) (limited to 'docs') diff --git a/docs/key_lock.md b/docs/key_lock.md index 03cea2089..e424061a9 100644 --- a/docs/key_lock.md +++ b/docs/key_lock.md @@ -8,4 +8,4 @@ Here's how to use it: 2. Enable key lock by including `KEY_LOCK_ENABLE = yes` in your Makefile. 3. That's it! -Important: switching layers does not cancel the key lock. Additionally, key lock is only able to hold standard action keys. This does not include any of the QMK special functions, or shifted versions of keys such as KC_LPRN. If it's in the [basic_keycodes](basic_keycodes.md) list, it can be held. If it's not, then it can't be. +Important: switching layers does not cancel the key lock. Additionally, key lock is only able to hold standard action keys and One Shot modifier keys (for example, if you have your shift defined as `OSM(KC_LSFT)`; see [One Shot Keys](quantum_keycodes.md#one-shot-keys)). This does not include any of the QMK special functions (except One Shot modifiers), or shifted versions of keys such as KC_LPRN. If it's in the [basic_keycodes](basic_keycodes.md) list, it can be held. If it's not, then it can't be. diff --git a/keyboards/nyquist/keymaps/333fred/Makefile b/keyboards/nyquist/keymaps/333fred/Makefile index 576bb3c30..f85443280 100644 --- a/keyboards/nyquist/keymaps/333fred/Makefile +++ b/keyboards/nyquist/keymaps/333fred/Makefile @@ -1,5 +1,6 @@ KEY_LOCK_ENABLE = yes NKRO_ENABLE = yes +CONSOLE_ENABLE = yes ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/quantum/process_keycode/process_key_lock.c b/quantum/process_keycode/process_key_lock.c index e3632b74f..b1ba397a0 100644 --- a/quantum/process_keycode/process_key_lock.c +++ b/quantum/process_keycode/process_key_lock.c @@ -50,7 +50,16 @@ uint64_t key_state[4] = { 0x0, 0x0, 0x0, 0x0 }; bool watching = false; -bool process_key_lock(uint16_t keycode, keyrecord_t *record) { +// Translate any OSM keycodes back to their unmasked versions. +uint16_t inline translate_keycode(uint16_t keycode) { + if (keycode > QK_ONE_SHOT_MOD && keycode <= QK_ONE_SHOT_MOD_MAX) { + return keycode ^ QK_ONE_SHOT_MOD; + } else { + return keycode; + } +} + +bool process_key_lock(uint16_t *keycode, keyrecord_t *record) { // We start by categorizing the keypress event. In the event of a down // event, there are several possibilities: // 1. The key is not being locked, and we are not watching for new keys. @@ -76,44 +85,54 @@ bool process_key_lock(uint16_t keycode, keyrecord_t *record) { // 2. The key is being locked. In this case, we will mask the up event // by returning false, so the OS never sees that the key was released // until the user pressed the key again. + + // We translate any OSM keycodes back to their original keycodes, so that if the key being + // one-shot modded is a standard keycode, we can handle it. This is the only set of special + // keys that we handle + uint16_t translated_keycode = translate_keycode(*keycode); + if (record->event.pressed) { // Non-standard keycode, reset and return - if (!(IS_STANDARD_KEYCODE(keycode) || keycode == KC_LOCK)) { + if (!(IS_STANDARD_KEYCODE(translated_keycode) || translated_keycode == KC_LOCK)) { watching = false; return true; } // If we're already watching, turn off the watch. - if (keycode == KC_LOCK) { + if (translated_keycode == KC_LOCK) { watching = !watching; return false; } - - if (IS_STANDARD_KEYCODE(keycode)) { + + if (IS_STANDARD_KEYCODE(translated_keycode)) { // We check watching first. This is so that in the following scenario, we continue to // hold the key: KC_LOCK, KC_F, KC_LOCK, KC_F // If we checked in reverse order, we'd end up holding the key pressed after the second // KC_F press is registered, when the user likely meant to hold F if (watching) { watching = false; - SET_KEY_STATE(keycode); + SET_KEY_STATE(translated_keycode); + // We need to set the keycode passed in to be the translated keycode, in case we + // translated a OSM back to the original keycode. + *keycode = translated_keycode; // Let the standard keymap send the keycode down event. The up event will be masked. return true; } - - if (KEY_STATE(keycode)) { - UNSET_KEY_STATE(keycode); + + if (KEY_STATE(translated_keycode)) { + UNSET_KEY_STATE(translated_keycode); // The key is already held, stop this process. The up event will be sent when the user // releases the key. return false; } } - + // Either the key isn't a standard key, or we need to send the down event. Continue standard // processing return true; } else { // Stop processing if it's a standard key and we're masking up. - return !(IS_STANDARD_KEYCODE(keycode) && KEY_STATE(keycode)); + return !(IS_STANDARD_KEYCODE(translated_keycode) && KEY_STATE(translated_keycode)); } } + diff --git a/quantum/process_keycode/process_key_lock.h b/quantum/process_keycode/process_key_lock.h index 237e103bc..876db4a32 100644 --- a/quantum/process_keycode/process_key_lock.h +++ b/quantum/process_keycode/process_key_lock.h @@ -19,6 +19,6 @@ #include "quantum.h" -bool process_key_lock(uint16_t keycode, keyrecord_t *record); +bool process_key_lock(uint16_t *keycode, keyrecord_t *record); #endif // PROCESS_KEY_LOCK_H diff --git a/quantum/quantum.c b/quantum/quantum.c index c71a97bf2..0243a7e01 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -195,7 +195,7 @@ bool process_record_quantum(keyrecord_t *record) { if (!( #if defined(KEY_LOCK_ENABLE) // Must run first to be able to mask key_up events. - process_key_lock(keycode, record) && + process_key_lock(&keycode, record) && #endif process_record_kb(keycode, record) && #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) -- cgit v1.2.3-70-g09d2 From f1536a3f547a48a0b244be122937c3329dfd31e0 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Fri, 4 Aug 2017 13:52:08 -0400 Subject: Change installation of avr-libc to avr-gcc, now that avr-libc is integrated into the avr-gcc build --- docs/build_environment_setup.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'docs') diff --git a/docs/build_environment_setup.md b/docs/build_environment_setup.md index 2282e9d13..d2d63defb 100644 --- a/docs/build_environment_setup.md +++ b/docs/build_environment_setup.md @@ -50,10 +50,10 @@ If you have trouble and want to ask for help, it is useful to generate a *Win_Ch If you're using [homebrew,](http://brew.sh/) you can use the following commands: brew tap osx-cross/avr - brew install avr-libc + brew install avr-gcc brew install dfu-programmer -This is the recommended method. If you don't have homebrew, [install it!](http://brew.sh/) It's very much worth it for anyone who works in the command line. Note that the `make` and `make install` portion during the homebrew installation of avr-libc can take over 20 minutes and exhibit high CPU usage. +This is the recommended method. If you don't have homebrew, [install it!](http://brew.sh/) It's very much worth it for anyone who works in the command line. Note that the `make` and `make install` portion during the homebrew installation of avr-gcc can take over 20 minutes and exhibit high CPU usage. You can also try these instructions: -- cgit v1.2.3-70-g09d2 From 5ad103fa51083cb26d3516e5598b7b2a099b1521 Mon Sep 17 00:00:00 2001 From: Balz Guenat Date: Fri, 11 Aug 2017 22:20:36 +0200 Subject: add description of new option to docs and add option (commented out) into template. --- docs/faq_keymap.md | 4 +++- quantum/template/config.h | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'docs') diff --git a/docs/faq_keymap.md b/docs/faq_keymap.md index d6442ac53..3c2795816 100644 --- a/docs/faq_keymap.md +++ b/docs/faq_keymap.md @@ -116,7 +116,9 @@ https://github.com/tekezo/Karabiner/issues/403 ## Esc and `~ on a key -Use `GRAVE_ESC` or `KC_GESC` in your keymap. +Use `GRAVE_ESC` or `KC_GESC` in your keymap. `GUI`+`GRAVE_ESC` results in `\`` and `SHIFT`+`GRAVE_ESC` results in `~`. + +Note that this will break the CTRL+SHIFT+ESC shortcut to the Windows task manager. Use `#define GRAVE_ESC_CTRL_OVERRIDE` in your `config.h` to get the shortcut back. With this option, `ESC_GRAVE` results in `ESC` if `CTRL` is held, even if `SHIFT` or `GUI` are also held. ## Arrow on Right Modifier keys with Dual-Role This turns right modifer keys into arrow keys when the keys are tapped while still modifiers when the keys are hold. In TMK the dual-role function is dubbed **TAP**. diff --git a/quantum/template/config.h b/quantum/template/config.h index dbca45765..700a56f52 100644 --- a/quantum/template/config.h +++ b/quantum/template/config.h @@ -67,6 +67,11 @@ along with this program. If not, see . /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + /* * Force NKRO * -- cgit v1.2.3-70-g09d2