我在 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) ... ]