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

Xmonad如何为firefox、feh等指定窗口永久去除边框

解决方案

疑问解答

  • 你第一个疑问的结论为是:ManageHook执行在窗口布局初始化流程之前,Xmonad会在后续布局渲染阶段根据全局边框配置重置窗口边框宽度,因此你在ManageHook内直接调用setWindowBorderWidth的操作会被覆盖,导致方案A失效。
  • 第二个疑问的结论为是:要实现指定窗口永久无边框,需要在布局渲染层面做持久化配置,XMonad.Layout.NoBorders是官方提供的标准实现方案,对所有布局、所有窗口模式(包括浮动窗口)均生效。
  • 第三个疑问:不需要修改你原本使用的布局,只需要用XMonad.Layout.NoBorders提供的布局修饰器包装原有布局即可。

具体配置步骤

方案1:搭配LayoutHook实现(推荐,性能更稳定)

  1. 首先导入依赖模块:
import XMonad.Layout.NoBorders
  1. 在你的自定义ManageHook中添加规则,标记需要无边框的窗口:
myManageHook = composeAll
  [ className =? "firefox" <||> className =? "feh" --> hasBorder False
  -- 保留你原本的其他ManageHook规则
  ]
  1. 用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,可以监听窗口映射完成的事件,在边框被设置完成后再修改宽度,代码如下:

  1. 导入依赖模块:
import XMonad
import qualified XMonad.StackSet as W
  1. 添加自定义事件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
  1. 在主配置中注册该事件Hook即可。

内容的提问来源于stack exchange,提问作者Xiaokui Shu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:48:01