Что такое переменная среды GNOME_TERMINAL_SCREEN?

#gnome #gnome-terminal

#гном #gnome-терминал #gnome

Вопрос:

Недавно я установил Ubuntu 20.4 LTS на один из своих компьютеров. В этом выпуске Ubuntu по умолчанию используется gnome desktop manager (3.36.3) с gnome-terminal (3.36.2).

В каждом окне терминала, которое я открываю, переменная среды GNOME_TERMINAL_SCREEN определяется как «/org / gnome/Terminal/screen /some-guid», где GUID каждого окна терминала уникален.

Кто-нибудь знает, для чего предполагается использовать эту переменную? Есть ли какой-нибудь способ использовать GUID в Xlib или XCB для идентификации X-окна терминала?

Ответ №1:

$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 Terminal не предоставляет никакой специфичной для X информации через D-Bus.

Я нашел один способ привязать процесс к X window терминала Gnome, в котором он запущен, но он далек от идеального. Тем не менее, этого может быть достаточно для ваших целей.
Идея в том, что при открытии окна терминала Gnome мы будем генерировать идентифицирующее значение и сохранять его как в свойстве X окна терминала Gnome, так и в переменной среды. Затем мы можем позже получить переменную среды из среды процесса (через /proc/<pid>/environ , если необходимо) и просканировать окна на предмет той, которая имеет наше значение в свойстве X.

Поскольку окно еще не существует при открытии нового терминала Gnome, мы не можем установить свойство самостоятельно, но gnome-terminal команда принимает параметр --role и сохраняет его значение в WM_WINDOW_ROLE свойстве X окна терминала Gnome.
Назначение WM_WINDOW_ROLE свойства X — однозначно идентифицировать окна, принадлежащие одному и тому же клиенту. Без --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 -l и xprop .