remove client-side decorations

This commit is contained in:
2026-01-04 18:07:28 +07:00
parent a36e205e08
commit 8995db6e1c
12 changed files with 163 additions and 30 deletions
+28 -7
View File
@@ -7,6 +7,7 @@
#include "output.h"
#include "xdg-toplevel.h"
#include "xdg-popup.h"
#include "xdg-decoration.h"
#include "absinthe-toplevel.h"
#include "focus.h"
#include "keyboard.h"
@@ -59,7 +60,7 @@ void server_new_xdg_toplevel(struct wl_listener *listener, void *data)
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;
xdg_toplevel->base->data = toplevel;
toplevel->map.notify = xdg_toplevel_map;
wl_signal_add(&xdg_toplevel->base->surface->events.map, &toplevel->map);
@@ -101,6 +102,20 @@ void server_new_xdg_popup(struct wl_listener *listener, void *data)
wl_signal_add(&xdg_popup->base->surface->events.destroy, &popup->destroy);
}
void server_new_xdg_decoration(struct wl_listener *listener, void *data)
{
struct wlr_xdg_toplevel_decoration_v1 *xdg_decoration = data;
struct absinthe_toplevel *toplevel = xdg_decoration->toplevel->base->data;
toplevel->decoration = xdg_decoration;
toplevel->decoration_request_mode.notify = xdg_decoration_request_mode;
wl_signal_add(&xdg_decoration->events.request_mode, &toplevel->decoration_request_mode);
toplevel->decoration_destroy.notify = xdg_decoration_destroy;
wl_signal_add(&xdg_decoration->events.destroy, &toplevel->decoration_destroy);
xdg_decoration_request_mode(&toplevel->decoration_request_mode, xdg_decoration);
}
void server_cursor_motion(struct wl_listener *listener, void *data)
{
struct absinthe_server *server = wl_container_of(listener, server, cursor_motion);
@@ -122,7 +137,7 @@ void server_cursor_button(struct wl_listener *listener, void *data)
struct absinthe_server *server = wl_container_of(listener, server, cursor_button);
struct wlr_pointer_button_event *event = data;
wlr_seat_pointer_notify_button(server->seat, event->time_msec, event->button, event->state);
bool handled = false;
if (event->state == WL_POINTER_BUTTON_STATE_RELEASED) {
reset_cursor_mode(server);
} else {
@@ -136,8 +151,10 @@ void server_cursor_button(struct wl_listener *listener, void *data)
if (mods & ABSINTHE_CURSOR_MOD) {
if (event->button == ABSINTHE_CURSOR_MOVE_BUTTON) {
server->cursor_mode = ABSINTHE_CURSOR_MOVE;
handled = true;
} else if (event->button == ABSINTHE_CURSOR_RESIZE_BUTTON) {
server->cursor_mode = ABSINTHE_CURSOR_RESIZE;
handled = true;
}
}
if (toplevel) {
@@ -146,11 +163,11 @@ void server_cursor_button(struct wl_listener *listener, void *data)
int lx, ly;
wlr_scene_node_coords(&toplevel->scene_tree->node, &lx, &ly);
server->grabbed_toplevel_x = lx;
server->grabbed_toplevel_y = ly;
server->grabbed_toplevel_width = toplevel->xdg_toplevel->base->geometry.width;
server->grabbed_toplevel_height = toplevel->xdg_toplevel->base->geometry.height;
wlr_log(WLR_DEBUG, "%d, %d", server->grabbed_toplevel_width, server->grabbed_toplevel_width);
server->grabbed_box.x = lx;
server->grabbed_box.y = ly;
server->grabbed_box.width = toplevel->xdg_toplevel->base->geometry.width;
server->grabbed_box.height = toplevel->xdg_toplevel->base->geometry.height;
wlr_log(WLR_DEBUG, "%d, %d", server->grabbed_box.width, server->grabbed_box.height);
server->grabbed_toplevel = toplevel;
int width = toplevel->xdg_toplevel->base->geometry.width;
@@ -167,6 +184,10 @@ void server_cursor_button(struct wl_listener *listener, void *data)
}
}
}
if (!handled) {
wlr_seat_pointer_notify_button(server->seat, event->time_msec, event->button, event->state);
}
}
void server_cursor_axis(struct wl_listener *listener, void *data)