diff options
-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; } |