feat(layouts): 实现 fair/fullscreen/maximize 内置布局

This commit is contained in:
2026-04-27 18:38:49 +08:00
parent 10fa3740a8
commit 7413d7439a
13 changed files with 164 additions and 16 deletions

1
src/layouts/.clang-format Symbolic link
View File

@@ -0,0 +1 @@
../../.clang-format

63
src/layouts/fair.c Normal file
View File

@@ -0,0 +1,63 @@
#include "layouts/fair.h"
#include <math.h>
#include <stddef.h>
#include <stdint.h>
#include <zdwm/layout.h>
bool fair(const zdwm_layout_ctx_t *ctx, zdwm_layout_result_t *out) {
auto windows = ctx->window_ids;
auto count = (int32_t)ctx->window_count;
if (!windows || !count) return false;
zdwm_layout_result_reset(out);
auto columns = (int32_t)floor(sqrt(count));
if (columns * (columns + 1) <= count) ++columns;
auto rows_in_other_cols = count / columns;
auto rows_in_main_col = count - (columns - 1) * rows_in_other_cols;
while (rows_in_main_col > rows_in_other_cols) {
++rows_in_other_cols;
rows_in_main_col = count - (columns - 1) * rows_in_other_cols;
}
auto workarea = &ctx->workarea;
auto width_avg = workarea->width / columns;
auto width_for_main_col = workarea->width - (columns - 1) * width_avg;
auto width_for_other_col = width_avg;
int32_t row = 0, col = 0, row_count;
int32_t x = workarea->x, y = workarea->y;
for (int32_t i = 0; i < count; ++i) {
int32_t width;
if (i < rows_in_main_col) {
row = i;
width = width_for_main_col;
row_count = rows_in_main_col;
} else {
width = width_for_other_col;
row_count = rows_in_other_cols;
if (((i - rows_in_main_col) % row_count) == 0) {
col++;
row = 0;
x += col == 1 ? width_for_main_col : width_for_other_col;
y = workarea->y;
}
}
auto h_avg = workarea->height / row_count;
auto h_main = workarea->height - h_avg * (row_count - 1);
auto height = row == 0 ? h_main : h_avg;
zdwm_layout_item_t item = {
.window_id = windows[i],
.rect = {.x = x, .y = y, .width = width, .height = height}
};
zdwm_layout_result_push(out, item);
y += height;
}
return true;
}

5
src/layouts/fair.h Normal file
View File

@@ -0,0 +1,5 @@
#pragma once
#include <zdwm/layout.h>
bool fair(const zdwm_layout_ctx_t *ctx, zdwm_layout_result_t *out);

18
src/layouts/fullscreen.c Normal file
View File

@@ -0,0 +1,18 @@
#include "layouts/fullscreen.h"
bool fullscreen(const zdwm_layout_ctx_t *ctx, zdwm_layout_result_t *out) {
auto windows = ctx->window_ids;
auto count = ctx->window_count;
if (!windows || !count) return false;
zdwm_layout_result_reset(out);
for (size_t i = 0; i < count; ++i) {
zdwm_layout_item_t item = {
.window_id = windows[i],
.rect = ctx->output_geometry,
};
zdwm_layout_result_push(out, item);
}
return true;
}

5
src/layouts/fullscreen.h Normal file
View File

@@ -0,0 +1,5 @@
#pragma once
#include <zdwm/layout.h>
bool fullscreen(const zdwm_layout_ctx_t *ctx, zdwm_layout_result_t *out);

20
src/layouts/maximize.c Normal file
View File

@@ -0,0 +1,20 @@
#include "layouts/maximize.h"
#include <zdwm/layout.h>
bool maximize(const zdwm_layout_ctx_t *ctx, zdwm_layout_result_t *out) {
auto windows = ctx->window_ids;
auto count = ctx->window_count;
if (!windows || !count) return false;
zdwm_layout_result_reset(out);
for (size_t i = 0; i < count; ++i) {
zdwm_layout_item_t item = {
.window_id = windows[i],
.rect = ctx->workarea,
};
zdwm_layout_result_push(out, item);
}
return true;
}

5
src/layouts/maximize.h Normal file
View File

@@ -0,0 +1,5 @@
#pragma once
#include <zdwm/layout.h>
bool maximize(const zdwm_layout_ctx_t *ctx, zdwm_layout_result_t *out);