2016-06-29 1 views
2

Я хотел расширить свой 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, а не моей песочнице (которая в настоящее время символически связана с двоичным файлом, созданным стеком).

ответ

2

Оказывается, проблема заключалась в том, что я не мог использовать двоичный код xmonad, созданный стекми, хотя он был на моем пути, и был связан с ним. Вместо этого я получил перезапуск работы, связывая мои моды-ц к следующему:

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

Он будет работать при условии, я даю ему абсолютный путь.

Это имеет некоторый смысл, учитывая ранее сделанное наблюдение, которое ставит следующее в моем.xinitrc приведет X к сбою:

exec xmonad 

Вместо этого, я должен был использовать следующие для первоначального запуска:

exec ~/.xmonad/xmonad-x86_64-linux 

Так что сейчас, казалось бы, как будто призывая xmonad намного менее надежны команды, и я должен просто прописать путь к xmonad-x86_64-linux и называть это с этого момента.