summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/engine/engine.c8
-rw-r--r--src/main/engine/engine.h1
-rw-r--r--src/main/engine/ui/ui.h4
-rw-r--r--src/main/engine/ui/x11/ui.c80
-rw-r--r--src/main/game/game.c2
5 files changed, 67 insertions, 28 deletions
diff --git a/src/main/engine/engine.c b/src/main/engine/engine.c
index c10cfca..362d2d8 100644
--- a/src/main/engine/engine.c
+++ b/src/main/engine/engine.c
@@ -82,6 +82,12 @@ engine_new(int w, int h)
return engine;
}
+void
+engine_set_window_title(Engine *engine, const char *title)
+{
+ ui_set_title(engine->ui, title);
+}
+
static Circle *
engine_new_circle(float cx, float cy, float r, int num_segments, int outline)
{
@@ -278,7 +284,7 @@ engine_set_mouse_button_listener(void (*event)(float x, float y, void *data), vo
mouse_button_event->on_mouse_button_pressed = event;
mouse_button_event->data = data;
- ui_set_mouse_press_listener(mouse_button_press_event);
+ ui_set_mouse_press_listener(mouse_button_press_event, mouse_button_event);
}
static void
diff --git a/src/main/engine/engine.h b/src/main/engine/engine.h
index b70c8c2..f3f817b 100644
--- a/src/main/engine/engine.h
+++ b/src/main/engine/engine.h
@@ -40,6 +40,7 @@ typedef struct {
Engine *engine_new(int width, int height);
void engine_set_rendering_background(Engine *engine, float r, float g, float b, float a);
void engine_set_rendering_background_c(Engine *engine, Color *color);
+void engine_set_window_title(Engine *engine, const char *title);
void engine_draw_circle(float cx, float cy, float r, int num_segments, int outline);
void engine_draw_line(float x1, float y1, float x2, float y2);
void engine_loop(void);
diff --git a/src/main/engine/ui/ui.h b/src/main/engine/ui/ui.h
index 34e21dd..e1c4283 100644
--- a/src/main/engine/ui/ui.h
+++ b/src/main/engine/ui/ui.h
@@ -25,11 +25,13 @@
typedef struct UI {
int width;
int height;
+ void *extra;
+ int close_window;
} UI;
UI *ui_new(int w, int h);
void ui_loop(UI *ui);
-void ui_set_title(const char *title);
+void ui_set_title(UI *ui, const char *title);
void ui_set_expose_listener(void (*expose_event)());
void ui_set_resize_listener(void (*resize_event)(UIEventResize *));
void ui_set_loop_listener(void (*event)());
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);
}
diff --git a/src/main/game/game.c b/src/main/game/game.c
index 9a5a245..31c9780 100644
--- a/src/main/game/game.c
+++ b/src/main/game/game.c
@@ -163,7 +163,7 @@ game_init(int width, int height)
game->board = board_new();
game->ended = false;
- ui_set_title("Tris Game");
+ engine_set_window_title(game->engine, "Tris Game");
engine_set_mouse_button_listener(game_mouse_button_pressed, game);
game_draw_field(game, 0.5f);