You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Awesome WM中获取最小化窗口的客户端内容?

解决Awesome WM最小化窗口预览空白问题

核心原因

X11环境下,最小化窗口会进入**Unmap(未映射)**状态,默认合成器会释放其像素缓冲区,导致直接调用c.content获取不到有效内容,预览自然空白。

具体解决办法

1. 配置合成器保留最小化窗口缓冲区

针对常用合成器做以下修改:

  • picom:编辑~/.config/picom.conf,添加/修改参数:

    unredir-if-possible = false; # 禁止合成器在窗口最小化时解除重定向
    preserve-shadow = true;
    detect-client-opacity = true;
    

    重启picom生效:picom --kill && picom &

  • xcompmgr:启动时添加-n参数,禁止取消窗口重定向:

    xcompmgr -n &
    

2. 在Awesome WM中提前缓存窗口内容

给客户端添加状态钩子,在窗口最小化前抓取并缓存其cairo表面:

-- 监听窗口最小化事件,缓存内容
client.connect_signal("property::minimized", function(c)
    if c.minimized then
        -- 抓取当前窗口表面并缓存到客户端对象
        c._cached_surface = gears.surface(c.content)
    else
        -- 取消最小化时清除缓存,恢复实时预览
        c._cached_surface = nil
    end
end)

-- 窗口关闭时清理缓存,避免内存泄漏
client.connect_signal("unmanage", function(c)
    c._cached_surface = nil
end)

然后在生成预览的函数里,优先使用缓存的表面:

-- 替换原获取cairo表面的代码
local surf
if c.minimized and c._cached_surface then
    surf = c._cached_surface
else
    surf = gears.surface(c.content)
end

-- 用处理后的surface创建预览imagebox
local imgbox = wibox.widget.imagebox(surf)

3. 额外注意

  • 缓存会占用内存,若开启预览的窗口数量较多,可限制缓存的窗口数量,或在切换工作区时清理非当前工作区的最小化窗口缓存。
  • 部分合成器(如compton的分支版本)可能参数名称不同,需对应调整配置。

内容的提问来源于stack exchange,提问作者Robert Nielsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:22:13