LINUX.ORG.RU

Ответ на: комментарий от ziemin

Мне надо все sudo окна определять независимо от источника. Просто тут gparted юзал, вот и написался. Хочу допилить свое appmenu поддержкой sudo окон.

Athor ★★
() автор топика
Ответ на: комментарий от Athor

gparted обфчно через оболочки вызывается. Их не так много: kdesu, kdesudo и какие-то ещё. В любом случае они должны писать в журнал, дескать «запущен процесс такой-то с такими-то правами». Найти окно по процессу проще, чем в цикле перебирать все окна, бессмысленно приближая тепловую смерть вселенной.

ziemin ★★
()

Возможно, не то, но через X получаешь PID окна, а по PID смотришь UID. Если 0 - вот тебе и sudo-окно.
[зануда]кроме sudo, есть su -c[/зануда]

DeadEye ★★★★★
()
Ответ на: комментарий от Athor

а ничего, что окно может быть с другого хоста? и с какими привилегиями запущен приклад, X11 в общем случае не знает.

MKuznetsov ★★★★★
()
Ответ на: комментарий от DeadEye

Попробую. Я хочу при рутовом окне пускать рутового регистратора и у него менюшки брать.

Athor ★★
() автор топика
Ответ на: комментарий от MKuznetsov

На привилегии мне с высокой башни, мне нужно dbus того юзверя, от которого окно.

Athor ★★
() автор топика
Ответ на: комментарий от DeadEye

PID окна я получил через xprop, но уверен, его можно и через xcb.

Можно. Если только WM поддерживает NETWM (EWMH).

Узнать можно через xcb_get_property. А property называется _NET_WM_PID.

http://standards.freedesktop.org/wm-spec/1.3/ar01s05.html

Однако имей в виду, что приложение может быть запущено на другом хосте, а показывается у тебя на компе. Поэтому надо еще выяснить, где приложение физически запущено (свойство окна WM_CLIENT_MACHINE).

Zubok ★★★★★
()
Ответ на: комментарий от Athor

Я вот не совсем верно сказал. Не WM должен поддерживать EWMH, а приложение, то есть клиент. А это не всегда так, между прочим. Свойство WM_CLIENT_MACHINE предписано ICCCM и вроде должно всегда быть установленным, то есть хост ты всегда обнаружить можешь. А вот _NET_WM_PID не всегда будет установленным. Старые приложения на старых тулкитах или на собственных тулкитах могут это свойство не устанавливать. Вот, например, xpdf (на lesstif), emacs с тулкитом xaw3d не устанавлиает. И tk тоже. Только что проверил. Поэтому надо что-то еще придумать на этот случай.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Athor

Мне qt/gtk надо только, МБ java.

Эти должны выставлять, да. А что касается старых, то надо подумать, как отследить, чье окно. Любой клиент соединяется с X-сервером. Единственное, что мы знаем об окне всегда — название и его window id. Можно ли отследить по цепочке, какое из копий приложения каким окном владеет в случае, если _NET_WM_PID не установлено, надо подумать. За секунду решения не могу придумать.

Zubok ★★★★★
()

Есть еще одна тема, но я никогда раньше не пробовал и информации мало. Если сервер поддерживает X-Resourse Extension 1.2, то там есть запрос xcb_res_query_client_ids, который возвращает LocalClientPID.

http://www.x.org/releases/X11R7.7/doc/resourceproto/resproto.txt

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.

Zubok ★★★★★
()
Ответ на: комментарий от Athor

Если эта штука работает, то ее можно совместно с 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 из твоей поставки?

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.