In spite of a hiatus that's now more than a year long, I haven't forgotten about my kilo project. Steps 43-45 involve code to keep track of where the cursor is on the screen, and allow the user to move it around. Here's the original code that does that:
void editorMoveCursor(char key) { switch (key) { case 'a': E.cx--; break; case 'd': E.cx++; break; case 'w': E.cy--; break; case 's': E.cy++; break; } } void editorProcessKeypress() { char c = editorReadKey(); switch (c) { case CTRL_KEY('q'): write(STDOUT_FILENO, "\x1b[2J", 4); write(STDOUT_FILENO, "\x1b[H", 3); exit(0); break; case 'w': case 's': case 'a': case 'd': editorMoveCursor(c); break; } }
The code is basically decoding the w, s, a, and d characters twice: once to determine that the editorMoveCursor function should be called, and another to determine how the cursor should be moved. This is (IMO) another bug waiting to happen, in a large project these two points in the code could easily get out of sync. There's no reason not to do something like this (which is also my current solution):
void editor_move_cursor(int dcx, int dcy) { g_editor_state.cx += dcx; g_editor_state.cy += dcy; } void editor_process_keypress(char c) { string_const clear_screen = get_clear_screen_str(); string_const home_cursor = get_home_cursor_str(); switch (c) { case CTRL_KEY('q'): write_str(clear_screen); write_str(home_cursor); exit(0); break; case 'w': editor_move_cursor( 0, -1); break; case 's': editor_move_cursor( 0, 1); break; case 'a': editor_move_cursor(-1, 0); break; case 'd': editor_move_cursor( 1, 0); break; } }
Note that now only editor_process_keypress needs to know what keys move the cursor, and editor_move_cursor gets parameters that are directly interpretable.
No comments:
Post a Comment