Use native Windows monitor handle for cursor overlay
This commit is contained in:
1 parent
4a6f95cebd
commit
e440c62339
3 files changed
+38
-17
No files matched your search
@@ -57,6 +57,7 @@ extern "C" {
|
||||
#ifdef UTUN_STREAM_WIN_CURSOR
|
||||
#include "../src/stream_screen_cursor.h"
|
||||
#include <QWindow>
|
||||
#include <QtGui/qscreen_platform.h>
|
||||
#include <qt_windows.h>
|
||||
#endif
|
||||
|
||||
@@ -422,8 +423,10 @@ private slots:
|
||||
POINT saved{}; QVERIFY(GetCursorPos(&saved));
|
||||
auto restorePosition = qScopeGuard([&] { SetCursorPos(saved.x, saved.y); });
|
||||
for (auto* screen : QGuiApplication::screens()) {
|
||||
DEVMODEW mode{}; mode.dmSize = sizeof(mode);
|
||||
QVERIFY(EnumDisplaySettingsExW(screen->name().toStdWString().c_str(), ENUM_CURRENT_SETTINGS, &mode, 0));
|
||||
auto* native = screen->nativeInterface<QNativeInterface::QWindowsScreen>(); QVERIFY(native);
|
||||
MONITORINFO monitor{}; monitor.cbSize = sizeof(monitor);
|
||||
QVERIFY(GetMonitorInfoW(native->handle(), &monitor));
|
||||
QPoint origin(monitor.rcMonitor.left, monitor.rcMonitor.top);
|
||||
QWindow target(screen); target.setFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
|
||||
target.setGeometry(QRect(screen->geometry().topLeft(), QSize(200, 160))); target.show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&target));
|
||||
@@ -436,11 +439,12 @@ private slots:
|
||||
StreamScreenCursor overlay(screen);
|
||||
const QColor background(0x12, 0x34, 0x56), inverted(0xed, 0xcb, 0xa9);
|
||||
for (QPoint position : {QPoint(60, 70), QPoint(0, 0)}) {
|
||||
QVERIFY(SetCursorPos(mode.dmPosition.x + position.x(), mode.dmPosition.y + position.y()));
|
||||
QVERIFY(SetCursorPos(origin.x() + position.x(), origin.y() + position.y()));
|
||||
SetCursor(cursor);
|
||||
CURSORINFO info{}; info.cbSize = sizeof(info); QVERIFY(GetCursorInfo(&info));
|
||||
QVERIFY(info.flags & CURSOR_SHOWING); QVERIFY(info.hCursor == cursor);
|
||||
QImage frame(mode.dmPelsWidth, mode.dmPelsHeight, QImage::Format_RGB32);
|
||||
QImage frame(monitor.rcMonitor.right - monitor.rcMonitor.left,
|
||||
monitor.rcMonitor.bottom - monitor.rcMonitor.top, QImage::Format_RGB32);
|
||||
frame.setDevicePixelRatio(screen->devicePixelRatio()); frame.fill(background);
|
||||
QImage blank = frame;
|
||||
QVERIFY(overlay.draw(frame));
|
||||
@@ -451,7 +455,7 @@ private slots:
|
||||
SetCursor(nullptr); frame = blank;
|
||||
QVERIFY(overlay.draw(frame)); QCOMPARE(frame, blank);
|
||||
}
|
||||
QVERIFY(SetCursorPos(mode.dmPosition.x + 60, mode.dmPosition.y + 70)); SetCursor(cursor);
|
||||
QVERIFY(SetCursorPos(origin.x() + 60, origin.y() + 70)); SetCursor(cursor);
|
||||
for (auto* other : QGuiApplication::screens()) {
|
||||
if (other == screen) continue;
|
||||
StreamScreenCursor otherOverlay(other);
|
||||
|
||||
Reference in new issue
Block a user