sdl callbacks

This commit is contained in:
zlago 2025-11-02 22:55:25 +01:00
parent 7e427e4dcc
commit 180026281e

View File

@ -1,5 +1,7 @@
#include <glad/gles2.h>
#include <SDL3/SDL.h>
#define SDL_MAIN_USE_CALLBACKS 1
#include <SDL3/SDL_main.h>
#include <cstdio>
#include <ctime>
@ -7,8 +9,15 @@
#define WINDOW_WIDTH 128
#define WINDOW_HEIGHT 128
int main(int argc, char **argv) {
struct state {
SDL_Window *window;
SDL_GLContext context;
float color;
};
SDL_AppResult SDL_AppInit(void **appstate, int, char **) {
clock_t begin = clock();
auto state = new (struct state);
SDL_Init(SDL_INIT_VIDEO);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
@ -16,37 +25,74 @@ int main(int argc, char **argv) {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
SDL_Window *window = SDL_CreateWindow("suwi", WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_HIDDEN | SDL_WINDOW_OPENGL /*| SDL_WINDOW_RESIZABLE*/ | SDL_WINDOW_TRANSPARENT);
state->window = SDL_CreateWindow("suwi", WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_HIDDEN | SDL_WINDOW_OPENGL /*| SDL_WINDOW_RESIZABLE*/ | SDL_WINDOW_TRANSPARENT);
SDL_GLContext context = SDL_GL_CreateContext(window);
state->context = SDL_GL_CreateContext(state->window);
int version = gladLoadGLES2((GLADloadfunc) SDL_GL_GetProcAddress);
if (version == 0) {
puts("error: GLES2 failed to initialize");
return 1;
return SDL_APP_FAILURE;
}
fprintf(stderr, "info: ver %u\n", version);
fprintf(stderr, "info: GLES%u.%u\n", GLAD_VERSION_MAJOR(version), GLAD_VERSION_MINOR(version));
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
SDL_ShowWindow(window);
SDL_ShowWindow(state->window);
fprintf(stderr, "info: init took %lu ms\n", ((clock() - begin) * 1000) / CLOCKS_PER_SEC);
while (true) {
SDL_Event evt;
while (SDL_PollEvent(&evt)) {
switch (evt.type) {
case SDL_EVENT_QUIT:
return 0;
default:;
}
*appstate = state;
return SDL_APP_CONTINUE;
}
SDL_AppResult SDL_AppEvent(void *, SDL_Event *evt) {
switch (evt->type) {
case SDL_EVENT_QUIT:
return SDL_APP_SUCCESS;
case SDL_EVENT_KEY_DOWN:
case SDL_EVENT_KEY_UP:
break;
case SDL_EVENT_MOUSE_MOTION:
case SDL_EVENT_MOUSE_BUTTON_DOWN:
case SDL_EVENT_MOUSE_BUTTON_UP:
case SDL_EVENT_MOUSE_WHEEL:
break;
case SDL_EVENT_WINDOW_SHOWN:
case SDL_EVENT_WINDOW_HIDDEN:
case SDL_EVENT_WINDOW_MINIMIZED:
case SDL_EVENT_WINDOW_MAXIMIZED:
case SDL_EVENT_WINDOW_RESTORED:
case SDL_EVENT_WINDOW_MOVED:
case SDL_EVENT_WINDOW_RESIZED:
case SDL_EVENT_WINDOW_MOUSE_ENTER:
case SDL_EVENT_WINDOW_MOUSE_LEAVE:
case SDL_EVENT_WINDOW_FOCUS_GAINED:
case SDL_EVENT_WINDOW_FOCUS_LOST:
case SDL_EVENT_WINDOW_CLOSE_REQUESTED:
break;
case SDL_EVENT_CLIPBOARD_UPDATE:
break;
default:
fprintf(stderr, "info: unknown event %x\n", evt->type);
}
return SDL_APP_CONTINUE;
}
SDL_AppResult SDL_AppIterate(void *appstate) {
auto state = (struct state *) appstate;
glClearColor(0.5, 0.5, 0.5, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
SDL_GL_SwapWindow(window);
SDL_GL_SwapWindow(state->window);
return SDL_APP_CONTINUE;
}
return 0;
void SDL_AppQuit(void *, SDL_AppResult) {
;
}