aboutsummaryrefslogtreecommitdiff
path: root/src/parse.c
diff options
context:
space:
mode:
authorkoekeishiya <aasvi93@hotmail.com>2018-07-20 19:26:15 +0200
committerkoekeishiya <aasvi93@hotmail.com>2018-07-20 19:26:15 +0200
commit0b03bdb56667fc3efcbf2624145409436cac9b78 (patch)
treebb5da0de9f7e18d7bcffda48f39acafd4c7a8df6 /src/parse.c
parentbee00428694c093baa805858e093815bd59ff112 (diff)
downloadskhd-0b03bdb56667fc3efcbf2624145409436cac9b78.tar.gz
skhd-0b03bdb56667fc3efcbf2624145409436cac9b78.zip
#44 synthesize keypress; skhd -k "alt - h"
Diffstat (limited to 'src/parse.c')
-rw-r--r--src/parse.c55
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);