void PLAYBOOK_PumpEvents(_THIS) { while (1) { int rc = screen_get_event(this->hidden->screenContext, this->hidden->screenEvent, 0 /*timeout*/); if (rc) break; int type; rc = screen_get_event_property_iv(this->hidden->screenEvent, SCREEN_PROPERTY_TYPE, &type); if (rc || type == SCREEN_EVENT_NONE) break; screen_window_t window; screen_get_event_property_pv(this->hidden->screenEvent, SCREEN_PROPERTY_WINDOW, (void **)&window); if (!window && type != SCREEN_EVENT_KEYBOARD) break; switch (type) { case SCREEN_EVENT_CLOSE: SDL_PrivateQuit(); // We can't stop it from closing anyway break; case SCREEN_EVENT_PROPERTY: { int val; screen_get_event_property_iv(this->hidden->screenEvent, SCREEN_PROPERTY_NAME, &val); //fprintf(stderr, "Property change (property val=%d)\n", val); } break; case SCREEN_EVENT_POINTER: handlePointerEvent(this->hidden->screenEvent, window); break; case SCREEN_EVENT_KEYBOARD: handleKeyboardEvent(this->hidden->screenEvent); break; case SCREEN_EVENT_MTOUCH_TOUCH: case SCREEN_EVENT_MTOUCH_MOVE: case SCREEN_EVENT_MTOUCH_RELEASE: handleMtouchEvent(this->hidden->screenEvent, window, type); break; } } #ifdef TOUCHPAD_SIMULATE if (state.pending[0] || state.pending[1]) { SDL_PrivateMouseMotion(state.mask, 1, state.pending[0], state.pending[1]); state.pending[0] = 0; state.pending[1] = 0; } #endif if (moveEvent.pending) { SDL_PrivateMouseMotion((moveEvent.touching?SDL_BUTTON_LEFT:0), 0, moveEvent.pos[0], moveEvent.pos[1]); moveEvent.pending = 0; } }
void QGraphicsViewAdapter::customEvent( QEvent* event ) { if ( event->type()==MYQKEYEVENT ) { MyQKeyEvent* keyEvent = ( MyQKeyEvent* )event; handleKeyEvent( keyEvent->_key, keyEvent->_down ); } else if ( event->type()==MYQPOINTEREVENT ) { MyQPointerEvent* pointerEvent = ( MyQPointerEvent* )event; handlePointerEvent( pointerEvent->_x, pointerEvent->_y, pointerEvent->_buttonMask ); } }
bool RenderableWebEntityItem::buildWebSurface(EntityTreeRenderer* renderer) { if (_currentWebCount >= MAX_CONCURRENT_WEB_VIEWS) { qWarning() << "Too many concurrent web views to create new view"; return false; } qDebug() << "Building web surface"; ++_currentWebCount; // Save the original GL context, because creating a QML surface will create a new context QOpenGLContext * currentContext = QOpenGLContext::currentContext(); QSurface * currentSurface = currentContext->surface(); _webSurface = new OffscreenQmlSurface(); _webSurface->create(currentContext); _webSurface->setBaseUrl(QUrl::fromLocalFile(PathUtils::resourcesPath() + "/qml/controls/")); _webSurface->load("WebView.qml"); _webSurface->resume(); _webSurface->getRootItem()->setProperty("url", _sourceUrl); _webSurface->getRootContext()->setContextProperty("desktop", QVariant()); _connection = QObject::connect(_webSurface, &OffscreenQmlSurface::textureUpdated, [&](GLuint textureId) { _texture = textureId; }); // Restore the original GL context currentContext->makeCurrent(currentSurface); auto forwardPointerEvent = [=](const EntityItemID& entityItemID, const PointerEvent& event) { if (entityItemID == getID()) { handlePointerEvent(event); } }; _mousePressConnection = QObject::connect(renderer, &EntityTreeRenderer::mousePressOnEntity, forwardPointerEvent); _mouseReleaseConnection = QObject::connect(renderer, &EntityTreeRenderer::mouseReleaseOnEntity, forwardPointerEvent); _mouseMoveConnection = QObject::connect(renderer, &EntityTreeRenderer::mouseMoveOnEntity, forwardPointerEvent); _hoverLeaveConnection = QObject::connect(renderer, &EntityTreeRenderer::hoverLeaveEntity, [=](const EntityItemID& entityItemID, const PointerEvent& event) { if (this->_pressed && this->getID() == entityItemID) { // If the user mouses off the entity while the button is down, simulate a touch end. QTouchEvent::TouchPoint point; point.setId(event.getID()); point.setState(Qt::TouchPointReleased); glm::vec2 windowPos = event.getPos2D() * (METERS_TO_INCHES * _dpi); QPointF windowPoint(windowPos.x, windowPos.y); point.setPos(windowPoint); QList<QTouchEvent::TouchPoint> touchPoints; touchPoints.push_back(point); QTouchEvent* touchEvent = new QTouchEvent(QEvent::TouchEnd, nullptr, Qt::NoModifier, Qt::TouchPointReleased, touchPoints); QCoreApplication::postEvent(_webSurface->getWindow(), touchEvent); } }); return true; }
static void handleInput(const MirInputEvent* input_event, _GLFWwindow* window) { int type = mir_input_event_get_type(input_event); switch (type) { case mir_input_event_type_key: handleKeyEvent(mir_input_event_get_keyboard_event(input_event), window); break; case mir_input_event_type_pointer: handlePointerEvent(mir_input_event_get_pointer_event(input_event), window); break; default: break; } }
void QBBEventThread::dispatchEvent(screen_event_t event) { // get the event type errno = 0; int qnxType; int result = screen_get_event_property_iv(event, SCREEN_PROPERTY_TYPE, &qnxType); if (result) { qFatal("QBB: failed to query event type, errno=%d", errno); } switch (qnxType) { case SCREEN_EVENT_MTOUCH_TOUCH: case SCREEN_EVENT_MTOUCH_MOVE: case SCREEN_EVENT_MTOUCH_RELEASE: handleTouchEvent(event, qnxType); break; case SCREEN_EVENT_KEYBOARD: handleKeyboardEvent(event); break; case SCREEN_EVENT_POINTER: handlePointerEvent(event); break; case SCREEN_EVENT_CLOSE: handleCloseEvent(event); break; case SCREEN_EVENT_USER: // treat all user events as shutdown requests #if defined(QBBEVENTTHREAD_DEBUG) qDebug() << "QBB: QNX user event"; #endif mQuit = true; break; default: // event ignored #if defined(QBBEVENTTHREAD_DEBUG) qDebug() << "QBB: QNX unknown event"; #endif break; } }
bool QQnxScreenEventHandler::handleEvent(screen_event_t event, int qnxType) { switch (qnxType) { case SCREEN_EVENT_MTOUCH_TOUCH: case SCREEN_EVENT_MTOUCH_MOVE: case SCREEN_EVENT_MTOUCH_RELEASE: handleTouchEvent(event, qnxType); break; case SCREEN_EVENT_KEYBOARD: handleKeyboardEvent(event); break; case SCREEN_EVENT_POINTER: handlePointerEvent(event); break; case SCREEN_EVENT_CREATE: handleCreateEvent(event); break; case SCREEN_EVENT_CLOSE: handleCloseEvent(event); break; case SCREEN_EVENT_DISPLAY: handleDisplayEvent(event); break; default: // event ignored qScreenEventDebug() << Q_FUNC_INFO << "unknown event" << qnxType; return false; } return true; }
void Web3DOverlay::render(RenderArgs* args) { QOpenGLContext * currentContext = QOpenGLContext::currentContext(); QSurface * currentSurface = currentContext->surface(); if (!_webSurface) { _webSurface = DependencyManager::get<OffscreenQmlSurfaceCache>()->acquire(pickURL()); // FIXME, the max FPS could be better managed by being dynamic (based on the number of current surfaces // and the current rendering load) if (_currentMaxFPS != _desiredMaxFPS) { setMaxFPS(_desiredMaxFPS); } loadSourceURL(); _webSurface->resume(); _webSurface->resize(QSize(_resolution.x, _resolution.y)); _webSurface->getRootItem()->setProperty("url", _url); _webSurface->getRootItem()->setProperty("scriptURL", _scriptURL); currentContext->makeCurrent(currentSurface); auto selfOverlayID = getOverlayID(); std::weak_ptr<Web3DOverlay> weakSelf = std::dynamic_pointer_cast<Web3DOverlay>(qApp->getOverlays().getOverlay(selfOverlayID)); auto forwardPointerEvent = [=](OverlayID overlayID, const PointerEvent& event) { auto self = weakSelf.lock(); if (self && overlayID == selfOverlayID) { self->handlePointerEvent(event); } }; auto overlays = &(qApp->getOverlays()); QObject::connect(overlays, &Overlays::mousePressOnOverlay, this, forwardPointerEvent); QObject::connect(overlays, &Overlays::mouseReleaseOnOverlay, this, forwardPointerEvent); QObject::connect(overlays, &Overlays::mouseMoveOnOverlay, this, forwardPointerEvent); QObject::connect(overlays, &Overlays::hoverLeaveOverlay, this, [=](OverlayID overlayID, const PointerEvent& event) { auto self = weakSelf.lock(); if (!self) { return; } if (overlayID == selfOverlayID && (self->_pressed || (!self->_activeTouchPoints.empty() && self->_touchBeginAccepted))) { PointerEvent endEvent(PointerEvent::Release, event.getID(), event.getPos2D(), event.getPos3D(), event.getNormal(), event.getDirection(), event.getButton(), event.getButtons(), event.getKeyboardModifiers()); forwardPointerEvent(overlayID, endEvent); } }); QObject::connect(this, &Web3DOverlay::scriptEventReceived, _webSurface.data(), &OffscreenQmlSurface::emitScriptEvent); QObject::connect(_webSurface.data(), &OffscreenQmlSurface::webEventReceived, this, &Web3DOverlay::webEventReceived); } else { if (_currentMaxFPS != _desiredMaxFPS) { setMaxFPS(_desiredMaxFPS); } } if (_mayNeedResize) { _mayNeedResize = false; _webSurface->resize(QSize(_resolution.x, _resolution.y)); } if (!_visible || !getParentVisible()) { return; } vec2 halfSize = getSize() / 2.0f; vec4 color(toGlm(getColor()), getAlpha()); Transform transform = getTransform(); // FIXME: applyTransformTo causes tablet overlay to detach from tablet entity. // Perhaps rather than deleting the following code it should be run only if isFacingAvatar() is true? /* applyTransformTo(transform, true); setTransform(transform); */ if (glm::length2(getDimensions()) != 1.0f) { transform.postScale(vec3(getDimensions(), 1.0f)); } if (!_texture) { auto webSurface = _webSurface; _texture = gpu::Texture::createExternal(OffscreenQmlSurface::getDiscardLambda()); _texture->setSource(__FUNCTION__); } OffscreenQmlSurface::TextureAndFence newTextureAndFence; bool newTextureAvailable = _webSurface->fetchTexture(newTextureAndFence); if (newTextureAvailable) { _texture->setExternalTexture(newTextureAndFence.first, newTextureAndFence.second); } Q_ASSERT(args->_batch); gpu::Batch& batch = *args->_batch; batch.setResourceTexture(0, _texture); batch.setModelTransform(transform); auto geometryCache = DependencyManager::get<GeometryCache>(); if (color.a < OPAQUE_ALPHA_THRESHOLD) { geometryCache->bindTransparentWebBrowserProgram(batch, _isAA); } else { geometryCache->bindOpaqueWebBrowserProgram(batch, _isAA); } geometryCache->renderQuad(batch, halfSize * -1.0f, halfSize, vec2(0), vec2(1), color, _geometryId); batch.setResourceTexture(0, nullptr); // restore default white color after me }