opt: avoid manula caculate in normal dwindle mode

This commit is contained in:
DreamMaoMao 2026-05-15 07:59:35 +08:00
parent 42a46259fb
commit 89b24d514c

View file

@ -81,6 +81,7 @@ static void dwindle_insert(DwindleNode **root, Client *new_c, Client *focused,
target = dwindle_first_leaf(*root); target = dwindle_first_leaf(*root);
// ================= 保持其他窗口比例缩减逻辑 ================= // ================= 保持其他窗口比例缩减逻辑 =================
if (config.dwindle_manual_split) {
DwindleNode *path[512]; DwindleNode *path[512];
float p[512]; float p[512];
int path_len = get_block_path_and_ratios(target, split_h, path, p); int path_len = get_block_path_and_ratios(target, split_h, path, p);
@ -111,6 +112,7 @@ static void dwindle_insert(DwindleNode **root, Client *new_c, Client *focused,
if (S->ratio > 0.999f) if (S->ratio > 0.999f)
S->ratio = 0.999f; S->ratio = 0.999f;
} }
}
// ============================================================ // ============================================================
DwindleNode *split = calloc(1, sizeof(DwindleNode)); DwindleNode *split = calloc(1, sizeof(DwindleNode));
@ -166,8 +168,9 @@ static void dwindle_remove(DwindleNode **root, Client *c) {
// 开始删除空间的比例回退逻辑 // 开始删除空间的比例回退逻辑
// 查找连续的同方向块路径 // 查找连续的同方向块路径
if (config.dwindle_manual_split) {
bool split_h = parent->split_h; bool split_h = parent->split_h;
DwindleNode *path[128]; DwindleNode *path[512];
int path_len = 0; int path_len = 0;
path[path_len++] = parent; path[path_len++] = parent;
DwindleNode *curr = parent->parent; DwindleNode *curr = parent->parent;
@ -177,7 +180,7 @@ static void dwindle_remove(DwindleNode **root, Client *c) {
} }
// 计算各祖先的旧绝对占比 // 计算各祖先的旧绝对占比
float p[128]; float p[512];
p[path_len - 1] = 1.0f; p[path_len - 1] = 1.0f;
for (int i = path_len - 1; i > 0; i--) { for (int i = path_len - 1; i > 0; i--) {
DwindleNode *S = path[i]; DwindleNode *S = path[i];
@ -189,8 +192,8 @@ static void dwindle_remove(DwindleNode **root, Client *c) {
} }
// 计算即将被删除的叶子节点,在该方向块中所占的绝对面积比例 (P_del) // 计算即将被删除的叶子节点,在该方向块中所占的绝对面积比例 (P_del)
float p_del = float p_del = p[0] * (parent->first == leaf ? parent->ratio
p[0] * (parent->first == leaf ? parent->ratio : (1.0f - parent->ratio)); : (1.0f - parent->ratio));
if (p_del > 0.999f) if (p_del > 0.999f)
p_del = 0.999f; // 兜底 p_del = 0.999f; // 兜底
@ -216,6 +219,7 @@ static void dwindle_remove(DwindleNode **root, Client *c) {
if (S->ratio > 0.999f) if (S->ratio > 0.999f)
S->ratio = 0.999f; S->ratio = 0.999f;
} }
}
// 比例重算结束 // 比例重算结束
@ -490,8 +494,8 @@ static void dwindle_insert_with_config(DwindleNode **root, Client *new_c,
as_first = false; as_first = false;
// ================= 计算新节点的 1/N 比例 ================= // ================= 计算新节点的 1/N 比例 =================
DwindleNode *path[128]; DwindleNode *path[512];
float p[128]; float p[512];
int path_len = get_block_path_and_ratios(target, split_h, path, p); int path_len = get_block_path_and_ratios(target, split_h, path, p);
int n_old = 1; int n_old = 1;