Awesome, thanks!
I didn’t want to type it all out on my anemic phone keyboard/screen, so here goes from my PC:
Before getting into how I want everything to be different (again), let me just say that with the same-half primary, minimum hold time and doubletap postponed until timeout, UHK is in a great place for HRMs! I doubt anyone would find it lackluster.
I just have very specific desires.
The concept is:
I want activations to happen on actions, not on inaction.
I want secondary roles to only activate for key combos, not on their own.
Side note:
It is possible that the solution that I propose and intend to implement should not be a modification of the current timeout behavior, but a new concept. It could also be that it would be the behavior of the timeout NoOp action, with Primary or Secondary timeout behaving as they do now.
The motivation:
I find that i often press one or more mod keys, then think about what I want to do, then change my mind and release them again. If that was Alt, now I have a menu popping up, if it was Gui, i have the Start Menu or Rofi, and so on. This happens a lot more after I switched to HRMs when I don’t change my mind about pressing the modifiers, but I remember that the primary key of the combo is on one of the fingers which are holding mods. I didn’t change my mind, I just needed to use the other hand. Maybe I pressed a mod too many and release one of them. The others now trigger primary from same half. I want those cases to not trigger mod presses, but I also want to be able to hold for a while and make up my mind, then use them as mod keys even though I passed timeout.
What I intend to implement:
Reaching timeout will remove the primary behavior of the key and substitute the timeout behavior on release. The key will no longer be able to trigger primary, only secondary if something brings it into that state, or the timeout action if nothing triggers it as secondary before release. This means that with Primary from same half, same half will no longer trigger resolution, but will be ignored for the purpose of resolving the currently evaluated key, if the current key hold has passed timeout. Those same-half presses will still be evaluated on their own on queue unroll.
Double tap will still trigger primary after timeout as an exception. That is the purpose of double tap, and this is still consistent with action triggered resolution even if the resolution is delayed from the action to ascertain the intention of the action.
How I imagine it will play out:
In the following, all mod keys are alt role keys. If I mention pressing Ctrl, that is an alt role key with secondary role Ctrl. Timeout action is NoOp, and primary from same half is active.
While typing, everything behaves the same as does is now.
When I hold a key, it is always with the intention of performing a combo. If I wanted to hold primary, I would double tap. I very rarely want to press mod keys just for themselves, so this will not be part of “standard actions”. It will still be possible though, more on that later.
If I hold one key past the timeout and release, simple “press-release” primary behavior is overridden by timeout NoOp.
If I hold two mods through timeout and release them, they will ignore each other for resolution, and their “press-release” primary behavior is overridden by timeout NoOp.
If I hold two or more mods through timeout, then release one, that release will not trigger the other key(s) as primary, and will itself resolve as timeout NoOp. The others will still be valid for activating a combo with the other half of the keyboard. I can even still add keys to the combo as well.
If I ever want to actually hold one or more mods without a primary key, I have several options:
- I can have dedicated mod keys for that
- I can press mods on one half, then use an unbound key on the other half to resolve them to secondary.
- I can press mods on one half and then hold a mod on the other half through timeout, then release that key on the other half. The first half mods will trigger secondary on the release from the other half, but the key used to trigger them will do nothing, essentially the same as the above case, without needing a separate unbound key.
Like I said, I think this is too specific for general users, and will likely have to stay on my own fork.