xwidpid
Утилита для X11 использующая расширение Xres для удобноно получения идентификаторов окон WID через идентификатор процесса PID и наоборот для их сопоставления.
Зачем
Существуют разные механизмы сопоставления PID процесса и его окна или окон например wmctrl -lp, но эти утилиты надеятся на то что окно установит _NET_WM_PID и сообщит тем самым свой PID, к сожалению это происходит не всегда. Например запустив glxgears мы легко получим его PID, но зная только его, мы никак не узнаем его WID тоесть не можем сопоставить пару WID/PID. Прямых путей решения этой пробелмы две, первая использовать LD_PRELOAD для перехвата функции создания окна X11 и принудительная установка значения в PID в _NET_WM_PID это надёжный, но хак. Второй способ предложенный Ja-Ja-Hey-Ho это использовать расширение Xres для X11 и кажется это тоже надёжный способ, более однозначный, но это расширение. Но плюсы явности перевешивают плюсы хака. Есть ещё варианты, но они основываются на косвенных данных и работают через раз (перебор окон с нулевым PID возврата от wmctrl -lp).
Зависимости
apt install libxres xorg
Сборка
sudo apt install libxres-dev libx11-dev pkg-config gcc make
make
Установка и удаление
Глобально
sudo make install
sudo make uninstall
Локально
make PREFIX=$HOME/.local install
make PREFIX=$HOME/.local uninstall
Независимо
make DESTDIR=$HOME/some_you_dir install
make DESTDIR=$HOME/some_you_dir uninstall
Использование
Получить список окон принадлежащих процеcсу
xwidpid --pid PIDxwidpid -p PIDxwidpid PID
Получить идентификатор процесса через идентификатор окна
xwidpid --wid WIDxwidpid -w WIDxwidpid WID
Получить список всех пар PID/WID
xwidpid --allxwidpid -axwidpid
PID процесса является просто числом 12345, а WID окна это тоже простое число, но в шестнадцатеричной записи 0x0x320273c, это позволяет различать ввод и не использовать явно ключи -p/-w/--wid/--pid если не хочется.
Коды возврата
0всё хорошо1не найдена параPIDиWID2внутренняя ошибка или плохой аргумент коммандной строки