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 ()

Связанный контент