diff options
| author | Josh Rahm <joshuarahm@gmail.com> | 2026-01-04 19:16:06 -0700 |
|---|---|---|
| committer | Josh Rahm <joshuarahm@gmail.com> | 2026-01-04 19:16:06 -0700 |
| commit | efe34b2c98cc90ed686217ea3b0655fae1839414 (patch) | |
| tree | 3e34f00b518eac8cefeb684c0538cf4312b2df06 /rt | |
| parent | 21667ce43fded6abf8516a1fb728d60a38b2b36e (diff) | |
| download | montis-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.h | 4 | ||||
| -rw-r--r-- | rt/src/wl.c | 188 |
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[]) |