diff options
author | cflip <cflip@cflip.net> | 2023-01-16 13:36:25 -0700 |
---|---|---|
committer | cflip <cflip@cflip.net> | 2023-01-16 13:36:25 -0700 |
commit | 58d38d02b215f2e4829ccdc399df8d59bb6cb140 (patch) | |
tree | e59bd669d2381ce320dc952752d31e0606347b5a | |
parent | 617db1d87703e929390a3ea04d189a25c4aaa026 (diff) |
Ignore first keypress after entering insert mode
This fixes the problem where the key used to enter insert mode ('i' for
example) would also be typed into the document.
-rw-r--r-- | editor.h | 6 | ||||
-rw-r--r-- | input.c | 3 | ||||
-rw-r--r-- | window.c | 8 |
3 files changed, 17 insertions, 0 deletions
@@ -25,6 +25,12 @@ struct editor_state { time_t status_message_time; struct editor_syntax* syntax; int mode; + /* + * Keep track of whether a key that toggles insert mode has been pressed, so + * we can ignore it during the text input event. Otherwise, an 'i' or other + * letter will be inserted when entering insert mode. + */ + int pressed_insert_key; }; void init_editor(struct editor_state* editor); @@ -61,6 +61,7 @@ void editor_process_keypress(struct editor_state *editor, SDL_Keysym *keysym) break; case SDLK_i: editor->mode = EDITOR_MODE_INSERT; + editor->pressed_insert_key = 1; break; case SDLK_a: if (keysym->mod & KMOD_SHIFT) @@ -68,6 +69,7 @@ void editor_process_keypress(struct editor_state *editor, SDL_Keysym *keysym) else editor_move_right(editor); editor->mode = EDITOR_MODE_INSERT; + editor->pressed_insert_key = 1; break; case SDLK_o: if (keysym->mod & KMOD_SHIFT) @@ -75,6 +77,7 @@ void editor_process_keypress(struct editor_state *editor, SDL_Keysym *keysym) else editor_add_line_below(editor); editor->mode = EDITOR_MODE_INSERT; + editor->pressed_insert_key = 1; break; case SDLK_k: editor_move_up(editor); @@ -49,6 +49,14 @@ int window_handle_event(struct editor_state *editor) case SDL_TEXTINPUT: if (editor->mode == EDITOR_MODE_NORMAL) break; + /* + * Ignore the first letter after entering insert mode, because it + * usually is just 'i'. + */ + if (editor->pressed_insert_key) { + editor->pressed_insert_key = 0; + break; + } editor_insert_char(editor, *e.text.text); break; } |