123 lines
2.7 KiB
C
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);
|
|
}
|