fed/app.c
2025-07-04 02:48:44 +02:00

123 lines
2.7 KiB
C

#include "app.h"
#include "editor.h"
#include <SDL2/SDL_keycode.h>
#include <SDL2/SDL_ttf.h>
#include <stdlib.h>
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);
}