首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从dmenu块启动进程XMonad

从dmenu块启动进程XMonad
EN

Stack Overflow用户
提问于 2020-12-14 04:42:23
回答 1查看 243关注 0票数 0

我从XMonad.Util.Dmenu获得的一个函数,即dmenuXinerama (见下文)有一个问题。这一切似乎正在发生:

这些函数阻止xmonad的事件循环,直到dmenu退出;这意味着程序将无法打开新的窗口,并且在以某种方式响应提示之前,您将无法更改工作区或输入焦点。

发生的情况是,我生成了一个菜单实例,然后它就出现了,但是一旦我在那里运行了一些东西,所有的东西都会被阻塞,我什么也做不了。

这是一项功能:

代码语言:javascript
复制
dmenuXinerama :: [String] -> X String
dmenuXinerama opts = do
    curscreen <- (fromIntegral . W.screen . W.current) `fmap` gets windowset :: X Int
    io $ runProcessWithInput "dmenu_run" ["-m", show curscreen] (unlines opts)

..。并具有约束力:

代码语言:javascript
复制
-- Spawn dmenu
, ((modMask, xK_p), void $ dmenuXinerama [])

我也试过这样做:

代码语言:javascript
复制
dmenuXinerama :: [String] -> X String
dmenuXinerama opts = do
    curscreen <-
      (fromIntegral . W.screen . W.current) `fmap` gets windowset :: X Int
    _ <-
      runProcessWithInput "dmenu_run" ["-m", show curscreen] (unlines opts)
    menuArgs "dmenu_run" ["-m", show curscreen] opts

-- | Like 'menu' but also takes a list of command line arguments.
menuArgs :: MonadIO m => String -> [String] -> [String] -> m String
menuArgs menuCmd args opts = liftM (filter (/='\n')) $
  runProcessWithInput menuCmd args (unlines opts)

如果有人能解释一下发生了什么以及我如何克服这个问题,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-14 06:15:18

我认为dmenu_run不会退出(直到您开始使用它的程序为止),所以它不适合与runProcessWithInput一起使用。使用dmenu_pathdmenu代替,然后spawn结果。

代码语言:javascript
复制
pickExe :: X ()
pickExe = do
    exes <- runProcessWithInput "dmenu_path" [] ""
    exe <- dmenuXinerama (lines exes)
    spawn exe

上面片段中的dmenuXinerama是可以从XMonad.Util.Dmenu导入的,而不是从问题中修改的。( spawn来自XMonad.Core。)

如果您对Monad接口感到满意,您可能更愿意在没有临时名称的情况下编写它:

代码语言:javascript
复制
pickExe = spawn =<< dmenuXinerama . lines =<< runProcessWithInput "dmenu_path" [] ""
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65283708

复制
相关文章

相似问题

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