Add tap flags on record_t
This commit is contained in:
parent
664796855b
commit
71bd9a72fb
@ -206,7 +206,7 @@ void action_exec(keyevent_t event)
|
|||||||
static void process_action(keyrecord_t *record)
|
static void process_action(keyrecord_t *record)
|
||||||
{
|
{
|
||||||
keyevent_t event = record->event;
|
keyevent_t event = record->event;
|
||||||
uint8_t tap_count = record->tap_count;
|
uint8_t tap_count = record->tap.count;
|
||||||
|
|
||||||
if (IS_NOEVENT(event)) { return; }
|
if (IS_NOEVENT(event)) { return; }
|
||||||
|
|
||||||
@ -295,7 +295,7 @@ static void process_action(keyrecord_t *record)
|
|||||||
if (waiting_buffer_has_anykey_pressed()) {
|
if (waiting_buffer_has_anykey_pressed()) {
|
||||||
debug("MODS_TAP: Tap: Cancel: add_mods\n");
|
debug("MODS_TAP: Tap: Cancel: add_mods\n");
|
||||||
// ad hoc: set 0 to cancel tap
|
// ad hoc: set 0 to cancel tap
|
||||||
record->tap_count = 0;
|
record->tap.count = 0;
|
||||||
add_mods(mods);
|
add_mods(mods);
|
||||||
} else {
|
} else {
|
||||||
debug("MODS_TAP: Tap: register_code\n");
|
debug("MODS_TAP: Tap: register_code\n");
|
||||||
@ -697,16 +697,17 @@ static bool process_tapping(keyrecord_t *keyp)
|
|||||||
// if tapping
|
// if tapping
|
||||||
if (IS_TAPPING_PRESSED()) {
|
if (IS_TAPPING_PRESSED()) {
|
||||||
if (WITHIN_TAPPING_TERM(event)) {
|
if (WITHIN_TAPPING_TERM(event)) {
|
||||||
if (tapping_key.tap_count == 0) {
|
if (tapping_key.tap.count == 0) {
|
||||||
if (IS_TAPPING_KEY(event.key) && !event.pressed) {
|
if (IS_TAPPING_KEY(event.key) && !event.pressed) {
|
||||||
// first tap!
|
// first tap!
|
||||||
debug("Tapping: First tap(0->1).\n");
|
debug("Tapping: First tap(0->1).\n");
|
||||||
tapping_key.tap_count = 1;
|
tapping_key.tap.count = 1;
|
||||||
|
tapping_key.tap.interrupted = (waiting_buffer_has_anykey_pressed() ? true : false);
|
||||||
debug_tapping_key();
|
debug_tapping_key();
|
||||||
process_action(&tapping_key);
|
process_action(&tapping_key);
|
||||||
|
|
||||||
// enqueue
|
// enqueue
|
||||||
keyp->tap_count = tapping_key.tap_count;
|
keyp->tap = tapping_key.tap;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#if TAPPING_TERM >= 500
|
#if TAPPING_TERM >= 500
|
||||||
@ -730,19 +731,19 @@ static bool process_tapping(keyrecord_t *keyp)
|
|||||||
// tap_count > 0
|
// tap_count > 0
|
||||||
else {
|
else {
|
||||||
if (IS_TAPPING_KEY(event.key) && !event.pressed) {
|
if (IS_TAPPING_KEY(event.key) && !event.pressed) {
|
||||||
debug("Tapping: Tap release("); debug_dec(tapping_key.tap_count); debug(")\n");
|
debug("Tapping: Tap release("); debug_dec(tapping_key.tap.count); debug(")\n");
|
||||||
keyp->tap_count = tapping_key.tap_count;
|
keyp->tap = tapping_key.tap;
|
||||||
process_action(keyp);
|
process_action(keyp);
|
||||||
tapping_key = *keyp;
|
tapping_key = *keyp;
|
||||||
debug_tapping_key();
|
debug_tapping_key();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (is_tap_key(keyp->event.key) && event.pressed) {
|
else if (is_tap_key(keyp->event.key) && event.pressed) {
|
||||||
if (tapping_key.tap_count > 1) {
|
if (tapping_key.tap.count > 1) {
|
||||||
debug("Tapping: Start new tap with releasing last tap(>1).\n");
|
debug("Tapping: Start new tap with releasing last tap(>1).\n");
|
||||||
// unregister key
|
// unregister key
|
||||||
process_action(&(keyrecord_t){
|
process_action(&(keyrecord_t){
|
||||||
.tap_count = tapping_key.tap_count,
|
.tap = tapping_key.tap,
|
||||||
.event.key = tapping_key.event.key,
|
.event.key = tapping_key.event.key,
|
||||||
.event.time = event.time,
|
.event.time = event.time,
|
||||||
.event.pressed = false
|
.event.pressed = false
|
||||||
@ -766,7 +767,7 @@ static bool process_tapping(keyrecord_t *keyp)
|
|||||||
}
|
}
|
||||||
// after TAPPING_TERM
|
// after TAPPING_TERM
|
||||||
else {
|
else {
|
||||||
if (tapping_key.tap_count == 0) {
|
if (tapping_key.tap.count == 0) {
|
||||||
debug("Tapping: End. Timeout. Not tap(0): ");
|
debug("Tapping: End. Timeout. Not tap(0): ");
|
||||||
debug_event(event); debug("\n");
|
debug_event(event); debug("\n");
|
||||||
process_action(&tapping_key);
|
process_action(&tapping_key);
|
||||||
@ -776,17 +777,17 @@ static bool process_tapping(keyrecord_t *keyp)
|
|||||||
} else {
|
} else {
|
||||||
if (IS_TAPPING_KEY(event.key) && !event.pressed) {
|
if (IS_TAPPING_KEY(event.key) && !event.pressed) {
|
||||||
debug("Tapping: End. last timeout tap release(>0).");
|
debug("Tapping: End. last timeout tap release(>0).");
|
||||||
keyp->tap_count = tapping_key.tap_count;
|
keyp->tap = tapping_key.tap;
|
||||||
process_action(keyp);
|
process_action(keyp);
|
||||||
tapping_key = (keyrecord_t){};
|
tapping_key = (keyrecord_t){};
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (is_tap_key(keyp->event.key) && event.pressed) {
|
else if (is_tap_key(keyp->event.key) && event.pressed) {
|
||||||
if (tapping_key.tap_count > 1) {
|
if (tapping_key.tap.count > 1) {
|
||||||
debug("Tapping: Start new tap with releasing last timeout tap(>1).\n");
|
debug("Tapping: Start new tap with releasing last timeout tap(>1).\n");
|
||||||
// unregister key
|
// unregister key
|
||||||
process_action(&(keyrecord_t){
|
process_action(&(keyrecord_t){
|
||||||
.tap_count = tapping_key.tap_count,
|
.tap = tapping_key.tap,
|
||||||
.event.key = tapping_key.event.key,
|
.event.key = tapping_key.event.key,
|
||||||
.event.time = event.time,
|
.event.time = event.time,
|
||||||
.event.pressed = false
|
.event.pressed = false
|
||||||
@ -810,10 +811,11 @@ static bool process_tapping(keyrecord_t *keyp)
|
|||||||
}
|
}
|
||||||
} else if (IS_TAPPING_RELEASED()) {
|
} else if (IS_TAPPING_RELEASED()) {
|
||||||
if (WITHIN_TAPPING_TERM(event)) {
|
if (WITHIN_TAPPING_TERM(event)) {
|
||||||
if (tapping_key.tap_count > 0 && IS_TAPPING_KEY(event.key) && event.pressed) {
|
if (tapping_key.tap.count > 0 && IS_TAPPING_KEY(event.key) && event.pressed) {
|
||||||
// sequential tap.
|
// sequential tap.
|
||||||
keyp->tap_count = tapping_key.tap_count + 1;
|
keyp->tap = tapping_key.tap;
|
||||||
debug("Tapping: Tap press("); debug_dec(keyp->tap_count); debug(")\n");
|
keyp->tap.count += 1;
|
||||||
|
debug("Tapping: Tap press("); debug_dec(keyp->tap.count); debug(")\n");
|
||||||
process_action(keyp);
|
process_action(keyp);
|
||||||
tapping_key = *keyp;
|
tapping_key = *keyp;
|
||||||
debug_tapping_key();
|
debug_tapping_key();
|
||||||
@ -858,16 +860,16 @@ static bool process_tapping(keyrecord_t *keyp)
|
|||||||
static void waiting_buffer_scan_tap(void)
|
static void waiting_buffer_scan_tap(void)
|
||||||
{
|
{
|
||||||
// tapping already is settled
|
// tapping already is settled
|
||||||
if (tapping_key.tap_count > 0) return;
|
if (tapping_key.tap.count > 0) return;
|
||||||
// invalid state: tapping_key released && tap_count == 0
|
// invalid state: tapping_key released && tap.count == 0
|
||||||
if (!tapping_key.event.pressed) return;
|
if (!tapping_key.event.pressed) return;
|
||||||
|
|
||||||
for (uint8_t i = waiting_buffer_tail; i != waiting_buffer_head; i = (i + 1) % WAITING_BUFFER_SIZE) {
|
for (uint8_t i = waiting_buffer_tail; i != waiting_buffer_head; i = (i + 1) % WAITING_BUFFER_SIZE) {
|
||||||
if (IS_TAPPING_KEY(waiting_buffer[i].event.key) &&
|
if (IS_TAPPING_KEY(waiting_buffer[i].event.key) &&
|
||||||
!waiting_buffer[i].event.pressed &&
|
!waiting_buffer[i].event.pressed &&
|
||||||
WITHIN_TAPPING_TERM(waiting_buffer[i].event)) {
|
WITHIN_TAPPING_TERM(waiting_buffer[i].event)) {
|
||||||
tapping_key.tap_count = 1;
|
tapping_key.tap.count = 1;
|
||||||
waiting_buffer[i].tap_count = 1;
|
waiting_buffer[i].tap.count = 1;
|
||||||
process_action(&tapping_key);
|
process_action(&tapping_key);
|
||||||
|
|
||||||
debug("waiting_buffer_scan_tap: found at ["); debug_dec(i); debug("]\n");
|
debug("waiting_buffer_scan_tap: found at ["); debug_dec(i); debug("]\n");
|
||||||
@ -987,6 +989,7 @@ bool is_tap_key(key_t key)
|
|||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
case ACT_MACRO:
|
||||||
case ACT_FUNCTION:
|
case ACT_FUNCTION:
|
||||||
if (action.func.opt & FUNC_TAP) { return true; }
|
if (action.func.opt & FUNC_TAP) { return true; }
|
||||||
return false;
|
return false;
|
||||||
@ -1006,7 +1009,8 @@ static void debug_event(keyevent_t event)
|
|||||||
}
|
}
|
||||||
static void debug_record(keyrecord_t record)
|
static void debug_record(keyrecord_t record)
|
||||||
{
|
{
|
||||||
debug_event(record.event); debug(":"); debug_dec(record.tap_count);
|
debug_event(record.event); debug(":"); debug_dec(record.tap.count);
|
||||||
|
if (record.tap.interrupted) debug("-");
|
||||||
}
|
}
|
||||||
static void debug_action(action_t action)
|
static void debug_action(action_t action)
|
||||||
{
|
{
|
||||||
|
@ -23,9 +23,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
|
|
||||||
/* Struct to record event and tap count */
|
/* Struct to record event and tap count */
|
||||||
|
typedef union {
|
||||||
|
struct {
|
||||||
|
bool interrupted :1;
|
||||||
|
bool reserved2 :1;
|
||||||
|
bool reserved1 :1;
|
||||||
|
bool reserved0 :1;
|
||||||
|
uint8_t count :4;
|
||||||
|
};
|
||||||
|
} tap_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
keyevent_t event;
|
keyevent_t event;
|
||||||
uint8_t tap_count;
|
tap_t tap;
|
||||||
} keyrecord_t;
|
} keyrecord_t;
|
||||||
|
|
||||||
/* Action struct.
|
/* Action struct.
|
||||||
@ -377,6 +387,7 @@ enum layer_params {
|
|||||||
*/
|
*/
|
||||||
/* Macro */
|
/* Macro */
|
||||||
#define ACTION_MACRO(id) ACTION(ACT_MACRO, (id))
|
#define ACTION_MACRO(id) ACTION(ACT_MACRO, (id))
|
||||||
|
#define ACTION_MACRO_TAP(id) ACTION(ACT_MACRO, FUNC_TAP<<8 | (id))
|
||||||
#define ACTION_MACRO_OPT(id, opt) ACTION(ACT_MACRO, (opt)<<8 | (id))
|
#define ACTION_MACRO_OPT(id, opt) ACTION(ACT_MACRO, (opt)<<8 | (id))
|
||||||
|
|
||||||
/* Command */
|
/* Command */
|
||||||
@ -386,7 +397,8 @@ enum layer_params {
|
|||||||
enum function_opts {
|
enum function_opts {
|
||||||
FUNC_TAP = 0x8, /* indciates function is tappable */
|
FUNC_TAP = 0x8, /* indciates function is tappable */
|
||||||
};
|
};
|
||||||
#define ACTION_FUNCTION(id, opt) ACTION(ACT_FUNCTION, (opt)<<8 | id)
|
#define ACTION_FUNCTION(id) ACTION(ACT_FUNCTION, (id))
|
||||||
#define ACTION_FUNCTION_TAP(id) ACTION(ACT_FUNCTION, FUNC_TAP<<8 | id)
|
#define ACTION_FUNCTION_TAP(id) ACTION(ACT_FUNCTION, FUNC_TAP<<8 | (id))
|
||||||
|
#define ACTION_FUNCTION_OPT(id, opt) ACTION(ACT_FUNCTION, (opt)<<8 | (id))
|
||||||
|
|
||||||
#endif /* ACTION_H */
|
#endif /* ACTION_H */
|
||||||
|
@ -41,7 +41,6 @@ void action_macro_play(const prog_macro_t *macro_p)
|
|||||||
case MODS_DOWN:
|
case MODS_DOWN:
|
||||||
MACRO_READ();
|
MACRO_READ();
|
||||||
debug("MODS_DOWN("); debug_hex(macro); debug(")\n");
|
debug("MODS_DOWN("); debug_hex(macro); debug(")\n");
|
||||||
debug("MODS_UP("); debug_hex(macro); debug(")\n");
|
|
||||||
add_mods(macro);
|
add_mods(macro);
|
||||||
break;
|
break;
|
||||||
case MODS_UP:
|
case MODS_UP:
|
||||||
|
Reference in New Issue
Block a user