Вопрос или проблема
Я не вижу курсор на скриншотах xwd, которые я делаю в сессии xvfb.
Вот как я запускаю свою сессию xvfb:
Xvfb :99 -screen 0 1920x1080x24 -ac
Также я попробовал использовать import, разницы нет:
xwd -display :99 -root -silent | convert xwd:- png:/tmp/screenshot.png
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
вы с большой вероятностью столкнетесь с результатом, где курсор отсутствует.
Применение
Для решения этой задачи можно использовать несколько подходов.
-
Программное включение курсора в снимок экрана:
- Единственным инструментом, который позволяет более гибко управлять процессом, является
x11vnc
. Он может быть опцией для тех, кто хочет получить изображения экрана с курсором.x11vnc
может получить доступ к фреймбуферу Xvfb и передать изображение, включая активный курсор, клиенту VNC, который затем может захватить скриншот. -
Убедитесь, что запускаете
x11vnc
с параметром для рендеринга курсора:x11vnc -display :99 -cursor arrow
- Единственным инструментом, который позволяет более гибко управлять процессом, является
-
Использование альтернативных инструментов:
- Помимо вышеописанного, также существуют модифицированные версии инструментов, которые поддерживают захват курсора. Попробуйте найти и использовать такие утилиты как
xvfb-run
, которые могут предложить оболочку для более автоматизированной и полной работы с X-сессиями.
- Помимо вышеописанного, также существуют модифицированные версии инструментов, которые поддерживают захват курсора. Попробуйте найти и использовать такие утилиты как
-
Дополнительные настройки и отладка:
- Убедитесь, что Xvfb правильно настроен и что запущенные вами программы не препятствуют отрисовке курсора. Например, иногда программы, использующие OpenGL или другие графические библиотеки, могут конфигурировать X-сервер так, что курсор не отображается.
-
Выбор оконного менеджера:
-
В некоторых случаях отсутствие оконного менеджера в сессиях Xvfb может быть причиной, по которой курсор не отображается. Попробуйте запустить легкий оконный менеджер, такой как
openbox
илиxfwm4
, внутри сессии Xvfb:Xvfb :99 -screen 0 1920x1080x24 -ac & DISPLAY=:99 openbox &
-
-
Преобразование и редактирование изображений после захвата:
- Если же все предложенные методы не сработали, возможно, простейшим решением будет дополнительно редактировать изображения после их захвата, вручную добавляя курсор. Это можно сделать, например, используя
ImageMagick
для автоматизации добавления курсора к изображениям.
- Если же все предложенные методы не сработали, возможно, простейшим решением будет дополнительно редактировать изображения после их захвата, вручную добавляя курсор. Это можно сделать, например, используя
Заключение
Захват изображения с курсором в Xvfb — задача вполне решаемая, хотя и требует определенной настройки системы и применения дополнительных инструментов. Во многих случаях альтернативные подходы, такие как использование x11vnc
или оконных менеджеров, которые могут управлять отображением курсора, обеспечат нужный результат. Однако, как и всегда в случае специфических требований, может понадобиться смешивание предложенных методов в зависимости от конкретных условий работы вашего окружения.