feat: add option center_when_single_slave

This commit is contained in:
DreamMaoMao 2025-09-27 16:18:01 +08:00
parent 43a0f80df9
commit d416211bec
3 changed files with 29 additions and 7 deletions

View file

@ -194,6 +194,7 @@ typedef struct {
float default_smfact; float default_smfact;
unsigned int default_nmaster; unsigned int default_nmaster;
int center_master_overspread; int center_master_overspread;
int center_when_single_slave;
unsigned int hotarea_size; unsigned int hotarea_size;
unsigned int enable_hotarea; unsigned int enable_hotarea;
@ -1148,6 +1149,8 @@ void parse_config_line(Config *config, const char *line) {
config->default_nmaster = atoi(value); config->default_nmaster = atoi(value);
} else if (strcmp(key, "center_master_overspread") == 0) { } else if (strcmp(key, "center_master_overspread") == 0) {
config->center_master_overspread = atoi(value); config->center_master_overspread = atoi(value);
} else if (strcmp(key, "center_when_single_slave") == 0) {
config->center_when_single_slave = atoi(value);
} else if (strcmp(key, "hotarea_size") == 0) { } else if (strcmp(key, "hotarea_size") == 0) {
config->hotarea_size = atoi(value); config->hotarea_size = atoi(value);
} else if (strcmp(key, "enable_hotarea") == 0) { } else if (strcmp(key, "enable_hotarea") == 0) {
@ -2288,6 +2291,7 @@ void override_config(void) {
default_smfact = CLAMP_FLOAT(config.default_smfact, 0.1f, 0.9f); default_smfact = CLAMP_FLOAT(config.default_smfact, 0.1f, 0.9f);
default_nmaster = CLAMP_INT(config.default_nmaster, 1, 1000); default_nmaster = CLAMP_INT(config.default_nmaster, 1, 1000);
center_master_overspread = CLAMP_INT(config.center_master_overspread, 0, 1); center_master_overspread = CLAMP_INT(config.center_master_overspread, 0, 1);
center_when_single_slave = CLAMP_INT(config.center_when_single_slave, 0, 1);
new_is_master = CLAMP_INT(config.new_is_master, 0, 1); new_is_master = CLAMP_INT(config.new_is_master, 0, 1);
// 概述模式设置 // 概述模式设置
@ -2418,6 +2422,8 @@ void set_value_default() {
config.default_nmaster = default_nmaster; // 默认master数量 config.default_nmaster = default_nmaster; // 默认master数量
config.center_master_overspread = config.center_master_overspread =
center_master_overspread; // 中心master时是否铺满 center_master_overspread; // 中心master时是否铺满
config.center_when_single_slave =
center_when_single_slave; // 单个slave时是否居中
config.numlockon = numlockon; // 是否打开右边小键盘 config.numlockon = numlockon; // 是否打开右边小键盘

View file

@ -38,6 +38,7 @@ double default_mfact = 0.55f; // master 窗口比例
double default_smfact = 0.5f; // 第一个stack窗口比例 double default_smfact = 0.5f; // 第一个stack窗口比例
unsigned int default_nmaster = 1; // 默认master数量 unsigned int default_nmaster = 1; // 默认master数量
int center_master_overspread = 0; // 中心master时是否铺满 int center_master_overspread = 0; // 中心master时是否铺满
int center_when_single_slave = 1; // 单个slave时是否居中
/* logging */ /* logging */
int log_level = WLR_ERROR; int log_level = WLR_ERROR;
unsigned int numlockon = 1; // 是否打开右边小键盘 unsigned int numlockon = 1; // 是否打开右边小键盘

View file

@ -472,9 +472,16 @@ void center_tile(Monitor *m) {
tw = (m->w.width - mw - 2 * gappoh - gappih) / 2; tw = (m->w.width - mw - 2 * gappoh - gappih) / 2;
mx = gappoh + tw + gappih; mx = gappoh + tw + gappih;
} else if (n - nmasters == 1) { } else if (n - nmasters == 1) {
// 单个堆叠窗口:主区域居中,堆叠窗口在左,右边空着 // 单个堆叠窗口的处理
if (center_when_single_slave) {
// 启用选项:主区域居中,堆叠窗口在左,右边空着
tw = (m->w.width - mw - 2 * gappoh - gappih) / 2; tw = (m->w.width - mw - 2 * gappoh - gappih) / 2;
mx = gappoh + tw + gappih; mx = gappoh + tw + gappih;
} else {
// 修改slave在右边master在左边
tw = m->w.width - mw - 2 * gappoh - gappih;
mx = gappoh; // master在左边
}
} else { } else {
// 只有主区域窗口:居中显示 // 只有主区域窗口:居中显示
tw = (m->w.width - mw - 2 * gappoh - gappih) / 2; tw = (m->w.width - mw - 2 * gappoh - gappih) / 2;
@ -512,11 +519,19 @@ void center_tile(Monitor *m) {
unsigned int stack_index = i - nmasters; unsigned int stack_index = i - nmasters;
if (n - nmasters == 1) { if (n - nmasters == 1) {
// 单个堆叠窗口:放在左侧 // 单个堆叠窗口
unsigned int r = n - i; unsigned int r = n - i;
h = (m->w.height - ety - gappov - gappiv * (r - 1)) / r; h = (m->w.height - ety - gappov - gappiv * (r - 1)) / r;
int stack_x = m->w.x + gappoh; // 左侧位置 int stack_x;
if (center_when_single_slave) {
// 启用选项:放在左侧
stack_x = m->w.x + gappoh;
} else {
// 修改:放在右侧
stack_x = m->w.x + mx + mw + gappih;
}
resize(c, resize(c,
(struct wlr_box){.x = stack_x, (struct wlr_box){.x = stack_x,
.y = m->w.y + ety, .y = m->w.y + ety,
@ -528,8 +543,8 @@ void center_tile(Monitor *m) {
// 多个堆叠窗口:交替放在左右两侧 // 多个堆叠窗口:交替放在左右两侧
unsigned int r = (n - i + 1) / 2; unsigned int r = (n - i + 1) / 2;
// 当n为数时翻转判断逻辑 // 当n为数时翻转判断逻辑
if ((stack_index % 2) ^ (n % 2 != 0)) { if ((stack_index % 2) ^ (n % 2 == 0)) {
// 右侧堆叠窗口 // 右侧堆叠窗口
h = (m->w.height - ety - gappov - gappiv * (r - 1)) / r; h = (m->w.height - ety - gappov - gappiv * (r - 1)) / r;
int stack_x = m->w.x + mx + mw + gappih; int stack_x = m->w.x + mx + mw + gappih;