xmonad:设置屏幕和工作区

时间:2011-06-03 21:19:42

标签: haskell xmonad

我无法按照我的预期使用此功能。

setScreenAndWorkspace i =
  windows (viewOnScreen screenId workspaceId)
  where
    screenId = ((i-1) `mod` numberOfScreens)
    -- workspaceId = show i -- doesn't work for some reason
    workspaceId =
      case i of
        1 -> "1"
        2 -> "2"
        3 -> "3"
        4 -> "4"
        5 -> "5"
        6 -> "6"
        7 -> "7"
        8 -> "8"
        9 -> "9"

我正在调用这样的函数:

myKeys =
  [
    ("M-1"   , setScreenAndWorkspace 1),
    ("M-2"   , setScreenAndWorkspace 2),
    ("M-3"   , setScreenAndWorkspace 3),
    ("M-4"   , setScreenAndWorkspace 4),
    ("M-5"   , setScreenAndWorkspace 5),
    ("M-6"   , setScreenAndWorkspace 6),
    ("M-7"   , setScreenAndWorkspace 7),
    ("M-8"   , setScreenAndWorkspace 8),
    ("M-9"   , setScreenAndWorkspace 9)
  ]

首先,显示我似乎与我的情况不一样。我一定是误解了一些基本的Haskell事情;如果我使用show我似乎xmonad找不到任何工作区。

第二个问题是该功能有效,但并不总是转移焦点。我必须按两次键序列才能设置屏幕,设置工作区,并将焦点设置在该工作区上。

1 个答案:

答案 0 :(得分:2)

对于show i问题,很容易看到提示为什么它不按预期方式工作:

Prelude XMonad> show (1 :: Integer)
"1"
Prelude XMonad> show (1 :: ScreenId)
"S 1"

如果您觉得特别骇客或类似

,您可以使用类似drop 2 . show的内容
unS (S i) = i
workspaceId = show (unS i)

如果你没有感觉到hacky。

至于为什么viewOnScreen没有关注屏幕,嗯...这只是因为它不是为了设计的。从文档中:“切换到屏幕sc上的工作区i。如果我可见,请使用视图将焦点切换到工作区i。”。因此,只有在i已经可见时才会改变焦点。为什么不叫它两次?这样的事情应该做:

windows (viewOnScreen screenId workspaceId . viewOnScreen screenId workspaceId)