我最近在我的一台计算机上安装了 Ubuntu 20.4 LTS。此版本的 Ubuntu 默认使用 gnome 桌面管理器 (3.36.3) 和 gnome-terminal (3.36.2)。
在我打开的每个终端窗口中,GNOME_TERMINAL_SCREEN 环境变量被定义为“/org/gnome/Terminal/screen/some-guid”,其中每个终端窗口的 GUID 都是唯一的。
有谁知道这个变量的用途是什么?有没有办法使用Xlib或XCB中的GUID来识别终端的X窗口?
$GNOME_TERMINAL_SCREEN
环境变量包含 D-Bus 的对象路径。运行以下命令即可看到其D-Bus接口的相关部分:
dbus-send --session --type=method_call --print-reply \
--dest=org.gnome.Terminal "$GNOME_TERMINAL_SCREEN" \
org.freedesktop.DBus.Introspectable.Introspect
输出(为了相关性而进行剪裁):
[...]
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<!-- GDBus 2.64.6 -->
<node>
[...]
<interface name="org.gnome.Terminal.Terminal0">
<method name="Exec">
<arg type="a{sv}" name="options" direction="in"/>
<arg type="aay" name="arguments" direction="in"/>
</method>
<signal name="ChildExited">
<arg type="i" name="exit_code"/>
</signal>
</interface>
</node>
如果运行
dbus-monitor
并打开和关闭 Gnome 终端选项卡,您可以看到正在运行的 D-Bus 通信。
X Window 系统不知道 D-Bus 领域中发生了什么,据我所知,Gnome 终端不会通过 D-Bus 公开任何 X 特定信息。
我找到了一种将进程绑定到运行该进程的 Gnome 终端的 X 窗口的方法,但它不太理想。尽管如此,它可能足以满足您的目的。
这个想法是,当打开 Gnome 终端窗口时,我们将生成一个标识值,并将其存储在 Gnome 终端窗口的 X 属性和环境变量中。
然后,我们可以稍后从进程的环境中获取环境变量(如果需要,可以通过
/proc/<pid>/environ
),并扫描窗口以查找 X 属性中具有我们的值的变量。
由于打开新的 Gnome 终端时窗口还不存在,我们无法自己设置属性,但是
gnome-terminal
命令接受选项 --role
,并将其值存储在 Gnome 的 WM_WINDOW_ROLE
X 属性中终端窗口。WM_WINDOW_ROLE
X 属性的目的是唯一标识属于同一客户端的窗口。 如果没有
--role
,Gnome 终端会为其分配一个唯一的值,但您可以自己执行此操作。
所以这是一个
start-gnome-terminal
包装器,您可以从通常启动的键绑定中调用它 gnome-terminal
:
#!/bin/sh
FINDWIN_ROLE=findwin-role-$(xxd -p -l 16 < /dev/urandom)
export FINDWIN_ROLE
exec gnome-terminal --role "$FINDWIN_ROLE" "$@"
稍后要通过窗口查看该属性,您可以使用
wmctrl -l
和 xprop
。
如果您执行命令
gnome-terminal --tab
打开新选项卡(注意:如果这是您的默认选项而不是打开新窗口,则不需要 --tab
),并且如果您从已运行的 gnome 终端执行此命令,然后新选项卡将出现在同一窗口中。
由于一次可以打开多个 gnome 终端窗口,因此必须有一种方法来知道要求从哪个终端打开新窗口。这是通过此环境变量完成的。
我不确定现在还有其他用途。将来它可以用于例如更改选项卡配置文件的命令行解决方案,恕我直言,这将非常有用。