From 023b9e533902641f0c9d286d9fddaaeeaab98df2 Mon Sep 17 00:00:00 2001 From: Raphael Dumusc Date: Thu, 16 Jun 2016 11:21:46 +0200 Subject: [PATCH] QmlStreamer handles keyboard events --- CMakeLists.txt | 2 +- deflect/qt/EventReceiver.cpp | 6 ++++++ deflect/qt/EventReceiver.h | 2 ++ deflect/qt/QmlStreamerImpl.cpp | 39 ++++++++++++++++++++++++++++++++++ deflect/qt/QmlStreamerImpl.h | 3 +++ doc/Changelog.md | 7 ++++++ 6 files changed, 58 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c44d3bc..5f6ad6a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ # Daniel Nachbaur cmake_minimum_required(VERSION 3.1 FATAL_ERROR) -project(Deflect VERSION 0.11.1) +project(Deflect VERSION 0.12.0) set(Deflect_VERSION_ABI 4) list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake diff --git a/deflect/qt/EventReceiver.cpp b/deflect/qt/EventReceiver.cpp index 05a3851..81aaede 100644 --- a/deflect/qt/EventReceiver.cpp +++ b/deflect/qt/EventReceiver.cpp @@ -105,7 +105,13 @@ void EventReceiver::_onEvent( int socket ) case Event::EVT_SWIPE_UP: case Event::EVT_SWIPE_DOWN: case Event::EVT_KEY_PRESS: + emit keyPress( deflectEvent.key, deflectEvent.modifiers, + QString::fromStdString( deflectEvent.text )); + break; case Event::EVT_KEY_RELEASE: + emit keyRelease( deflectEvent.key, deflectEvent.modifiers, + QString::fromStdString( deflectEvent.text )); + break; default: break; } diff --git a/deflect/qt/EventReceiver.h b/deflect/qt/EventReceiver.h index ab9b193..5bb2ff0 100644 --- a/deflect/qt/EventReceiver.h +++ b/deflect/qt/EventReceiver.h @@ -65,6 +65,8 @@ class EventReceiver : public QObject void moved( double x, double y ); void resized( double x, double y ); void wheeled( double x, double y, double dy ); + void keyPress( int key, int modifiers, QString text ); + void keyRelease( int key, int modifiers, QString text ); private slots: void _onEvent( int socket ); diff --git a/deflect/qt/QmlStreamerImpl.cpp b/deflect/qt/QmlStreamerImpl.cpp index 2ae5ac1..cb6e937 100644 --- a/deflect/qt/QmlStreamerImpl.cpp +++ b/deflect/qt/QmlStreamerImpl.cpp @@ -286,6 +286,41 @@ void QmlStreamer::Impl::_onResized( double x_, double y_ ) QCoreApplication::postEvent( this, resizeEvent_ ); } +void QmlStreamer::Impl::_onKeyPress( int key, int modifiers, QString text ) +{ + QKeyEvent* keyEvent_ = new QKeyEvent( QEvent::KeyPress, key, + (Qt::KeyboardModifiers)modifiers, + text ); + _send( keyEvent_ ); +} + +void QmlStreamer::Impl::_onKeyRelease( int key, int modifiers, QString text ) +{ + QKeyEvent* keyEvent_ = new QKeyEvent( QEvent::KeyRelease, key, + (Qt::KeyboardModifiers)modifiers, + text ); + _send( keyEvent_ ); +} + +void QmlStreamer::Impl::_send( QKeyEvent* keyEvent_ ) +{ + // Work around missing key event support in Qt for offscreen windows. + + const QList items = + _rootItem->findChildren( QString(), + Qt::FindChildrenRecursively ); + for( QQuickItem* item : items ) + { + if( item->hasFocus( )) + { + _quickWindow->sendEvent( item, keyEvent_ ); + if( keyEvent_->isAccepted()) + break; + } + } + delete keyEvent_; +} + bool QmlStreamer::Impl::_setupRootItem() { disconnect( _qmlComponent, &QQmlComponent::statusChanged, @@ -372,6 +407,10 @@ bool QmlStreamer::Impl::_setupDeflectStream() this, &QmlStreamer::Impl::_onResized ); connect( _eventHandler, &EventReceiver::wheeled, this, &QmlStreamer::Impl::_onWheeled ); + connect( _eventHandler, &EventReceiver::keyPress, + this, &QmlStreamer::Impl::_onKeyPress ); + connect( _eventHandler, &EventReceiver::keyRelease, + this, &QmlStreamer::Impl::_onKeyRelease ); return true; } diff --git a/deflect/qt/QmlStreamerImpl.h b/deflect/qt/QmlStreamerImpl.h index 425b913..092b2a3 100644 --- a/deflect/qt/QmlStreamerImpl.h +++ b/deflect/qt/QmlStreamerImpl.h @@ -97,11 +97,14 @@ private slots: void _onMoved( double, double ); void _onResized( double, double ); void _onWheeled( double, double, double ); + void _onKeyPress( int key, int modifiers, QString text ); + void _onKeyRelease( int key, int modifiers, QString text ); signals: void streamClosed(); private: + void _send( QKeyEvent* keyEvent ); std::string _getDeflectStreamIdentifier() const; bool _setupDeflectStream(); void _updateSizes( const QSize& size ); diff --git a/doc/Changelog.md b/doc/Changelog.md index 12de302..4d4f594 100644 --- a/doc/Changelog.md +++ b/doc/Changelog.md @@ -1,6 +1,13 @@ Changelog {#Changelog} ============ +## Deflect 0.12 + +### 0.12.0 (git master) + +* [114](https://github.com/BlueBrain/Deflect/pull/114): + QmlStreamer: added support for keyboard events + ## Deflect 0.11 ### 0.11.1 (30-06-2016)