Scroll 作者在讨论中提供过一个 master 布局的示例。所谓的 Master 布局,核心逻辑就是将屏幕划分为两个区域:一边是占据大部分空间的“主窗口(Master)”,另一边是堆叠在一起的“从属窗口(Stack)”。但侧边的 Stack 窗口如果多了,每个窗口只能分到极窄的空间,除了看个标题,几乎感知不到内容。
有一天在折腾配置时突发奇想:之前各大厂商(锤子的“一步”、苹果的台前调度)都在推崇的那种“侧边缩略图”模式,其本质不就是 Master 布局 + 内容缩放 吗?,正好scroll有提供任意缩放内容的命令scale_content。如果能让侧边的 Stack 窗口按比例缩小,既能看清内容预览,又不占用主屏的逻辑空间,这不就很棒?
44c44,45
< scroll.command(con, "set_size h 0.5; move right nomode")
---
> scroll.command(con, "set_size h 0.3; move right nomode")
> scroll.command(con, "scale_content exact 0.5")
51c52,53
< scroll.command(scroll.view_get_container(views[1]), "set_size h 0.5; set_size v 1.0; focus")
---
> scroll.command(scroll.view_get_container(views[1]), "set_size h 0.7; set_size v 1.0; focus")
> scroll.command(scroll.view_get_container(views[1]), "scale_content exact 1.0")
70a73,75
> local focused_view = scroll.focused_view()
> local focused_con = scroll.view_get_container(focused_view)
> scroll.command(focused_con, "scale_content exact 1.0")
78a84,85
> scroll.command(container, "scale_content exact 0.5")
>
折腾完发现咱需要的并不是真的master布局,与其维护复杂的 Master 逻辑,不如直接缩放具体的某一列。这样就可以兼容其他布局啦。以下是建议的配置。为了方便直接变成master布局所以还是保留了原脚本。脚本存储在 配置仓库
mode "master" {
bindsym t exec scrollmsg lua ~/.config/scroll/scripts/master.lua toggle; mode default
bindsym r exec scrollmsg lua ~/.config/scroll/scripts/scale_2.lua run; mode default
bindsym u exec scrollmsg lua ~/.config/scroll/scripts/scale_2.lua undo; mode default
bindsym s exec scrollmsg lua ~/.config/scroll/scripts/scale_2.lua swap; mode default
bindsym Escape mode "default"
}
bindsym $mod+o mode "master"
bindsym --whole-window $mod+button2 exec scrollmsg lua ~/.config/scroll/scripts/scale_2.lua swap