trying to read commands from std while displaying things, fixes

This commit is contained in:
Rakarake 2025-12-15 23:33:30 +01:00
parent a32e44f45f
commit dc791e3481
5 changed files with 43 additions and 9 deletions

View file

@ -13,5 +13,3 @@ $(objects): %.o: %.c
clean:
rm -f *.o glonkers
run: glonkers
SDL_VIDEODRIVER="wayland,x11" ./glonkers

View file

@ -1,10 +1,12 @@
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <stdint.h>
#include <wayland-client.h>
#include <wayland-util.h>
#include <SDL3/SDL.h>
#include <pthread.h>
#include "renderer.h"
//int main() {
@ -79,7 +81,34 @@ double time_since_start() {
(now.tv_nsec - program_start.tv_nsec) / 1e9;
}
_Atomic bool running = true;
void intHandler(int dummy) {
printf("exiting\n");
running = false;
fclose(stdin);
}
bool reload_shader = false;
/// reads stdin on a separate thread.
void *read_stdin(void *ptr) {
char buff[10];
while (running) {
fgets(buff, 10, stdin);
if (strcmp(buff, "r\n") == 0) {
printf("reloading shader\n");
reload_shader = true;
}
}
return NULL;
}
int main(int argc, char *argv[]) {
signal(SIGINT, intHandler);
pthread_t stdin_thread;
pthread_create( &stdin_thread, NULL, read_stdin, NULL);
init_timer();
printf("Good Morning 🍵\n");
@ -109,7 +138,6 @@ int main(int argc, char *argv[]) {
Renderer renderer = new_renderer();
SDL_Event e;
int running = 1;
int w, h;
while (running) {
while (SDL_PollEvent(&e)) {
@ -128,9 +156,12 @@ int main(int argc, char *argv[]) {
}
double time = time_since_start();
render(&renderer, w, h, time, shader_path);
render(&renderer, w, h, time, shader_path, reload_shader);
if (reload_shader) reload_shader = false;
SDL_GL_SwapWindow(window);
}
pthread_join(stdin_thread, NULL);
}

View file

@ -68,12 +68,16 @@ GLuint create_shader(const char *fragment_src) {
GLuint load_shader(const char *path) {
FILE *handle = fopen(path, "r");
if (handle == NULL) {
printf("failed to open shader file\n");
exit(1);
}
fseek(handle, 0L, SEEK_END);
long length = ftell(handle);
fseek(handle, 0L, SEEK_SET);
char *string = malloc(length * sizeof(char));
if (!fread(string, sizeof(char), length, handle)) {
printf("failed to read shader file");
printf("failed to read shader file\n");
exit(1);
}
fclose(handle);
@ -143,9 +147,10 @@ Renderer new_renderer() {
}
/// shader_path cannot be NULL.
void render(Renderer *state, int w, int h, double time, char *shader_path) {
if (strcmp(state->shader_path, shader_path)) {
void render(Renderer *state, int w, int h, double time, char *shader_path, int reload_shader) {
if (reload_shader || strcmp(state->shader_path, shader_path)) {
state->shader = load_shader(shader_path);
state->shader_path = shader_path;
}
checkGlError();

View file

@ -8,7 +8,7 @@ typedef struct Renderer {
} Renderer;
Renderer new_renderer();
void render(Renderer *renderer, int w, int h, double time, char *shader_path);
void render(Renderer *renderer, int w, int h, double time, char *shader_path, int reload_shader);
#endif

2
run.sh
View file

@ -1,3 +1,3 @@
make
./glonkers "$@"
SDL_VIDEODRIVER="wayland,x11" ./glonkers "$@"