繁体   English   中英

在 Xmonad 中为特定 Windows 配置无边界

[英]Config No Border For Specific Windows in Xmonad

目标

在 Xmonad 中不为特定窗口设置边框。

具体示例:我希望firefoxfeh始终没有边框。 我想不仅为特定布局(例如,单个窗口)或特定窗口模式(如浮动)设置它。

尝试 A

我最直接的想法是在manageHook添加一行,它假设处理窗口创建。 所以我在我定制的ManageHook放了一行:

className =? "firefox" --> ask >>= \w -> liftX $ withDisplay $ \d -> io $ setWindowBorderWidth d w 0 >> idHook

它编译,但不幸的是当我启动firefox时没有任何反应。

然后我尝试调试它:

  1. 测试了以下内容并且它有效(新的 Firefox 窗口浮动),这表明我自定义的ManageHook有效,并且我的逻辑(修改窗口后跟idHook )应该没问题。
className =? "firefox" --> ask >>= liftX . float >> idHook
  1. 经测试setWindowBorderWidth试图功能toggleBorderXMonad.Actions.NoBorders toggleBorder执行类似调用setWindowBorderWidth 我使用键绑定来调用toggleBorder并且它有效。 因此setWindowBorderWidth在创建窗口后的setWindowBorderWidth会话期间运行良好。

  2. 测试了以下内容(在此处找到)但它不起作用,与我的代码(尝试 A)相同。

className =? "firefox" --> ask >>= liftX . toggleBorder >> idHook

尝试 B

我在XMonad.Layout.NoBorders这个答案中找到了hasBorder函数,但我没有成功。

如果我只放className =? "firefox" --> hasBorder False className =? "firefox" --> hasBorder FalseManageHook但不使用layoutHook ,什么都不会发生。 查了hasBorder源码,发现只广播消息,没有设置边框。 我想我可能需要调用一个layoutHookXMonad.Layout.NoBorders真正设置边界,但我不知道哪一个,我应该使用。 而且我也不确定是否需要指定任何布局来使用XMonad.Layout.NoBorders

问题

  1. ManageHook是否在ManageHook之后设置了边框,以便我在尝试 A 中的代码无效?

  2. 如果 Q1 为真,是否意味着当窗口在屏幕上绘制时,我只能在LayoutHook (可能使用XMonad.Layout.NoBorders )上不设置边框?

  3. 如果 Q2 为真,我是否需要指定布局以及我可以使用哪个layoutHook

我会尝试B:

从 xmonad-contrib 导入NoBorders模块:

import XMonad.Layout.NoBorders

在您的 manageHook 中定义您的约束:

className =? "feh"     --> hasBorder False
className =? "firefox" --> hasBorder False

并将模块的布局修饰符之一,例如smartBorders应用于所有布局:

layoutHook = smartBorders $ Full ||| ResizableTall 1 (3/100) (1/2) [] ||| ...

注意:这只会影响重新编译并重新启动 XMonad创建的窗口。 已经存在的 firefox 和 feh 实例在关闭和重新启动之前仍然有它们的边界。

我想我找到了第一个问题的答案。

Xmonad 是否在 ManageHook 之后设置了边框,以便我在尝试 A 中的代码无效?

是的。

看起来 xmonad 窗口初始化逻辑在XMonad/Operations.hs 中 创建窗口时,将调用函数manage() 函数的最后三行:

  1. 加载管理ManageHook
  2. 使用runQuery()应用ManageHook
  3. 运行windows()函数,该函数从 config 加载边框信息并应用setInitialProperties()函数根据边框 config 设置边框

最后一步setInitialProperties()使用从配置加载的边框宽度调用setWindowBorderWidth() ,这使我的setWindowBorderWidth()作为ManageHook步骤无效。

如果我不更改XMonad/Operations.hs 中的这个逻辑,看起来我只能尝试 B。但是,我真的觉得windows跳转问题很烦人。 这不仅发生在Full布局中,我在单个窗口中使用Tall 当我在两个工作区之间切换时,这两个工作区都有一个没有边框的窗口,我看到这个跳跃 视觉效果影响屏幕上的所有像素,因为它需要缩放整个窗口。 需要为此找到解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM