如何使用其他工作区上的应用程序启动xmonad

时间:2019-05-18 07:57:49

标签: haskell x11 window-managers xmonad

我正在尝试编写一个xmonad.hs,它在启动时会在某些工作区上启动一些应用程序。其中一些应用程序(例如atop)将在终端中运行(urxvt是我的偏好)。

此问题在herehere等问题上曾被问过几次,并在XMonad FAQ上被倾斜了。

但是,这些依赖于:

  1. 使用XMonad.Actions.SpawnOn中的spawnOn,该单位不起作用(使用urxvt进行测试,也使用xclock作为简单示例);它被发送到当前工作区。

  2. 使用spawn prog >> windows $ greedyView <workspace>可以工作,但存在严重的时序问题-例如,如果您连续运行两个工作空间不同的工作空间,则两个编都会最终出现在后一个工作空间上。 FWIW,我尝试使用threaddelay进行协助;即使在生成之间有10秒的延迟,它也没有任何明显的区别(我记得threadDelay以微秒为单位,因此使用了10000000)。

  3. 依赖于对程序使用通用挂钩-这意味着每当我启动它们时,它们就会被发送到给定的工作区中。那不是我想要的我只希望它们在启动时放在那里。

与此相关的是,API不允许我启动应用程序,然后给我对该应用程序/窗口的引用(可能会超时),这让我感到惊讶。这样我就可以放心地将该应用程序/窗口发送到工作区。

任何帮助将不胜感激。

2 个答案:

答案 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。