Skip to main content
scroll实现grid布局
  1. Blog/

scroll实现grid布局

· loading · loading · ·
IT IT Linux Guide
Table of Contents

scroll介绍
#

由于 Hyprland 最近一次破坏性更新(Break Update)带来的不便,在习惯了 hyprscroller 的操作逻辑后,咱选择了由同一作者维护的新项目:scroll。scroll 提供了更加灵活的“卷轴”体验,支持上下左右全方位的平铺与滚动。体验很舒服,但是grid模式没有了,没法愉快的九宫格刷b站了,幸好作者提供了丰富的Lua接口,实在不行咱们可以自己实现一个。询问作者后得到了个 初步的例子,核心逻辑:将新窗口的插入位置固定在工作区的最后,检查它的前一列容器中的子窗口数量。如果数量小于 3,则执行一次 move left nomode,将新窗口塞进前一列。

一些小优化
#

  • 不支持“插空”补位

    • 手动关闭中间的窗口后,新窗口依然只会在最右侧创建,无法填充留下的空洞。
    • image-orignal
    • 方案:新窗口创建时,遍历所有列,优先寻找子窗口数未达上限(column_limit)的容器并执行 move left nomode填补。
    • ...
      if #tiling > 1 then
      	local target_tiling = nil
      	for i = 1,#tiling - 1 do
      		local prev_container = tiling[i]
      		local children = scroll.container_get_children(prev_container)
      		if children and #children < ws_config[1] then
      			target_tiling = i
      			break
      		end
      	end
      
      	if target_tiling then
      		local steps = (#tiling - target_tiling - 1) * 2 + 1
      		for i = 1, steps do
      			scroll.command(container, "move left nomode")
      		end
      	end
      end
      ...
      
  • 缺乏工作区独立性

    • 全局开关导致所有工作区被迫同步开启 Grid。
    • 解决方案:将状态存储由布尔值改为以 ws_name 为键的哈希表
  • 加入 on_destroy 回调。当某个grid工作区只剩下最后一个窗口并被关闭时,代码会自动清理该工作区的配置并切换回默认模式。

  • 同时为了减少观看视频时的花销加入了调整窗口大小的逻辑。

完整的脚本存储在 配置仓库,以下是建议的配置。

#2345为不调整窗口大小的n宫格模式,wert为调整大小的n宫格模式
mode "grid" {
    bindsym 0 exec scrollmsg lua ~/.config/scroll/scripts/grid.lua disable; mode default
    bindsym 1 exec scrollmsg lua ~/.config/scroll/scripts/grid.lua toggle; mode default
    bindsym 2 exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 2; mode default
    bindsym 3 exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 3; mode default
    bindsym 4 exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 4; mode default
    bindsym 5 exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 5; mode default
    bindsym q exec scrollmsg lua ~/.config/scroll/scripts/grid.lua toggle; mode default
    bindsym w exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 2 1; mode default
    bindsym e exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 3 1; mode default
    bindsym r exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 4 1; mode default
    bindsym t exec scrollmsg lua ~/.config/scroll/scripts/grid.lua enable 5 1; mode default
    bindsym Escape mode "default"
}
bindsym $mod+Shift+y mode "grid"

又可以愉快的九宫格刷b站了。