| `ESC` | Exit console |
| `Enter` | Evaluate the expression |
| `Up/Down` | Traverse console history |
+| `CTRL+L` | Clear |
+| `CTRL+W` | Cut |
+| `META+W` | Copy |
+| `CTRL+Y` | Paste |
### Level Editor
};
/* TODO(#356): Console does not support autocompletion */
-/* TODO(#358): Console does not support copy, cut, paste operations */
Console *create_console(Game *game)
{
}
} break;
+ case SDLK_l: {
+ if (event->key.keysym.mod & KMOD_CTRL) {
+ console_log_clear(console->console_log);
+ return 0;
+ }
+ } break;
+
+ case SDLK_w: {
+ if (event->key.keysym.mod & (KMOD_CTRL | KMOD_ALT)) {
+ SDL_SetClipboardText(edit_field_as_text(console->edit_field));
+ if (event->key.keysym.mod & KMOD_CTRL) {
+ edit_field_clean(console->edit_field);
+ }
+ return 0;
+ }
+ } break;
+
+ case SDLK_y: {
+ if (event->key.keysym.mod & KMOD_CTRL) {
+ char *text = SDL_GetClipboardText();
+ edit_field_append(console->edit_field, text);
+ return 0;
+ }
+ } break;
+
case SDLK_DOWN:
edit_field_replace(
console->edit_field,
return 0;
}
+
+void console_log_clear(Console_Log *console_log)
+{
+ trace_assert(console_log);
+ console_log->cursor = 0;
+ for (size_t i = 0; i < console_log->capacity; ++i) {
+ if (console_log->buffer[i]) {
+ console_log->buffer[i] = 0;
+ }
+ }
+}
const char *line_end,
Color color);
+void console_log_clear(Console_Log *console_log);
+
#endif // CONSOLE_LOG_H_
}
}
+void edit_field_append(Edit_field *edit_field, const char *text)
+{
+ size_t n = strlen(text);
+ edit_field->buffer = strcat(edit_field->buffer, text);
+ edit_field->cursor += n;
+}
+
void edit_field_clean(Edit_field *edit_field)
{
trace_assert(edit_field);
const char *edit_field_as_text(const Edit_field *edit_field);
void edit_field_replace(Edit_field *edit_field, const char *text);
+void edit_field_append(Edit_field *edit_field, const char *text);
void edit_field_clean(Edit_field *edit_field);
void edit_field_restyle(Edit_field *edit_field,
Vec2f font_size,