2016-06-29 30 views
2

我想通過將其移動到其自己的沙盒項目環境中,通過stack擴展我的xmonad.hs。事實證明,通過在使用xmonad-entryhelper的父代main中嵌入您的xmonad main函數,可以實現此類沙盒。繼在項目中自述文件的說明,從這個轉換xmonad.hs如何重新啓動沙盒和自定義編譯的Xmonad

main :: IO() 
main = do 
    statBar <- spawnPipe myXMobar 
    xmonad def 
    { terminal   = myTerminal 
    , focusFollowsMouse = myFocusFollowsMouse 
    , borderWidth   = myBorderWidth 
    , modMask    = myModMask 
    , workspaces   = myWorkspaces 
    , normalBorderColor = myNormalBorderColor 
    , focusedBorderColor = myFocusedBorderColor 

    -- key bindings 
    , keys    = myKeys 
    --, mouseBindings  = myMouseBindings 

    -- hooks, layouts 
    , layoutHook   = myLayoutHook 
    , manageHook   = manageHook def <+> myManageHook 
    --, handleEventHook  = myEventHook 
    , logHook    = myLogHook statBar >> setWMName "LG3D" 
    --, startupHook   = myStartupHook 
    } 

要...

kaleidoscope :: IO() 
kaleidoscope = do 
    statBar <- spawnPipe myXMobar 
    xmonad def 
    { terminal   = myTerminal 
    , focusFollowsMouse = myFocusFollowsMouse 
    , borderWidth   = myBorderWidth 
    , modMask    = myModMask 
    , workspaces   = myWorkspaces 
    , normalBorderColor = myNormalBorderColor 
    , focusedBorderColor = myFocusedBorderColor 

    -- key bindings 
    , keys    = myKeys 
    --, mouseBindings  = myMouseBindings 

    -- hooks, layouts 
    , layoutHook   = myLayoutHook 
    , manageHook   = manageHook def <+> myManageHook 
    --, handleEventHook  = myEventHook 
    , logHook    = myLogHook statBar >> setWMName "LG3D" 
    --, startupHook   = myStartupHook 
    } 

main :: IO() 
main = EH.withCustomHelper kaleidoscopeConfig 
    where 
    kaleidoscopeConfig = EH.defaultConfig 
    { EH.run = kaleidoscope 
    , EH.compile = \force -> EH.withLock ExitSuccess $ do 
     let cmd = 
       if force 
       then "cd /home/oldmanmike/src/github.com/oldmanmike/kaleidoscope && stack clean && stack build" 
       else "cd /home/oldmanmike/src/github.com/oldmanmike/kaleidoscope && stack build" 
     EH.compileUsingShell cmd 
    , EH.postCompile = EH.defaultPostCompile 
    } 

所以,我現在就可以編譯使用xmonad --recompile和我的項目在.xmonad找到二進制被軟鏈接到我的沙盒項目生成的二進制文件。

但由於某種原因,xmonad --restart不再有效。什麼可能會絆倒它?

該命令本身似乎沒有從X中產生任何錯誤 - 它只是成功返回,沒有任何符號甚至發生任何事情。我試圖在shell中使用xmonad --restart命令,並在xmonad中將mod-q綁定到spawnPipe "xmonad --restart"io sendRestart - 兩者似乎都不起作用。當我關閉我的Xserver並手動重新啓動時,任何和所有更新都顯示出來,但現在熱插拔更改似乎不起作用。它是否需要同時看到兩個單獨的二進制文件 - 當前文件和新文件?

編輯:我已經通過閱讀源代碼xmonadxmonad-entryhelperX11玩弄的問題。目前,我正在撿除了這一點:

sendRestart :: IO() 
sendRestart = do 
    dpy <- openDisplay "" 
    rw <- rootWindow dpy $ defaultScreen dpy 
    xmonad_restart <- internAtom dpy "XMONAD_RESTART" False 
    allocaXEvent $ \e -> do 
     setEventType e clientMessage 
     setClientMessageEvent e rw xmonad_restart 32 0 currentTime 
     sendEvent dpy rw False structureNotifyMask e 
    sync dpy False 

我不熟悉的X11 API還沒有,但什麼weirds我出去是internAtom功能和XMONAD_RESTART的宗旨服務於客戶端消息的內容。還有這個處理程序:

handle [email protected] { ev_message_type = mt } = do 
    a <- getAtom "XMONAD_RESTART" 
    if (mt == a) 
     then restart "xmonad" True 
     else broadcastMessage e 

handle e = broadcastMessage e -- trace (eventName e) -- ignoring 

所以我猜測原子只是用於ID消息事件的臨時字符串? 當我運行一個重新啓動,以便它會認爲好像是它使所有的方式來操作手柄我沒有得到任何錯誤消息:

restart :: String -> Bool -> X() 
restart prog resume = do 
    broadcastMessage ReleaseResources 
    io . flush =<< asks display 
    let wsData = show . W.mapLayout show . windowset 
     maybeShow (t, Right (PersistentExtension ext)) = Just (t, show ext) 
     maybeShow (t, Left str) = Just (t, str) 
     maybeShow _ = Nothing 
     extState = return . show . catMaybes . map maybeShow . M.toList . extensibleState 
    args <- if resume then gets (\s -> "--resume":wsData s:extState s) else return [] 
    catchIO (executeFile prog True args Nothing) 

我懷疑這裏有一個權限問題是xmonad-x86_64-linux有當它通過xmonad的系統安裝而不是我的沙盒(當前符號鏈接到由堆棧生成的二進制文件)進行編譯和啓動時返回。

回答

2

事實證明,問題在於我無法使用堆棧生成的xmonad二進制文件,即使它在我的路徑中,並且~/.xmonad/xmonad-x86_64-linux已被鏈接到它。相反,我通過綁定我的mod-q重新啓動工作如下:

restart "/home/oldmanmike/.xmonad/xmonad-x86_64-linux" True 

這將工作,我會給它的絕對路徑。

考慮到以前的觀察將以下內容放入我的內容,XINITRC會導致X崩潰:

exec xmonad 

相反,我不得不使用首次啓動以下:

exec ~/.xmonad/xmonad-x86_64-linux 

就目前而言,它似乎好像叫xmonad是少了很多可靠的一個命令,我應該別名路徑xmonad-x86_64-linux並從現在開始調用。

相關問題