diff options
-rw-r--r-- | src/main/engine/engine.c | 16 | ||||
-rw-r--r-- | src/main/engine/engine.h | 2 | ||||
-rw-r--r-- | src/main/engine/ui/types.h | 4 | ||||
-rw-r--r-- | src/main/engine/ui/ui.h | 2 | ||||
-rw-r--r-- | src/main/engine/ui/x11/ui.c | 22 | ||||
-rw-r--r-- | src/main/game/game.c | 8 |
6 files changed, 43 insertions, 11 deletions
diff --git a/src/main/engine/engine.c b/src/main/engine/engine.c index 048c618..443ee93 100644 --- a/src/main/engine/engine.c +++ b/src/main/engine/engine.c @@ -59,7 +59,7 @@ static int frames; static time_t end; void (*dispatch_ui_event)(int); -void (*on_mouse_pressed)(); +void (*on_mouse_button_pressed)(int x, int y); void engine_init(int w, int h) @@ -236,9 +236,16 @@ engine_loop(void) } void -engine_on_mouse_pressed(void (*event)()) +mouse_button_press_event(UIMouseButtonPressed *mbp) { - on_mouse_pressed = event; + on_mouse_button_pressed(mbp->x, mbp->y); +} + +void +engine_set_mouse_button_listener(void (*event)(int x, int y)) +{ + on_mouse_button_pressed = event; + ui_set_mouse_press_listener(mouse_button_press_event); } static void @@ -249,9 +256,6 @@ engine_dispatch_ui_events(int type) #ifdef X11 case ButtonPress: event_type = ENGINE_MOUSE_PRESSED; - if (on_mouse_pressed != NULL) { - on_mouse_pressed(); - } break; #endif default: diff --git a/src/main/engine/engine.h b/src/main/engine/engine.h index b28a3c5..73d5dd5 100644 --- a/src/main/engine/engine.h +++ b/src/main/engine/engine.h @@ -29,6 +29,6 @@ void engine_draw_circle(float cx, float cy, float r, int num_segments, int outli void engine_draw_line(float x1, float y1, float x2, float y2); void engine_loop(void); void engine_input(void (*f_input)(int engine_input)); -void engine_on_mouse_pressed(void (*event)()); +void engine_set_mouse_button_listener(void (*event)(int x, int y)); #endif /* __ENGINE_H__ */ diff --git a/src/main/engine/ui/types.h b/src/main/engine/ui/types.h index 23943a2..6a9fedb 100644 --- a/src/main/engine/ui/types.h +++ b/src/main/engine/ui/types.h @@ -30,4 +30,8 @@ typedef struct UIEventResize { int height; } UIEventResize; +typedef struct UIMouseButtonPressed { + int x, y; +} UIMouseButtonPressed; + #endif /* __TYPES_H__ */ diff --git a/src/main/engine/ui/ui.h b/src/main/engine/ui/ui.h index 3d32c1a..432d158 100644 --- a/src/main/engine/ui/ui.h +++ b/src/main/engine/ui/ui.h @@ -28,7 +28,7 @@ void ui_set_title(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)()); -void ui_set_mouse_press_listener(void (*event)()); +void ui_set_mouse_press_listener(void (*event)(UIMouseButtonPressed *)); void ui_set_generic_listener(void (*generic_event)(int type)); #endif /* __UI_H__ */ diff --git a/src/main/engine/ui/x11/ui.c b/src/main/engine/ui/x11/ui.c index 7a325ce..cd35edf 100644 --- a/src/main/engine/ui/x11/ui.c +++ b/src/main/engine/ui/x11/ui.c @@ -35,7 +35,7 @@ static int close_window = 0; void (*on_loop_event)(); void (*on_expose_event)(); void (*on_resize_event)(UIEventResize *); -void (*on_mouse_press_event)(); +void (*on_mouse_press_event)(UIMouseButtonPressed *); void (*on_generic_event)(int); void cleanup(void); @@ -156,11 +156,27 @@ ui_on_keypress(XEvent event) } static void +ui_get_mouse_position(Display *display, Window window, int *x, int *y) { + Window root_return, child_return; + int root_x, root_y; + unsigned int mask_return; + + XQueryPointer(display, window, &root_return, &child_return, + &root_x, &root_y, x, y, &mask_return); +} + +static void ui_on_mouse_press(XEvent event) { if (event.type != ButtonPress) return; if (on_mouse_press_event != NULL) { - on_mouse_press_event(); + UIMouseButtonPressed *mbp = malloc(sizeof(UIMouseButtonPressed)); + if (mbp == NULL) { + log_error("Error allocating UIMouseButtonPressed"); + exit(EXIT_FAILURE); + } + ui_get_mouse_position(display, window, &mbp->x, &mbp->y); + on_mouse_press_event(mbp); } } @@ -197,7 +213,7 @@ ui_set_resize_listener(void (*resize_event)(UIEventResize *)) } void -ui_set_mouse_press_listener(void (*mouse_press_event)()) +ui_set_mouse_press_listener(void (*mouse_press_event)(UIMouseButtonPressed *)) { on_mouse_press_event = mouse_press_event; } diff --git a/src/main/game/game.c b/src/main/game/game.c index 0aa4888..2bd0bb5 100644 --- a/src/main/game/game.c +++ b/src/main/game/game.c @@ -17,12 +17,19 @@ * along with Tris Game. If not, see <http://www.gnu.org/licenses/>. */ +#include <stdio.h> #include <stdlib.h> #include "../engine/engine.h" #include "game.h" #include "../util.h" #include "../engine/ui/ui.h" +static void +game_mouse_button_pressed(int x, int y) +{ + printf("mouse pressed %d %d\n", x, y); +} + TrisGame * game_init(int width, int height) { @@ -33,6 +40,7 @@ game_init(int width, int height) } engine_init(width, height); ui_set_title("Tris Game"); + engine_set_mouse_button_listener(game_mouse_button_pressed); game_draw_field(0.5, 0, 0); |