add stack_proportion

This commit is contained in:
DreamMaoMao 2026-01-17 17:00:20 +08:00
parent 02690694d8
commit 9adb80d29f
3 changed files with 53 additions and 8 deletions

View file

@ -224,17 +224,39 @@ void arrange_stack(Client *scroller_stack_head, struct wlr_box geometry,
if (stack_size == 0) if (stack_size == 0)
return; return;
int32_t client_height = float total_proportion = 0.0f;
(geometry.height - (stack_size - 1) * gappiv) / stack_size; iter = scroller_stack_head;
int32_t current_y = geometry.y; while (iter) {
if(iter->stack_proportion <= 0.0f || iter->stack_proportion >= 1.0f) {
iter->stack_proportion = stack_size == 1 ? 1.0f : 1.0f/(stack_size - 1);
}
total_proportion += iter->stack_proportion;
iter = iter->next_in_stack;
}
iter = scroller_stack_head; iter = scroller_stack_head;
while (iter) { while (iter) {
iter->stack_proportion = iter->stack_proportion / total_proportion;
iter = iter->next_in_stack;
}
int32_t client_height;
int32_t current_y = geometry.y;
int32_t remain_client_height = geometry.height - (stack_size - 1) * gappiv;
float remain_proportion = 1.0f;
iter = scroller_stack_head;
while (iter) {
client_height = remain_client_height * (iter->stack_proportion / remain_proportion);
struct wlr_box client_geom = {.x = geometry.x, struct wlr_box client_geom = {.x = geometry.x,
.y = current_y, .y = current_y,
.width = geometry.width, .width = geometry.width,
.height = client_height}; .height = client_height};
resize(iter, client_geom, 0); resize(iter, client_geom, 0);
remain_proportion -= iter->stack_proportion;
remain_client_height -= client_height;
current_y += client_height + gappiv; current_y += client_height + gappiv;
iter = iter->next_in_stack; iter = iter->next_in_stack;
} }

View file

@ -199,8 +199,8 @@ void vertical_scroll_adjust_fullandmax(Client *c, struct wlr_box *target_geom) {
target_geom->x = m->w.x + (m->w.width - target_geom->width) / 2; target_geom->x = m->w.x + (m->w.width - target_geom->width) / 2;
} }
void arrange_stack_vertical(Client *scroller_stack_head, void arrange_stack_vertical(Client *scroller_stack_head, struct wlr_box geometry,
struct wlr_box geometry, int32_t gappih) { int32_t gappih) {
int32_t stack_size = 0; int32_t stack_size = 0;
Client *iter = scroller_stack_head; Client *iter = scroller_stack_head;
while (iter) { while (iter) {
@ -211,17 +211,39 @@ void arrange_stack_vertical(Client *scroller_stack_head,
if (stack_size == 0) if (stack_size == 0)
return; return;
int32_t client_width = float total_proportion = 0.0f;
(geometry.width - (stack_size - 1) * gappih) / stack_size; iter = scroller_stack_head;
int32_t current_x = geometry.x; while (iter) {
if(iter->stack_proportion <= 0.0f || iter->stack_proportion >= 1.0f) {
iter->stack_proportion = stack_size == 1 ? 1.0f : 1.0f/(stack_size - 1);
}
total_proportion += iter->stack_proportion;
iter = iter->next_in_stack;
}
iter = scroller_stack_head; iter = scroller_stack_head;
while (iter) { while (iter) {
iter->stack_proportion = iter->stack_proportion / total_proportion;
iter = iter->next_in_stack;
}
int32_t client_width;
int32_t current_x = geometry.x;
int32_t remain_client_width = geometry.width - (stack_size - 1) * gappih;
float remain_proportion = 1.0f;
iter = scroller_stack_head;
while (iter) {
client_width = remain_client_width * (iter->stack_proportion / remain_proportion);
struct wlr_box client_geom = {.y = geometry.y, struct wlr_box client_geom = {.y = geometry.y,
.x = current_x, .x = current_x,
.height = geometry.height, .height = geometry.height,
.width = client_width}; .width = client_width};
resize(iter, client_geom, 0); resize(iter, client_geom, 0);
remain_proportion -= iter->stack_proportion;
remain_client_width -= client_width;
current_x += client_width + gappih; current_x += client_width + gappih;
iter = iter->next_in_stack; iter = iter->next_in_stack;
} }

View file

@ -375,6 +375,7 @@ struct Client {
bool is_pending_open_animation; bool is_pending_open_animation;
bool is_restoring_from_ov; bool is_restoring_from_ov;
float scroller_proportion; float scroller_proportion;
float stack_proportion;
bool need_output_flush; bool need_output_flush;
struct dwl_animation animation; struct dwl_animation animation;
struct dwl_opacity_animation opacity_animation; struct dwl_opacity_animation opacity_animation;