feat: add scroller_prefer_center option

This commit is contained in:
DreamMaoMao 2025-03-31 14:49:23 +08:00
parent 6710dbd82a
commit 3e47d6ed2c
4 changed files with 73 additions and 52 deletions

View file

@ -18,7 +18,8 @@ animation_curve_close=0.08,0.92,0,1
# Scroller Layout Setting # Scroller Layout Setting
scroller_structs=20 scroller_structs=20
scroller_default_proportion=0.8 scroller_default_proportion=0.8
scoller_focus_center=0 scroller_focus_center=0
scroller_prefer_center=0
scroller_proportion_preset=0.5,0.8,1.0 scroller_proportion_preset=0.5,0.8,1.0
# Master-Stack Layout Setting (tile,spiral,dwindle) # Master-Stack Layout Setting (tile,spiral,dwindle)

View file

@ -5744,10 +5744,10 @@ void scroller(Monitor *m, unsigned int gappo, unsigned int gappi) {
target_geom.y = m->w.y + (m->w.height - target_geom.height) / 2; target_geom.y = m->w.y + (m->w.height - target_geom.height) / 2;
if (need_scroller) { if (need_scroller) {
if (scoller_focus_center || m->prevsel == NULL || if (scroller_focus_center || m->prevsel == NULL ||
(m->prevsel->scroller_proportion * max_client_width) + ((m->prevsel->scroller_proportion * max_client_width) +
(root_client->scroller_proportion * max_client_width) > (root_client->scroller_proportion * max_client_width) >
m->w.width - 2 * scroller_structs - gappih) { m->w.width - 2 * scroller_structs - gappih && scroller_prefer_center)) {
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;
} else { } else {
target_geom.x = target_geom.x =

View file

@ -92,7 +92,9 @@ typedef struct {
int scroller_structs; int scroller_structs;
float scroller_default_proportion; float scroller_default_proportion;
int scoller_focus_center; int scroller_focus_center;
int scroller_prefer_center;
int focus_cross_monitor;
float *scroller_proportion_preset; float *scroller_proportion_preset;
int scroller_proportion_preset_count; int scroller_proportion_preset_count;
@ -550,8 +552,12 @@ void parse_config_line(Config *config, const char *line) {
config->scroller_structs = atoi(value); config->scroller_structs = atoi(value);
} else if (strcmp(key, "scroller_default_proportion") == 0) { } else if (strcmp(key, "scroller_default_proportion") == 0) {
config->scroller_default_proportion = atof(value); config->scroller_default_proportion = atof(value);
} else if (strcmp(key, "scoller_focus_center") == 0) { } else if (strcmp(key, "scroller_focus_center") == 0) {
config->scoller_focus_center = atoi(value); config->scroller_focus_center = atoi(value);
} else if (strcmp(key, "scroller_prefer_center") == 0) {
config->scroller_prefer_center = atoi(value);
} else if (strcmp(key, "focus_cross_monitor") == 0) {
config->focus_cross_monitor = atoi(value);
} else if (strcmp(key, "scroller_proportion_preset") == 0) { } else if (strcmp(key, "scroller_proportion_preset") == 0) {
// 1. 统计 value 中有多少个逗号,确定需要解析的浮点数个数 // 1. 统计 value 中有多少个逗号,确定需要解析的浮点数个数
int count = 0; // 初始化为 0 int count = 0; // 初始化为 0
@ -1129,7 +1135,9 @@ void override_config(void) {
scroller_structs = config.scroller_structs; scroller_structs = config.scroller_structs;
scroller_default_proportion = config.scroller_default_proportion; scroller_default_proportion = config.scroller_default_proportion;
scoller_focus_center = config.scoller_focus_center; scroller_focus_center = config.scroller_focus_center;
focus_cross_monitor = config.focus_cross_monitor;
scroller_prefer_center = config.scroller_prefer_center;
new_is_master = config.new_is_master; new_is_master = config.new_is_master;
default_mfact = config.default_mfact; default_mfact = config.default_mfact;
@ -1175,60 +1183,61 @@ void override_config(void) {
void set_value_default() { void set_value_default() {
/* animaion */ /* animaion */
config.animations = 1; // 是否启用动画 config.animations = animations; // 是否启用动画
config.animation_fade_in = 1; // Enable animation fade in config.animation_fade_in = animation_fade_in; // Enable animation fade in
config.zoom_initial_ratio = 0.5; // 动画起始窗口比例 config.zoom_initial_ratio = zoom_initial_ratio; // 动画起始窗口比例
config.fadein_begin_opacity = 0.5; // Begin opac window ratio for animations config.fadein_begin_opacity = fadein_begin_opacity; // Begin opac window ratio for animations
config.fadeout_begin_opacity = 0.5; config.fadeout_begin_opacity = fadeout_begin_opacity;
config.animation_duration_move = 500; // Animation move speed config.animation_duration_move = animation_duration_move; // Animation move speed
config.animation_duration_open = 400; // Animation open speed config.animation_duration_open = animation_duration_open; // Animation open speed
config.animation_duration_tag = 300; // Animation tag speed config.animation_duration_tag = animation_duration_tag; // Animation tag speed
config.animation_duration_close = 300; // Animation tag speed config.animation_duration_close = animation_duration_close; // Animation tag speed
/* appearance */ /* appearance */
config.axis_bind_apply_timeout = 100; // 滚轮绑定动作的触发的时间间隔 config.axis_bind_apply_timeout = axis_bind_apply_timeout; // 滚轮绑定动作的触发的时间间隔
config.focus_on_activate = 1; // 收到窗口激活请求是否自动跳转聚焦 config.focus_on_activate = focus_on_activate; // 收到窗口激活请求是否自动跳转聚焦
config.new_is_master = 1; // 新窗口是否插在头部 config.new_is_master = new_is_master; // 新窗口是否插在头部
config.default_mfact = 0.55f; // master 窗口比例 config.default_mfact = default_mfact; // master 窗口比例
config.default_smfact = 0.5f; // 第一个stack比例 config.default_smfact = default_smfact; // 第一个stack比例
config.default_nmaster = 1; // 默认master数量 config.default_nmaster = default_nmaster; // 默认master数量
config.numlockon = 1; // 是否打开右边小键盘 config.numlockon = numlockon; // 是否打开右边小键盘
config.ov_tab_mode = 0; // alt tab切换模式 config.ov_tab_mode = ov_tab_mode; // alt tab切换模式
config.hotarea_size = 10; // 热区大小,10x10 config.hotarea_size = hotarea_size; // 热区大小,10x10
config.enable_hotarea = 1; // 是否启用鼠标热区 config.enable_hotarea = enable_hotarea; // 是否启用鼠标热区
config.smartgaps = 0; /* 1 means no outer gap when there is only one window */ config.smartgaps = smartgaps; /* 1 means no outer gap when there is only one window */
config.sloppyfocus = 1; /* focus follows mouse */ config.sloppyfocus = sloppyfocus; /* focus follows mouse */
config.gappih = 5; /* horiz inner gap between windows */ config.gappih = gappih; /* horiz inner gap between windows */
config.gappiv = 5; /* vert inner gap between windows */ config.gappiv = gappiv; /* vert inner gap between windows */
config.gappoh = 10; /* horiz outer gap between windows and screen edge */ config.gappoh = gappoh; /* horiz outer gap between windows and screen edge */
config.gappov = 10; /* vert outer gap between windows and screen edge */ config.gappov = gappov; /* vert outer gap between windows and screen edge */
config.scroller_structs = 20; config.scroller_structs = scroller_structs;
config.scroller_default_proportion = 0.9; config.scroller_default_proportion = scroller_default_proportion;
config.scoller_focus_center = 0; config.scroller_focus_center = scroller_focus_center;
config.scroller_prefer_center = scroller_prefer_center;
config.focus_cross_monitor = focus_cross_monitor;
config.bypass_surface_visibility = config.bypass_surface_visibility = bypass_surface_visibility; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */
0; /* 1 means idle inhibitors will disable idle tracking even if it's
surface isn't visible */
config.overviewgappi = 5; /* overview时 窗口与边缘 缝隙大小 */ config.borderpx = borderpx;
config.overviewgappo = 30; /* overview时 窗口与窗口 缝隙大小 */ config.overviewgappi = overviewgappi; /* overview时 窗口与边缘 缝隙大小 */
config.overviewgappo = overviewgappo; /* overview时 窗口与窗口 缝隙大小 */
config.warpcursor = 1; /* Warp cursor to focused client */ config.warpcursor = warpcursor; /* Warp cursor to focused client */
config.repeat_rate = 25; config.repeat_rate = repeat_rate;
config.repeat_delay = 600; config.repeat_delay = repeat_delay;
/* Trackpad */ /* Trackpad */
config.tap_to_click = 1; config.tap_to_click = tap_to_click;
config.tap_and_drag = 1; config.tap_and_drag = tap_and_drag;
config.drag_lock = 1; config.drag_lock = drag_lock;
config.natural_scrolling = 0; config.natural_scrolling = natural_scrolling;
config.disable_while_typing = 1; config.disable_while_typing = disable_while_typing;
config.left_handed = 0; config.left_handed = left_handed;
config.middle_button_emulation = 0; config.middle_button_emulation = middle_button_emulation;
memcpy(config.animation_curve_move, animation_curve_move, memcpy(config.animation_curve_move, animation_curve_move,
sizeof(animation_curve_move)); sizeof(animation_curve_move));
@ -1238,6 +1247,15 @@ void set_value_default() {
sizeof(animation_curve_tag)); sizeof(animation_curve_tag));
memcpy(config.animation_curve_close, animation_curve_close, memcpy(config.animation_curve_close, animation_curve_close,
sizeof(animation_curve_close)); sizeof(animation_curve_close));
memcpy(config.rootcolor, rootcolor, sizeof(rootcolor));
memcpy(config.bordercolor, bordercolor, sizeof(bordercolor));
memcpy(config.focuscolor, focuscolor, sizeof(focuscolor));
memcpy(config.maxmizescreencolor, maxmizescreencolor,
sizeof(maxmizescreencolor));
memcpy(config.urgentcolor, urgentcolor, sizeof(urgentcolor));
memcpy(config.scratchpadcolor, scratchpadcolor, sizeof(scratchpadcolor));
memcpy(config.globalcolor, globalcolor, sizeof(globalcolor));
} }
void parse_config(void) { void parse_config(void) {

View file

@ -31,6 +31,7 @@ unsigned int default_nmaster = 1; // 默认master数量
/* logging */ /* logging */
int log_level = WLR_ERROR; int log_level = WLR_ERROR;
unsigned int numlockon = 1; // 是否打开右边小键盘 unsigned int numlockon = 1; // 是否打开右边小键盘
unsigned int capslock = 0; // 是否启用快捷键
unsigned int ov_tab_mode = 0; // alt tab切换模式 unsigned int ov_tab_mode = 0; // alt tab切换模式
unsigned int hotarea_size = 10; // 热区大小,10x10 unsigned int hotarea_size = 10; // 热区大小,10x10
@ -44,7 +45,8 @@ unsigned int gappov = 10; /* vert outer gap between windows and screen edge */
int scroller_structs = 20; int scroller_structs = 20;
float scroller_default_proportion = 0.9; float scroller_default_proportion = 0.9;
int scoller_focus_center = 0; int scroller_focus_center = 0;
int scroller_prefer_center = 0;
int focus_cross_monitor = 0; int focus_cross_monitor = 0;
int bypass_surface_visibility = int bypass_surface_visibility =