Просмотр исходного кода

Adding support for keybind with 2 mods

Vinicius Teshima 1 год назад
Родитель
Сommit
26403b4f06
2 измененных файлов с 23 добавлено и 8 удалено
  1. 22 8
      src/app.h
  2. 1 0
      src/config.h

+ 22 - 8
src/app.h

@@ -351,17 +351,31 @@ app_add_global_keybind(struct app *app, const char *keybind,
 	IF_GOTO(words.size != 1, invalid_key);
 	/* for */ {
 		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;
-		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);
-		} 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);
 		} else {
 			goto invalid_key;

+ 1 - 0
src/config.h

@@ -22,6 +22,7 @@ void config(struct app *app) {
 
 	AAGK(app, "C-s", keybind_save_buffer, DIR_NO);
 	AAGK(app, "C-k", keybind_delete_to_edg_line, DIR_FORWARD);
+	AAGK(app, "C-S-<backspace>", keybind_delete_line, DIR_NO);
 
 	AAGK(app, "A-d", keybind_delete_word, DIR_FORWARD);
 	AAGK(app, "C-<backspace>", keybind_delete_word, DIR_BACKWARD);