From 693d830f69b9a4ce6f956f4a688f41180156473e Mon Sep 17 00:00:00 2001 From: Alessandro Iezzi Date: Tue, 20 May 2025 20:23:59 +0200 Subject: Add logic to get coordinates of the mouse button click --- src/main/engine/ui/types.h | 4 ++++ src/main/engine/ui/ui.h | 2 +- src/main/engine/ui/x11/ui.c | 22 +++++++++++++++++++--- 3 files changed, 24 insertions(+), 4 deletions(-) (limited to 'src/main/engine/ui') 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); @@ -155,12 +155,28 @@ ui_on_keypress(XEvent event) close_window = 1; } +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; } -- cgit v1.2.3