我想通過將其移動到其自己的沙盒項目環境中,通過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並手動重新啓動時,任何和所有更新都顯示出來,但現在熱插拔更改似乎不起作用。它是否需要同時看到兩個單獨的二進制文件 - 當前文件和新文件?
編輯:我已經通過閱讀源代碼xmonad
,xmonad-entryhelper
和X11
玩弄的問題。目前,我正在撿除了這一點:
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的系統安裝而不是我的沙盒(當前符號鏈接到由堆棧生成的二進制文件)進行編譯和啓動時返回。