2

我正在使用以下内容,

layoutHook = smartBorders $ lessBorders OnlyFloat $ avoidStruts $ layoutHook defaultConfig

当工作区中只有一个应用程序时禁用边框。我想要实现的是当我有 2 个或更多时,瓷砖之间有空间。我尝试将间距 10 添加到有效的组合中,但是当工作区中只有一个窗口时,它仍然会留下空间。当工作空间中有超过 1 个瓷砖时,是否可以只设置间距?

4

1 回答 1

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

此外,您可能必须在 xmonad.hs 中添加以下行才能编译:

{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}

附言

最新版本的 xmonad 已经包含 smartSpacing 作为 XMonad.Layout.Spacing 模块的一部分,因此在这种情况下,您可以跳过定义 shrinkRect、smartSpacing 和 SmartSpacing(其中已经包含完全相同的代码)。

最新的 xmonad 智能间距

于 2012-12-22T01:19:56.223 回答