diff options
Diffstat (limited to 'src/main/engine/ui/x11')
-rw-r--r-- | src/main/engine/ui/x11/ui.c | 80 |
1 files changed, 55 insertions, 25 deletions
diff --git a/src/main/engine/ui/x11/ui.c b/src/main/engine/ui/x11/ui.c index 3c302b1..fc7e0b7 100644 --- a/src/main/engine/ui/x11/ui.c +++ b/src/main/engine/ui/x11/ui.c @@ -26,11 +26,14 @@ #include <time.h> #include <log.h> #include "../types.h" +#include "../ui.h" -static Display *display; -static Window window; -static GLXContext gl_context; -static int close_window = 0; +typedef struct { + Display *display; + Window window; + GLXContext gl_context; + int close_window; +} X11UI; void (*on_loop_event)(); void (*on_expose_event)(); @@ -38,13 +41,20 @@ void (*on_resize_event)(UIEventResize *); void (*on_mouse_press_event)(UIMouseButtonPressed *); void (*on_generic_event)(int); +/* Private functions */ + static void -cleanup(UI *ui) { +ui_cleanup(UI *ui) { + Display *display = ((X11UI *) ui->extra)->display; + Window window = ((X11UI *) ui->extra)->window; + GLXContext gl_context = ((X11UI *) ui->extra)->gl_context; + glXMakeCurrent(display, None, NULL); glXDestroyContext(display, gl_context); XDestroyWindow(display, window); XCloseDisplay(display); + free(ui->extra); free(ui); } @@ -72,7 +82,7 @@ ui_open_display(void) } static XVisualInfo * -gl_choose_visual(int screen) +gl_choose_visual(int screen, Display *display) { init_log(); @@ -87,7 +97,7 @@ gl_choose_visual(int screen) } static XSetWindowAttributes -ui_get_attributes(Window root, XVisualInfo *vi) +ui_get_attributes(Window root, XVisualInfo *vi, Display *display) { Colormap colormap = XCreateColormap(display, root, vi->visual, AllocNone); XSetWindowAttributes swa; @@ -98,9 +108,9 @@ ui_get_attributes(Window root, XVisualInfo *vi) } static Window -ui_create_window(Window root, XVisualInfo *vi, int width, int height) +ui_create_window(Window root, XVisualInfo *vi, Display *display, int width, int height) { - XSetWindowAttributes swa = ui_get_attributes(root, vi); + XSetWindowAttributes swa = ui_get_attributes(root, vi, display); Window window = XCreateWindow(display, root, 0, 0, width, height, 0, vi->depth, InputOutput, vi->visual, CWColormap | CWEventMask, &swa); XMapWindow(display, window); @@ -108,10 +118,23 @@ ui_create_window(Window root, XVisualInfo *vi, int width, int height) return window; } +/****** Public functions ******/ + void -ui_set_title(const char *title) +ui_set_title(UI *ui, const char *title) { - XStoreName(display, window, title); + X11UI *x11ui = ui->extra; + + XStoreName(x11ui->display, x11ui->window, title); +} + +static X11UI * +ui_x11_new(void) +{ + X11UI *x11ui = malloc(sizeof(X11UI)); + x11ui->display = ui_open_display(); + + return x11ui; } /* @@ -130,20 +153,23 @@ ui_new(int width, int height) } ui->width = width; ui->height = height; + ui->close_window = 0; + X11UI *x11ui = ui_x11_new(); + ui->extra = x11ui; - display = ui_open_display(); + Display *display = x11ui->display; int screen = DefaultScreen(display); Window root = RootWindow(display, screen); - XVisualInfo *vi = gl_choose_visual(screen); - window = ui_create_window(root, vi, width, height); + XVisualInfo *vi = gl_choose_visual(screen, display); + x11ui->window = ui_create_window(root, vi, display, width, height); - gl_context = glXCreateContext(display, vi, NULL, GL_TRUE); + x11ui->gl_context = glXCreateContext(display, vi, NULL, GL_TRUE); - if (!glXMakeCurrent(display, window, gl_context)) { + if (!glXMakeCurrent(display, x11ui->window, x11ui->gl_context)) { log_error(log, "Error on making GLX context"); - exit(1); + exit(EXIT_FAILURE); } return ui; @@ -179,10 +205,10 @@ ui_on_resize(UI *ui, XEvent event) } static void -ui_on_keypress(XEvent event) +ui_on_keypress(UI *ui, XEvent event) { if (event.type != KeyPress) return; - close_window = 1; + ui->close_window = 1; } static void @@ -196,7 +222,7 @@ ui_get_mouse_position(Display *display, Window window, int *x, int *y) { } static void -ui_on_mouse_press(XEvent event) +ui_on_mouse_press(X11UI *x11ui, XEvent event) { init_log(); @@ -207,7 +233,7 @@ ui_on_mouse_press(XEvent event) log_error(log, "Error allocating UIMouseButtonPressed"); exit(EXIT_FAILURE); } - ui_get_mouse_position(display, window, &mbp->x, &mbp->y); + ui_get_mouse_position(x11ui->display, x11ui->window, &mbp->x, &mbp->y); on_mouse_press_event(mbp); } } @@ -259,15 +285,19 @@ ui_set_generic_listener(void (*generic_event)(int type)) void ui_loop(UI *ui) { + X11UI *x11ui = ui->extra; + Display *display = x11ui->display; + Window window = x11ui->window; + XEvent event; - while (!close_window) { + while (!ui->close_window) { while (XPending(display)) { XNextEvent(display, &event); ui_on_generic_event(event); ui_on_expose(event); ui_on_resize(ui, event); - ui_on_keypress(event); - ui_on_mouse_press(event); + ui_on_keypress(ui, event); + ui_on_mouse_press(x11ui, event); ui_on_mouse_release(event); } @@ -275,5 +305,5 @@ ui_loop(UI *ui) glXSwapBuffers(display, window); } - cleanup(ui); + ui_cleanup(ui); } |