【问题标题】:How to start up xmonad with apps on other workspaces如何使用其他工作区上的应用程序启动 xmonad
【发布时间】:2019-10-05 09:57:24
【问题描述】:

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

这已被问过几次,例如herehere,并在XMonad FAQ 上被间接提及。

但是,这些依赖于:

  1. 使用来自XMonad.Actions.SpawnOnspawnOn,哪个平面不起作用(以urxvtxclock 为例进行测试);它被发送到当前工作区。

  2. 使用spawn prog >> windows $ greedyView <workspace>,这有点工作,但有主要的时间问题 - 例如,如果你连续运行两个,使用不同的工作区,两个 progs 最终都在后一个工作区。 FWIW,我尝试使用 threaddelay 来辅助;它没有任何明显的区别,即使产生之间有 10 秒的延迟(我记得 threadDelay 以微秒为单位,因此使用了 10000000)。

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

令我惊讶的是,API 不允许我启动一个应用程序,然后给我一个对该应用程序/窗口的引用(可能会超时);以便我可以放心地将该应用程序/窗口发送到工作区。

任何帮助将不胜感激。

【问题讨论】:

  • 看来spawnOn 正是您所需要的。我只想调查为什么这不起作用。可能会问另一个问题并提供 MVCE (stackoverflow.com/help/reprex)?
  • 你能发布你的代码吗?

标签: haskell x11 window-managers xmonad


【解决方案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

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

注意大写字母(“Thunderbird”而不是“thunderbird”)!!

在 3d 工作区上使用 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"

使用 Cinnamon 开发 Debain 10。但应该适用于所有人

【讨论】:

    【解决方案2】:

    您可以通过 startupHook 生成应用程序,然后使用 manageHook 处理窗口放置。

    manageHook 如:

    , className =? "deluge" --> doShift ( myWorkspaces !! 3 )
    

    上面的内容实际上会在 Workspace 4 上产生洪水。在我的 startupHook 中我有

    spawnOnce "deluge-gtk" 在启动时启动应用程序。

    您可能想要导入 XMonad.Util.SpawnOnce。 doShift 来自默认的 XMonad.ManageHooks 您也可以查看 XMonad.Actions.SpawnOn 但我只使用该模块中的 manageSpawn。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-06
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      相关资源
      最近更新 更多