什么是 GNOME_TERMINAL_SCREEN 环境变量?

Die*_*nte 5 gnome gnome-terminal

我最近在我的一台计算机上安装了 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 窗口?

Svd*_*vdB 1

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

您可以通过运行以下命令查看其D-Bus接口的相关部分:

dbus-send --session --type=method_call --print-reply \
        --dest=org.gnome.Terminal "$GNOME_TERMINAL_SCREEN" \
        org.freedesktop.DBus.Introspectable.Introspect
Run Code Online (Sandbox Code Playgroud)

输出(为了相关性而进行剪裁):

[...]
<!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>
Run Code Online (Sandbox Code Playgroud)

如果您运行dbus-monitor并打开和关闭 Gnome 终端选项卡,您可以看到正在运行的 D-Bus 通信。

X Window 系统不知道 D-Bus 领域中发生了什么,并且据我所知,Gnome Terminal 不会通过 D-Bus 公开任何 X 特定信息。

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

由于打开新的 Gnome 终端时该窗口还不存在,因此我们无法自己设置属性,但该gnome-terminal命令接受一个 option --role,并将其值存储在WM_WINDOW_ROLEGnome 终端窗口的 X 属性中。X 属性的目的
是唯一标识属于同一客户端的窗口。如果没有,Gnome 终端会为其分配一个唯一的值,但您可以自己执行此操作。WM_WINDOW_ROLE--role

所以这里是一个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" "$@"
Run Code Online (Sandbox Code Playgroud)

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