Windows: Fix Geometry, OpenGL formats

- Do not use size returned by GetWindowRect for child windows
- Turn Open GL samples off if number is 1.

Change-Id: I2f44606d965fe691548094771deda7bca51ef9a6
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
This commit is contained in:
Friedemann Kleint 2011-10-19 16:32:05 +02:00 committed by Qt by Nokia
parent a0d1b99609
commit 40738b185d
2 changed files with 41 additions and 10 deletions

View File

@ -429,17 +429,19 @@ static int choosePixelFormat(HDC hdc,
iAttributes[i++] = WGL_NUMBER_OVERLAYS_ARB; iAttributes[i++] = WGL_NUMBER_OVERLAYS_ARB;
iAttributes[i++] = 1; iAttributes[i++] = 1;
} }
const bool sampleBuffersRequested = format.samples() > 1 const int samples = format.samples();
const bool sampleBuffersRequested = samples > 1
&& testFlag(staticContext.extensions, QOpenGLStaticContext::SampleBuffers); && testFlag(staticContext.extensions, QOpenGLStaticContext::SampleBuffers);
int samplesValuePosition = 0; int samplesValuePosition = 0;
int samplesEnabledPosition = 0;
if (sampleBuffersRequested) { if (sampleBuffersRequested) {
iAttributes[i++] = WGL_SAMPLE_BUFFERS_ARB; iAttributes[i++] = WGL_SAMPLE_BUFFERS_ARB;
samplesEnabledPosition = i;
iAttributes[i++] = TRUE; iAttributes[i++] = TRUE;
iAttributes[i++] = WGL_SAMPLES_ARB; iAttributes[i++] = WGL_SAMPLES_ARB;
samplesValuePosition = i; samplesValuePosition = i;
iAttributes[i++] = format.samples(); iAttributes[i++] = format.samples();
} else if (samples == 0 || samples == 1 ) {
iAttributes[i++] = WGL_SAMPLE_BUFFERS_ARB;
iAttributes[i++] = FALSE;
} }
// If sample buffer request cannot be satisfied, reduce request. // If sample buffer request cannot be satisfied, reduce request.
int pixelFormat = 0; int pixelFormat = 0;

View File

@ -132,6 +132,14 @@ static inline QRect qrectFromRECT(const RECT &rect)
return QRect(QPoint(rect.left, rect.top), qSizeOfRect(rect)); return QRect(QPoint(rect.left, rect.top), qSizeOfRect(rect));
} }
static inline RECT RECTfromQRect(const QRect &rect)
{
const int x = rect.left();
const int y = rect.top();
RECT result = { x, y, x + rect.width(), y + rect.height() };
return result;
}
QDebug operator<<(QDebug d, const RECT &r) QDebug operator<<(QDebug d, const RECT &r)
{ {
d.nospace() << "RECT: left/top=" << r.left << ',' << r.top d.nospace() << "RECT: left/top=" << r.left << ',' << r.top
@ -148,14 +156,23 @@ QDebug operator<<(QDebug d, const NCCALCSIZE_PARAMS &p)
return d; return d;
} }
// Return the frame geometry relative to the parent
// if there is one.
// Note: This has been observed to return invalid sizes for child windows.
static inline QRect frameGeometry(HWND hwnd) static inline QRect frameGeometry(HWND hwnd)
{ {
RECT rect = { 0, 0, 0, 0 }; RECT rect = { 0, 0, 0, 0 };
GetWindowRect(hwnd, &rect); GetWindowRect(hwnd, &rect); // Screen coordinates.
if (const HWND parent = GetParent(hwnd)) {
POINT leftTop = { rect.left, rect.top };
ScreenToClient(parent, &leftTop);
rect.left = leftTop.x;
rect.top = leftTop.y;
}
return qrectFromRECT(rect); return qrectFromRECT(rect);
} }
QSize clientSize(HWND hwnd) static inline QSize clientSize(HWND hwnd)
{ {
RECT rect = { 0, 0, 0, 0 }; RECT rect = { 0, 0, 0, 0 };
GetClientRect(hwnd, &rect); // Always returns point 0,0, thus unusable for geometry. GetClientRect(hwnd, &rect); // Always returns point 0,0, thus unusable for geometry.
@ -807,12 +824,15 @@ void QWindowsWindow::setGeometry(const QRect &rect)
setGeometry_sys(rect); setGeometry_sys(rect);
if (m_data.geometry != rect) { if (m_data.geometry != rect) {
qWarning("%s: Unable to set geometry %dx%d+%d+%d on '%s'." qWarning("%s: Unable to set geometry %dx%d+%d+%d on '%s'."
" Resulting geometry: %dx%d+%d+%d.", " Resulting geometry: %dx%d+%d+%d "
"(frame: %d, %d, %d, %d).",
__FUNCTION__, __FUNCTION__,
rect.width(), rect.height(), rect.x(), rect.y(), rect.width(), rect.height(), rect.x(), rect.y(),
qPrintable(window()->objectName()), qPrintable(window()->objectName()),
m_data.geometry.width(), m_data.geometry.height(), m_data.geometry.width(), m_data.geometry.height(),
m_data.geometry.x(), m_data.geometry.y()); m_data.geometry.x(), m_data.geometry.y(),
m_data.frame.left(), m_data.frame.top(),
m_data.frame.right(), m_data.frame.bottom());
} }
} else { } else {
QPlatformWindow::setGeometry(rect); QPlatformWindow::setGeometry(rect);
@ -858,11 +878,13 @@ void QWindowsWindow::handleGeometryChange()
void QWindowsWindow::setGeometry_sys(const QRect &rect) const void QWindowsWindow::setGeometry_sys(const QRect &rect) const
{ {
const QRect frameGeometry = rect + frameMargins(); const QMargins margins = frameMargins();
const QRect frameGeometry = rect + margins;
if (QWindowsContext::verboseWindows) if (QWindowsContext::verboseWindows)
qDebug() << '>' << __FUNCTION__ << this << window() qDebug() << '>' << __FUNCTION__ << this << window()
<< " \n from " << geometry_sys() << " to " <<rect << " \n from " << geometry_sys() << " frame: "
<< margins << " to " <<rect
<< " new frame: " << frameGeometry; << " new frame: " << frameGeometry;
const bool rc = MoveWindow(m_data.hwnd, frameGeometry.x(), frameGeometry.y(), const bool rc = MoveWindow(m_data.hwnd, frameGeometry.x(), frameGeometry.y(),
@ -875,7 +897,14 @@ void QWindowsWindow::setGeometry_sys(const QRect &rect) const
QRect QWindowsWindow::geometry_sys() const QRect QWindowsWindow::geometry_sys() const
{ {
// Warning: Returns bogus values when minimized. // Warning: Returns bogus values when minimized.
return frameGeometry(m_data.hwnd) - frameMargins(); // Note: Using frameGeometry (based on GetWindowRect)
// has been observed to return a size based on a standard top level
// frame for WS_CHILD windows (whose frame is zero), thus, use the real
// client size instead.
QRect result = frameGeometry(m_data.hwnd) - frameMargins();
if (result.isValid() && !window()->isTopLevel())
result.setSize(clientSize(m_data.hwnd));
return result;
} }
/*! /*!