From c28c07dad42bb3c452457b82aa6f1b1da94996d8 Mon Sep 17 00:00:00 2001 From: Maciej Samborski Date: Sun, 8 Jun 2025 11:42:38 +0200 Subject: [PATCH] added `windowDraw\' and renamed window functions --- main.c | 12 +++--- src/openwindow.c | 105 ++++++++++------------------------------------- src/openwindow.h | 7 ++-- 3 files changed, 32 insertions(+), 92 deletions(-) diff --git a/main.c b/main.c index c334011..b76cade 100644 --- a/main.c +++ b/main.c @@ -52,25 +52,27 @@ int main(void) { Window w = openWindow("Window", 800, 600); - setWindowHandler(&w, xevent); + windowSetEventHandler(&w, xevent); while (!w.close) { - handleWindowEvents(&w); + windowHandleEvents(&w); glClearColor(1, 1, 1, 1); glClear(GL_COLOR_BUFFER_BIT); - glColor3f(1.0f, 0.0f, 0.0f); glBegin(GL_TRIANGLES); + glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(-0.5, -0.5); + glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.5, -0.5); + glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(0.0, 0.5); glEnd(); glFlush(); - glXSwapBuffers(w.x.display, w.x.window); + windowDraw(w); } - destroyWindow(w); + closeWindow(w); return 0; } diff --git a/src/openwindow.c b/src/openwindow.c index aea854a..f648c97 100644 --- a/src/openwindow.c +++ b/src/openwindow.c @@ -1,6 +1,15 @@ #include "openwindow.h" + #include +int initOpenGL() { + if (getOpenGLProcs() == 0) return -1; + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + return 0; +} + #ifndef _WIN32 #define GLLOADER glXGetProcAddress @@ -76,6 +85,7 @@ int initGLX(Window * window) glXCreateContextAttribsARBProc glXCreateContextAttribsARB = 0; glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc) glXGetProcAddressARB( (const GLubyte *) "glXCreateContextAttribsARB" ); + int context_attribs[] = { GLX_CONTEXT_MAJOR_VERSION_ARB, 3, GLX_CONTEXT_MINOR_VERSION_ARB, 0, @@ -147,14 +157,6 @@ int init(Window * window, const char * name, size_t width, size_t height) { return 0; } -int initOpenGL() { - if (getOpenGLProcs() == 0) return -1; - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - - return 0; -} - Window openWindow(const char * name, size_t width, size_t height) { Window w = {0}; @@ -171,13 +173,17 @@ Window openWindow(const char * name, size_t width, size_t height) { return w; } -void setWindowHandler(Window * window, WindowEventHandler handler) { +void windowDraw(Window window) { + glXSwapBuffers(window.x.display, window.x.window); +} + +void windowSetEventHandler(Window * window, WindowEventHandler handler) { window->eventHandler = handler; } -void handleWindowEvents(Window * window) { +void windowHandleEvents(Window * window) { if (window->eventHandler == NULL) { - fprintf(stderr, "Window event handler is not defined. Use `setWindowHandler' to set it!\n"); + fprintf(stderr, "Window event handler is not defined. Use `setEventHandler' to set it!\n"); exit(1); } @@ -188,7 +194,7 @@ void handleWindowEvents(Window * window) { window->eventHandler(window, xev); } -void destroyWindow(Window window) { +void closeWindow(Window window) { glXMakeCurrent(window.x.display, None, None); glXDestroyContext(window.x.display, window.glx.context); @@ -218,7 +224,7 @@ LRESULT CALLBACK wndProc(HWND hwnd, unsigned int msg, WPARAM wParam, LPARAM lPar return (DefWindowProc(hwnd, msg, wParam, lParam)); } -int initWWM(Window * window, const char * title, size_t width, size_t height) { +int initWGL(Window * window, const char * title, size_t width, size_t height) { HINSTANCE hInstance = GetModuleHandle(NULL); WNDCLASSEX wcex; @@ -249,79 +255,10 @@ int initWWM(Window * window, const char * title, size_t width, size_t height) { return 0; } -int initEgl(Window * window) -{ - EGLint attr[] = { - EGL_SURFACE_TYPE, EGL_WINDOW_BIT, - EGL_RED_SIZE, 8, - EGL_GREEN_SIZE, 8, - EGL_BLUE_SIZE, 8, - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, - EGL_NONE - }; - - EGLint num_config; - EGLint major, minor; - - EGLint ctxattr[] = { - EGL_CONTEXT_CLIENT_VERSION, 2, - EGL_NONE - }; - - window->w.display = GetDC(window->w.window); - - window->egl.display = eglGetDisplay((EGLNativeDisplayType) window->w.display); - if (window->egl.display == EGL_NO_DISPLAY) { - fprintf(stderr, "Error getting EGL display\n"); - return -1; - } - - if (!eglInitialize(window->egl.display, &major, &minor )) { - fprintf(stderr, "Error initializing EGL\n"); - return -1; - } - - /* create EGL rendering context */ - int res = eglChooseConfig(window->egl.display, attr, &window->egl.config, 1, &num_config); - if (res != EGL_TRUE) { - fprintf(stderr, "Failed to choose config (eglError: %x)\n", res); - return -1; - } - - if (num_config != 1) { - fprintf(stderr, "Couldn't choose config!\n"); - return -1; - } - - window->egl.surface = eglCreateWindowSurface(window->egl.display, window->egl.config, (EGLNativeWindowType) window->w.window, NULL); - if (window->egl.surface == EGL_NO_SURFACE) { - fprintf(stderr, "CreateWindowSurface, EGL eglError: %x\n", eglGetError()); - return -1; - } - - window->egl.context = eglCreateContext(window->egl.display, window->egl.config, EGL_NO_CONTEXT, ctxattr); - if (window->egl.context == EGL_NO_CONTEXT) { - fprintf(stderr, "CreateContext, EGL eglError: %d\n", eglGetError()); - return -1; - } - - return 0; -} - -void initOpenGL() { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); -} - Window openWindow(const char * name, size_t width, size_t height) { Window w = {0}; - if (initWWM(&w, name, width, height) < 0) { - fprintf(stderr, "Failed to initialize egl!\n"); - exit(1); - } - - if (initEgl(&w) < 0) { + if (initWGL(&w, name, width, height) < 0) { fprintf(stderr, "Failed to initialize egl!\n"); exit(1); } @@ -333,7 +270,7 @@ Window openWindow(const char * name, size_t width, size_t height) { return w; } -void destroyWindow(Window window) { +void closeWindow(Window window) { DestroyWindow(window.w.window); } diff --git a/src/openwindow.h b/src/openwindow.h index ab6a7ed..b53d5ce 100644 --- a/src/openwindow.h +++ b/src/openwindow.h @@ -63,9 +63,10 @@ typedef struct Window { int getOpenGLProcs(void); Window openWindow(const char * name, size_t width, size_t height); -void setWindowHandler(Window * window, WindowEventHandler handler); -void handleWindowEvents(Window * window); -void destroyWindow(Window w); +void windowDraw(Window window); +void windowSetEventHandler(Window * window, WindowEventHandler handler); +void windowHandleEvents(Window * window); +void closeWindow(Window w); #endif // _OPEN_WINDOW_H_