summaryrefslogtreecommitdiff
path: root/src/main/engine/ui/x11/ui.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/engine/ui/x11/ui.c')
-rw-r--r--src/main/engine/ui/x11/ui.c80
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);
}