Собираем информацию об окнах в Linux с помощью XLib

информация об окнах в Linux с помощью XLib

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

Решение: используем возможности библиотеки XLib, а именно ее функции: XGetWindowProperty() и XGetWindowAttributes().

План действий:

  1. Открываем экран по умолчанию;
  2. Находим идентификаторы всех окон с помощью XGetWindowProperty() (создадим вспомогательную функцию findWindows();
  3. Для каждого окна определяем заголовок с помощью той же функции XGetWindowProperty() (создаем функцию getWindowName()). Дополнительно запрашиваем атрибуты окна (координаты и размер) с помощью XGetWindowAttributes().

Пример вывода для окна браузера Chromium:

Реализация

Файл main.cpp:

Несколько замечаний по реализации:

  1. Для успешной сборки проекта необходимо подключить библиотеку X11: LIBS += -lX11;
  2. Не все окна выдают свое имя в формате UTF-8, поэтому в качестве запасного варианта мы запрашиваем хоть какой-то идентифицирующий окно текст, вызывая XGetWindowProperty() с параметром WM_NAME;
  3. Для вывода текста в формате UTF-8 на консоль Linux не забываем настроить кодировку приложения setlocale( LC_ALL, "" );
  4. Координаты левого верхнего угла окна (без учета рамки), которые возвращает XGetWindowAttributes(), отложены в системе координат самого этого окна, но нас интересуют абсолютные координаты окна на экране. Поэтому мы выполняем преобразование точки (x; y) в систему координат родительского окна с помощью XTranslateCoordinates().
Понравилась статья? Поделиться с друзьями:
Добавить комментарий