From 1f0d430c3a660c9e72581b582fe16c440bcf9eac Mon Sep 17 00:00:00 2001 From: James Turner Date: Mon, 8 Oct 2012 14:29:51 +0100 Subject: QNX: Add and remove screens dynamically. Watch for display events from libscreen, and dynamically add and remove QPlatformScreens (and hence QScreens) in response. Change-Id: I56dc7019a4d4c77798a0a88451d2f3060066f5d2 Reviewed-by: Thomas McGuire Reviewed-by: Sean Harmer --- .../platforms/qnx/qqnxscreeneventhandler.cpp | 39 ++++++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) (limited to 'src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp') diff --git a/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp b/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp index 14019d40d2..621440ed53 100644 --- a/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp +++ b/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp @@ -57,8 +57,9 @@ QT_BEGIN_NAMESPACE -QQnxScreenEventHandler::QQnxScreenEventHandler() - : m_lastButtonState(Qt::NoButton) +QQnxScreenEventHandler::QQnxScreenEventHandler(QQnxIntegration *integration) + : m_qnxIntegration(integration) + , m_lastButtonState(Qt::NoButton) , m_lastMouseWindow(0) , m_touchDevice(0) { @@ -120,9 +121,13 @@ bool QQnxScreenEventHandler::handleEvent(screen_event_t event, int qnxType) handleCloseEvent(event); break; + case SCREEN_EVENT_DISPLAY: + handleDisplayEvent(event); + break; + default: // event ignored - qScreenEventDebug() << Q_FUNC_INFO << "unknown event"; + qScreenEventDebug() << Q_FUNC_INFO << "unknown event" << qnxType; return false; } @@ -455,6 +460,34 @@ void QQnxScreenEventHandler::handleCreateEvent(screen_event_t event) Q_EMIT newWindowCreated(window); } +void QQnxScreenEventHandler::handleDisplayEvent(screen_event_t event) +{ + screen_display_t nativeDisplay = NULL; + if (screen_get_event_property_pv(event, SCREEN_PROPERTY_DISPLAY, (void **)&nativeDisplay) != 0) { + qWarning("QQnx: failed to query display property, errno=%d", errno); + return; + } + + int isAttached = 0; + if (screen_get_event_property_iv(event, SCREEN_PROPERTY_ATTACHED, &isAttached) != 0) { + qWarning("QQnx: failed to query display attached property, errno=%d", errno); + return; + } + + qScreenEventDebug() << Q_FUNC_INFO << "display attachment is now:" << isAttached; + QQnxScreen *screen = m_qnxIntegration->screenForNative(nativeDisplay); + if (!screen) { + if (isAttached) { + qScreenEventDebug() << "creating new QQnxScreen for newly attached display"; + m_qnxIntegration->createDisplay(nativeDisplay, false /* not primary, we assume */); + } + } else if (!isAttached) { + // libscreen display is deactivated, let's remove the QQnxScreen / QScreen + qScreenEventDebug() << "removing display"; + m_qnxIntegration->removeDisplay(screen); + } +} + #include "moc_qqnxscreeneventhandler.cpp" QT_END_NAMESPACE -- cgit v1.2.3