summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessandro Iezzi <aiezzi@alessandroiezzi.it>2025-05-20 20:23:59 +0200
committerAlessandro Iezzi <aiezzi@alessandroiezzi.it>2025-05-20 20:25:31 +0200
commit693d830f69b9a4ce6f956f4a688f41180156473e (patch)
treec15764d1e95291b32ca9af41daf4dd41290544a7
parent618402caa489751d61643e6839607fd1546ad635 (diff)
downloadtris-693d830f69b9a4ce6f956f4a688f41180156473e.tar.gz
tris-693d830f69b9a4ce6f956f4a688f41180156473e.zip
Add logic to get coordinates of the mouse button click
-rw-r--r--src/main/engine/engine.c16
-rw-r--r--src/main/engine/engine.h2
-rw-r--r--src/main/engine/ui/types.h4
-rw-r--r--src/main/engine/ui/ui.h2
-rw-r--r--src/main/engine/ui/x11/ui.c22
-rw-r--r--src/main/game/game.c8
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);