Properly handle position in non-synthetic ConfigureNotify with xcb

The received window position cannot be trusted blindly, e.g. in case
of resizing a window via the mouse or calling showMaximized() the
position is bogus (for our purposes). Instead, it needs to be queried.

Before 37f338e5ed an incomplete
workaround was in place however it got removed in that commit,
resulting in weird off-by-a-certain-amount mouse position issues in
certain use cases. This patch aims to fix the issue similarly to how
it was done in Qt4.

Change-Id: I2d2a69b81a2782117b700fe366fae4c102aca1f4
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
bb10
Laszlo Agocs 2011-11-05 14:00:53 +02:00 committed by Qt by Nokia
parent f5b9982805
commit fc659979e6
1 changed files with 18 additions and 1 deletions

View File

@ -1221,7 +1221,24 @@ void QXcbWindow::handleClientMessageEvent(const xcb_client_message_event_t *even
void QXcbWindow::handleConfigureNotifyEvent(const xcb_configure_notify_event_t *event)
{
QRect rect(event->x, event->y, event->width, event->height);
bool fromSendEvent = (event->response_type & 0x80);
QPoint pos(event->x, event->y);
if (!fromSendEvent) {
// Do not trust the position, query it instead.
xcb_translate_coordinates_cookie_t cookie = xcb_translate_coordinates(xcb_connection(), xcb_window(),
m_screen->root(), 0, 0);
xcb_generic_error_t *error;
xcb_translate_coordinates_reply_t *reply = xcb_translate_coordinates_reply(xcb_connection(), cookie, &error);
if (reply) {
pos.setX(reply->dst_x);
pos.setY(reply->dst_y);
free(reply);
} else if (error) {
free(error);
}
}
QRect rect(pos, QSize(event->width, event->height));
QPlatformWindow::setGeometry(rect);
QWindowSystemInterface::handleGeometryChange(window(), rect);