在i3的浮动窗口中打开程序

在i3的浮动窗口中打开程序

我想在浮动窗口中打开一个程序。我尝试过 exec emacsclient -c ; floating enable,但这使得浮动之前处于活动状态的窗口,而不是新窗口。

答案1

这就是我为我的 Galculator 应用程序所做的:

〜/.config/i3/config

for_window [class="Galculator" instance="galculator"] floating enable

要了解您的 class="..." 和 instance=".​​.." 中的内容,请输入xprop在终端中,然后单击要浮动的窗口。您将在底部 WM_CLASS(STRING)="instance", "Class" 下的某个位置找到该信息。

答案2

使当前聚焦的窗口在 i3 中浮动的正确方法是运行

i3-msg floating enable

这就是您的配置行的作用。

现在的问题是i3-msg在窗口获得焦点之前运行(如果它甚至获得焦点)。彼得·O. 解释说在这里如何根据窗口的 PID 获得焦点。我们可以这样使用它:

our_application &
pid="$!"

# Wait for the window to open and grab its window ID
winid=''
while : ; do
    winid="`wmctrl -lp | awk -vpid=$pid '$3==pid {print $1; exit}'`"
    [[ -z "${winid}" ]] || break
done

# Focus the window we found
wmctrl -ia "${winid}"

# Make it float
i3-msg floating enable > /dev/null;

# Move it to the center for good measure
i3-msg move position center > /dev/null;

# Wait for the application to quit
wait "${pid}";

注意:

  • 如果应用本身就可以抓住焦点,只需等待这种情况发生就足够了。看这里了解确定当前焦点窗口的方法。
  • 我没有完成它,但应该可以扩展脚本以将焦点返回到我们更改它之前的位置。
  • wmctrl不能总是找出所有窗口的PID;display例如,ImageMagick 的列表中始终包含 PID 0。看这里对于使用窗口标题的修改方法。
  • 将上述解决方案的重要部分包装在脚本中,应该可以编写类似的内容

    exec our_command; grab_focus; floating enable
    

    在 i3 配置中。

答案3

我想总结一下哈勃望远镜后其他一些肮脏的解决方法添加了信息:


总长DR:附加&& i3-msg "[id=$(xdotool getactivewindow)] floating enable"到您的快捷方式定义(需要xdotool)。例如bindsym $mod+button exec program && i3-msg "[id=$(xdotool getactivewindow)] floating enable"


您可以设置规则全部与可在 i3-config 中设置的条件列表匹配的窗口,或者等效地使用i3-msg.

语法是for_window [ criteria ] command.您可以阅读更多相关内容这里。如果您希望它仅在单个窗口上工作,您可以确保您的标准的唯一性。

不只是有

班级

比较窗口类(WM_CLASS 的第二部分)。使用特殊值专注的匹配与当前焦点窗口具有相同窗口类的所有窗口。

实例

比较窗口实例(WM_CLASS 的第一部分)。使用特殊值专注的匹配与当前焦点窗口具有相同窗口实例的所有窗口。

但还有更多,比如titleor id

标题

比较 X11 窗口标题(_NET_WM_NAME 或 WM_NAME 作为后备)。使用特殊值 __focused__ 来匹配与当前聚焦窗口具有相同窗口标题的所有窗口。

ID

比较 X11 窗口 ID,例如您可以通过 xwininfo 获取该 ID。

假设emacsclient是一个命令行程序,您可以因此添加

for_window [ title="uniquetitle" ] floating enable

到你的 i3 配置并使用打开你最喜欢的终端

termite -e emacsclient -t uniquetitle

直接以浮动模式打开。

如果它不是命令行程序并且没有标题选项,您可以使用其他标准或例如(使用xdotooli3-msg):

bindsym $mod+button exec program && xdotool getactivewindow set_window --name uniquetitle

或不太脏

bindsym $mod+t exec program && i3-msg "[id=$(xdotool getactivewindow)] floating enable"

答案4

对 termnml 的答案进行一个小调整使其对我有用。完整的工作结果现在如下:

bindsym $mod+Shift+Return exec --no-startup-id urxvt --class floating
for_window [class="floating"] floating enabled

相关内容