From 368866aebb8ea241def7ac5d169aa2ab38eb766f Mon Sep 17 00:00:00 2001 From: DreamMaoMao <2523610504@qq.com> Date: Fri, 10 Oct 2025 14:59:41 +0800 Subject: [PATCH] feat: vertical support resize in tile --- src/layout/horizontal.h | 76 +++++----- src/layout/layout.h | 1 - src/layout/vertical.h | 318 ++++++++++++++++------------------------ src/mango.c | 131 +++++++++-------- 4 files changed, 230 insertions(+), 296 deletions(-) diff --git a/src/layout/horizontal.h b/src/layout/horizontal.h index 4c3fd24..a1a7d37 100644 --- a/src/layout/horizontal.h +++ b/src/layout/horizontal.h @@ -145,7 +145,7 @@ void deck(Monitor *m) { } // Calculate master width using mfact from pertag - mfact = fc->master_width_per > 0.0f ? fc->master_width_per + mfact = fc->master_mfact_per > 0.0f ? fc->master_mfact_per : m->pertag->mfacts[m->pertag->curtag]; // Calculate master width including outer gaps @@ -159,7 +159,7 @@ void deck(Monitor *m) { if (!VISIBLEON(c, m) || !ISTILED(c)) continue; if (i < m->nmaster) { - c->master_width_per = mfact; + c->master_mfact_per = mfact; // Master area clients resize( c, @@ -172,7 +172,7 @@ void deck(Monitor *m) { my += c->geom.height; } else { // Stack area clients - c->master_width_per = mfact; + c->master_mfact_per = mfact; resize(c, (struct wlr_box){.x = m->w.x + mw + cur_gappoh + cur_gappih, .y = m->w.y + cur_gappov, @@ -351,7 +351,7 @@ void center_tile(Monitor *m) { cur_gappoh = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gappoh; unsigned int nmasters = m->pertag->nmasters[m->pertag->curtag]; - mfact = fc->master_width_per > 0.0f ? fc->master_width_per + mfact = fc->master_mfact_per > 0.0f ? fc->master_mfact_per : m->pertag->mfacts[m->pertag->curtag]; // 初始化区域 @@ -406,17 +406,17 @@ void center_tile(Monitor *m) { if (i < nmasters) { // 主区域窗口 r = MIN(n, nmasters) - i; - if (c->master_height_per > 0.0f) { + if (c->master_inner_per > 0.0f) { h = (m->w.height - 2 * cur_gappov - cur_gappiv * ie * (r - 1)) * - c->master_height_per; - c->master_width_per = mfact; + c->master_inner_per; + c->master_mfact_per = mfact; } else { h = (m->w.height - my - cur_gappov - cur_gappiv * ie * (r - 1)) / r; - c->master_height_per = h / (m->w.height - my - cur_gappov - - cur_gappiv * ie * (r - 1)); - c->master_width_per = mfact; + c->master_inner_per = h / (m->w.height - my - cur_gappov - + cur_gappiv * ie * (r - 1)); + c->master_mfact_per = mfact; } resize(c, @@ -433,18 +433,18 @@ void center_tile(Monitor *m) { if (n - nmasters == 1) { // 单个堆叠窗口 r = n - i; - if (c->slave_height_per > 0.0f) { + if (c->slave_innder_per > 0.0f) { h = (m->w.height - 2 * cur_gappov - cur_gappiv * ie * (r - 1)) * - c->slave_height_per; - c->master_width_per = mfact; + c->slave_innder_per; + c->master_mfact_per = mfact; } else { h = (m->w.height - ety - cur_gappov - cur_gappiv * ie * (r - 1)) / r; - c->slave_height_per = h / (m->w.height - ety - cur_gappov - + c->slave_innder_per = h / (m->w.height - ety - cur_gappov - cur_gappiv * ie * (r - 1)); - c->master_width_per = mfact; + c->master_mfact_per = mfact; } int stack_x; @@ -469,19 +469,19 @@ void center_tile(Monitor *m) { if ((stack_index % 2) ^ (n % 2 == 0)) { // 右侧堆叠窗口 - if (c->slave_height_per > 0.0f) { + if (c->slave_innder_per > 0.0f) { h = (m->w.height - 2 * cur_gappov - cur_gappiv * ie * (r - 1)) * - c->slave_height_per; - c->master_width_per = mfact; + c->slave_innder_per; + c->master_mfact_per = mfact; } else { h = (m->w.height - ety - cur_gappov - cur_gappiv * ie * (r - 1)) / r; - c->slave_height_per = + c->slave_innder_per = h / (m->w.height - ety - cur_gappov - cur_gappiv * ie * (r - 1)); - c->master_width_per = mfact; + c->master_mfact_per = mfact; } int stack_x = m->w.x + mx + mw + cur_gappih * ie; @@ -494,19 +494,19 @@ void center_tile(Monitor *m) { ety += c->geom.height + cur_gappiv * ie; } else { // 左侧堆叠窗口 - if (c->slave_height_per > 0.0f) { + if (c->slave_innder_per > 0.0f) { h = (m->w.height - 2 * cur_gappov - cur_gappiv * ie * (r - 1)) * - c->slave_height_per; - c->master_width_per = mfact; + c->slave_innder_per; + c->master_mfact_per = mfact; } else { h = (m->w.height - oty - cur_gappov - cur_gappiv * ie * (r - 1)) / r; - c->slave_height_per = + c->slave_innder_per = h / (m->w.height - oty - cur_gappov - cur_gappiv * ie * (r - 1)); - c->master_width_per = mfact; + c->master_mfact_per = mfact; } int stack_x = m->w.x + cur_gappoh; @@ -551,7 +551,7 @@ void tile(Monitor *m) { break; } - mfact = fc->master_width_per > 0.0f ? fc->master_width_per + mfact = fc->master_mfact_per > 0.0f ? fc->master_mfact_per : m->pertag->mfacts[m->pertag->curtag]; if (n > m->pertag->nmasters[m->pertag->curtag]) @@ -567,17 +567,17 @@ void tile(Monitor *m) { continue; if (i < m->pertag->nmasters[m->pertag->curtag]) { r = MIN(n, m->pertag->nmasters[m->pertag->curtag]) - i; - if (c->master_height_per > 0.0f) { + if (c->master_inner_per > 0.0f) { h = (m->w.height - 2 * cur_gappov - cur_gappiv * ie * (r - 1)) * - c->master_height_per; - c->master_width_per = mfact; + c->master_inner_per; + c->master_mfact_per = mfact; } else { h = (m->w.height - my - cur_gappov - cur_gappiv * ie * (r - 1)) / r; - c->master_height_per = h / (m->w.height - my - cur_gappov - - cur_gappiv * ie * (r - 1)); - c->master_width_per = mfact; + c->master_inner_per = h / (m->w.height - my - cur_gappov - + cur_gappiv * ie * (r - 1)); + c->master_mfact_per = mfact; } resize(c, (struct wlr_box){.x = m->w.x + cur_gappoh, @@ -588,20 +588,20 @@ void tile(Monitor *m) { my += c->geom.height + cur_gappiv * ie; } else { r = n - i; - if (c->slave_height_per > 0.0f) { + if (c->slave_innder_per > 0.0f) { h = (m->w.height - 2 * cur_gappov - cur_gappiv * ie * (r - 1)) * - c->slave_height_per; - c->master_width_per = mfact; + c->slave_innder_per; + c->master_mfact_per = mfact; } else { h = (m->w.height - ty - cur_gappov - cur_gappiv * ie * (r - 1)) / r; - c->slave_height_per = h / (m->w.height - ty - cur_gappov - + c->slave_innder_per = h / (m->w.height - ty - cur_gappov - cur_gappiv * ie * (r - 1)); - c->master_width_per = mfact; + c->master_mfact_per = mfact; } - // wlr_log(WLR_ERROR, "slave_height_per: %f", c->slave_height_per); + // wlr_log(WLR_ERROR, "slave_innder_per: %f", c->slave_innder_per); resize(c, (struct wlr_box){.x = m->w.x + mw + cur_gappoh, diff --git a/src/layout/layout.h b/src/layout/layout.h index 5f523cd..db1353d 100644 --- a/src/layout/layout.h +++ b/src/layout/layout.h @@ -39,6 +39,5 @@ Layout layouts[] = { {"VS", vertical_scroller, "vertical_scroller", VERTICAL_SCROLLER}, // 垂直滚动布局 {"VT", vertical_tile, "vertical_tile", VERTICAL_TILE}, // 垂直平铺布局 - {"VG", vertical_grid, "vertical_grid", VERTICAL_GRID}, // 垂直格子布局 {"VK", vertical_deck, "vertical_deck", VERTICAL_DECK}, // 垂直卡片布局 }; \ No newline at end of file diff --git a/src/layout/vertical.h b/src/layout/vertical.h index 667276b..4986d9f 100644 --- a/src/layout/vertical.h +++ b/src/layout/vertical.h @@ -1,164 +1,62 @@ -void vertical_grid(Monitor *m) { - unsigned int i, n; - unsigned int cx, cy, cw, ch; - unsigned int dy; - unsigned int rows, cols, overrows; - Client *c = NULL; - - n = m->isoverview ? m->visible_clients : m->visible_tiling_clients; - - if (n == 0) { - return; - } - - if (n == 1) { - wl_list_for_each(c, &clients, link) { - - if (c->mon != m) - continue; - - c->bw = m->visible_tiling_clients == 1 && no_border_when_single && - smartgaps - ? 0 - : borderpx; - if (VISIBLEON(c, m) && !c->isunglobal && - ((m->isoverview && !client_should_ignore_focus(c)) || - ISTILED(c))) { - ch = (m->w.height - 2 * overviewgappo) * 0.7; - cw = (m->w.width - 2 * overviewgappo) * 0.8; - c->geom.x = m->w.x + (m->w.width - cw) / 2; - c->geom.y = m->w.y + (m->w.height - ch) / 2; - c->geom.width = cw - 2 * c->bw; - c->geom.height = ch - 2 * c->bw; - resize(c, c->geom, 0); - return; - } - } - } - - if (n == 2) { - ch = (m->w.height - 2 * overviewgappo - overviewgappi) / 2; - cw = (m->w.width - 2 * overviewgappo) * 0.65; - i = 0; - wl_list_for_each(c, &clients, link) { - - if (c->mon != m) - continue; - - c->bw = m->visible_tiling_clients == 1 && no_border_when_single && - smartgaps - ? 0 - : borderpx; - if (VISIBLEON(c, m) && !c->isunglobal && - ((m->isoverview && !client_should_ignore_focus(c)) || - ISTILED(c))) { - if (i == 0) { - c->geom.x = m->w.x + (m->w.width - cw) / 2 + overviewgappo; - c->geom.y = m->w.y + overviewgappo; - c->geom.width = cw - 2 * c->bw; - c->geom.height = ch - 2 * c->bw; - resize(c, c->geom, 0); - } else if (i == 1) { - c->geom.x = m->w.x + (m->w.width - cw) / 2 + overviewgappo; - c->geom.y = m->w.y + ch + overviewgappo + overviewgappi; - c->geom.width = cw - 2 * c->bw; - c->geom.height = ch - 2 * c->bw; - resize(c, c->geom, 0); - } - i++; - } - } - return; - } - - for (rows = 0; rows <= n / 2; rows++) { - if (rows * rows >= n) { - break; - } - } - cols = (rows && (rows - 1) * rows >= n) ? rows - 1 : rows; - - cw = (m->w.width - 2 * overviewgappo - (cols - 1) * overviewgappi) / cols; - ch = (m->w.height - 2 * overviewgappo - (rows - 1) * overviewgappi) / rows; - - overrows = n % rows; - if (overrows) { - dy = - (m->w.height - overrows * ch - (overrows - 1) * overviewgappi) / 2 - - overviewgappo; - } - - i = 0; - wl_list_for_each(c, &clients, link) { - if (c->mon != m) - continue; - - c->bw = - m->visible_tiling_clients == 1 && no_border_when_single && smartgaps - ? 0 - : borderpx; - if (VISIBLEON(c, m) && !c->isunglobal && - ((m->isoverview && !client_should_ignore_focus(c)) || ISTILED(c))) { - cx = m->w.x + (i / rows) * (cw + overviewgappi); - cy = m->w.y + (i % rows) * (ch + overviewgappi); - if (overrows && i >= n - overrows) { - cy += dy; - } - c->geom.x = cx + overviewgappo; - c->geom.y = cy + overviewgappo; - c->geom.width = cw - 2 * c->bw; - c->geom.height = ch - 2 * c->bw; - resize(c, c->geom, 0); - i++; - } - } -} - void vertical_deck(Monitor *m) { unsigned int mh, mx; int i, n = 0; Client *c = NULL; - unsigned int cur_gappiv = enablegaps ? m->gappiv : 0; - unsigned int cur_gappoh = enablegaps ? m->gappoh : 0; - unsigned int cur_gappov = enablegaps ? m->gappov : 0; + Client *fc = NULL; + float mfact; - cur_gappiv = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gappiv; - cur_gappoh = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gappoh; - cur_gappov = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gappov; + unsigned int cur_gapiv = enablegaps ? m->gappiv : 0; + unsigned int cur_gapih = enablegaps ? m->gappih : 0; + unsigned int cur_gapov = enablegaps ? m->gappov : 0; + + cur_gapiv = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gapiv; + cur_gapih = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gapih; + cur_gapov = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gapov; n = m->visible_tiling_clients; if (n == 0) return; - float mfact = m->pertag ? m->pertag->mfacts[m->pertag->curtag] : m->mfact; + wl_list_for_each(fc, &clients, link) { + if (VISIBLEON(fc, m) && ISTILED(fc)) + break; + } + // Calculate master height using mfact from pertag + mfact = fc->master_mfact_per > 0.0f ? fc->master_mfact_per + : m->pertag->mfacts[m->pertag->curtag]; + + // Calculate master height including outer gaps if (n > m->nmaster) - mh = m->nmaster ? round((m->w.height - 2 * cur_gappov) * mfact) : 0; + mh = m->nmaster ? round((m->w.height - 2 * cur_gapov) * mfact) : 0; else - mh = m->w.height - 2 * cur_gappov; + mh = m->w.height - 2 * cur_gapov; i = mx = 0; wl_list_for_each(c, &clients, link) { if (!VISIBLEON(c, m) || !ISTILED(c)) continue; if (i < m->nmaster) { - resize( - c, - (struct wlr_box){.x = m->w.x + cur_gappoh + mx, - .y = m->w.y + cur_gappov, - .width = (m->w.width - 2 * cur_gappoh - mx) / - (MIN(n, m->nmaster) - i), - .height = mh}, - 0); + c->master_mfact_per = mfact; + // Master area clients + resize(c, + (struct wlr_box){.x = m->w.x + cur_gapih, + .y = m->w.y + cur_gapov, + .width = (m->w.width - 2 * cur_gapih - mx) / + (MIN(n, m->nmaster) - i), + .height = mh}, + 0); mx += c->geom.width; } else { + // Stack area clients + c->master_mfact_per = mfact; resize(c, - (struct wlr_box){.x = m->w.x + cur_gappoh, - .y = m->w.y + mh + cur_gappov + cur_gappiv, - .width = m->w.width - 2 * cur_gappoh, - .height = m->w.height - mh - - 2 * cur_gappov - cur_gappiv}, + (struct wlr_box){.x = m->w.x + cur_gapih, + .y = m->w.y + mh + cur_gapov + cur_gapiv, + .width = m->w.width - 2 * cur_gapih, + .height = m->w.height - mh - 2 * cur_gapov - + cur_gapiv}, 0); if (c == focustop(m)) wlr_scene_node_raise_to_top(&c->scene->node); @@ -167,6 +65,93 @@ void vertical_deck(Monitor *m) { } } +void vertical_tile(Monitor *m) { + unsigned int i, n = 0, w, r, ie = enablegaps, mh, mx, tx; + Client *c = NULL; + Client *fc = NULL; + double mfact = 0; + + n = m->visible_tiling_clients; + + if (n == 0) + return; + + unsigned int cur_gapih = enablegaps ? m->gappih : 0; + unsigned int cur_gapiv = enablegaps ? m->gappiv : 0; + unsigned int cur_gapoh = enablegaps ? m->gappoh : 0; + unsigned int cur_gapov = enablegaps ? m->gappov : 0; + + cur_gapih = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gapih; + cur_gapiv = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gapiv; + cur_gapoh = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gapoh; + cur_gapov = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gapov; + + wl_list_for_each(fc, &clients, link) { + if (VISIBLEON(fc, m) && ISTILED(fc)) + break; + } + + mfact = fc->master_mfact_per > 0.0f ? fc->master_mfact_per + : m->pertag->mfacts[m->pertag->curtag]; + + if (n > m->pertag->nmasters[m->pertag->curtag]) + mh = m->pertag->nmasters[m->pertag->curtag] + ? (m->w.height + cur_gapiv * ie) * mfact + : 0; + else + mh = m->w.height - 2 * cur_gapov + cur_gapiv * ie; + + i = 0; + mx = tx = cur_gapih; + wl_list_for_each(c, &clients, link) { + if (!VISIBLEON(c, m) || !ISTILED(c)) + continue; + if (i < m->pertag->nmasters[m->pertag->curtag]) { + r = MIN(n, m->pertag->nmasters[m->pertag->curtag]) - i; + if (c->master_inner_per > 0.0f) { + w = (m->w.width - 2 * cur_gapih - cur_gapih * ie * (r - 1)) * + c->master_inner_per; + c->master_mfact_per = mfact; + } else { + w = (m->w.width - mx - cur_gapih - cur_gapih * ie * (r - 1)) / + r; + c->master_inner_per = w / (m->w.width - mx - cur_gapih - + cur_gapih * ie * (r - 1)); + c->master_mfact_per = mfact; + } + resize(c, + (struct wlr_box){.x = m->w.x + mx, + .y = m->w.y + cur_gapov, + .width = w, + .height = mh - cur_gapiv * ie}, + 0); + mx += c->geom.width + cur_gapih * ie; + } else { + r = n - i; + if (c->slave_innder_per > 0.0f) { + w = (m->w.width - 2 * cur_gapih - cur_gapih * ie * (r - 1)) * + c->slave_innder_per; + c->master_mfact_per = mfact; + } else { + w = (m->w.width - tx - cur_gapih - cur_gapih * ie * (r - 1)) / + r; + c->slave_innder_per = w / (m->w.width - tx - cur_gapih - + cur_gapih * ie * (r - 1)); + c->master_mfact_per = mfact; + } + + resize(c, + (struct wlr_box){.x = m->w.x + tx, + .y = m->w.y + mh + cur_gapov, + .width = w, + .height = m->w.height - mh - 2 * cur_gapov}, + 0); + tx += c->geom.width + cur_gapih * ie; + } + i++; + } +} + void vertical_scroller(Monitor *m) { unsigned int i, n, j; Client *c = NULL, *root_client = NULL; @@ -293,60 +278,3 @@ void vertical_scroller(Monitor *m) { free(tempClients); } - -void vertical_tile(Monitor *m) { - unsigned int i, n = 0, w, r, ie = enablegaps, mh, mx, tx; - Client *c = NULL; - - n = m->visible_tiling_clients; - - if (n == 0) - return; - - unsigned int cur_gappiv = enablegaps ? m->gappiv : 0; - unsigned int cur_gappih = enablegaps ? m->gappih : 0; - unsigned int cur_gappov = enablegaps ? m->gappov : 0; - unsigned int cur_gappoh = enablegaps ? m->gappoh : 0; - - cur_gappiv = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gappiv; - cur_gappih = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gappih; - cur_gappov = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gappov; - cur_gappoh = smartgaps && m->visible_tiling_clients == 1 ? 0 : cur_gappoh; - - if (n > m->pertag->nmasters[m->pertag->curtag]) - mh = m->pertag->nmasters[m->pertag->curtag] - ? (m->w.height + cur_gappiv * ie) * - m->pertag->mfacts[m->pertag->curtag] - : 0; - else - mh = m->w.height - 2 * cur_gappoh + cur_gappiv * ie; - i = 0; - mx = tx = cur_gappov; - wl_list_for_each(c, &clients, link) { - if (!VISIBLEON(c, m) || !ISTILED(c)) - continue; - if (i < m->pertag->nmasters[m->pertag->curtag]) { - r = MIN(n, m->pertag->nmasters[m->pertag->curtag]) - i; - w = (m->w.width - mx - cur_gappov - cur_gappiv * ie * (r - 1)) / r; - resize(c, - (struct wlr_box){.x = m->w.x + mx, - .y = m->w.y + cur_gappoh, - .width = w, - .height = mh - cur_gappih * ie}, - 0); - mx += c->geom.width + cur_gappiv * ie; - } else { - r = n - i; - w = (m->w.width - tx - cur_gappov - cur_gappiv * ie * (r - 1)) / r; - resize( - c, - (struct wlr_box){.x = m->w.x + tx, - .y = m->w.y + mh + cur_gappoh, - .width = w, - .height = m->w.height - mh - 2 * cur_gappoh}, - 0); - tx += c->geom.width + cur_gappiv * ie; - } - i++; - } -} \ No newline at end of file diff --git a/src/mango.c b/src/mango.c index 68bf310..45c4556 100644 --- a/src/mango.c +++ b/src/mango.c @@ -338,8 +338,8 @@ struct Client { float unfocused_opacity; char oldmonname[128]; int noblur; - double master_width_per, master_height_per, slave_height_per; - double old_master_width_per, old_master_height_per, old_slave_height_per; + double master_mfact_per, master_inner_per, slave_innder_per; + double old_master_mfact_per, old_master_inner_per, old_slave_innder_per; double old_scroller_pproportion; bool ismaster; bool cursor_in_upper_half, cursor_in_left_half; @@ -1384,7 +1384,7 @@ void reset_size_per_mon(Monitor *m, int tile_cilent_num, double total_left_slave_hight_percent, double total_right_slave_hight_percent, double total_slave_hight_percent, - double total_master_height_percent, int master_num, + double total_master_inner_percent, int master_num, int slave_num) { Client *c; int i = 0; @@ -1396,18 +1396,18 @@ void reset_size_per_mon(Monitor *m, int tile_cilent_num, wl_list_for_each(c, &clients, link) { if (VISIBLEON(c, m) && ISTILED(c)) { - if (total_master_height_percent <= 0.0) + if (total_master_inner_percent <= 0.0) return; if (i < m->pertag->nmasters[m->pertag->curtag]) { c->ismaster = true; - c->slave_height_per = slave_num ? 1.0f / slave_num : 1.0f; - c->master_height_per = - c->master_height_per / total_master_height_percent; + c->slave_innder_per = slave_num ? 1.0f / slave_num : 1.0f; + c->master_inner_per = + c->master_inner_per / total_master_inner_percent; } else { c->ismaster = false; - c->master_height_per = 1.0f / master_num; - c->slave_height_per = - c->slave_height_per / total_slave_hight_percent; + c->master_inner_per = 1.0f / master_num; + c->slave_innder_per = + c->slave_innder_per / total_slave_hight_percent; } } @@ -1417,24 +1417,24 @@ void reset_size_per_mon(Monitor *m, int tile_cilent_num, wl_list_for_each(c, &clients, link) { if (VISIBLEON(c, m) && ISTILED(c)) { - if (total_master_height_percent <= 0.0) + if (total_master_inner_percent <= 0.0) return; if (i < m->pertag->nmasters[m->pertag->curtag]) { c->ismaster = true; - c->slave_height_per = + c->slave_innder_per = slave_num > 1 ? 2.0f / slave_num : 1.0f; - c->master_height_per = - c->master_height_per / total_master_height_percent; + c->master_inner_per = + c->master_inner_per / total_master_inner_percent; } else { stack_index = i - nmasters; c->ismaster = false; - c->master_height_per = 1.0f / master_num; + c->master_inner_per = 1.0f / master_num; if ((stack_index % 2) ^ (tile_cilent_num % 2 == 0)) { - c->slave_height_per = c->slave_height_per / + c->slave_innder_per = c->slave_innder_per / total_right_slave_hight_percent; } else { - c->slave_height_per = c->slave_height_per / + c->slave_innder_per = c->slave_innder_per / total_left_slave_hight_percent; } } @@ -1448,8 +1448,8 @@ void reset_size_per_mon(Monitor *m, int tile_cilent_num, void // 17 arrange(Monitor *m, bool want_animation) { Client *c = NULL; - double total_slave_height_percent = 0; - double total_master_height_percent = 0; + double total_slave_innder_percent = 0; + double total_master_inner_percent = 0; double total_right_slave_hight_percent = 0; double total_left_slave_hight_percent = 0; int i = 0; @@ -1493,20 +1493,20 @@ arrange(Monitor *m, bool want_animation) { if (i < m->pertag->nmasters[m->pertag->curtag]) { master_num++; - total_master_height_percent += c->master_height_per; + total_master_inner_percent += c->master_inner_per; } else { slave_num++; - total_slave_height_percent += c->slave_height_per; + total_slave_innder_percent += c->slave_innder_per; stack_index = i - nmasters; if ((stack_index % 2) ^ (m->visible_tiling_clients % 2 == 0)) { c->isleftslave = false; total_right_slave_hight_percent += - c->slave_height_per; + c->slave_innder_per; } else { c->isleftslave = true; total_left_slave_hight_percent += - c->slave_height_per; + c->slave_innder_per; } } @@ -1527,8 +1527,8 @@ arrange(Monitor *m, bool want_animation) { reset_size_per_mon( m, m->visible_tiling_clients, total_left_slave_hight_percent, - total_right_slave_hight_percent, total_slave_height_percent, - total_master_height_percent, master_num, slave_num); + total_right_slave_hight_percent, total_slave_innder_percent, + total_master_inner_percent, master_num, slave_num); if (m->isoverview) { overviewlayout.arrange(m); @@ -3669,9 +3669,9 @@ void init_client_properties(Client *c) { c->ignore_maximize = 0; c->ignore_minimize = 1; c->iscustomsize = 0; - c->master_width_per = 0.0f; - c->master_height_per = 0.0f; - c->slave_height_per = 0.0f; + c->master_mfact_per = 0.0f; + c->master_inner_per = 0.0f; + c->slave_innder_per = 0.0f; } void set_size_per(Monitor *m, Client *c) { @@ -3679,18 +3679,18 @@ void set_size_per(Monitor *m, Client *c) { bool found = false; wl_list_for_each(fc, &clients, link) { if (VISIBLEON(fc, m) && ISTILED(fc) && fc != c) { - c->master_width_per = fc->master_width_per; - c->master_height_per = fc->master_height_per; - c->slave_height_per = fc->slave_height_per; + c->master_mfact_per = fc->master_mfact_per; + c->master_inner_per = fc->master_inner_per; + c->slave_innder_per = fc->slave_innder_per; found = true; break; } } if (!found) { - c->master_width_per = 0.5f; - c->master_height_per = 1.0f; - c->slave_height_per = 1.0f; + c->master_mfact_per = 0.5f; + c->master_inner_per = 1.0f; + c->slave_innder_per = 1.0f; } } @@ -3946,6 +3946,7 @@ void resize_tile_master(Client *grabc, unsigned int time, int type) { float delta_x, delta_y; Client *next = NULL; Client *prev = NULL; + int tempdelta = 0; double refresh_interval = 1000000.0 / grabc->mon->wlr_output->refresh; struct wl_list *node; @@ -3972,9 +3973,9 @@ void resize_tile_master(Client *grabc, unsigned int time, int type) { start_drag_window = true; // 记录初始状态 - grabc->old_master_width_per = grabc->master_width_per; - grabc->old_master_height_per = grabc->master_height_per; - grabc->old_slave_height_per = grabc->slave_height_per; + grabc->old_master_mfact_per = grabc->master_mfact_per; + grabc->old_master_inner_per = grabc->master_inner_per; + grabc->old_slave_innder_per = grabc->slave_innder_per; grabc->cursor_in_upper_half = cursor->y < grabc->geom.y + grabc->geom.height / 2; grabc->cursor_in_left_half = @@ -3985,15 +3986,15 @@ void resize_tile_master(Client *grabc, unsigned int time, int type) { // 计算相对于屏幕尺寸的比例变化 if (grabc->ismaster) { delta_x = (float)(cursor->x - begin_cursorx) * - (grabc->old_master_width_per) / grabc->begin_geom.width; + (grabc->old_master_mfact_per) / grabc->begin_geom.width; delta_y = (float)(cursor->y - begin_cursory) * - (grabc->old_master_height_per) / grabc->begin_geom.height; + (grabc->old_master_inner_per) / grabc->begin_geom.height; } else { delta_x = (float)(cursor->x - begin_cursorx) * - (1 - grabc->old_master_width_per) / + (1 - grabc->old_master_mfact_per) / grabc->begin_geom.width; delta_y = (float)(cursor->y - begin_cursory) * - (grabc->old_slave_height_per) / grabc->begin_geom.height; + (grabc->old_slave_innder_per) / grabc->begin_geom.height; } bool moving_up = cursor->y < begin_cursory; @@ -4052,25 +4053,31 @@ void resize_tile_master(Client *grabc, unsigned int time, int type) { delta_x = delta_x * 2; } + if (type == VERTICAL_TILE || type == VERTICAL_DECK) { + tempdelta = delta_x; + delta_x = delta_y; + delta_y = tempdelta; + } + // 直接设置新的比例,基于初始值 + 变化量 - float new_master_width_per = grabc->old_master_width_per + delta_x; - float new_master_height_per = grabc->old_master_height_per + delta_y; - float new_slave_height_per = grabc->old_slave_height_per + delta_y; + float new_master_mfact_per = grabc->old_master_mfact_per + delta_x; + float new_master_inner_per = grabc->old_master_inner_per + delta_y; + float new_slave_innder_per = grabc->old_slave_innder_per + delta_y; // 应用限制,确保比例在合理范围内 - new_master_width_per = fmaxf(0.1f, fminf(0.9f, new_master_width_per)); - new_master_height_per = fmaxf(0.1f, fminf(0.9f, new_master_height_per)); - new_slave_height_per = fmaxf(0.1f, fminf(0.9f, new_slave_height_per)); + new_master_mfact_per = fmaxf(0.1f, fminf(0.9f, new_master_mfact_per)); + new_master_inner_per = fmaxf(0.1f, fminf(0.9f, new_master_inner_per)); + new_slave_innder_per = fmaxf(0.1f, fminf(0.9f, new_slave_innder_per)); // 应用到所有平铺窗口 wl_list_for_each(tc, &clients, link) { if (VISIBLEON(tc, grabc->mon) && ISTILED(tc)) { - tc->master_width_per = new_master_width_per; + tc->master_mfact_per = new_master_mfact_per; } } - grabc->master_height_per = new_master_height_per; - grabc->slave_height_per = new_slave_height_per; + grabc->master_inner_per = new_master_inner_per; + grabc->slave_innder_per = new_slave_innder_per; if (last_apply_drap_time == 0 || time - last_apply_drap_time > refresh_interval) { @@ -4551,26 +4558,26 @@ void exchange_two_client(Client *c1, Client *c2) { Monitor *tmp_mon = NULL; unsigned int tmp_tags; - double master_height_per = 0.0f; - double master_width_per = 0.0f; - double slave_height_per = 0.0f; + double master_inner_per = 0.0f; + double master_mfact_per = 0.0f; + double slave_innder_per = 0.0f; if (c1 == NULL || c2 == NULL || (!exchange_cross_monitor && c1->mon != c2->mon)) { return; } - master_height_per = c1->master_height_per; - master_width_per = c1->master_width_per; - slave_height_per = c1->slave_height_per; + master_inner_per = c1->master_inner_per; + master_mfact_per = c1->master_mfact_per; + slave_innder_per = c1->slave_innder_per; - c1->master_height_per = c2->master_height_per; - c1->master_width_per = c2->master_width_per; - c1->slave_height_per = c2->slave_height_per; + c1->master_inner_per = c2->master_inner_per; + c1->master_mfact_per = c2->master_mfact_per; + c1->slave_innder_per = c2->slave_innder_per; - c2->master_height_per = master_height_per; - c2->master_width_per = master_width_per; - c2->slave_height_per = slave_height_per; + c2->master_inner_per = master_inner_per; + c2->master_mfact_per = master_mfact_per; + c2->slave_innder_per = slave_innder_per; struct wl_list *tmp1_prev = c1->link.prev; struct wl_list *tmp2_prev = c2->link.prev;