bounds and anonymus union in absinthe_toplevel
This commit is contained in:
@@ -17,11 +17,11 @@ void absinthe_toplevel_map(struct wl_listener *listener, void *data)
|
||||
toplevel->tiled = true;
|
||||
|
||||
if (toplevel->type != ABSINTHE_TOPLEVEL_X11 &&
|
||||
wl_resource_get_version(toplevel->toplevel.xdg->resource) >= XDG_TOPLEVEL_STATE_TILED_RIGHT_SINCE_VERSION) {
|
||||
wlr_xdg_toplevel_set_tiled(toplevel->toplevel.xdg,
|
||||
wl_resource_get_version(toplevel->xdg_toplevel->resource) >= XDG_TOPLEVEL_STATE_TILED_RIGHT_SINCE_VERSION) {
|
||||
wlr_xdg_toplevel_set_tiled(toplevel->xdg_toplevel,
|
||||
WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT);
|
||||
} else {
|
||||
wlr_xdg_toplevel_set_maximized(toplevel->toplevel.xdg, true);
|
||||
wlr_xdg_toplevel_set_maximized(toplevel->xdg_toplevel, true);
|
||||
}
|
||||
|
||||
toplevel->border_width = absinthe_toplevel_is_unmanaged(toplevel) ? 0 : ABSINTHE_TOPLEVEL_BORDER_WIDTH;
|
||||
@@ -29,12 +29,12 @@ void absinthe_toplevel_map(struct wl_listener *listener, void *data)
|
||||
#ifdef XWAYLAND
|
||||
if (toplevel->type == ABSINTHE_TOPLEVEL_X11) {
|
||||
toplevel->scene_surface =
|
||||
wlr_scene_subsurface_tree_create(toplevel->scene_tree, toplevel->toplevel.x11->surface);
|
||||
wlr_scene_subsurface_tree_create(toplevel->scene_tree, toplevel->xwayland_surface->surface);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
toplevel->scene_surface =
|
||||
wlr_scene_subsurface_tree_create(toplevel->scene_tree, toplevel->toplevel.xdg->base->surface);
|
||||
wlr_scene_subsurface_tree_create(toplevel->scene_tree, toplevel->xdg_toplevel->base->surface);
|
||||
}
|
||||
toplevel->scene_surface->node.data = toplevel;
|
||||
|
||||
@@ -109,29 +109,29 @@ void absinthe_toplevel_request_move(struct wl_listener *listener, void *data)
|
||||
{
|
||||
UNUSED(data);
|
||||
struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, request_maximize);
|
||||
if (toplevel->toplevel.xdg->base->initialized)
|
||||
wlr_xdg_surface_schedule_configure(toplevel->toplevel.xdg->base);
|
||||
if (toplevel->xdg_toplevel->base->initialized)
|
||||
wlr_xdg_surface_schedule_configure(toplevel->xdg_toplevel->base);
|
||||
}
|
||||
|
||||
void absinthe_toplevel_request_resize(struct wl_listener *listener, void *data)
|
||||
{
|
||||
UNUSED(data);
|
||||
struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, request_maximize);
|
||||
if (toplevel->toplevel.xdg->base->initialized)
|
||||
wlr_xdg_surface_schedule_configure(toplevel->toplevel.xdg->base);
|
||||
if (toplevel->xdg_toplevel->base->initialized)
|
||||
wlr_xdg_surface_schedule_configure(toplevel->xdg_toplevel->base);
|
||||
}
|
||||
|
||||
void absinthe_toplevel_request_maximize(struct wl_listener *listener, void *data)
|
||||
{
|
||||
UNUSED(data);
|
||||
struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, request_maximize);
|
||||
if (toplevel->toplevel.xdg->base->initialized)
|
||||
wlr_xdg_surface_schedule_configure(toplevel->toplevel.xdg->base);
|
||||
if (toplevel->xdg_toplevel->base->initialized)
|
||||
wlr_xdg_surface_schedule_configure(toplevel->xdg_toplevel->base);
|
||||
}
|
||||
|
||||
void absinthe_toplevel_request_fullscreen(struct wl_listener *listener, void *data)
|
||||
{
|
||||
UNUSED(data);
|
||||
struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, request_fullscreen);
|
||||
absinthe_toplevel_set_fullscreen(toplevel, toplevel->toplevel.xdg->requested.fullscreen);
|
||||
absinthe_toplevel_set_fullscreen(toplevel, toplevel->xdg_toplevel->requested.fullscreen);
|
||||
}
|
||||
|
||||
+24
-20
@@ -7,6 +7,7 @@
|
||||
#include "layout.h"
|
||||
#include "output.h"
|
||||
#include "types.h"
|
||||
#include "xdg-shell-protocol.h"
|
||||
|
||||
struct absinthe_toplevel *absinthe_toplevel_at(struct absinthe_server *server, double lx, double ly,
|
||||
struct wlr_surface **surface, double *sx, double *sy)
|
||||
@@ -43,7 +44,7 @@ bool absinthe_toplevel_is_unmanaged(struct absinthe_toplevel *toplevel)
|
||||
{
|
||||
#ifdef XWAYLAND
|
||||
if (toplevel->type == ABSINTHE_TOPLEVEL_X11)
|
||||
return toplevel->toplevel.x11->override_redirect;
|
||||
return toplevel->xwayland_surface->override_redirect;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
@@ -52,14 +53,14 @@ void absinthe_toplevel_update_geometry(struct absinthe_toplevel *toplevel)
|
||||
{
|
||||
#ifdef XWAYLAND
|
||||
if (toplevel->type == ABSINTHE_TOPLEVEL_X11) {
|
||||
toplevel->geometry.x = toplevel->toplevel.x11->x;
|
||||
toplevel->geometry.y = toplevel->toplevel.x11->y;
|
||||
toplevel->geometry.width = toplevel->toplevel.x11->width;
|
||||
toplevel->geometry.height = toplevel->toplevel.x11->height;
|
||||
toplevel->geometry.x = toplevel->xwayland_surface->x;
|
||||
toplevel->geometry.y = toplevel->xwayland_surface->y;
|
||||
toplevel->geometry.width = toplevel->xwayland_surface->width;
|
||||
toplevel->geometry.height = toplevel->xwayland_surface->height;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
toplevel->geometry = toplevel->toplevel.xdg->base->geometry;
|
||||
toplevel->geometry = toplevel->xdg_toplevel->base->geometry;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,6 +101,22 @@ void absinthe_toplevel_set_size(struct absinthe_toplevel *toplevel, int32_t widt
|
||||
toplevel->geometry.width = width;
|
||||
toplevel->geometry.height = height;
|
||||
|
||||
if (toplevel->type == ABSINTHE_TOPLEVEL_XDG) {
|
||||
if (wl_resource_get_version(toplevel->xdg_toplevel->resource) >=
|
||||
XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION)
|
||||
wlr_xdg_toplevel_set_bounds(toplevel->xdg_toplevel, width, height);
|
||||
toplevel->resizing = wlr_xdg_toplevel_set_size(
|
||||
toplevel->xdg_toplevel, width - 2 * toplevel->border_width, height - 2 * toplevel->border_width);
|
||||
}
|
||||
#ifdef XWAYLAND
|
||||
else if (toplevel->type == ABSINTHE_TOPLEVEL_X11) {
|
||||
wlr_xwayland_surface_configure(toplevel->xwayland_surface, toplevel->geometry.x, toplevel->geometry.y,
|
||||
width - 2 * toplevel->border_width, height - 2 * toplevel->border_width);
|
||||
absinthe_toplevel_set_position(toplevel, toplevel->geometry.x + toplevel->border_width,
|
||||
toplevel->geometry.y + toplevel->border_width);
|
||||
}
|
||||
#endif
|
||||
|
||||
struct wlr_box clip = {
|
||||
.x = 0,
|
||||
.y = 0,
|
||||
@@ -108,19 +125,6 @@ void absinthe_toplevel_set_size(struct absinthe_toplevel *toplevel, int32_t widt
|
||||
};
|
||||
wlr_scene_subsurface_tree_set_clip(&toplevel->scene_surface->node, &clip);
|
||||
|
||||
if (toplevel->type == ABSINTHE_TOPLEVEL_XDG) {
|
||||
toplevel->resizing = wlr_xdg_toplevel_set_size(
|
||||
toplevel->toplevel.xdg, width - 2 * toplevel->border_width, height - 2 * toplevel->border_width);
|
||||
}
|
||||
#ifdef XWAYLAND
|
||||
else if (toplevel->type == ABSINTHE_TOPLEVEL_X11) {
|
||||
wlr_xwayland_surface_configure(toplevel->toplevel.x11, toplevel->geometry.x, toplevel->geometry.y,
|
||||
width - 2 * toplevel->border_width, height - 2 * toplevel->border_width);
|
||||
absinthe_toplevel_set_position(toplevel, toplevel->geometry.x + toplevel->border_width,
|
||||
toplevel->geometry.y + toplevel->border_width);
|
||||
}
|
||||
#endif
|
||||
|
||||
absinthe_toplevel_update_borders_geometry(toplevel);
|
||||
}
|
||||
|
||||
@@ -131,7 +135,7 @@ void absinthe_toplevel_set_fullscreen(struct absinthe_toplevel *toplevel, bool f
|
||||
|
||||
struct absinthe_output *output = toplevel->server->focused_output;
|
||||
toplevel->fullscreen = fullscreen;
|
||||
wlr_xdg_toplevel_set_fullscreen(toplevel->toplevel.xdg, fullscreen);
|
||||
wlr_xdg_toplevel_set_fullscreen(toplevel->xdg_toplevel, fullscreen);
|
||||
|
||||
if (fullscreen) {
|
||||
toplevel->prev_geometry = toplevel->geometry;
|
||||
|
||||
+5
-5
@@ -10,7 +10,7 @@ void reset_cursor_mode(struct absinthe_server *server)
|
||||
server->cursor_mode = ABSINTHE_CURSOR_PASSTHROUGH;
|
||||
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "default");
|
||||
if (server->focused_toplevel) {
|
||||
wlr_xdg_toplevel_set_resizing(server->focused_toplevel->toplevel.xdg, false);
|
||||
wlr_xdg_toplevel_set_resizing(server->focused_toplevel->xdg_toplevel, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,11 +41,11 @@ static void process_cursor_move(struct absinthe_server *server)
|
||||
|
||||
static void apply_resize(struct absinthe_toplevel *toplevel, struct wlr_box *new_geometry)
|
||||
{
|
||||
int32_t min_width = toplevel->toplevel.xdg->current.min_width;
|
||||
int32_t min_height = toplevel->toplevel.xdg->current.min_height;
|
||||
int32_t min_width = toplevel->xdg_toplevel->current.min_width;
|
||||
int32_t min_height = toplevel->xdg_toplevel->current.min_height;
|
||||
|
||||
int32_t max_width = toplevel->toplevel.xdg->current.max_width;
|
||||
int32_t max_height = toplevel->toplevel.xdg->current.max_height;
|
||||
int32_t max_width = toplevel->xdg_toplevel->current.max_width;
|
||||
int32_t max_height = toplevel->xdg_toplevel->current.max_height;
|
||||
|
||||
if (max_width == 0)
|
||||
max_width = 10000;
|
||||
|
||||
+3
-3
@@ -16,10 +16,10 @@ void focus_toplevel(struct absinthe_toplevel *toplevel)
|
||||
struct wlr_surface *surface;
|
||||
#ifdef XWAYLAND
|
||||
if (toplevel->type == ABSINTHE_TOPLEVEL_X11)
|
||||
surface = toplevel->toplevel.x11->surface;
|
||||
surface = toplevel->xwayland_surface->surface;
|
||||
else
|
||||
#endif
|
||||
surface = toplevel->toplevel.xdg->base->surface;
|
||||
surface = toplevel->xdg_toplevel->base->surface;
|
||||
|
||||
if (surface == prev_surface)
|
||||
return;
|
||||
@@ -44,7 +44,7 @@ void focus_toplevel(struct absinthe_toplevel *toplevel)
|
||||
wl_list_remove(&toplevel->flink);
|
||||
wl_list_insert(&server->focus_stack, &toplevel->flink);
|
||||
if (toplevel->type != ABSINTHE_TOPLEVEL_X11)
|
||||
wlr_xdg_toplevel_set_activated(toplevel->toplevel.xdg, true);
|
||||
wlr_xdg_toplevel_set_activated(toplevel->xdg_toplevel, true);
|
||||
absinthe_toplevel_set_border_color(toplevel, focused_border_color);
|
||||
|
||||
if (keyboard)
|
||||
|
||||
+6
-6
@@ -72,8 +72,8 @@ void server_new_xdg_toplevel(struct wl_listener *listener, void *data)
|
||||
struct absinthe_toplevel *toplevel = calloc(1, sizeof(*toplevel));
|
||||
toplevel->type = ABSINTHE_TOPLEVEL_XDG;
|
||||
toplevel->server = server;
|
||||
toplevel->toplevel.xdg = xdg_toplevel;
|
||||
toplevel->toplevel.xdg->base->data = toplevel;
|
||||
toplevel->xdg_toplevel = xdg_toplevel;
|
||||
toplevel->xdg_toplevel->base->data = toplevel;
|
||||
|
||||
toplevel->commit.notify = xdg_toplevel_commit;
|
||||
wl_signal_add(&xdg_toplevel->base->surface->events.commit, &toplevel->commit);
|
||||
@@ -156,7 +156,7 @@ void server_xwayland_new_surface(struct wl_listener *listener, void *data)
|
||||
|
||||
toplevel->type = ABSINTHE_TOPLEVEL_X11;
|
||||
toplevel->server = server;
|
||||
toplevel->toplevel.x11 = surface;
|
||||
toplevel->xwayland_surface = surface;
|
||||
toplevel->border_width = absinthe_toplevel_is_unmanaged(toplevel) ? 0 : ABSINTHE_TOPLEVEL_BORDER_WIDTH;
|
||||
|
||||
toplevel->destroy.notify = absinthe_toplevel_destroy;
|
||||
@@ -241,8 +241,8 @@ void server_cursor_button(struct wl_listener *listener, void *data)
|
||||
if (server->cursor_mode != ABSINTHE_CURSOR_RESIZE)
|
||||
goto handle;
|
||||
|
||||
int32_t width = toplevel->toplevel.xdg->base->geometry.width;
|
||||
int32_t height = toplevel->toplevel.xdg->base->geometry.height;
|
||||
int32_t width = toplevel->xdg_toplevel->base->geometry.width;
|
||||
int32_t height = toplevel->xdg_toplevel->base->geometry.height;
|
||||
|
||||
if (server->grab_x > (lx + width / 2) && server->grab_y > (ly + height / 2)) {
|
||||
server->cursor_resize_corner = ABSINTHE_CURSOR_RESIZE_CORNER_BOTTOM_RIGHT;
|
||||
@@ -258,7 +258,7 @@ void server_cursor_button(struct wl_listener *listener, void *data)
|
||||
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "nw-resize");
|
||||
}
|
||||
|
||||
wlr_xdg_toplevel_set_resizing(toplevel->toplevel.xdg, true);
|
||||
wlr_xdg_toplevel_set_resizing(toplevel->xdg_toplevel, true);
|
||||
}
|
||||
|
||||
handle:
|
||||
|
||||
@@ -6,7 +6,7 @@ void xdg_decoration_request_mode(struct wl_listener *listener, void *data)
|
||||
{
|
||||
UNUSED(data);
|
||||
struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, decoration_request_mode);
|
||||
if (toplevel->toplevel.xdg->base->initialized)
|
||||
if (toplevel->xdg_toplevel->base->initialized)
|
||||
wlr_xdg_toplevel_decoration_v1_set_mode(toplevel->decoration,
|
||||
WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
|
||||
}
|
||||
|
||||
+4
-4
@@ -14,16 +14,16 @@ void xdg_toplevel_commit(struct wl_listener *listener, void *data)
|
||||
UNUSED(data);
|
||||
struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, commit);
|
||||
|
||||
if (toplevel->toplevel.xdg->base->initial_commit) {
|
||||
wlr_xdg_toplevel_set_activated(toplevel->toplevel.xdg, false);
|
||||
if (toplevel->xdg_toplevel->base->initial_commit) {
|
||||
wlr_xdg_toplevel_set_activated(toplevel->xdg_toplevel, false);
|
||||
|
||||
/* Forse server side decoration mode */
|
||||
if (toplevel->decoration)
|
||||
xdg_decoration_request_mode(&toplevel->decoration_request_mode, toplevel->decoration);
|
||||
toplevel->resizing = wlr_xdg_toplevel_set_size(toplevel->toplevel.xdg, 0, 0);
|
||||
toplevel->resizing = wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, 0, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (toplevel->resizing && toplevel->resizing <= toplevel->toplevel.xdg->base->current.configure_serial)
|
||||
if (toplevel->resizing && toplevel->resizing <= toplevel->xdg_toplevel->base->current.configure_serial)
|
||||
toplevel->resizing = 0;
|
||||
}
|
||||
|
||||
+8
-6
@@ -12,7 +12,7 @@ void xwayland_activate(struct wl_listener *listener, void *data)
|
||||
struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, xwayland_activate);
|
||||
|
||||
if (!absinthe_toplevel_is_unmanaged(toplevel))
|
||||
wlr_xwayland_surface_activate(toplevel->toplevel.x11, 1);
|
||||
wlr_xwayland_surface_activate(toplevel->xwayland_surface, 1);
|
||||
}
|
||||
|
||||
void xwayland_associate(struct wl_listener *listener, void *data)
|
||||
@@ -21,9 +21,9 @@ void xwayland_associate(struct wl_listener *listener, void *data)
|
||||
struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, xwayland_associate);
|
||||
|
||||
toplevel->map.notify = absinthe_toplevel_map;
|
||||
wl_signal_add(&toplevel->toplevel.x11->surface->events.map, &toplevel->map);
|
||||
wl_signal_add(&toplevel->xwayland_surface->surface->events.map, &toplevel->map);
|
||||
toplevel->unmap.notify = absinthe_toplevel_unmap;
|
||||
wl_signal_add(&toplevel->toplevel.x11->surface->events.unmap, &toplevel->unmap);
|
||||
wl_signal_add(&toplevel->xwayland_surface->surface->events.unmap, &toplevel->unmap);
|
||||
}
|
||||
|
||||
void xwayland_dissociate(struct wl_listener *listener, void *data)
|
||||
@@ -41,14 +41,16 @@ void xwayland_configure(struct wl_listener *listener, void *data)
|
||||
struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, xwayland_configure);
|
||||
struct wlr_xwayland_surface_configure_event *event = data;
|
||||
|
||||
if (!toplevel->toplevel.x11->surface || !toplevel->toplevel.x11->surface->mapped) {
|
||||
wlr_xwayland_surface_configure(toplevel->toplevel.x11, event->x, event->y, event->width, event->height);
|
||||
if (!toplevel->xwayland_surface->surface || !toplevel->xwayland_surface->surface->mapped) {
|
||||
wlr_xwayland_surface_configure(toplevel->xwayland_surface, event->x, event->y, event->width,
|
||||
event->height);
|
||||
return;
|
||||
}
|
||||
|
||||
if (absinthe_toplevel_is_unmanaged(toplevel)) {
|
||||
wlr_scene_node_set_position(&toplevel->scene_tree->node, event->x, event->y);
|
||||
wlr_xwayland_surface_configure(toplevel->toplevel.x11, event->x, event->y, event->width, event->height);
|
||||
wlr_xwayland_surface_configure(toplevel->xwayland_surface, event->x, event->y, event->width,
|
||||
event->height);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user