如果尚未在特定工作区启动,请启动应用程序

时间:2017-08-27 18:33:25

标签: haskell window x11 xmonad

简而言之:当我切换到工作区 X 时,我希望某些程序能够自动启动,但前提是它们尚未启动。

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

足够的东西不起作用, 的工作原理如下:
<子>(几乎)

在我的工作区列表中,我使用工作区名称和列表程序进行操作,以便在切换时启动:

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_要求第二个参数是 String 而不是 [String] 。我想将spawn映射到 filtered_commands 中的字符串,知道为什么这不起作用?)

最后一个缺失的部分是isNotOpen函数,该函数应搜索当前工作空间中窗口的className并返回command是否已存在。

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

但不是。窗口实际上是Word64的别名!!!好的,我想。 Google xmonad获取窗口属性。没有。 xmonad从窗口ID获取classname 。没有。 xmonad窗口信息。还有十几种其他方式可以说出相似之处 - 没有任何有用的结果。我得到的只是xmonad主页,FAQ或“Xmonad配置提示” 我也在 hayoo!中尝试了这些,我最接近的是“fromClassName - 根据它的className着色一个窗口。”。哈哈。

那么,如何在 ManageHook 之外获取窗口的className(或任何其他属性)?

2 个答案:

答案 0 :(得分:4)

您可能希望dynamic projectstopic spaces作为预先烘焙的替代品。他们没有完全你的建议,但也许其中一个足够接近仍然有用,并且需要较少的配置工作。

  

我想在filtered_commands中的字符串上映射spawn,知道为什么这不起作用?

是的,您需要提升mapM_来处理monadic参数(而不是monadic函数或返回值)。因此:

filtered_commands >>= mapM_ spawn

或者,因为您已经在do区块中:

result_of_filtered_commands <- filtered_commands
mapM_ spawn result_of_filtered_commands
  

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

查看the source of className

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

您只需将参数liftX作为X操作而不是Query操作。关键功能是来自X11包的getClassHint,它还提供对windows的其他属性的访问。

答案 1 :(得分:0)

安装wmctrl

sudo apt install wmctrl

并创建一个脚本(在本示例中,第二个工作区(-t 1上是雷鸟):

#!/bin/sh

 (thunderbird &)  & sleep 5 && 
sh -c "wmctrl -i -r `wmctrl -l | grep Thunderbird` -t 1"

要知道您在wmctrl上的应用程序名称,可以通过在终端上点击来查看它:

wmctrl -l

并用脚本中的正确名称替换它。

请对大写字母充满信心(“雷鸟”而非“雷鸟”)!

在3d工作区(-t 2)上使用Firefox的其他示例:

#!/bin/sh
(firefox &)  & sleep 5 && 
sh -c "wmctrl -i -r `wmctrl -l | grep Firefox` -t 2"

奖金:

这是在启动时执行的命令:

sh -c "thunderbird  & sleep 5 && wmctrl -i -r `wmctrl -l | grep Thunderbird` -t 1"

与肉桂一起制作Debain 10。但应该为所有人工作