#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
.