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 PID
xwidpid -p PID
xwidpid PID
Получить идентификатор процесса через идентификатор окна
xwidpid --wid WID
xwidpid -w WID
xwidpid WID
Получить список всех пар PID/WID
xwidpid --all
xwidpid -a
xwidpid
PID
процесса является просто числом 12345
, а WID
окна это тоже простое число, но в шестнадцатеричной записи 0x0x320273c
, это позволяет различать ввод и не использовать явно ключи -p
/-w
/--wid
/--pid
если не хочется.
Коды возврата
0
всё хорошо1
не найдена параPID
иWID
2
внутренняя ошибка или плохой аргумент коммандной строки