Feed external geometry changes to Qt

So that Qt responds correctly when window managers make geometry
changes.

Note: Older versions of screen, such as the screen from the QNX 6.6.0
4036 patch, don't produce SIZE/POSITION property events.

Change-Id: I7e1e5982a2cbd3f57d468b43869af8558c6d50e7
Reviewed-by: Dan Cape <dcape@qnx.com>
Reviewed-by: Rafael Roquetto <rafael.roquetto@kdab.com>
bb10
James McDonnell 2018-03-26 13:39:11 -04:00
parent 5ea238cda6
commit 01c12a5c1a
2 changed files with 27 additions and 0 deletions

View File

@ -591,6 +591,10 @@ void QQnxScreenEventHandler::handlePropertyEvent(screen_event_t event)
case SCREEN_PROPERTY_FOCUS:
handleKeyboardFocusPropertyEvent(window);
break;
case SCREEN_PROPERTY_SIZE:
case SCREEN_PROPERTY_POSITION:
handleGeometryPropertyEvent(window);
break;
default:
// event ignored
qScreenEventDebug() << "Ignore property event for property: " << property;
@ -617,6 +621,28 @@ void QQnxScreenEventHandler::handleKeyboardFocusPropertyEvent(screen_window_t wi
m_focusLostTimer = startTimer(50);
}
void QQnxScreenEventHandler::handleGeometryPropertyEvent(screen_window_t window)
{
int pos[2];
if (screen_get_window_property_iv(window, SCREEN_PROPERTY_POSITION, pos) != 0) {
qFatal("QQnx: failed to query window property, errno=%d", errno);
}
int size[2];
if (screen_get_window_property_iv(window, SCREEN_PROPERTY_SIZE, size) != 0) {
qFatal("QQnx: failed to query window property, errno=%d", errno);
}
QRect rect(pos[0], pos[1], size[0], size[1]);
QWindow *qtWindow = QQnxIntegration::window(window);
if (qtWindow) {
qtWindow->setGeometry(rect);
QWindowSystemInterface::handleGeometryChange(qtWindow, rect);
}
qScreenEventDebug() << qtWindow << "moved to" << rect;
}
void QQnxScreenEventHandler::timerEvent(QTimerEvent *event)
{
if (event->timerId() == m_focusLostTimer) {

View File

@ -85,6 +85,7 @@ private:
void handleDisplayEvent(screen_event_t event);
void handlePropertyEvent(screen_event_t event);
void handleKeyboardFocusPropertyEvent(screen_window_t window);
void handleGeometryPropertyEvent(screen_window_t window);
private:
enum {