Xmonad:将每个物理屏幕的dwm风格工作区与循环功能

时间:2015-11-05 14:30:19

标签: haskell xmonad multiple-monitors

对于在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知之甚少,无法弄明白。

这两个扩展都有详细记录,所以对于你们中的一些人来说这应该是一个简单的扩展。

感谢您的帮助!

1 个答案:

答案 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)

我还没有对它进行过测试,但至少它有点严重。 ; - )