#include "input.h" #include "editor.h" #include "file.h" #include "line.h" void editor_process_keypress(struct editor_state *editor, SDL_Keysym *keysym) { static int quit_message = 1; /* Handle keypresses for typing modes separately. */ if (editor->mode != EDITOR_MODE_NORMAL) { if (keysym->sym == SDLK_BACKSPACE) editor_delete_char(editor); if (keysym->sym == SDLK_RETURN) editor_insert_newline(editor); if (keysym->sym == SDLK_TAB) editor_insert_char(editor, '\t'); if (keysym->sym == SDLK_ESCAPE) editor->mode = EDITOR_MODE_NORMAL; return; } switch (keysym->sym) { /* TODO: Reimplement page up/down on Shift+W/S. */ case SDLK_w: editor_move_up(editor); break; case SDLK_s: if (keysym->mod & KMOD_CTRL) { editor_save(editor); break; } editor_move_down(editor); break; case SDLK_a: editor_move_left(editor); break; case SDLK_d: editor_move_right(editor); break; case SDLK_q: if (keysym->mod & KMOD_CTRL) { if (editor->dirty && quit_message) { editor_set_status_message(editor, "This file has unsaved changes. Press Ctrl+Q again to quit"); quit_message = 0; return; } exit(0); } editor->cursor_x = 0; break; case SDLK_e: editor_move_end(editor); break; case SDLK_n: editor_delete_char(editor); break; case SDLK_m: editor_move_right(editor); editor_delete_char(editor); break; case SDLK_i: editor->mode = EDITOR_MODE_INSERT; editor->pressed_insert_key = 1; 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; 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; break; case SDLK_SLASH: editor_find(editor); break; } quit_message = 1; }