Add timeout option to MODS_ONESHOT #66
This commit is contained in:
parent
d52d554360
commit
35f9f30074
5 changed files with 44 additions and 30 deletions
|
@ -100,40 +100,29 @@ void process_action(keyrecord_t *record)
|
|||
action.key.mods<<4;
|
||||
switch (action.layer_tap.code) {
|
||||
#ifndef NO_ACTION_ONESHOT
|
||||
case 0x00:
|
||||
case MODS_ONESHOT:
|
||||
// Oneshot modifier
|
||||
if (event.pressed) {
|
||||
if (tap_count == 0) {
|
||||
dprint("MODS_TAP: Oneshot: add_mods\n");
|
||||
register_mods(mods);
|
||||
}
|
||||
else if (tap_count == 1) {
|
||||
dprint("MODS_TAP: Oneshot: start\n");
|
||||
set_oneshot_mods(mods);
|
||||
}
|
||||
else if (tap_count == TAPPING_TOGGLE) {
|
||||
dprint("MODS_TAP: Oneshot: toggle\n");
|
||||
oneshot_toggle();
|
||||
}
|
||||
else {
|
||||
dprint("MODS_TAP: Oneshot: cancel&add_mods\n");
|
||||
// double tap cancels oneshot and works as normal modifier.
|
||||
clear_oneshot_mods();
|
||||
register_mods(mods);
|
||||
}
|
||||
} else {
|
||||
if (tap_count == 0) {
|
||||
dprint("MODS_TAP: Oneshot: cancel/del_mods\n");
|
||||
// cancel oneshot on hold
|
||||
clear_oneshot_mods();
|
||||
unregister_mods(mods);
|
||||
}
|
||||
else if (tap_count == 1) {
|
||||
// Oneshot
|
||||
// Retain Oneshot mods
|
||||
}
|
||||
else {
|
||||
dprint("MODS_TAP: Oneshot: del_mods\n");
|
||||
// cancel Mods
|
||||
clear_oneshot_mods();
|
||||
unregister_mods(mods);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include "report.h"
|
||||
#include "debug.h"
|
||||
#include "action_util.h"
|
||||
#include "timer.h"
|
||||
|
||||
static inline void add_key_byte(uint8_t code);
|
||||
static inline void del_key_byte(uint8_t code);
|
||||
|
@ -35,17 +36,28 @@ static uint8_t weak_mods = 0;
|
|||
report_keyboard_t *keyboard_report = &(report_keyboard_t){};
|
||||
|
||||
#ifndef NO_ACTION_ONESHOT
|
||||
static bool oneshot_enabled = true;
|
||||
static int8_t oneshot_mods = 0;
|
||||
#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
|
||||
static int16_t oneshot_time = 0;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
void send_keyboard_report(void) {
|
||||
keyboard_report->mods = real_mods;
|
||||
keyboard_report->mods |= weak_mods;
|
||||
#ifndef NO_ACTION_ONESHOT
|
||||
keyboard_report->mods |= oneshot_mods;
|
||||
if (has_anykey()) {
|
||||
clear_oneshot_mods();
|
||||
if (oneshot_mods) {
|
||||
#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
|
||||
if (TIMER_DIFF_16(timer_read(), oneshot_time) >= ONESHOT_TIMEOUT) {
|
||||
dprintf("Oneshot: timeout\n");
|
||||
clear_oneshot_mods();
|
||||
}
|
||||
#endif
|
||||
keyboard_report->mods |= oneshot_mods;
|
||||
if (has_anykey()) {
|
||||
clear_oneshot_mods();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
host_keyboard_send(keyboard_report);
|
||||
|
@ -99,11 +111,20 @@ void clear_weak_mods(void) { weak_mods = 0; }
|
|||
|
||||
/* Oneshot modifier */
|
||||
#ifndef NO_ACTION_ONESHOT
|
||||
void set_oneshot_mods(uint8_t mods) { oneshot_mods = mods; }
|
||||
void clear_oneshot_mods(void) { oneshot_mods = 0; }
|
||||
void oneshot_toggle(void) { oneshot_enabled = !oneshot_enabled; }
|
||||
void oneshot_enable(void) { oneshot_enabled = true; }
|
||||
void oneshot_disable(void) { oneshot_enabled = false; }
|
||||
void set_oneshot_mods(uint8_t mods)
|
||||
{
|
||||
oneshot_mods = mods;
|
||||
#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
|
||||
oneshot_time = timer_read();
|
||||
#endif
|
||||
}
|
||||
void clear_oneshot_mods(void)
|
||||
{
|
||||
oneshot_mods = 0;
|
||||
#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
|
||||
oneshot_time = 0;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue