GNOME_TERMINAL_SCREEN 环境变量是什么?

What is the GNOME_TERMINAL_SCREEN environment variable?

我最近在我的一台计算机上安装了 Ubuntu 20.4 LTS。此版本 Ubuntu 默认使用 gnome 桌面管理器 (3.36.3) 和 gnome-terminal (3.36.2)。

在我打开的每个终端 window 中,GNOME_TERMINAL_SCREEN 环境变量被定义为“/org/gnome/Terminal/screen/some-guid”,其中每个终端 window 的 GUID 都是唯一的。

有人知道这个变量的用途吗?有什么方法可以使用 Xlib 或 XCB 中的 GUID 来识别终端的 X window?

$GNOME_TERMINAL_SCREEN 环境变量包含 D-Bus 的对象路径。
它用于在启动进程时在 Gnome 终端中寻址选项卡,并在其终止时发出信号。

您可以通过运行以下命令查看其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 特定信息.

我找到了一种将进程绑定到 运行ning 的 Gnome 终端的 X window 的方法,但它不太理想。尽管如此,它可能足以满足您的目的。
当打开 Gnome 终端 window 时,我们将生成一个标识值,并将其存储在 Gnome 终端 window 的 X 属性 和环境变量中。 然后我们可以稍后从进程的环境中获取环境变量(如果需要,通过 /proc/<pid>/environ),并扫描 windows 以查找在 X 属性 中具有我们值的变量。

由于在打开新的 Gnome 终端时 window 还不存在,我们不能自己设置 属性,但是 gnome-terminal 命令接受一个选项 --role,并将其值存储在 Gnome 终端 window.
WM_WINDOW_ROLE X 属性 中 purpose of the WM_WINDOW_ROLE X property是为了唯一标识属于同一个客户端的windows。 如果没有 --role,Gnome Terminal 会为其分配一个唯一值,但您可以自己执行此操作。

所以这是一个 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" "$@"

稍后要通过 windows 查找 属性,您可以使用 wmctrl -lxprop