diff options
| author | Josh Rahm <joshuarahm@gmail.com> | 2026-01-05 00:37:13 -0700 |
|---|---|---|
| committer | Josh Rahm <joshuarahm@gmail.com> | 2026-01-05 00:37:13 -0700 |
| commit | 9daffd37236469e8089e3c12207c449b4db09e92 (patch) | |
| tree | 9d844e0ff0e3f580212a2dde0465ed81d8f6cdc8 /rt | |
| parent | fafcdc6fed80652aa76555b40f77328e8994a172 (diff) | |
| download | montis-9daffd37236469e8089e3c12207c449b4db09e92.tar.gz montis-9daffd37236469e8089e3c12207c449b4db09e92.tar.bz2 montis-9daffd37236469e8089e3c12207c449b4db09e92.zip | |
[feat] add focusing and better dragging.
Diffstat (limited to 'rt')
| -rw-r--r-- | rt/include/util.h | 1 | ||||
| -rw-r--r-- | rt/src/util.c | 35 |
2 files changed, 36 insertions, 0 deletions
diff --git a/rt/include/util.h b/rt/include/util.h index b477113..a9c290d 100644 --- a/rt/include/util.h +++ b/rt/include/util.h @@ -9,5 +9,6 @@ void *montis_plugin_toplevel_at(void *ctx, double lx, double ly); void montis_plugin_get_toplevel_position(void *toplevel, double *x, double *y); void montis_plugin_set_toplevel_position(void *toplevel, double x, double y); +void montis_plugin_focus_toplevel(void *toplevel); #endif /* MONTIS_UTIL_H */ diff --git a/rt/src/util.c b/rt/src/util.c index 6576770..66a2b20 100644 --- a/rt/src/util.c +++ b/rt/src/util.c @@ -2,6 +2,7 @@ #include "wl.h" #include <wlr/types/wlr_scene.h> +#include <wlr/types/wlr_xdg_shell.h> static struct montis_server *server_from_ctx(void *ctx) { @@ -61,3 +62,37 @@ void montis_plugin_set_toplevel_position(void *toplevel, double x, double y) struct montis_toplevel *tl = toplevel; wlr_scene_node_set_position(&tl->scene_tree->node, (int)x, (int)y); } + +void montis_plugin_focus_toplevel(void *toplevel) +{ + if (!toplevel) { + return; + } + struct montis_toplevel *tl = toplevel; + struct montis_server *server = tl->server; + struct wlr_seat *seat = server->seat; + struct wlr_surface *surface = tl->xdg_toplevel->base->surface; + struct wlr_surface *prev_surface = seat->keyboard_state.focused_surface; + + if (prev_surface == surface) { + return; + } + if (prev_surface) { + struct wlr_xdg_toplevel *prev_toplevel = + wlr_xdg_toplevel_try_from_wlr_surface(prev_surface); + if (prev_toplevel != NULL) { + wlr_xdg_toplevel_set_activated(prev_toplevel, false); + } + } + + struct wlr_keyboard *keyboard = wlr_seat_get_keyboard(seat); + wlr_scene_node_raise_to_top(&tl->scene_tree->node); + wl_list_remove(&tl->link); + wl_list_insert(&server->toplevels, &tl->link); + wlr_xdg_toplevel_set_activated(tl->xdg_toplevel, true); + if (keyboard != NULL) { + wlr_seat_keyboard_notify_enter(seat, surface, keyboard->keycodes, + keyboard->num_keycodes, + &keyboard->modifiers); + } +} |