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

Xmonad: Combine dwm-style workspaces per physical screen with cycling function

我的问题对于在 Haskell 中学过一点的人来说应该是小菜一碟:

我想使用类似 dwm 的多显示器设置:每个物理屏幕都有自己的一组工作区。没有自动交换 windows 或焦点或任何东西。 这是由扩展 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 知之甚少,无法弄清楚。

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

感谢您的帮助!

我想主要的技巧是构建一个 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)

我还没有测试过,但至少可以进行类型检查。 ;-)