Xmonad如何为firefox、feh等指定窗口永久去除边框
解决方案
疑问解答
- 你第一个疑问的结论为是:ManageHook执行在窗口布局初始化流程之前,Xmonad会在后续布局渲染阶段根据全局边框配置重置窗口边框宽度,因此你在ManageHook内直接调用
setWindowBorderWidth的操作会被覆盖,导致方案A失效。 - 第二个疑问的结论为是:要实现指定窗口永久无边框,需要在布局渲染层面做持久化配置,XMonad.Layout.NoBorders是官方提供的标准实现方案,对所有布局、所有窗口模式(包括浮动窗口)均生效。
- 第三个疑问:不需要修改你原本使用的布局,只需要用XMonad.Layout.NoBorders提供的布局修饰器包装原有布局即可。
具体配置步骤
方案1:搭配LayoutHook实现(推荐,性能更稳定)
- 首先导入依赖模块:
import XMonad.Layout.NoBorders
- 在你的自定义ManageHook中添加规则,标记需要无边框的窗口:
myManageHook = composeAll [ className =? "firefox" <||> className =? "feh" --> hasBorder False -- 保留你原本的其他ManageHook规则 ]
- 用
lessBorders修饰你原本的layoutHook,示例如下:
-- 示例中原布局为 Tall ||| Mirror Tall ||| Full,替换为你自己的原有布局即可 myLayoutHook = lessBorders OtherIndicated $ Tall 1 (3/100) (1/2) ||| Mirror (Tall 1 (3/100) (1/2)) ||| Full
其中OtherIndicated参数表示所有被hasBorder False标记的窗口都将默认无边框,该配置对所有布局、浮动窗口均生效。
方案2:通过EventHook实现(无需修改原有布局配置)
如果你不想修改现有layoutHook,可以监听窗口映射完成的事件,在边框被设置完成后再修改宽度,代码如下:
- 导入依赖模块:
import XMonad import qualified XMonad.StackSet as W
- 添加自定义事件Hook:
myEventHook e@(MapRequestEvent {ev_window = w}) = do whenX (runQuery (className =? "firefox" <||> className =? "feh") w) $ withDisplay $ \d -> io $ setWindowBorderWidth d w 0 return $ All True myEventHook _ = return $ All True
- 在主配置中注册该事件Hook即可。
内容的提问来源于stack exchange,提问作者Xiaokui Shu
相关产品推荐
相关产品推荐

