Курсор не отображается на скриншотах сеансов xvfb.

Вопрос или проблема

Я не вижу курсор на скриншотах xwd, которые я делаю в сессии xvfb.

Вот как я запускаю свою сессию xvfb:

Xvfb :99 -screen 0 1920x1080x24 -ac

Также я попробовал использовать import, разницы нет:

  1. xwd -display :99 -root -silent | convert xwd:- png:/tmp/screenshot.png
  2. import -window root -display :99 /tmp/screenshot.png

Моя цель — переместить курсор в нужные координаты и щелкнуть с помощью xdotool, так что я хочу сделать скриншот и увидеть, где находится курсор, чтобы выяснить, делаю ли я что-то неправильно.

Ответ или решение

Виртуальный фреймбуфер X (Xvfb) представляет собой инструмент, который часто используется для выполнения графических операций в средах, где сервер дисплея недоступен или нежелателен. Одной из распространенных задач, связанной с Xvfb, является создание скриншотов в фоновом режиме, однако одна из проблем, с которой могут столкнуться пользователи, заключается в отсутствии захвата курсора мыши на таких скриншотах, особенно если используют инструменты вроде xwd и import.

Теория

Первое, что следует понять при работе с Xvfb и снятием скриншотов, — это то, как работают инструменты xwd и import. Оба инструмента, по умолчанию, не захватывают курсор мыши. Это происходит из-за особенностей работы с X11-протоколом: курсор мыши часто рендерится "поверх" основной графической поверхности и не является её частью. Таким образом, инструменты, которые снимают скриншоты экрана, могут не "видеть" курсор.

Пример

Итак, при использовании стандартного запуска Xvfb:

Xvfb :99 -screen 0 1920x1080x24 -ac

и попытке снять скриншот:

xwd -display :99 -root -silent | convert xwd:- png:/tmp/screenshot.png

или:

import -window root -display :99 /tmp/screenshot.png

вы с большой вероятностью столкнетесь с результатом, где курсор отсутствует.

Применение

Для решения этой задачи можно использовать несколько подходов.

  1. Программное включение курсора в снимок экрана:

    • Единственным инструментом, который позволяет более гибко управлять процессом, является x11vnc. Он может быть опцией для тех, кто хочет получить изображения экрана с курсором. x11vnc может получить доступ к фреймбуферу Xvfb и передать изображение, включая активный курсор, клиенту VNC, который затем может захватить скриншот.
    • Убедитесь, что запускаете x11vnc с параметром для рендеринга курсора:

      x11vnc -display :99 -cursor arrow
  2. Использование альтернативных инструментов:

    • Помимо вышеописанного, также существуют модифицированные версии инструментов, которые поддерживают захват курсора. Попробуйте найти и использовать такие утилиты как xvfb-run, которые могут предложить оболочку для более автоматизированной и полной работы с X-сессиями.
  3. Дополнительные настройки и отладка:

    • Убедитесь, что Xvfb правильно настроен и что запущенные вами программы не препятствуют отрисовке курсора. Например, иногда программы, использующие OpenGL или другие графические библиотеки, могут конфигурировать X-сервер так, что курсор не отображается.
  4. Выбор оконного менеджера:

    • В некоторых случаях отсутствие оконного менеджера в сессиях Xvfb может быть причиной, по которой курсор не отображается. Попробуйте запустить легкий оконный менеджер, такой как openbox или xfwm4, внутри сессии Xvfb:

      Xvfb :99 -screen 0 1920x1080x24 -ac &
      DISPLAY=:99 openbox &
  5. Преобразование и редактирование изображений после захвата:

    • Если же все предложенные методы не сработали, возможно, простейшим решением будет дополнительно редактировать изображения после их захвата, вручную добавляя курсор. Это можно сделать, например, используя ImageMagick для автоматизации добавления курсора к изображениям.

Заключение

Захват изображения с курсором в Xvfb — задача вполне решаемая, хотя и требует определенной настройки системы и применения дополнительных инструментов. Во многих случаях альтернативные подходы, такие как использование x11vnc или оконных менеджеров, которые могут управлять отображением курсора, обеспечат нужный результат. Однако, как и всегда в случае специфических требований, может понадобиться смешивание предложенных методов в зависимости от конкретных условий работы вашего окружения.

Оцените материал
Добавить комментарий

Капча загружается...