如何在其他工作区启动xmonad并打开应用程序

4
我尝试编写一个xmonad.hs文件,在启动时在一些工作区启动一些应用程序。其中一些应用程序(例如atop)将在终端中运行(我更喜欢的是urxvt)。
这个问题以前已经被问过几次,例如这里这里,并且在XMonad FAQ上也有间接提到。
然而,这些依赖于:
1. 使用来自XMonad.Actions.SpawnOnspawnOn,它根本不起作用(使用urxvt进行测试,以及xclock作为简单的示例);它被发送到当前工作区。 2. 使用spawn prog >> windows $ greedyView <workspace>,这种方法有重大的时间问题——例如,如果您连续运行两个具有不同工作区的程序,则这两个程序都会出现在后一个工作区。就我而言,我尝试使用threaddelay来帮助;即使在间隔为10秒的情况下(我记得threadDelay是以微秒为单位的,所以使用了10000000),它也没有产生任何明显的差异。 3. 依赖通用挂钩来启动程序——这意味着无论何时启动它们,它们都会被发送到给定的工作区。这不是我想要的;我只想在启动时将它们放在那里。
相关地,API让我惊讶的是,它不允许我启动一个应用程序,然后给我一个对该应用程序/窗口的引用(潜在地带有超时);以便我可以有信心将该应用程序/窗口发送到一个工作区。
非常感谢任何帮助。

2
看起来 spawnOn 正是你所需要的。我建议你去调查一下为什么它不工作。或许可以提出另一个问题,同时提供 MVCE(https://stackoverflow.com/help/reprex)? - Chris Stryczynski
你能发一下你的代码吗? - justsomeguy
2个回答

2

安装wmctrl

sudo apt install wmctrl

并创建一个脚本(在此示例中,将Thunderbird放置在第二个工作区(-t 1)):

#!/bin/sh

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

要知道 wmctrl 上的应用程序名称,您可以在终端上输入以下命令来查看它:
wmctrl -l

将其替换为脚本中的正确名称。

注意大写字母(应为“Thunderbird”,而非“thunderbird”)!!

另一个示例是在第三个工作区中使用 Firefox(-t 2):

#!/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"

在Debian 10上使用Cinnamon。但应适用于所有情况。


1
你可以通过startupHook来启动应用程序,然后使用manageHook来处理窗口位置。
例如,manageHook:
, className =? "deluge" --> doShift ( myWorkspaces !! 3 )

上面的代码会在 Workspace 4 上启动 deluge。在我的 startupHook 中,我使用 spawnOnce "deluge-gtk" 来启动应用程序。
您需要导入 XMonad.Util.SpawnOnce。doShift 是来自默认的 XMonad.ManageHooks。您还可以查看 XMonad.Actions.SpawnOn,但我只使用该模块中的 manageSpawn。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接