#include "app.h" #include "editor.h" #include #include #include static void ptr_vec_push( void*** vec, size_t* capacity, size_t* size, void* element) { if (*size + 1 > *capacity) { *capacity *= 2; *vec = realloc(*vec, *capacity * sizeof(void*)); } (*vec)[*size] = element; *size += 1; } void app_init(App* app) { const size_t buffers_initial_capacity = 16; *app = (App) { .buffers = malloc(buffers_initial_capacity), .buffers_capacity = buffers_initial_capacity, .buffers_size = 0, .res = (AppRessources) { .font = nullptr, .char_size = {}, }, .editor = {}, }; editor_init(&app->editor, 1000, 1000, &app->res); } void app_deinit(App* app) { if (app->res.font) TTF_CloseFont(app->res.font); for (size_t i = 0; i < app->buffers_size; ++i) { buffer_deinit(app->buffers[i]); free(app->buffers[i]); } free(app->buffers); } int app_ressources_load(App* app) { app->res.font = TTF_OpenFont("/usr/share/fonts/TTF/FiraCodeNerdFont-Medium.ttf", 16); if (!app->res.font) { fprintf(stderr, "error: cannot open font: %s\n", SDL_GetError()); return -1; } app->res.char_size = text_size("A", app->res.font); app->res.theme = defaultTheme; return 0; } void app_ressources_unload(App* app) { if (app->res.font) { TTF_CloseFont(app->res.font); app->res.font = nullptr; } } void app_new_file(App* app) { Buffer* buffer = malloc(sizeof(Buffer)); buffer_init(buffer); ptr_vec_push( (void***)&app->buffers, &app->buffers_capacity, &app->buffers_size, buffer); } void app_open_file(App* app, const char* path) { Buffer* buffer = malloc(sizeof(Buffer)); buffer_from_file(buffer, path); ptr_vec_push( (void***)&app->buffers, &app->buffers_capacity, &app->buffers_size, buffer); } void app_prepare(App* app) { if (app->buffers_size == 0) { app_new_file(app); } editor_open(&app->editor, app->buffers[app->buffers_size - 1]); } void app_handle_keydown(App* app, int keysum) { switch (keysum) { case SDLK_UP: editor_cursor_up(&app->editor); break; case SDLK_DOWN: editor_cursor_down(&app->editor); break; case SDLK_LEFT: editor_cursor_left(&app->editor); break; case SDLK_RIGHT: editor_cursor_right(&app->editor); break; } } void app_render(App* app, void* renderer) { editor_render(&app->editor, renderer, 0, 0); }