diff options
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/engine/engine.c | 8 | ||||
-rw-r--r-- | src/main/engine/engine.h | 1 | ||||
-rw-r--r-- | src/main/engine/ui/ui.h | 4 | ||||
-rw-r--r-- | src/main/engine/ui/x11/ui.c | 80 | ||||
-rw-r--r-- | src/main/game/game.c | 2 |
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); |