|
@@ -351,17 +351,31 @@ app_add_global_keybind(struct app *app, const char *keybind,
|
|
|
IF_GOTO(words.size != 1, invalid_key);
|
|
IF_GOTO(words.size != 1, invalid_key);
|
|
|
/* for */ {
|
|
/* for */ {
|
|
|
struct str_da chars = str_split(words.items[0], '-');
|
|
struct str_da chars = str_split(words.items[0], '-');
|
|
|
- IF_GOTO(chars.size != 2, invalid_key);
|
|
|
|
|
- IF_GOTO(chars.items[0].size != 1, invalid_key);
|
|
|
|
|
- SDL_Keymod mod = char_to_keymod(chars.items[0].data[0]);
|
|
|
|
|
- IF_GOTO((int32_t)(mod) == -1, invalid_key);
|
|
|
|
|
|
|
+ IF_GOTO(chars.size < 2, invalid_key);
|
|
|
|
|
+ size_t key_i;
|
|
|
|
|
+ SDL_Keymod mod;
|
|
|
|
|
+ if ( chars.size >= 2 ) {
|
|
|
|
|
+ IF_GOTO(chars.items[0].size != 1, invalid_key);
|
|
|
|
|
+ mod = char_to_keymod(chars.items[0].data[0]);
|
|
|
|
|
+ IF_GOTO((int32_t)(mod) == -1, invalid_key);
|
|
|
|
|
+ key_i = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ if ( chars.size == 3 ) {
|
|
|
|
|
+ IF_GOTO(chars.items[1].size != 1, invalid_key);
|
|
|
|
|
+ SDL_Keymod mod_ =
|
|
|
|
|
+ char_to_keymod(chars.items[1].data[0]);
|
|
|
|
|
+ IF_GOTO((int32_t)(mod_) == -1, invalid_key);
|
|
|
|
|
+ mod |= mod_;
|
|
|
|
|
+ key_i = 2;
|
|
|
|
|
+ }
|
|
|
|
|
+ IF_GOTO(chars.size > 3, invalid_key);
|
|
|
|
|
|
|
|
SDL_KeyCode key;
|
|
SDL_KeyCode key;
|
|
|
- if ( chars.items[1].size == 1 ) {
|
|
|
|
|
- key = char_to_keycode(chars.items[1].data[0]);
|
|
|
|
|
|
|
+ if ( chars.items[key_i].size == 1 ) {
|
|
|
|
|
+ key = char_to_keycode(chars.items[key_i].data[0]);
|
|
|
IF_GOTO(key == SDLK_UNKNOWN, invalid_key);
|
|
IF_GOTO(key == SDLK_UNKNOWN, invalid_key);
|
|
|
- } else if ( chars.items[1].data[0] == '<' ) {
|
|
|
|
|
- key = str_to_keycode(chars.items[1]);
|
|
|
|
|
|
|
+ } else if ( chars.items[key_i].data[0] == '<' ) {
|
|
|
|
|
+ key = str_to_keycode(chars.items[key_i]);
|
|
|
IF_GOTO(key == SDLK_UNKNOWN, invalid_key);
|
|
IF_GOTO(key == SDLK_UNKNOWN, invalid_key);
|
|
|
} else {
|
|
} else {
|
|
|
goto invalid_key;
|
|
goto invalid_key;
|