diff --git a/src/main.c++ b/src/main.c++ index 2676dcd..e234d0a 100644 --- a/src/main.c++ +++ b/src/main.c++ @@ -1,5 +1,7 @@ #include #include +#define SDL_MAIN_USE_CALLBACKS 1 +#include #include #include @@ -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:; - } - } - - glClearColor(0.5, 0.5, 0.5, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - - SDL_GL_SwapWindow(window); - } - return 0; + *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(state->window); + return SDL_APP_CONTINUE; +} + +void SDL_AppQuit(void *, SDL_AppResult) { + ; }