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

Too*_*rot 8 window-manager i3 window-management

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

Hub*_*leT 9

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

~/.config/i3/config

for_window [class="Galculator" instance="galculator"] floating enable
Run Code Online (Sandbox Code Playgroud)

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

  • 如果我们希望该类的 _all_ 窗口浮动,这很好。我通常发现我没有。 (3认同)

Rap*_*ael 5

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

i3-msg floating enable
Run Code Online (Sandbox Code Playgroud)

这就是您的配置行所做的。

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

i3-msg floating enable
Run Code Online (Sandbox Code Playgroud)

注意事项:

  • 如果应用程序本身确实获得了焦点,那么等待它发生就足够了。有关确定当前聚焦窗口的方法,请参见此处
  • 我没有完成它,但应该可以扩展脚本以将焦点返回到我们更改它之前的位置。
  • wmctrl不能总是找出所有窗口的PID;例如,ImageMagick 的列表中display总是有 PID 0。有关使用窗口标题的修改方法,请参见此处
  • 将上述解决方案的显着部分包装在脚本中,应该可以编写类似

    exec our_command; grab_focus; floating enable
    
    Run Code Online (Sandbox Code Playgroud)

    在 i3 配置中。


Suu*_*hgi 5

我想总结HubbleT 的帖子以及其他一些肮脏的解决方法添加的信息:


TLDR:附加&& 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 的第二部分)。使用特殊值focused来匹配与当前聚焦窗口具有相同窗口类的所有窗口。

实例

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

但还有更多,比如titleor id

标题

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

ID

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

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

for_window [ title="uniquetitle" ] floating enable
Run Code Online (Sandbox Code Playgroud)

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

termite -e emacsclient -t uniquetitle
Run Code Online (Sandbox Code Playgroud)

直接以浮动模式打开。

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

bindsym $mod+button exec program && xdotool getactivewindow set_window --name uniquetitle
Run Code Online (Sandbox Code Playgroud)

或不太脏

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