如果还没有启动,在特定工作区启动应用程序

问题描述:

总之:当我切换到工作区X时,我想让一些程序自动启动,但前提是它们尚未启动。如果还没有启动,在特定工作区启动应用程序

这与XMonad startup on different workspaces不同,因为我不想将窗口移动到特定的工作空间(例如始终将xterm移动到工作空间2)。
这对我不起作用:xmonad spawn on startup in different workspace。我不希望所有应用程序在我登录时立即启动,也不会自动启动,例如xterm如果我关闭它并再次切换到工作区2。


别再想什么行不通,这里是工作:
(几乎)

在我区列表我认为与工作区名称touples和列表中的程序来

myWorkspaces = [ ("VIM", ["gvim"]), ("TERM",[myTerminal ++ " -e tmux"]) ] 

-- In my keybindings: 
[ ((mod4Mask, key), loadWorkspace workspace cmd) 
    | (key, (workspace, cmd)) <- zip [xK_1..] myWorkspaces 
] 

予定义的函数以切换到工作区和产卵给定的程序:当我切换那里开始

loadWorkspace :: String -> [String] -> X() 
loadWorkspace workspace commands = 
    do windows $ W.greedyView workspace 
     mapM_ spawn filtered_commands 
      where filtered_commands :: X [String] 
       filtered_commands = filterM isNotOpen commands 

       isNotOpen :: String -> X Bool 
       isNotOpen command = return True 

(出于某种原因mapM_需要的第二个参数是字符串代替[字符串]。我想在filtered_commands映射spawn的字符串时,任何想法,为什么这不工作?)

最后缺少的部分是isNotOpen功能,这应搜索className S中的窗口的当前工作空间和返回command是否已经存在。


我发现它非常困难(与其他语言和技术相比)来搜索XMonad的方式来做事情。对于这种情况,我只能找到如何获取当前WS - https://superuser.com/a/852152/481701中的窗口。好吧,我想,这给了我一个Window对象,我可以查询它的一些属性。

但是没有。该窗口实际上是Word64的别名!好吧,我想。谷歌xmonad获取窗口属性。没有。 xmonad从窗口ID获取类名。没有。 xmonad窗口信息。还有其他十几种说法类似的方法 - 没有有用的结果。我所获得的只是xmonad主页,FAQ或“Xmonad配置提示”。
我试过这些在hayoo!,而且我能得到的距离最近的是“fromClassName - 根据它的className着色一个窗口”。哈哈。

那么,我怎样才能得到一个窗口的className(或任何其他属性)以外的ManageHook

您可能会喜欢dynamic projectstopic spaces作为预焙替代品。他们并没有刚好你的建议,但也许其中一个足够接近,仍然是有用的,并且需要较少的配置工作。

我想映射spawn在filtered_commands中的字符串,任何想法,为什么这不起作用?

是的,你需要解除mapM_来处理一元参数(而不是一元函数或返回值)。因此:

filtered_commands >>= mapM_ spawn 

或者,因为你已经在do块:

result_of_filtered_commands <- filtered_commands 
mapM_ spawn result_of_filtered_commands 

所以,我怎么能得到的ManageHook外窗的className(或任何其他属性)?

the source of className

className = ask >>= (\w -> liftX $ withDisplay $ \d -> fmap resClass $ io $ getClassHint d w) 

你可以取适量参数liftXX行动,而不是一个Query行动。关键功能是来自X11软件包的getClassHint,该软件还提供对Windows其他属性的访问。

+0

非常感谢您对如此详细的答案的每一部分! –