From 0b03bdb56667fc3efcbf2624145409436cac9b78 Mon Sep 17 00:00:00 2001 From: koekeishiya Date: Fri, 20 Jul 2018 19:26:15 +0200 Subject: #44 synthesize keypress; skhd -k "alt - h" --- src/parse.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'src/parse.c') 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); -- cgit v1.2.3