gparted обфчно через оболочки вызывается. Их не так много: kdesu, kdesudo и какие-то ещё. В любом случае они должны писать в журнал, дескать «запущен процесс такой-то с такими-то правами». Найти окно по процессу проще, чем в цикле перебирать все окна, бессмысленно приближая тепловую смерть вселенной.
Однако имей в виду, что приложение может быть запущено на другом хосте, а показывается у тебя на компе. Поэтому надо еще выяснить, где приложение физически запущено (свойство окна WM_CLIENT_MACHINE).
Я вот не совсем верно сказал. Не WM должен поддерживать EWMH, а приложение, то есть клиент. А это не всегда так, между прочим. Свойство WM_CLIENT_MACHINE предписано ICCCM и вроде должно всегда быть установленным, то есть хост ты всегда обнаружить можешь. А вот _NET_WM_PID не всегда будет установленным. Старые приложения на старых тулкитах или на собственных тулкитах могут это свойство не устанавливать. Вот, например, xpdf (на lesstif), emacs с тулкитом xaw3d не устанавлиает. И tk тоже. Только что проверил. Поэтому надо что-то еще придумать на этот случай.
Эти должны выставлять, да. А что касается старых, то надо подумать, как отследить, чье окно. Любой клиент соединяется с X-сервером. Единственное, что мы знаем об окне всегда — название и его window id. Можно ли отследить по цепочке, какое из копий приложения каким окном владеет в случае, если _NET_WM_PID не установлено, надо подумать. За секунду решения не могу придумать.
Есть еще одна тема, но я никогда раньше не пробовал и информации мало. Если сервер поддерживает X-Resourse Extension 1.2, то там есть запрос xcb_res_query_client_ids, который возвращает LocalClientPID.
The LocalClientPid type of IDs are included in the reply list only if
the client executing the request asked for it and was also a local
client itself. It doesn't make sense for remote clients to ask PIDs of
local clients.
Если эта штука работает, то ее можно совместно с xcb_get_property использовать. Для начала надо проверить, какая версия X-Resource Extension на сервере (есть специальный запрос xcb, который позволяет выяснить версию расширения). Если вовзратит 1.0, то уже xcb_res_query_client_id не использовать, так как она только в 1.2 появилась. Тогда надо фолбэк делать на xcb_get_property и проверять через _NET_WM_PID. Может быть, есть смысл делать наоборот: сначала через _NET_WM_PID, а потом уже, если не установлен там PID, через xcb_res_query_client_ids (с проверкой версии расширения). Сейчас не могу сказать точно, какой метод надежнее. _NET_WN_PID установливается приложением или тулкитом. Там, где тулкит это не делает, там свойство должно устанавливаться специально. Вот, например, xterm хоть и не gtk/qt, но свойство устанавливает.
Если в обоих случаях пусто, то надо думать какую-то эвристику, но думаю, что это такая эвристика не будет надежной.
Есть утилита xrestop, которая использует X-Resource Extension, но она PID берет через _NET_WM_PID, а не через xcb_res_query_client_ids. Вполне возможно, что это из-за того, что этого запроса еще к моменту написания утилиты не было. Не могу точно сказать. Но проверить надо!
И это попробую, но я не знаю, есть ли у меня vapi на это дело.
Это что имеется в виду? Реализован ли запрос в xcb из твоей поставки?