diff options
author | koekeishiya <aasvi93@hotmail.com> | 2018-07-20 19:26:15 +0200 |
---|---|---|
committer | koekeishiya <aasvi93@hotmail.com> | 2018-07-20 19:26:15 +0200 |
commit | 0b03bdb56667fc3efcbf2624145409436cac9b78 (patch) | |
tree | bb5da0de9f7e18d7bcffda48f39acafd4c7a8df6 /src/parse.c | |
parent | bee00428694c093baa805858e093815bd59ff112 (diff) | |
download | skhd-0b03bdb56667fc3efcbf2624145409436cac9b78.tar.gz skhd-0b03bdb56667fc3efcbf2624145409436cac9b78.zip |
#44 synthesize keypress; skhd -k "alt - h"
Diffstat (limited to 'src/parse.c')
-rw-r--r-- | src/parse.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/parse.c b/src/parse.c index 79f4aba..a79d8a3 100644 --- a/src/parse.c +++ b/src/parse.c @@ -367,6 +367,53 @@ void parse_config(struct parser *parser) } } +struct hotkey * +parse_keypress(struct parser *parser) +{ + if ((parser_check(parser, Token_Modifier)) || + (parser_check(parser, Token_Literal)) || + (parser_check(parser, Token_Key_Hex)) || + (parser_check(parser, Token_Key))) { + struct hotkey *hotkey = malloc(sizeof(struct hotkey)); + memset(hotkey, 0, sizeof(struct hotkey)); + bool found_modifier; + + if ((found_modifier = parser_match(parser, Token_Modifier))) { + hotkey->flags = parse_modifier(parser); + if (parser->error) { + goto err; + } + } + + if (found_modifier) { + if (!parser_match(parser, Token_Dash)) { + parser_report_error(parser, Error_Unexpected_Token, "expected '-'"); + goto err; + } + } + + if (parser_match(parser, Token_Key)) { + hotkey->key = parse_key(parser); + } else if (parser_match(parser, Token_Key_Hex)) { + hotkey->key = parse_key_hex(parser); + } else if (parser_match(parser, Token_Literal)) { + parse_key_literal(parser, hotkey); + } else { + parser_report_error(parser, Error_Unexpected_Token, "expected key-literal"); + goto err; + } + + return hotkey; + + err: + free(hotkey); + return NULL; + } else { + parser_report_error(parser, Error_Unexpected_Token, "expected modifier or key-literal"); + } + return NULL; +} + struct token parser_peek(struct parser *parser) { @@ -445,6 +492,14 @@ bool parser_init(struct parser *parser, struct table *mode_map, char *file) return false; } +bool parser_init_text(struct parser *parser, char *text) +{ + memset(parser, 0, sizeof(struct parser)); + tokenizer_init(&parser->tokenizer, text); + parser_advance(parser); + return true; +} + void parser_destroy(struct parser *parser) { free(parser->tokenizer.buffer); |