commit 0c582f90a9878b05a537e8bf13922ecb3a6a9063
parent 2182214d5eb309d8cbe8d18882ca0e1b0a5c1726
Author: rexim <reximkut@gmail.com>
Date: Tue, 10 Jan 2023 13:29:31 +0700
Factor out file_browser translation unit
Diffstat:
5 files changed, 46 insertions(+), 25 deletions(-)
diff --git a/build.sh b/build.sh
@@ -6,7 +6,7 @@ CC="${CXX:-cc}"
PKGS="sdl2 glew freetype2"
CFLAGS="-Wall -Wextra -std=c11 -pedantic -ggdb"
LIBS=-lm
-SRC="src/main.c src/la.c src/editor.c src/free_glyph.c src/simple_renderer.c src/common.c"
+SRC="src/main.c src/la.c src/editor.c src/file_browser.c src/free_glyph.c src/simple_renderer.c src/common.c"
if [ `uname` = "Darwin" ]; then
CFLAGS+=" -framework OpenGL"
diff --git a/build_msvc.bat b/build_msvc.bat
@@ -9,4 +9,4 @@ set LIBS=dependencies\SDL2\lib\x64\SDL2.lib ^
dependencies\GLEW\lib\glew32s.lib ^
opengl32.lib User32.lib Gdi32.lib Shell32.lib
-cl.exe %CFLAGS% %INCLUDES% /Feded src\main.c src\la.c src\editor.c src\free_glyph.c src\simple_renderer.c src\common.c /link %LIBS% -SUBSYSTEM:windows
+cl.exe %CFLAGS% %INCLUDES% /Feded src\main.c src\la.c src\editor.c src\file_browser.c src\free_glyph.c src\simple_renderer.c src\common.c /link %LIBS% -SUBSYSTEM:windows
diff --git a/src/file_browser.c b/src/file_browser.c
@@ -0,0 +1,21 @@
+#include <string.h>
+#include "file_browser.h"
+
+int file_cmp(const void *ap, const void *bp)
+{
+ const char *a = *(const char**)ap;
+ const char *b = *(const char**)bp;
+ return strcmp(a, b);
+}
+
+Errno fb_open_dir(File_Browser *fb, const char *dir_path)
+{
+ fb->files.count = 0;
+ fb->cursor = 0;
+ Errno err = read_entire_dir(dir_path, &fb->files);
+ if (err != 0) {
+ return err;
+ }
+ qsort(fb->files.items, fb->files.count, sizeof(*fb->files.items), file_cmp);
+ return 0;
+}
diff --git a/src/file_browser.h b/src/file_browser.h
@@ -0,0 +1,13 @@
+#ifndef FILE_BROWSER_H_
+#define FILE_BROWSER_H_
+
+#include "common.h"
+
+typedef struct {
+ Files files;
+ size_t cursor;
+} File_Browser;
+
+Errno fb_open_dir(File_Browser *fb, const char *dir_path);
+
+#endif // FILE_BROWSER_H_
diff --git a/src/main.c b/src/main.c
@@ -17,6 +17,7 @@
#include "./sv.h"
#include "./editor.h"
+#include "./file_browser.h"
#include "./la.h"
#include "./free_glyph.h"
#include "./simple_renderer.h"
@@ -60,16 +61,12 @@ void MessageCallback(GLenum source,
static Free_Glyph_Atlas atlas = {0};
static Simple_Renderer sr = {0};
static Editor editor = {0};
+static File_Browser fb = {0};
static Uint32 last_stroke = 0;
#define FREE_GLYPH_FONT_SIZE 64
#define ZOOM_OUT_GLYPH_THRESHOLD 30
-typedef struct {
- Files files;
- size_t cursor;
-} File_Browser;
-
void render_file_browser(SDL_Window *window, Free_Glyph_Atlas *atlas, Simple_Renderer *sr, const File_Browser *fb)
{
Vec2f cursor_pos = vec2f(0, -(float)fb->cursor * FREE_GLYPH_FONT_SIZE);
@@ -225,13 +222,6 @@ void render_editor(SDL_Window *window, Free_Glyph_Atlas *atlas, Simple_Renderer
// TODO: display errors reported via flash_error right in the text editor window somehow
#define flash_error(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__)
-int file_cmp(const void *ap, const void *bp)
-{
- const char *a = *(const char**)ap;
- const char *b = *(const char**)bp;
- return strcmp(a, b);
-}
-
int main(int argc, char **argv)
{
editor_recompute_lines(&editor);
@@ -279,6 +269,13 @@ int main(int argc, char **argv)
}
}
+ const char *dir_path = ".";
+ Errno err = fb_open_dir(&fb, dir_path);
+ if (err != 0) {
+ fprintf(stderr, "ERROR: Could not read directory %s: %s\n", dir_path, strerror(errno));
+ return 1;
+ }
+
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "ERROR: Could not initialize SDL: %s\n", SDL_GetError());
return 1;
@@ -346,7 +343,6 @@ int main(int argc, char **argv)
bool quit = false;
bool file_browser = false;
- File_Browser fb = {0};
while (!quit) {
const Uint32 start = SDL_GetTicks();
SDL_Event event = {0};
@@ -404,16 +400,7 @@ int main(int argc, char **argv)
break;
case SDLK_F3: {
- fb.files.count = 0;
- fb.cursor = 0;
- const char *dir_path = ".";
- Errno err = read_entire_dir(dir_path, &fb.files);
- if (err != 0) {
- flash_error("Could not read directory %s: %s", dir_path, strerror(errno));
- } else {
- qsort(fb.files.items, fb.files.count, sizeof(*fb.files.items), file_cmp);
- file_browser = true;
- }
+ file_browser = true;
}
break;