Xmonad、ワークスペースのグリッドを設定するにはどうすればいいですか?

Xmonad、ワークスペースのグリッドを設定するにはどうすればいいですか?

9 つのワークスペースをグリッドとして用意し、矢印キーを使用してナビゲートします。今のところ、矢印キーでナビゲートできますが、「ラップアラウンド」をなくしたいと思っています。たとえば、ワークスペース 9 が現在のワークスペースで上矢印キーを押すと、ワークスペース 1 に移動します (ワークスペース 9 に留まる必要があります)。現在のワークスペースを取得する方法があれば、これを実装しても問題はありません。

これまでのコードの一部を以下に示します。

 myKeys = [ 
      , ((myModMask , xK_Down), (switchWorkspace (-3)))  -- prevWS 
      , ((myModMask , xK_Up), (switchWorkspace 3))    -- nextWS
      , ((myModMask , xK_Left), prevWS)
      , ((myModMask , xK_Right), nextWS)
      ]

 switchWorkspace :: Int -> X ()
 switchWorkspace d = wsBy d >>= windows . W.greedyView

 wsBy :: Int -> X (WorkspaceId)
 wsBy = findWorkspace C.getSortByIndex Next AnyWS

役に立つかもしれない以下のコードを見つけましたが、結果を「抽出」する方法や、結果が役に立つかどうかがわかりません。現在のワークスペースを取得するにはどうすればよいですか? ありがとうございます。

   -- | Lookup the index of a workspace id in the user's config, return Nothing
  -- if that workspace does not exist in the config.
 getWsIndex :: X (WorkspaceId -> Maybe Int)
 getWsIndex = do
     spaces <- asks (workspaces . config)
     return $ flip elemIndex spaces 

答え1

現在のワークスペースを取得するにはlogCurrent

https://hackage.haskell.org/package/xmonad-contrib-0.15/docs/XMonad-Util-Loggers.html#v:logCurrent

したがって、次のようにする代わりにnextWS:

do
  x <- logCurrent
  if x /= "9" then nextWS else pure ()

関連情報