summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcflip <cflip@cflip.net>2023-01-31 12:30:50 -0700
committercflip <cflip@cflip.net>2023-01-31 12:30:50 -0700
commit16b949aa3147e3aaadb6888f574f6424d4c2d8f3 (patch)
treefa0dc9e332eb319e58186d334cfb843a2ee9ff2a
parent757efb85045408e2601da0f53547941a40d2e960 (diff)
Add a function to handle changing the editor mode
This way any extra stuff such as clearing the command line buffer or setting the flag to ignore the extra first key can be automatically set.
-rw-r--r--editor.c22
-rw-r--r--editor.h2
-rw-r--r--input.c16
3 files changed, 29 insertions, 11 deletions
diff --git a/editor.c b/editor.c
index bba0ab9..c4e2a06 100644
--- a/editor.c
+++ b/editor.c
@@ -62,8 +62,7 @@ char* editor_prompt(struct editor_state* editor, char* prompt, void (*callback)(
void editor_run_command(struct editor_state *editor)
{
/* TODO: Do something here */
- editor->mode = EDITOR_MODE_NORMAL;
- textbuf_clear(&editor->cmdline);
+ editor_set_mode(editor, EDITOR_MODE_NORMAL);
}
void editor_try_quit(struct editor_state *editor)
@@ -183,6 +182,25 @@ void editor_add_line_below(struct editor_state* editor)
editor->cursor_x = 0;
}
+void editor_set_mode(struct editor_state *editor, enum editor_mode mode)
+{
+ enum editor_mode last_mode = editor->mode;
+ if (mode == last_mode)
+ return;
+
+ /* Clear the command line if we are leaving command mode. */
+ if (last_mode == EDITOR_MODE_COMMAND) {
+ textbuf_clear(&editor->cmdline);
+ }
+
+ /* Ignore the extra first letter if we are entering a typing mode. */
+ if (mode != EDITOR_MODE_NORMAL) {
+ editor->pressed_insert_key = 1;
+ }
+
+ editor->mode = mode;
+}
+
static void editor_find_callback(struct editor_state* editor, char* query, int key)
{
static int last_match = -1;
diff --git a/editor.h b/editor.h
index 52daa06..0ae0fae 100644
--- a/editor.h
+++ b/editor.h
@@ -55,6 +55,8 @@ void editor_delete_char(struct editor_state* editor);
void editor_add_line_above(struct editor_state* editor);
void editor_add_line_below(struct editor_state* editor);
+void editor_set_mode(struct editor_state *editor, enum editor_mode mode);
+
void editor_find(struct editor_state* editor);
void editor_scroll(struct editor_state* editor);
void editor_update_screen_size(struct editor_state *);
diff --git a/input.c b/input.c
index 36670e2..3167a91 100644
--- a/input.c
+++ b/input.c
@@ -33,7 +33,7 @@ void editor_process_keypress(struct editor_state *editor, SDL_Keysym *keysym)
editor_insert_char(editor, '\t');
if (keysym->sym == SDLK_ESCAPE)
- editor->mode = EDITOR_MODE_NORMAL;
+ editor_set_mode(editor, EDITOR_MODE_NORMAL);
return;
}
@@ -45,7 +45,7 @@ void editor_process_keypress(struct editor_state *editor, SDL_Keysym *keysym)
editor_run_command(editor);
if (keysym->sym == SDLK_ESCAPE)
- editor->mode = EDITOR_MODE_NORMAL;
+ editor_set_mode(editor, EDITOR_MODE_NORMAL);
return;
}
@@ -85,30 +85,28 @@ void editor_process_keypress(struct editor_state *editor, SDL_Keysym *keysym)
editor_delete_char(editor);
break;
case SDLK_i:
- editor->mode = EDITOR_MODE_INSERT;
- editor->pressed_insert_key = 1;
+ editor_set_mode(editor, EDITOR_MODE_INSERT);
break;
case SDLK_l:
if (keysym->mod & KMOD_SHIFT)
editor_move_end(editor);
else
editor_move_right(editor);
- editor->mode = EDITOR_MODE_INSERT;
- editor->pressed_insert_key = 1;
+ editor_set_mode(editor, EDITOR_MODE_INSERT);
break;
case SDLK_o:
if (keysym->mod & KMOD_SHIFT)
editor_add_line_above(editor);
else
editor_add_line_below(editor);
- editor->mode = EDITOR_MODE_INSERT;
- editor->pressed_insert_key = 1;
+ editor_set_mode(editor, EDITOR_MODE_INSERT);
break;
case SDLK_SLASH:
editor_find(editor);
break;
case SDLK_SEMICOLON:
- editor->mode = EDITOR_MODE_COMMAND;
+ if (keysym->mod & KMOD_SHIFT)
+ editor_set_mode(editor, EDITOR_MODE_COMMAND);
break;
}
}