Windows QPA: Use the native algorithm to find out the window's screen
QPlatformWindow::screenForGeometry uses the screen where the center of the window is, but native application use the one which intersects with the bigger area. It might not be the same. Change-Id: I831a5fcaea0e293e9f0f93ef5e562cce57fae2f4 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>bb10
parent
b5995afc79
commit
1037eebc0b
|
|
@ -82,6 +82,7 @@ static bool monitorData(HMONITOR hMonitor, QWindowsScreenData *data)
|
|||
if (GetMonitorInfo(hMonitor, &info) == FALSE)
|
||||
return false;
|
||||
|
||||
data->hMonitor = hMonitor;
|
||||
data->geometry = QRect(QPoint(info.rcMonitor.left, info.rcMonitor.top), QPoint(info.rcMonitor.right - 1, info.rcMonitor.bottom - 1));
|
||||
data->availableGeometry = QRect(QPoint(info.rcWork.left, info.rcWork.top), QPoint(info.rcWork.right - 1, info.rcWork.bottom - 1));
|
||||
data->name = QString::fromWCharArray(info.szDevice);
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ struct QWindowsScreenData
|
|||
QString name;
|
||||
Qt::ScreenOrientation orientation = Qt::LandscapeOrientation;
|
||||
qreal refreshRateHz = 60;
|
||||
HMONITOR hMonitor = nullptr;
|
||||
};
|
||||
|
||||
class QWindowsScreen : public QPlatformScreen
|
||||
|
|
|
|||
|
|
@ -1533,10 +1533,16 @@ void QWindowsWindow::handleGeometryChange()
|
|||
&& !(m_data.geometry.width() > previousGeometry.width() || m_data.geometry.height() > previousGeometry.height())) {
|
||||
fireExpose(QRect(QPoint(0, 0), m_data.geometry.size()), true);
|
||||
}
|
||||
if (previousGeometry.topLeft() != m_data.geometry.topLeft()) {
|
||||
QPlatformScreen *newScreen = screenForGeometry(m_data.geometry);
|
||||
if (newScreen != screen())
|
||||
QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->screen());
|
||||
if (!parent() && previousGeometry.topLeft() != m_data.geometry.topLeft()) {
|
||||
HMONITOR hMonitor = MonitorFromWindow(m_data.hwnd, MONITOR_DEFAULTTONULL);
|
||||
QPlatformScreen *currentScreen = screen();
|
||||
const auto screens = QWindowsContext::instance()->screenManager().screens();
|
||||
auto newScreenIt = std::find_if(screens.begin(), screens.end(), [&](QWindowsScreen *s) {
|
||||
return s->data().hMonitor == hMonitor
|
||||
&& s->data().flags & QWindowsScreenData::VirtualDesktop;
|
||||
});
|
||||
if (newScreenIt != screens.end() && *newScreenIt != currentScreen)
|
||||
QWindowSystemInterface::handleWindowScreenChanged(window(), (*newScreenIt)->screen());
|
||||
}
|
||||
if (testFlag(SynchronousGeometryChangeEvent))
|
||||
QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents);
|
||||
|
|
|
|||
Loading…
Reference in New Issue