首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重新启动沙箱和自定义编译的Xmonad

如何重新启动沙箱和自定义编译的Xmonad
EN

Stack Overflow用户
提问于 2016-06-29 14:28:52
回答 1查看 523关注 0票数 3

我希望通过将xmonad.hs通过stack迁移到它自己的沙箱项目环境中来扩展它。事实证明,通过将xmonad main函数嵌入到利用xmonad-entryhelper的父main中,这种沙箱是可能的。按照项目自述中的说明,将xmonad.hs转换为:

代码语言:javascript
复制
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
    }

为了..。

代码语言:javascript
复制
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的源代码来处理这个问题。我现在把这个拆开:

代码语言:javascript
复制
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,但奇怪的是internAtom函数以及XMONAD_RESTART在客户端消息中的用途。还有一个处理程序:

代码语言:javascript
复制
handle e@ClientMessageEvent { 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

所以我猜原子只是用来标识消息事件的特殊字符串?当我运行重新启动时,我不会收到任何错误消息,因此它似乎使它一直到操作句柄:

代码语言:javascript
复制
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的系统安装中编译和启动时有一个权限问题,而不是我的沙箱(目前与堆栈生成的二进制文件有符号链接)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-29 20:55:56

事实证明,问题是我不能使用堆栈生成的xmonad二进制文件,即使它在我的路径中,而且~/.xmonad/xmonad-x86_64-linux也是与它相关联的。相反,我通过将mod绑定到以下内容来重新开始工作:

代码语言:javascript
复制
restart "/home/oldmanmike/.xmonad/xmonad-x86_64-linux" True

只要我给它绝对的路径,它就能工作。

考虑到在前面的观察中,在我的.xinitrc中放置以下内容会导致X崩溃,这是有意义的:

代码语言:javascript
复制
exec xmonad

相反,我不得不在最初的发布中使用以下内容:

代码语言:javascript
复制
exec ~/.xmonad/xmonad-x86_64-linux

因此,现在看来,调用xmonad对于命令来说不太可靠,我应该将xmonad-x86_64-linux路径化名,并从现在起调用它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38102625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档