gpt4 book ai didi

haskell - 如何删除 XMonad 中所有 float 窗口的边框

转载 作者:行者123 更新时间:2023-12-02 16:07:49 24 4
gpt4 key购买 nike

有几个类似的问题,但没有一个能完全为我解决,例如 this问题解释了如何从全屏 float 窗口中删除边框。

使用XMonad.Layout.NoBorders您可以做很多很酷的事情,例如删除某些窗口的边框,或者如果它是唯一的窗口或唯一的全屏 float 窗口。

我找不到所有 float 窗口的任何内容,但是如果有人可以向我指出一些可以用来检查窗口是否 float 的工具,我相信我可以尝试找到解决方案。

欢迎提出建议

最佳答案

我将使用 source code XMonad.Layout.NoBorders 作为引用,因为我找不到任何已经存在的更合适的东西。我们想看看它是如何实现“全屏 float 窗口去边框”的,看看是否可以轻松放宽为“ float 窗口去边框”(没有全屏限制)。

根据您链接的问题的答案:

layoutHook = lessBorders OnlyFloat $ avoidStruts $ myLayout

OnlyFloat 似乎是“删除全屏 float 窗口上的边框”的说明符,所以让我们检查一下它的定义:

data Ambiguity = Combine With Ambiguity Ambiguity
| OnlyFloat
| Never
| EmptyScreen
| OtherIndicated
| Screen
deriving (Read, Show)

它本身并没有太大帮助。我们应该看看其他地方,看看代码如何处理这些值。

<小时/>

可以肯定的是,第一个要检查的函数是 lessBorders:

lessBorders :: (SetsAmbiguous p, Read p, Show p, LayoutClass l a) =>
p -> l a -> ModifiedLayout (ConfigurableBorder p) l a
lessBorders amb = ModifiedLayout (ConfigurableBorder amb [])

lessBorders的类型签名中,我们可以看到:

OnlyFloat :: (SetsAmbiguous p, Read p, Show p) => p

这是一个好兆头,因为它意味着 lessBorders 不会明确期望 Ambiguity:我们可以通过实现我们自己的 SetsAmbigously< 来扩展此处的功能 并将其传递给现有的 lessBorders。现在让我们看看 SetsAmbigouslyAmbiguity 的实现:

class SetsAmbiguous p where
hiddens :: p -> WindowSet -> Maybe (W.Stack Window) -> [(Window, Rectangle)] -> [Window]

instance SetsAmbiguous Ambiguity where
hiddens amb wset mst wrs
| Combine Union a b <- amb = on union next a b
| Combine Difference a b <- amb = on (\\) next a b
| Combine Intersection a b <- amb = on intersect next a b
| otherwise = tiled ms ++ floating
where next p = hiddens p wset mst wrs
nonzerorect (Rectangle _ _ 0 0) = False
nonzerorect _ = True
screens =
[ scr | scr <- W.screens wset,
case amb of
Never -> True
_ -> not $ null $ integrate scr,
nonzerorect . screenRect $ W.screenDetail scr]
floating = [ w |
(w, W.RationalRect px py wx wy) <- M.toList . W.floating $ wset,
px <= 0, py <= 0,
wx + px >= 1, wy + py >= 1]
ms = filter (`elem` W.integrate' mst) $ map fst wrs
tiled [w]
| Screen <- amb = [w]
| OnlyFloat <- amb = []
| OtherIndicated <- amb
, let nonF = map integrate $ W.current wset : W.visible wset
, length (concat nonF) > length wrs
, singleton $ filter (1==) $ map length nonF = [w]
| singleton screens = [w]
tiled _ = []
integrate y = W.integrate' . W.stack $ W.workspace y

hiddens 是我们需要实现的唯一方法。它的参数是我们的 SetsAmbigously 值、WindowSet 和其他一些东西,并且它返回不应显示边框的窗口列表。组合操作和其他歧义值有很多逻辑,但现在这些对我们来说并不重要。我们关心的是这个片段:

            floating = [ w |
(w, W.RationalRect px py wx wy) <- M.toList . W.floating $ wset,
px <= 0, py <= 0,
wx + px >= 1, wy + py >= 1]

这是非常有前途的。它通过从 WindowSetfloating 部分中提取所有窗口来定义一组 float 窗口,并将其转换为列表(最初它是一个 Data.Map code>),并过滤掉所有不覆盖整个屏幕的窗口。我们需要做的就是删除过滤器。

<小时/>

进行更改并删除与平铺窗口和设置操作相关的所有不必要的代码(这是大部分实现)后,我们最终得到的结果很简单:

import XMonad.Layout.NoBorders
import qualified XMonad.StackSet as W
import qualified Data.Map as M

data AllFloats = AllFloats deriving (Read, Show)

instance SetsAmbiguous AllFloats where
hiddens _ wset _ _ = M.keys $ W.floating wset

然后我们可以说:

layoutHook = lessBorders AllFloats $ myLayout...

关于haskell - 如何删除 XMonad 中所有 float 窗口的边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55053645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com