2011-06-03 80 views
5

我無法按照我的預期使該功能正常工作。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

你能否詳細說明'show i'如何不起作用? – Tener 2011-06-03 21:55:37

+1

關於焦點:從文檔:「如果我是可見的使用視圖切換焦點到工作區我。」。所以首先讓它可見,然後你轉移焦點。所以它按照廣告的方式工作。 – Tener 2011-06-03 21:57:26

+0

我覺得'show i'不可行。你確定嗎? – luqui 2011-06-04 07:36:44

回答

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) 

如果你不覺得哈克。

至於爲什麼viewOnScreen不聚焦屏幕,好吧......這只是因爲它不是爲了設計。從文檔:「切換到屏幕sc上的工作區i。如果我可見,則使用視圖將焦點切換到工作區i」。所以只有當i已經可見時它纔會改變焦點。爲什麼不把它調用兩次?像這樣的事情應該這樣做:

windows (viewOnScreen screenId workspaceId . viewOnScreen screenId workspaceId)