如何在 XMonad 中定义显示桌面的快捷方式?

如何在 XMonad 中定义显示桌面的快捷方式?

我在 Gnome 环境中使用 XMonad。如何定义快捷方式来最小化所有窗口并显示桌面?

答案1

我不推荐它,因为这不是 XMonad 应该使用的“方式”,但我确实知道两种可能的解决方案来实现你想要的。

我这样做的方式不是隐藏工作区中的所有内容,而是切换到另一个空白的工作区,xmonad-contrib 中有一个非常方便的操作可以做到这一点称为 FindEmptyWorpace. 本质上你只需像这样使用它:

((AltMask, xK_space), viewEmptyWorkspace)

尽管我推荐另一种方法,但我会回答你提出的问题。隐藏和显示功能正是为此目的而设计的。我以前从未使用过它们,因为我不想在屏幕上隐藏任何东西,但函数定义足以解释它们是作用于单个窗口的 X Monad Actions,因此如果您想最小化它们,那么您必须从 StackSet 中获取当前屏幕,然后获取该屏幕上的工作区,然后将 mapM hide 到该工作区的窗口堆栈中的每个窗口上。例如在 ghci 中:

:m + XMonad.StackSet
$ :t stack . workspace . current
  :: StackSet i l a sid sd -> Maybe (Stack a)

所以它可以完成,当我可以转到一个空闲窗口时我不会被打扰。

答案2

我意识到这是一篇非常老的帖子,但我最近自己找到了一个优雅的解决方案,并想与大家分享。

这个解决方案非常好,因为它不仅清除了所有窗口,而且还允许您在查看完桌面后将它们恢复到以前的状态。

它的工作原理是定义一个新布局,然后按下按键切换到该布局。第二次按下按键将返回到您原来的布局。

import XMonad.Layout.MultiToggle
import XMonad.Layout.MultiToggle.Instances

...

data EmptyLayout a = EmptyLayout deriving (Show, Read)

instance LayoutClass EmptyLayout a where
    doLayout a b _ = emptyLayout a b
    description _ = "Empty Layout"

data HIDE = HIDE deriving (Read, Show, Eq, Typeable)
instance Transformer HIDE Window where
    transform _ x k = k (EmptyLayout) (\(EmptyLayout) -> x)

...

myLayoutHook = smartBorders
               . mkToggle (NOBORDERS ?? FULL ?? EOT)
               . gaps [(U,10), (R,10), (D,20), (L,10)]
               . spacingWithEdge default_spacing
               . mkToggle (single HIDE)                -- This line
               $ Grid ||| Full ||| tiled ||| Mirror tiled

... 


keyBindings :: [((KeyMask, KeySym), X ())]
keyBindings = [ ... ((mMask, xK_z), sendMessage $ Toggle HIDE) ... ]

相关内容