i3:如何在指定工作区启动启动时间较长的程序

i3:如何在指定工作区启动启动时间较长的程序

是否可以在我的 i3 启动文件中专门配置一个桌面来启动一个程序,但只在那里启动一次,而不通常将该程序分配给该桌面。

我知道存在一个解决方案,即涉及更改到另一个工作区,但这给我留下了一个主要问题:一旦我有一个具有“非即时”启动时间的程序,该程序就会出现在我切换到的最后一个工作区中,而不是出现在我希望它在的工作区中。

具体来说,在我当前的启动文件中,我做了一个解决方法,涉及将atom(这是困扰我的atm程序)分配给工作区9,目前还可以,但从长远来看是不可取的:

assign [class="Atom"] $workspace9
exec atom

exec --no-startup-id i3-msg 'workspace $workspace9; exec 
/usr/bin/urxvt'
#exec --no-startup-id i3-msg 'workspace $workspace9; exec /usr/bin/atom'
exec --no-startup-id i3-msg 'workspace $workspace1; exec /usr/bin/urxvt'

我希望获得对atom的注释调用,以所需的方式执行并完全放弃赋值方法。

我实际上并不认为这是相关的,但以防万一:我运行 Manjaro-Linux,它基于 Arch。

编辑:以下代码片段有效,但仍然使这个问题悬而未决,因为它限制我最后打开atom并在该桌面上启动我的会话:

#assign [class="Atom"] $workspace9
#exec atom

exec --no-startup-id i3-msg 'workspace $workspace9; exec 
/usr/bin/urxvt'
exec --no-startup-id i3-msg 'workspace $workspace1; exec /usr/bin/urxvt'
exec --no-startup-id i3-msg 'workspace $workspace9; exec /usr/bin/atom'

这也有一个显着的缺点,即它不允许多个程序在不同的工作空间上启动,如果它们表现出与atom相同的行为。

答案1

等待窗口出现,然后将其发送到原始工作区:

#!/bin/bash

activeworkspace=$(i3-msg -t get_workspaces | jq -c '.[] | select(.focused) | .name' --raw-output)
atom &
windowname=atom
xprop -spy -root _NET_ACTIVE_WINDOW | \
  while read line ; do 
      if xprop WM_CLASS -id ${line##* } | grep -q $windowname ; then
          i3-msg move "[con_id=\"${line##* }\"]" $activeworkspace
          exit
      fi
  done
  • 首先获取活动工作区,jq作为示例
  • 在后台运行您的程序:atom &
  • 用于xprop -spy“永远检查窗口属性,查找属性更改事件。”
  • 对所有新的活动窗口进行操作while read line
  • 使用 获取它们的 WM_CLASS xprop WM_CLASS,使用 bash 提取 windowid${line##* }
  • 过滤器grep $windowname
  • 将窗口移动到原始工作区i3-msg move ..

您应该停留在活动工作区上,并且该工作区上的窗口应该获得焦点。

当您有多个原子窗口并且在新原子窗口的开始和移动之间获得焦点时,它不起作用。在这种情况下,您必须查找 NET_WM_PID 原子而不是 WM_CLASS。

答案2

如果您希望始终在特定工作区上打开特定程序(例如 Atom),您可以使用 中描述的分配类功能i3 用户文档

从您的终端运行xprop,然后单击窗口(例如,Firefox)以查看它属于哪个类。寻找WM_CLASS(STRING)

然后,就像将以下行放入 .config 文件中一样简单:

assign [class="Firefox"] 2 

不要忘记使用(默认)重新启动您的实例$Mod + Shift + r

现在,无论我何时何地运行 Firefox,它都将始终在工作区 2 上打开。您可以使用 Atom 执行相同的操作,这样您就可以随时随地启动桌面。

答案3

您注释掉的调用确实适用于支持启动通知的应用程序 - 事实上,“在工作区 3 上启动iceweasel(一次)”示例用户手册有几乎相同的exec命令:

exec --no-startup-id i3-msg 'workspace 3; exec iceweasel; workspace 1'

然而原子好像不支持启动通知所以你需要继续使用该assign方法。

相关内容