- XLib: Собираем информацию об окнах в Linux
- Реализация
- Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- Re: Как в bash получить список заголовков открытых окон?
- список окон xlib
XLib: Собираем информацию об окнах в Linux
Поставим задачу: создать Linux-приложение, которое находит все окна графической оболочки и выводит для них заголовки, координаты (положение на экране) и размер (высоту и ширину).
Решение: используем возможности библиотеки XLib , а именно ее функции: XGetWindowProperty() и XGetWindowAttributes() .
- Открываем экран по умолчанию;
- Находим идентификаторы всех окон с помощью XGetWindowProperty() (создадим вспомогательную функцию findWindows() ;
- Для каждого окна определяем заголовок с помощью той же функции XGetWindowProperty() (создаем функцию getWindowName() ). Дополнительно запрашиваем атрибуты окна (координаты и размер) с помощью XGetWindowAttributes() .
Пример вывода для окна браузера Chromium :
Реализация
Несколько замечаний по реализации:
- Для успешной сборки проекта необходимо подключить библиотеку X11 : LIBS += -lX11 ;
- Не все окна выдают свое имя в формате UTF-8 , поэтому в качестве запасного варианта мы запрашиваем хоть какой-то идентифицирующий окно текст, вызывая XGetWindowProperty() с параметром WM_NAME ;
- Для вывода текста в формате UTF-8 на консоль Linux не забываем настроить кодировку приложения setlocale( LC_ALL, «» ) ;
- Координаты левого верхнего угла окна (без учета рамки), которые возвращает XGetWindowAttributes() , отложены в системе координат самого этого окна, но нас интересуют абсолютные координаты окна на экране. Поэтому мы выполняем преобразование точки (x; y) в систему координат родительского окна с помощью XTranslateCoordinates() .
Как в bash получить список заголовков открытых окон?
Хочу, чтобы каждые 15 минут, при наличии некоторых характерных заголовков, типа «Последние сообщения» или «Последние 50 комментариев пользователя KRoN73», выдавался zenity —warning —text «Хватит страдать хернёй» 🙂
Re: Как в bash получить список заголовков открытых окон?
apt-get install wmctrl
wmctrl — control an EWMH/NetWM compatible X Window Manager
Re: Как в bash получить список заголовков открытых окон?
xwininfo -root -tree
Re: Как в bash получить список заголовков открытых окон?
>xwininfo -root -tree
Ага, то, что надо 🙂
Re: Как в bash получить список заголовков открытых окон?
Re: Как в bash получить список заголовков открытых окон?
на быстром инете шанс срабатывания невелик.
Re: Как в bash получить список заголовков открытых окон?
Re: Как в bash получить список заголовков открытых окон?
Тут другая херня. zenity почему-то не вызывается из cron’а :-/ DISPLAY=:0 не помогает.
Re: Как в bash получить список заголовков открытых окон?
>на быстром инете шанс срабатывания невелик.
На 7.5Мегабитах почти нулевой. Коннекты к lor обнаружены не были 🙂
Re: Как в bash получить список заголовков открытых окон?
А кронтаб твой или рута?
Re: Как в bash получить список заголовков открытых окон?
Re: Как в bash получить список заголовков открытых окон?
Re: Как в bash получить список заголовков открытых окон?
Етить. А я всю жизнь while[1] пишу 😀
Re: Как в bash получить список заголовков открытых окон?
может, он из кронтаба переменные не парсит?
env DISPLAY=:0 zenity —warning —text «Хватит страдать хернёй»
Re: Как в bash получить список заголовков открытых окон?
и даже с полными путями на всякий случай можно
Re: Как в bash получить список заголовков открытых окон?
> env DISPLAY=:0 zenity —warning —text «Хватит страдать хернёй»
zenity —display :0
Re: Как в bash получить список заголовков открытых окон?
May 30 16:54:01 [cron] (balancer) CMD (/home/balancer/bin/check-hernya.sh) May 30 16:54:01 [cron] (balancer) MAIL (mailed 1085 bytes of output but got status 0x0001_) May 30 16:55:01 [cron] (root) CMD (/usr/local/bin/cron/1m) May 30 16:55:01 [cron] (balancer) CMD (/home/balancer/bin/check-hernya.sh) May 30 16:55:01 [cron] (balancer) MAIL (mailed 1085 bytes of output but got status 0x0001_)
Осталось найти, куда он mailed эти bytes 🙂 У меня на десктопе никакой почтовой системы не развёрнуто, .mail* в домашних каталогах отсутствует, /var/spool/mail/ пуст. 🙂
Re: Как в bash получить список заголовков открытых окон?
May 30 16:58:02 [sSMTP] Unable to locate mail
May 30 16:58:02 [sSMTP] Cannot open mail:25
Куда б теперь это засунуть.
Re: Как в bash получить список заголовков открытых окон?
> but got status 0x0001_
Видимо в /dev/null.
Re: Как в bash получить список заголовков открытых окон?
netstat -antc | grep ‘217.76.32.61:80’
Re: Как в bash получить список заголовков открытых окон?
>zenity почему-то не вызывается из cron’а :-/ DISPLAY=:0 не помогает
в самом zenity есть опция —display, вот ее и надо использовать
Re: Как в bash получить список заголовков открытых окон?
>Куда б теперь это засунуть.
Если cron при выполнении задания ничего не увидел в STDOUT и STDERR почту он не шлет.
Можно этого избежать если в crontab’e строчку с заданием закончить &>/dev/null, но переменной SHELL в crontab’e желательно присвоить значение bash, во избежание неожиданностей.
Re: Как в bash получить список заголовков открытых окон?
Ларчик просто открывался 🙂
xwininfo: unable to open display »
if [[ `xwininfo -root -tree|grep -P ‘»Последние сообщения»|»Последние 50 комментариев|»Форумы Balancer’|wc -l` > 0 ]]; then zenity —warning —text «Давай, работай. » fi
Теперь в логе пусто, но всё равно ничего не выводится 🙂 (вариант /usr/bin/zenity и -display :0 пробовал).
При запуске вручную всё срабатывает. Даже когда запускается по ssh с другой машины.
Re: Как в bash получить список заголовков открытых окон?
список окон xlib
Братцы, нужно получить список окон.
Получаю вот это: segmentation fault (core dumped).
Подскажите чего не так?
google: xlib query windows
дружище, ты можешь сказать почему не работает или нет?
и как надо сделать чтоб заработало?
Примерно следующим образом:
если пишешь кейлоггер то уже есть готовые =)
объясни пожалуйсто, что значит эта чатсть кода:
The XFetchName() function returns the name of the specified window. If it succeeds, it returns a nonzero status; otherwise, no name has been set for the window, and it returns zero. If the WM_NAME property has not been set for this window, XFetchName() sets window_name_return to NULL. If the data returned by the server is in the Latin Portable Character Encoding, then the returned string is in the Host Portable Character Encoding. Otherwise, the result is implementation dependent. When finished with it, a client must free the window name string using XFree().
Не у всех Х-окон есть имя(заголовок). В таких случаях XFetchName кладет NULL в name, и возвращает 0. Падает printf(«%s\n», NULL).
И на name надо говорить XFree. (man XFetchName)
Спасибо, последний вариант работает!
Обнаружил интересную вещь. У мне открыт ELK терминал. И вверху у этого окна собственно и написано «ELK терминал», я всегда думал что это и есть заголовок, но программа выводит, что заголовок у нее «elk-wm». А чем тогда является надпись на окне «ELK терминал» и как мне ее получить?
Может это название у потомка не корневого окна ?
получить то его как?
Пройтись по массиву cw. Написать ?
Давай. Оч поможешь!
А что вы делаете ?
вообще задача такая:
есть программа (сетевая). когда нам по ней приходит сообщение, появляется окошко «вам пришло сообщение».
Нужно сделать так, чтоб когда это окошко появляется, это дело фиксировалось и проигрывался какой-либо аудиофайл для привлечения внимания.
devilspie спасет отца демократии.
UPD. Или не спасет. Что-то я был уверен, что там есть запуск программ и скриптов, если сработало правило. Но что-то не вижу.
UPD. Или не спасет. Что-то я был уверен, что там есть запуск программ и скриптов, если сработало правило. Но что-то не вижу.
А, нет. кажется, спасет. Надо проверить, то ли это.
UPD: Работает! У себя проверил. По правилу запускает нужную команду.
Спасибо за совет, но охото уже добить то что есть.
Как все таки быть вот с этим:
Обнаружил интересную вещь. У мне открыт ELK терминал. И вверху у этого окна собственно и написано «ELK терминал», я всегда думал что это и есть заголовок, но программа выводит, что заголовок у нее «elk-wm». А чем тогда является надпись на окне «ELK терминал» и как мне ее получить?
Если честно, то не имею возможности разбираться, что у тебя там не так. Это глупо заниматься программазмом, когда для твоей задачи есть готовые средства. Задача решается за минуту. К тому же, твоя программа не будет работать в фоне, она не умеет перехватывать события открытия и создания окон. Как ты там собираешься делать — одному Патрегу известно. Каждую секунду программу вызывать? 🙂
А чем тогда является надпись на окне «ELK терминал» и как мне ее получить?
Ну вот откуда нам знать? Набираешь в терминале xprop? жмешь в окошко с этим ELK, вывод вываливаешь сюда (или, если вывод длинный очень, то на pastebin.com).
WM_NAME(COMPOUND_TEXT) = «ELK терминал»
Значит, elk-wm имя какого-то другого окна в иерархии. Да и из названия видно, что ты получил имя какого-то окна оконного своего менеджера ELK (или что там). Это не имя терминала и это не окно терминала. Вот и все. Значит, до окна «ELK Терминал» надо лезть еще ниже по иерархии. Значит, на первом уровне иерархии после RootWindow терминала твоего нет. В общем, фигней ты занимаешься.
Обходит все окна. Печатает имя, если есть.
Спасибо за помощь!
Нет, программа другая — «юпитер».
Очень дорогой обход. Надо прекращать поиск вглубь, когда найдено первое окно, у которого WM_STATE есть, а дальше уже не погружаться. Иерархия в теории может быть очень большой, а искать по ней всей смысла никакого нет, так как там будут окна виджетов. Тем не менее, если смотреть проблему, о которой говорит ТС, то, повторю, он занимается фигней. И способ, которым он хочет искать окно, полная фигня.