有几个类似的问题,但还没有一个为我解决,例如,这个问题说明了如何从全屏浮动窗口中删除边框。
使用XMonad.Layout.NoBorders可以做很多很酷的事情,例如从某些窗口中删除边框,或者如果这是唯一窗口或仅是全屏浮动窗口。
我无法为所有浮动窗口找到任何东西,但是,如果有人可以将我指向可以用来检查窗口是否在浮动的工具,我相信我可以尝试破解一个解决方案。
欢迎任何建议
我将使用XMonad.Layout.NoBorders的源代码作为参考,因为我找不到已经存在的更合适的东西。我们想看看它如何实现“在全屏浮动窗口上删除边框”,以查看是否可以轻松放宽“在全屏浮动窗口上删除边框”(没有全屏约束)。
根据您所链接问题的答案:
layoutHook = lessBorders OnlyFloat $ avoidStruts $ myLayout
OnlyFloat
似乎是“删除全屏浮动窗口上的边框”的说明符,所以让我们检查一下它的定义:
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
:我们可以在这里扩展功能,方法是实现自己的功能SetsAmbiguous
并将其传递给现有的lessBorders
。现在让我们看一下SetsAmbiguous
和Ambiguity
的实现:
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
是我们唯一需要实现的方法。它的参数是我们的SetsAmbiguous
value,aWindowSet
和其他东西,它返回不显示边框的窗口列表。合并操作和其他Ambiguity
值有很多逻辑,但是现在这些对我们来说都无关紧要。我们关心的是以下片段:
floating = [ w |
(w, W.RationalRect px py wx wy) <- M.toList . W.floating $ wset,
px <= 0, py <= 0,
wx + px >= 1, wy + py >= 1]
这是非常有希望的。它通过提取所有窗口定义了一组浮动窗口floating
的部分WindowSet
,将其转换为一个列表(最初这是一个Data.Map
),并过滤掉所有不覆盖整个屏幕的窗口。我们需要做的就是删除过滤器。
进行更改后,除去所有与平铺窗口和set操作有关的不必要代码(这是大多数实现),我们最终得到了简单的结果:
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...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句