xmonad: установить экран и рабочее пространство - PullRequest
5 голосов
/ 04 июня 2011

У меня проблемы с тем, чтобы эта функция работала так, как я ожидал.

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

Во-первых, покажи, что я неКажется, я делаю то же самое, что и я.Должно быть, я неправильно понимаю некоторые основные вещи на Хаскеле;если я использую show i, кажется, что xmonad не может найти какое-либо рабочее пространство.

Вторая проблема заключается в том, что функция работает, но не всегда передает фокус.Мне нужно дважды нажать последовательность клавиш, чтобы установить экран, установить рабочее пространство и установить фокус на этом рабочем пространстве.

1 Ответ

2 голосов
/ 10 июня 2011

Для вопроса 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)

если вы не чувствуете себя счастливым.

Что касается того, почему viewOnScreen не фокусирует экран, ну ... это просто потому, что он не предназначен для этого. Из документации: «Переключиться в рабочую область i на экране sc. Если я видим, используйте view, чтобы переключить фокус на рабочую область i.». Таким образом, он меняет фокус только тогда, когда i уже виден. Почему бы просто не позвонить дважды? Примерно так должно поступить:

windows (viewOnScreen screenId workspaceId . viewOnScreen screenId workspaceId)
...