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