add basic tiling

This commit is contained in:
2026-04-03 17:13:34 +07:00
parent 7e3ca8238c
commit cba94498b1
5 changed files with 106 additions and 5 deletions
+61
View File
@@ -0,0 +1,61 @@
#include "types.h"
void layout_arrange(struct absinthe_output *output)
{
if (!output)
return;
struct absinthe_toplevel *toplevel;
size_t toplevels_count = 0;
wl_list_for_each(toplevel, &output->server->toplevels, link) {
if (toplevel->output == output)
toplevels_count++;
}
if (toplevels_count < 1)
return;
int32_t bw = ABSINTHE_WINDOW_BORDER_WIDTH;
int32_t og = ABSINTHE_OUTPUT_GAP;
if (toplevels_count == 1) {
wl_list_for_each(toplevel, &output->server->toplevels, link) {
if (toplevel->output == output)
break;
}
wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel,
output->geometry.width - 2 * bw - 2 * og,
output->geometry.height - 2 * bw - 2 * og);
toplevel->geometry.x = output->geometry.x + og;
toplevel->geometry.y = output->geometry.y + og;
return;
}
int32_t w, h;
int32_t lg = ABSINTHE_LAYOUT_GAP;
int32_t mw = ABSINTHE_MAIN_TOPLEVEL_WIDTH * (output->geometry.width - 2 * og);
int32_t ty = og;
size_t i = 0;
wl_list_for_each(toplevel, &output->server->toplevels, link) {
if (toplevel->output != output)
continue;
if (i == 0) {
h = output->geometry.height - 2 * bw - 2 * og;
wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, mw, h);
toplevel->geometry.x = output->geometry.x + og;
toplevel->geometry.y = output->geometry.y + og;
} else {
w = output->geometry.width - mw - 2 * bw - 2 * lg - 2 * og;
h = (output->geometry.height - ty - og) / (toplevels_count - i) - 2 * bw;
wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, w, h);
toplevel->geometry.x = output->geometry.x + mw + lg + og;
toplevel->geometry.y = output->geometry.y + ty;
ty += h + 2 * bw + lg;
}
i++;
}
}
+1 -1
View File
@@ -172,7 +172,7 @@ void server_cursor_button(struct wl_listener *listener, void *data)
int32_t lx, ly;
wlr_scene_node_coords(&toplevel->scene_tree->node, &lx, &ly);
server->grabbed_geometry.x = lx;
server->grabbed_geometry.y = ly;
server->grabbed_geometry.y = ly;
server->grabbed_geometry.width = toplevel->geometry.width;
server->grabbed_geometry.height = toplevel->geometry.height;
+9 -2
View File
@@ -5,8 +5,10 @@
#include <wlr/util/log.h>
#include "types.h"
#include "xdg-decoration.h"
#include "absinthe-toplevel.h"
#include "layout.h"
#include "output.h"
#include "xdg-decoration.h"
void xdg_toplevel_commit(struct wl_listener *listener, void *data)
{
@@ -18,7 +20,7 @@ void xdg_toplevel_commit(struct wl_listener *listener, void *data)
xdg_decoration_request_mode(&toplevel->decoration_request_mode, toplevel->decoration);
// Let toplevel set preferred size
wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, 0, 0);
// wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, 0, 0);
} else {
// Check for size because we did't set it on initial commit
int32_t bw = toplevel->border_width;
@@ -42,11 +44,14 @@ void xdg_toplevel_map(struct wl_listener *listener, void *data)
toplevel->border_width = ABSINTHE_WINDOW_BORDER_WIDTH;
update_focused_output(toplevel->server);
toplevel->output = toplevel->server->focused_output;
toplevel->fullscreen = false;
wl_list_insert(&toplevel->server->toplevels, &toplevel->link);
wl_list_insert(&toplevel->server->focus_stack, &toplevel->flink);
layout_arrange(toplevel->output);
}
void xdg_toplevel_unmap(struct wl_listener *listener, void *data)
@@ -57,6 +62,8 @@ void xdg_toplevel_unmap(struct wl_listener *listener, void *data)
wl_list_remove(&toplevel->link);
wl_list_remove(&toplevel->flink);
layout_arrange(toplevel->output);
}
void xdg_toplevel_destroy(struct wl_listener *listener, void *data)