From acf1ca45d8f823371a2b55327971cf0d548e2916 Mon Sep 17 00:00:00 2001 From: Raheman Vaiya Date: Mon, 18 Apr 2022 02:36:18 -0400 Subject: [PATCH] feature: Add macro2() to allow for per-macro timeout values (#176) --- data/keyd-application-mapper.1.gz | Bin 1488 -> 1484 bytes data/keyd.1.gz | Bin 5429 -> 5493 bytes docs/keyd.scdoc | 9 ++++++ src/descriptor.c | 44 +++++++++++++++++++++++++----- src/keyboard.c | 14 +++++++--- src/layer.h | 5 +++- 6 files changed, 60 insertions(+), 12 deletions(-) diff --git a/data/keyd-application-mapper.1.gz b/data/keyd-application-mapper.1.gz index 9a5d913cc805fcc728e8a8c2c252528b65b8a34a..2ad79806b5be56567baa75d94565ea13c0a2c5d8 100644 GIT binary patch delta 1441 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 diff --git a/data/keyd.1.gz b/data/keyd.1.gz index bf8032cd146928d0d86878c1c5ddf5eb5abdfeaf..ef7b68d041f35e6e4ef2fd21884b2e49599cfb7e 100644 GIT binary patch delta 5423 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 diff --git a/docs/keyd.scdoc b/docs/keyd.scdoc index 7f907d6..59b6f6c 100644 --- a/docs/keyd.scdoc +++ b/docs/keyd.scdoc @@ -364,6 +364,15 @@ arguments. b = S-insert ``` +*macro2(, , )* + Creates a macro with the given timeout and repeat timeout. If a timeout value of 0 is used, + macro repeat is disabled. + + E.G + + macro2(400, 50, macro(Hello space World)) + + *noop* Do nothing. diff --git a/src/descriptor.c b/src/descriptor.c index 3f3455c..8f7a6b0 100644 --- a/src/descriptor.c +++ b/src/descriptor.c @@ -153,7 +153,7 @@ static int parse_sequence(const char *s, uint8_t *codep, uint8_t *modsp) return -1; } -/* +/* * Returns the character size in bytes, or 0 in the case of the empty string. */ static int utf8_read_char(const char *_s, uint32_t *code) @@ -514,25 +514,34 @@ int create_layer(struct layer *layer, const char *desc, const struct layer_table return 0; } -/* +/* * Returns: * * > 0 if exp is a valid macro but the macro table is full * < 0 in the case of an invalid macro * 0 on success */ -int set_macro_arg(struct descriptor *d, int idx, struct layer_table *lt, const char *exp) +int set_macro_arg(struct descriptor *d, + int idx, + struct layer_table *lt, const char *exp, + int32_t timeout, + int32_t repeat_timeout) { + struct macro *macro = <->macros[lt->nr_macros]; + if (lt->nr_macros >= MAX_MACROS) { err("max macros (%d), exceeded", MAX_MACROS); return 1; } - if (parse_macro(exp, <->macros[lt->nr_macros]) < 0) { + if (parse_macro(exp, macro) < 0) { err("\"%s\" is not a valid macro", exp); return -1; } + macro->timeout = timeout; + macro->repeat_timeout = repeat_timeout; + d->args[idx].idx = lt->nr_macros; lt->nr_macros++; @@ -573,7 +582,7 @@ int parse_descriptor(const char *descstr, if (keycode_to_mod(code)) fprintf(stderr, "WARNING: mapping modifier keycodes directly may produce unintended results, you probably want layer() instead\n"); - } else if ((ret=set_macro_arg(d, 0, lt, descstr)) >= 0) { + } else if ((ret=set_macro_arg(d, 0, lt, descstr, -1, -1)) >= 0) { if (ret > 0) return -1; else @@ -589,6 +598,8 @@ int parse_descriptor(const char *descstr, d->op = OP_OVERLOAD; else if (!strcmp(fn, "swap")) { d->op = OP_SWAP; + } else if (!strcmp(fn, "macro2")) { + d->op = OP_MACRO; } else if (!strcmp(fn, "timeout")) { d->op = OP_TIMEOUT; } else { @@ -601,6 +612,25 @@ int parse_descriptor(const char *descstr, return -1; } + if (d->op == OP_MACRO) { + int32_t timeout; + int32_t repeat_timeout; + + if (nargs != 3) { + err("macro2 requires 3 arguments."); + return -1; + } + + timeout = atoi(args[0]); + repeat_timeout = atoi(args[1]); + + if (set_macro_arg(d, 0, lt, args[2], timeout, repeat_timeout) < 0) + return -1; + + + return 0; + } + if (d->op == OP_TIMEOUT) { struct timeout *timeout; @@ -642,13 +672,13 @@ int parse_descriptor(const char *descstr, d->args[1].idx = -1; if (nargs > 1) - return set_macro_arg(d, 1, lt, args[1]); + return set_macro_arg(d, 1, lt, args[1], -1, -1); } else if (utf8_strlen(descstr) == 1) { char buf[32]; sprintf(buf, "macro(%s)", descstr); d->op = OP_MACRO; - if (set_macro_arg(d, 0, lt, buf)) + if (set_macro_arg(d, 0, lt, buf, -1, -1)) return -1; } else { err("invalid key or action"); diff --git a/src/keyboard.c b/src/keyboard.c index ef365c7..f5baf79 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -447,7 +447,9 @@ static long process_descriptor(struct keyboard *kbd, uint8_t code, kbd->active_macro = macro; kbd->active_macro_layer = dl; - timeout = kbd->config.macro_timeout; + timeout = macro->timeout == -1 ? + kbd->config.macro_timeout : + macro->timeout; } break; @@ -498,9 +500,11 @@ static long process_descriptor(struct keyboard *kbd, uint8_t code, } } else { deactivate_layer(kbd, layer); - update_mods(kbd, layer, mods); + update_mods(kbd, layer, 0); } + break; + case OP_UNDEFINED: break; } @@ -523,14 +527,16 @@ static long process_descriptor(struct keyboard *kbd, uint8_t code, long kbd_process_key_event(struct keyboard *kbd, uint8_t code, int pressed) { - struct layer *dl; + struct layer *dl = NULL; struct descriptor d; /* timeout */ if (!code) { if (kbd->active_macro) { execute_macro(kbd, kbd->active_macro_layer, kbd->active_macro); - return kbd->config.macro_repeat_timeout; + return kbd->active_macro->repeat_timeout == -1 ? + kbd->config.macro_repeat_timeout : + kbd->active_macro->repeat_timeout; } if (kbd->pending_timeout.active) { diff --git a/src/layer.h b/src/layer.h index 9b6ab49..53cd369 100644 --- a/src/layer.h +++ b/src/layer.h @@ -72,7 +72,10 @@ struct macro_entry { */ struct macro { struct macro_entry entries[MAX_MACRO_SIZE]; - size_t sz; + + int32_t timeout; + int32_t repeat_timeout; + uint32_t sz; }; struct layer_table {