Describe cursor overlay coordinates, thread ownership and outcomes

This commit is contained in:
evgeny committed 2026-10-28 00:58:59 +01:00
1 parent 615bdda36e
commit d9eab97dee
1 file changed
+16 -9
+16 -9
View File
@@ -1,6 +1,8 @@
/* Системный курсор накладывается до масштабирования. Создаётся в GUI: X11 draw остаётся в GUI,
* Windows draw работает в image worker через сохранённый HMONITOR, без обращения к QScreen.
* Положение, hotspot и bitmap используют физические пиксели выбранного монитора. */
/* Наложение системного курсора на кадр выбранного экрана до масштабирования/кодирования.
* X11/XFixes: создание, draw и разрушение в GUI-потоке. Windows: создать в GUI, draw последовательно в image worker;
* сохранённый HMONITOR позволяет не обращаться к QScreen из worker. Экземпляр не синхронизирует параллельные вызовы.
* Кадр задаётся в физических пикселях исходного монитора; position/hotspot/bitmap используют ту же систему координат.
* При рисовании devicePixelRatio кадра сбрасывается в 1. Wayland получает курсор через portal, этот класс там не используется. */
#pragma once
#include <QImage>
#include <QPointer>
@@ -11,17 +13,22 @@ struct _XDisplay;
#endif
class StreamScreenCursor {
public:
// screen — выбранный живой монитор, владение не передаётся; ошибка открытия логируется, draw вернёт false.
explicit StreamScreenCursor(QScreen* screen);
// Освободить служебные ресурсы после завершения draw; X11 содержит QWindow и требует GUI-поток.
~StreamScreenCursor();
// Изменить paintable frame в исходном размере экрана; Windows также проверяет точное совпадение размеров.
// true — обработано, включая отсутствие видимого курсора в кадре; false — ошибка с логом video.
// Ранний успех без рисования сохраняет frame, включая его devicePixelRatio.
bool draw(QImage& frame);
private:
#ifdef Q_OS_WIN
void* m_monitor = nullptr;
QString m_screenName;
void* m_monitor = nullptr; // Заимствованный HMONITOR; GetMonitorInfo проверяет доступность перед draw.
QString m_screenName; // Снимок имени для диагностики, без чтения QScreen из worker.
#else
QPointer<QScreen> m_screen;
QWindow m_origin;
struct _XDisplay* m_display = nullptr;
QPointer<QScreen> m_screen; // Выбранный монитор; удаление приводит к отказу draw.
QWindow m_origin; // Невидимое окно в начале монитора для перевода координат X11 в физические пиксели.
struct _XDisplay* m_display = nullptr; // Заимствованный Qt X11 display, не закрывается этим объектом.
#endif
bool m_ready = false, m_reported = false;
bool m_ready = false, m_reported = false; // Открыт backend; успешное наложение уже записано в INFO.
};