对于在Haskell中学到一点的人来说,我的问题应该是小菜一碟:
我想使用类似dwm的multihead-setup:每个物理屏幕都有自己的工作空间集。没有自动交换窗口或焦点或任何东西。 这是由扩展XMonad.Layout.IndependentScreens(http://xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Layout-IndependentScreens.html)提供的,可以正常工作。
但我同样想使用XMonad.Actions.CycleWS(http://xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Actions-CycleWS.html)提供的循环功能,它同样适用(单独使用)。
实际上,当我在工作空间中循环时,它会:Screen1 WS1< - > Screen2 WS1< - > Screen1 WS2< - > Screen2 WS2等。
我猜想循环功能必须包含在独立布局功能中。正如我所说,这可能非常简单,但我对Haskell知之甚少,无法弄明白。
这两个扩展都有详细记录,所以对于你们中的一些人来说这应该是一个简单的扩展。
感谢您的帮助!
答案 0 :(得分:0)
我想主要的诀窍是构建一个WSType
,告知CycleWS您只对与当前物理工作区出现在同一屏幕上的物理工作区感兴趣。这是你怎么做的。
isOnScreen :: ScreenId -> WindowSpace -> Bool
isOnScreen s ws = s == unmarshallS (tag ws)
currentScreen :: X ScreenId
currentScreen = gets (screen . current . windowset)
spacesOnCurrentScreen :: WSType
spacesOnCurrentScreen = WSIs (isOnScreen <$> currentScreen)
然后你可以在键绑定中使用spacesOnCurrentScreen
,如下所示:
, ((modM, xK_whatever ), moveTo Next spacesOnCurrentScreen)
, ((modM, xK_whatever2), shiftTo Next spacesOnCurrentScreen)
我还没有对它进行过测试,但至少它有点严重。 ; - )