我正在使用以下内容,
layoutHook = smartBorders $ lessBorders OnlyFloat $ avoidStruts $ layoutHook defaultConfig
在工作区中只有一个应用程序时禁用边框。我想要实现的是当我有2个或更多时,在瓷砖之间有空间。我已经尝试将间距10添加到混合中,但是当工作区中只有一个窗口时,它仍然会留下空间。当工作空间中有多于一个瓷砖时,是否可以只有间距?
答案 0 :(得分:1)
这里的想法是创建一个布局修饰符,它可以识别何时只有一个窗口,因此它不会缩小它。
这就是我在xmonad.hs中解决它的方法:
shrinkRect :: Int -> Rectangle -> Rectangle
shrinkRect p (Rectangle x y w h) = Rectangle (x+fi p) (y+fi p) (w-2*fi p) (h-2*fi p)
where fi n = fromIntegral n
这是缩小给定窗口的函数。
接下来,你必须定义布局修饰符:
data SmartSpacing a = SmartSpacing Int deriving (Show, Read)
instance LayoutModifier SmartSpacing a
where
pureModifier _ _ _ [x] = ([x], Nothing)
pureModifier (SmartSpacing p) _ _ wrs = (map (second $ shrinkRect p) wrs, Nothing)
modifierDescription (SmartSpacing p) = "SmartSpacing " ++ show p
最后,将它应用于布局的函数:
smartSpacing :: Int -> l a -> ModifiedLayout SmartSpacing l a
smartSpacing p = ModifiedLayout (SmartSpacing p)
您必须将smartSpacing
应用于您希望更改的布局,例如(Tall
在这里被修改):
myLayout = tiled ||| Mirror tiled ||| Full
where
-- Add spacing between windows
tiled = smartSpacing 3 $ Tall nmaster delta ratio
然后你最终使用:
layoutHook = smartBorders myLayout
有关详细信息,您可以查看我的xmonad.hs here
此外,您可能必须在xmonad.hs中添加以下行才能进行编译:
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
P.S。
xmonad的最新版本已经包含smartSpacing作为XMonad.Layout.Spacing模块的一部分,因此在这种情况下,您可以跳过定义shrinkRect,smartSpacing和SmartSpacing(完全相同的代码已经在其中)。