我从XMonad.Util.Dmenu获得的一个函数,即dmenuXinerama (见下文)有一个问题。这一切似乎正在发生:
这些函数阻止xmonad的事件循环,直到dmenu退出;这意味着程序将无法打开新的窗口,并且在以某种方式响应提示之前,您将无法更改工作区或输入焦点。
发生的情况是,我生成了一个菜单实例,然后它就出现了,但是一旦我在那里运行了一些东西,所有的东西都会被阻塞,我什么也做不了。
这是一项功能:
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)..。并具有约束力:
-- Spawn dmenu
, ((modMask, xK_p), void $ dmenuXinerama [])我也试过这样做:
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)如果有人能解释一下发生了什么以及我如何克服这个问题,我将不胜感激。
发布于 2020-12-14 06:15:18
我认为dmenu_run不会退出(直到您开始使用它的程序为止),所以它不适合与runProcessWithInput一起使用。使用dmenu_path和dmenu代替,然后spawn结果。
pickExe :: X ()
pickExe = do
exes <- runProcessWithInput "dmenu_path" [] ""
exe <- dmenuXinerama (lines exes)
spawn exe上面片段中的dmenuXinerama是可以从XMonad.Util.Dmenu导入的,而不是从问题中修改的。( spawn来自XMonad.Core。)
如果您对Monad接口感到满意,您可能更愿意在没有临时名称的情况下编写它:
pickExe = spawn =<< dmenuXinerama . lines =<< runProcessWithInput "dmenu_path" [] ""https://stackoverflow.com/questions/65283708
复制相似问题