aboutsummaryrefslogtreecommitdiff
path: root/rt
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2026-01-04 19:16:06 -0700
committerJosh Rahm <joshuarahm@gmail.com>2026-01-04 19:16:06 -0700
commitefe34b2c98cc90ed686217ea3b0655fae1839414 (patch)
tree3e34f00b518eac8cefeb684c0538cf4312b2df06 /rt
parent21667ce43fded6abf8516a1fb728d60a38b2b36e (diff)
downloadmontis-efe34b2c98cc90ed686217ea3b0655fae1839414.tar.gz
montis-efe34b2c98cc90ed686217ea3b0655fae1839414.tar.bz2
montis-efe34b2c98cc90ed686217ea3b0655fae1839414.zip
[feat] add mouse motion hooks.
Added absolute mouse motion hooks.
Diffstat (limited to 'rt')
-rw-r--r--rt/include/plugin.h4
-rw-r--r--rt/src/wl.c188
2 files changed, 108 insertions, 84 deletions
diff --git a/rt/include/plugin.h b/rt/include/plugin.h
index 16823e8..be5dbb4 100644
--- a/rt/include/plugin.h
+++ b/rt/include/plugin.h
@@ -143,6 +143,10 @@ typedef struct PLUGIN {
EXPORT(opqst_t (*plugin_handle_button)(struct wlr_pointer_button_event *event,
uint32_t modifiers, opqst_t state));
+ EXPORT(opqst_t (*plugin_handle_motion)(
+ struct wlr_pointer_motion_absolute_event *event, uint32_t modifiers,
+ opqst_t state));
+
/*
* Handles a surface being mapped, unmapped or destroyed.
*/
diff --git a/rt/src/wl.c b/rt/src/wl.c
index 261e082..7c24168 100644
--- a/rt/src/wl.c
+++ b/rt/src/wl.c
@@ -451,6 +451,14 @@ static void server_cursor_motion_absolute(struct wl_listener *listener,
struct montis_server *server =
wl_container_of(listener, server, cursor_motion_absolute);
struct wlr_pointer_motion_absolute_event *event = data;
+
+ printf("[CQD] - %lf %lf\n", event->x, event->y);
+ struct wlr_seat *seat = server->seat;
+ struct wlr_keyboard *keyboard = wlr_seat_get_keyboard(seat);
+ uint32_t modifiers = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0;
+
+ plugin_call_update_state(server->plugin, plugin_handle_motion, event,
+ modifiers);
wlr_cursor_warp_absolute(server->cursor, &event->pointer->base, event->x,
event->y);
process_cursor_motion(server, event->time_msec);
@@ -761,102 +769,114 @@ static void xdg_toplevel_request_fullscreen(struct wl_listener *listener,
wlr_xdg_surface_schedule_configure(toplevel->xdg_toplevel->base);
}
-static void xdg_popup_commit(struct wl_listener *listener, void *data) {
- /* Called when a new surface state is committed. */
- struct montis_popup *popup = wl_container_of(listener, popup, commit);
-
- if (popup->xdg_popup->base->initial_commit) {
- /* When an xdg_surface performs an initial commit, the compositor must
- * reply with a configure so the client can map the surface.
- * montis sends an empty configure. A more sophisticated compositor
- * might change an xdg_popup's geometry to ensure it's not positioned
- * off-screen, for example. */
- wlr_xdg_surface_schedule_configure(popup->xdg_popup->base);
- }
+static void xdg_popup_commit(struct wl_listener *listener, void *data)
+{
+ /* Called when a new surface state is committed. */
+ struct montis_popup *popup = wl_container_of(listener, popup, commit);
+
+ if (popup->xdg_popup->base->initial_commit) {
+ /* When an xdg_surface performs an initial commit, the compositor must
+ * reply with a configure so the client can map the surface.
+ * montis sends an empty configure. A more sophisticated compositor
+ * might change an xdg_popup's geometry to ensure it's not positioned
+ * off-screen, for example. */
+ wlr_xdg_surface_schedule_configure(popup->xdg_popup->base);
+ }
}
-static void xdg_popup_destroy(struct wl_listener *listener, void *data) {
- /* Called when the xdg_popup is destroyed. */
- struct montis_popup *popup = wl_container_of(listener, popup, destroy);
+static void xdg_popup_destroy(struct wl_listener *listener, void *data)
+{
+ /* Called when the xdg_popup is destroyed. */
+ struct montis_popup *popup = wl_container_of(listener, popup, destroy);
- wl_list_remove(&popup->commit.link);
- wl_list_remove(&popup->destroy.link);
+ wl_list_remove(&popup->commit.link);
+ wl_list_remove(&popup->destroy.link);
- free(popup);
+ free(popup);
}
-static void server_new_xdg_popup(struct wl_listener *listener, void *data) {
- /* This event is raised when a client creates a new popup. */
- struct wlr_xdg_popup *xdg_popup = data;
-
- struct montis_popup *popup = calloc(1, sizeof(*popup));
- popup->xdg_popup = xdg_popup;
-
- /* We must add xdg popups to the scene graph so they get rendered. The
- * wlroots scene graph provides a helper for this, but to use it we must
- * provide the proper parent scene node of the xdg popup. To enable this,
- * we always set the user data field of xdg_surfaces to the corresponding
- * scene node. */
- struct wlr_xdg_surface *parent = wlr_xdg_surface_try_from_wlr_surface(xdg_popup->parent);
- assert(parent != NULL);
- struct wlr_scene_tree *parent_tree = parent->data;
- xdg_popup->base->data = wlr_scene_xdg_surface_create(parent_tree, xdg_popup->base);
-
- popup->commit.notify = xdg_popup_commit;
- wl_signal_add(&xdg_popup->base->surface->events.commit, &popup->commit);
-
- popup->destroy.notify = xdg_popup_destroy;
- wl_signal_add(&xdg_popup->events.destroy, &popup->destroy);
+static void server_new_xdg_popup(struct wl_listener *listener, void *data)
+{
+ /* This event is raised when a client creates a new popup. */
+ struct wlr_xdg_popup *xdg_popup = data;
+
+ struct montis_popup *popup = calloc(1, sizeof(*popup));
+ popup->xdg_popup = xdg_popup;
+
+ /* We must add xdg popups to the scene graph so they get rendered. The
+ * wlroots scene graph provides a helper for this, but to use it we must
+ * provide the proper parent scene node of the xdg popup. To enable this,
+ * we always set the user data field of xdg_surfaces to the corresponding
+ * scene node. */
+ struct wlr_xdg_surface *parent =
+ wlr_xdg_surface_try_from_wlr_surface(xdg_popup->parent);
+ assert(parent != NULL);
+ struct wlr_scene_tree *parent_tree = parent->data;
+ xdg_popup->base->data =
+ wlr_scene_xdg_surface_create(parent_tree, xdg_popup->base);
+
+ popup->commit.notify = xdg_popup_commit;
+ wl_signal_add(&xdg_popup->base->surface->events.commit, &popup->commit);
+
+ popup->destroy.notify = xdg_popup_destroy;
+ wl_signal_add(&xdg_popup->events.destroy, &popup->destroy);
}
-static void xdg_toplevel_commit(struct wl_listener *listener, void *data) {
- /* Called when a new surface state is committed. */
- struct montis_toplevel *toplevel = wl_container_of(listener, toplevel, commit);
-
- if (toplevel->xdg_toplevel->base->initial_commit) {
- /* When an xdg_surface performs an initial commit, the compositor must
- * reply with a configure so the client can map the surface. montis
- * configures the xdg_toplevel with 0,0 size to let the client pick the
- * dimensions itself. */
- wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, 0, 0);
- }
+static void xdg_toplevel_commit(struct wl_listener *listener, void *data)
+{
+ /* Called when a new surface state is committed. */
+ struct montis_toplevel *toplevel =
+ wl_container_of(listener, toplevel, commit);
+
+ if (toplevel->xdg_toplevel->base->initial_commit) {
+ /* When an xdg_surface performs an initial commit, the compositor must
+ * reply with a configure so the client can map the surface. montis
+ * configures the xdg_toplevel with 0,0 size to let the client pick the
+ * dimensions itself. */
+ wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, 0, 0);
+ }
}
static void server_new_xdg_toplevel(struct wl_listener *listener, void *data)
{
- /* This event is raised when a client creates a new toplevel (application window). */
- struct montis_server *server = wl_container_of(listener, server, new_xdg_toplevel);
- struct wlr_xdg_toplevel *xdg_toplevel = data;
-
- /* Allocate a montis_toplevel for this surface */
- struct montis_toplevel *toplevel = calloc(1, sizeof(*toplevel));
- toplevel->server = server;
- toplevel->xdg_toplevel = xdg_toplevel;
- toplevel->scene_tree =
- wlr_scene_xdg_surface_create(&toplevel->server->scene->tree, xdg_toplevel->base);
- toplevel->scene_tree->node.data = toplevel;
- xdg_toplevel->base->data = toplevel->scene_tree;
-
- /* Listen to the various events it can emit */
- toplevel->map.notify = xdg_toplevel_map;
- wl_signal_add(&xdg_toplevel->base->surface->events.map, &toplevel->map);
- toplevel->unmap.notify = xdg_toplevel_unmap;
- wl_signal_add(&xdg_toplevel->base->surface->events.unmap, &toplevel->unmap);
- toplevel->commit.notify = xdg_toplevel_commit;
- wl_signal_add(&xdg_toplevel->base->surface->events.commit, &toplevel->commit);
-
- toplevel->destroy.notify = xdg_toplevel_destroy;
- wl_signal_add(&xdg_toplevel->events.destroy, &toplevel->destroy);
-
- /* cotd */
- toplevel->request_move.notify = xdg_toplevel_request_move;
- wl_signal_add(&xdg_toplevel->events.request_move, &toplevel->request_move);
- toplevel->request_resize.notify = xdg_toplevel_request_resize;
- wl_signal_add(&xdg_toplevel->events.request_resize, &toplevel->request_resize);
- toplevel->request_maximize.notify = xdg_toplevel_request_maximize;
- wl_signal_add(&xdg_toplevel->events.request_maximize, &toplevel->request_maximize);
- toplevel->request_fullscreen.notify = xdg_toplevel_request_fullscreen;
- wl_signal_add(&xdg_toplevel->events.request_fullscreen, &toplevel->request_fullscreen);
+ /* This event is raised when a client creates a new toplevel (application
+ * window). */
+ struct montis_server *server =
+ wl_container_of(listener, server, new_xdg_toplevel);
+ struct wlr_xdg_toplevel *xdg_toplevel = data;
+
+ /* Allocate a montis_toplevel for this surface */
+ struct montis_toplevel *toplevel = calloc(1, sizeof(*toplevel));
+ toplevel->server = server;
+ toplevel->xdg_toplevel = xdg_toplevel;
+ toplevel->scene_tree = wlr_scene_xdg_surface_create(
+ &toplevel->server->scene->tree, xdg_toplevel->base);
+ toplevel->scene_tree->node.data = toplevel;
+ xdg_toplevel->base->data = toplevel->scene_tree;
+
+ /* Listen to the various events it can emit */
+ toplevel->map.notify = xdg_toplevel_map;
+ wl_signal_add(&xdg_toplevel->base->surface->events.map, &toplevel->map);
+ toplevel->unmap.notify = xdg_toplevel_unmap;
+ wl_signal_add(&xdg_toplevel->base->surface->events.unmap, &toplevel->unmap);
+ toplevel->commit.notify = xdg_toplevel_commit;
+ wl_signal_add(&xdg_toplevel->base->surface->events.commit, &toplevel->commit);
+
+ toplevel->destroy.notify = xdg_toplevel_destroy;
+ wl_signal_add(&xdg_toplevel->events.destroy, &toplevel->destroy);
+
+ /* cotd */
+ toplevel->request_move.notify = xdg_toplevel_request_move;
+ wl_signal_add(&xdg_toplevel->events.request_move, &toplevel->request_move);
+ toplevel->request_resize.notify = xdg_toplevel_request_resize;
+ wl_signal_add(&xdg_toplevel->events.request_resize,
+ &toplevel->request_resize);
+ toplevel->request_maximize.notify = xdg_toplevel_request_maximize;
+ wl_signal_add(&xdg_toplevel->events.request_maximize,
+ &toplevel->request_maximize);
+ toplevel->request_fullscreen.notify = xdg_toplevel_request_fullscreen;
+ wl_signal_add(&xdg_toplevel->events.request_fullscreen,
+ &toplevel->request_fullscreen);
}
int main(int argc, char *argv[])