aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/saffron.c11
-rw-r--r--src/saffron_internal.h10
-rw-r--r--src/saffron_widget.c31
-rw-r--r--src/saffron_window.c24
4 files changed, 54 insertions, 22 deletions
diff --git a/src/saffron.c b/src/saffron.c
index 8724101..e9f9ca6 100644
--- a/src/saffron.c
+++ b/src/saffron.c
@@ -17,13 +17,8 @@ bool saffron_init(void) {
return true;
}
-void saffron_widget_draw(SaffronWidget* widget, SDL_Renderer *renderer) {
- // do stuff later
+void saffron_quit(void) {
+ TTF_Quit();
+ SDL_Quit();
}
-void saffron_widget_add_child(SaffronWidget *parent, SaffronWidget *child) {
- child->parent = parent;
- parent->children = realloc(parent->children, sizeof(SaffronWidget*) * (parent->child_count + 1));
- parent->children[parent->child_count] = child;
- parent->child_count++;
-}
diff --git a/src/saffron_internal.h b/src/saffron_internal.h
deleted file mode 100644
index 61d4195..0000000
--- a/src/saffron_internal.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* we could use #pragma once, but we don't because BACK IN MY DAY WE DIDNT HAVE PRAGMA ONCE!!!
- * and also it's not in the C standard, if some lunatic compiles it with a custom standards-comformant compiler this is undefined behaviour
- * therefore, my response is TOO BAD SO SAD */
-#ifndef SAFFRON_INTERNAL_H
-#define SAFFRON_INTERNAL_H
-
-extern SaffronWindow **windows;
-extern int window_count;
-
-#endif
diff --git a/src/saffron_widget.c b/src/saffron_widget.c
index 089c040..85b2013 100644
--- a/src/saffron_widget.c
+++ b/src/saffron_widget.c
@@ -4,7 +4,7 @@
#include <saffron_api.h>
#include <saffron_window.h>
-SaffronWidget* saffron_widget_new() {
+SaffronWidget* saffron_widget_new(void) {
/* This function is a generic primitive for creating widgets. You wouldn't want to do this manually unless you're a lunatic. It is meant to be wrapped around by other functions that change the default parameters, for example, what sane person makes a widget 0x0x0x0? you LUNATIC! */
SaffronWidget* widget = malloc(sizeof(SaffronWidget));
@@ -24,9 +24,12 @@ SaffronWidget* saffron_widget_new() {
}
void saffron_widget_free(SaffronWidget *widget) {
- /* should probably check if widget is NULL here
- * oh well, too bad so sad. not my problem if the caller
- * doesn't check and causes undefined behaviour. */
+ /* follow-up to my previous comment:
+ * yeah it is the caller's responsibility to check
+ * for undefined behaviour but this one line will save
+ * so much time down the line */
+ if (!widget) return;
+
for (int i = 0; i < widget->child_count; i++) {
saffron_widget_free(widget->children[i]);
}
@@ -34,3 +37,23 @@ void saffron_widget_free(SaffronWidget *widget) {
free(widget->children);
free(widget);
}
+
+void saffron_widget_draw(SaffronWidget* widget, SDL_Renderer *renderer) {
+ if (!widget) return;
+
+ if (widget->draw) {
+ widget->draw(widget, renderer);
+ }
+
+ for (int i = 0; i < widget->child_count; i++) {
+ saffron_widget_draw(widget->children[i], renderer);
+ }
+}
+
+void saffron_widget_add_child(SaffronWidget *parent, SaffronWidget *child) {
+ child->parent = parent;
+ parent->children = realloc(parent->children, sizeof(SaffronWidget*) * (parent->child_count + 1));
+ parent->children[parent->child_count] = child;
+ parent->child_count++;
+}
+
diff --git a/src/saffron_window.c b/src/saffron_window.c
index 10adfce..4bdae76 100644
--- a/src/saffron_window.c
+++ b/src/saffron_window.c
@@ -1,3 +1,4 @@
+#include <SDL3/SDL_events.h>
#include <stdlib.h>
#include <SDL3/SDL.h>
#include <SDL3_ttf/SDL_ttf.h>
@@ -22,3 +23,26 @@ void saffron_window_free(SaffronWindow* window) {
saffron_widget_free(window->root);
free(window);
}
+
+void saffron_window_main(SaffronWindow *window) {
+ if (!window) return;
+
+ bool running = true;
+ SDL_Event event;
+
+ while (running) {
+ while (SDL_PollEvent(&event)) {
+ if (event.type == SDL_EVENT_QUIT) {
+ running = false;
+ }
+ // TODO: send events to widgets and stuff
+ }
+
+ SDL_SetRenderDrawColor(window->renderer, 0, 0, 0, 255);
+ SDL_RenderClear(window->renderer);
+ saffron_widget_draw(window->root, window->renderer);
+ SDL_RenderPresent(window->renderer);
+
+ SDL_Delay(16); // around 60fps or so
+ }
+}