我正在尝试编写一个xmonad.hs,它在启动时会在某些工作区上启动一些应用程序。其中一些应用程序(例如atop
)将在终端中运行(urxvt
是我的偏好)。
此问题在here,here等问题上曾被问过几次,并在XMonad FAQ上被倾斜了。
但是,这些依赖于:
使用XMonad.Actions.SpawnOn
中的spawnOn
,该单位不起作用(使用urxvt
进行测试,也使用xclock
作为简单示例);它被发送到当前工作区。
使用spawn prog >> windows $ greedyView <workspace>
可以工作,但存在严重的时序问题-例如,如果您连续运行两个工作空间不同的工作空间,则两个编都会最终出现在后一个工作空间上。 FWIW,我尝试使用threaddelay进行协助;即使在生成之间有10秒的延迟,它也没有任何明显的区别(我记得threadDelay以微秒为单位,因此使用了10000000)。
依赖于对程序使用通用挂钩-这意味着每当我启动它们时,它们就会被发送到给定的工作区中。那不是我想要的我只希望它们在启动时放在那里。
与此相关的是,API不允许我启动应用程序,然后给我对该应用程序/窗口的引用(可能会超时),这让我感到惊讶。这样我就可以放心地将该应用程序/窗口发送到工作区。
任何帮助将不胜感激。
答案 0 :(得分:1)
安装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。但应该为所有人工作
答案 1 :(得分:0)
您可以通过 startupHook 生成应用,然后使用 manageHook 来处理窗口放置。
manageHook 如:
, className =? "deluge" --> doShift ( myWorkspaces !! 3 )
上述内容实际上会在 Workspace 4 上产生洪水。在我的 startupHook 中,我有
spawnOnce "deluge-gtk" 在启动时启动应用程序。
您可能想要导入 XMonad.Util.SpawnOnce。 doShift 来自默认的 XMonad.ManageHooks 您也可以看看 XMonad.Actions.SpawnOn 但我只使用该模块中的 manageSpawn。