Я хотел расширить свой xmonad.hs
, переместив его в свою изолированную среду проекта через stack
. Оказывается, такая песочница возможна через вложение вашей функции xmonad main
в родителях main
, которая использует xmonad-entryhelper. Следуя инструкциям в README проектов, преобразованный 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 - она просто успешно возвращается без каких-либо признаков. Я пытаюсь выполнить команду xmonad --restart
на корпусе и привязать mod-q
в xmonad к spawnPipe "xmonad --restart"
или io sendRestart
- ничто не работает. Когда я закрываю свой Xserver и перезапускаю его вручную, появляются все и все обновления, но сейчас изменения в горячей замене, похоже, не работают. Нужно ли сразу видеть два отдельных двоичных файла - текущий и новый?
EDIT: Я играл вокруг с проблемой через чтение исходного кода 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
Я не знаком с API X11 еще, но что Диковины меня это 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, а не моей песочнице (которая в настоящее время символически связана с двоичным файлом, созданным стеком).