From b2a11aa9ab5d74c993b6a34656ceeefb63b386ff Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 19 Apr 2017 21:30:43 +0100 Subject: [PATCH 1/4] check for null when we dont --- libraries/script-engine/src/TabletScriptingInterface.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index 60e40c76f5..7e18551862 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -81,6 +81,11 @@ void TabletScriptingInterface::setQmlTabletRoot(QString tabletId, QQuickItem* qm QQuickWindow* TabletScriptingInterface::getTabletWindow() { TabletProxy* tablet = qobject_cast(getTablet("com.highfidelity.interface.tablet.system")); + + if (!tablet) { + return nullptr; + } + QObject* qmlSurface = tablet->getTabletSurface(); OffscreenQmlSurface* surface = dynamic_cast(qmlSurface); From 1ec4081a99d8b2153ddad394877c634cf072e77d Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Thu, 20 Apr 2017 21:38:20 +0100 Subject: [PATCH 2/4] crash fix --- libraries/script-engine/src/ScriptEngine.cpp | 1 + .../src/TabletScriptingInterface.cpp | 18 ++++++++++++------ .../src/TabletScriptingInterface.h | 11 +++++++++-- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 525928897d..067c7c1412 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -669,6 +669,7 @@ void ScriptEngine::init() { globalObject().setProperty("TREE_SCALE", newVariant(QVariant(TREE_SCALE))); registerGlobalObject("Tablet", DependencyManager::get().data()); + qScriptRegisterMetaType(this, tabletToScriptValue, tabletFromScriptValue); registerGlobalObject("Assets", &_assetScriptingInterface); registerGlobalObject("Resources", DependencyManager::get().data()); diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index 7e18551862..fea7e1c720 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -21,6 +21,17 @@ #include #include "SoundEffect.h" + +QScriptValue tabletToScriptValue(QScriptEngine* engine, TabletProxy* const &in) { + qDebug() << "------------------- converting tabletProxy to scriptValue <--------------------"; + return engine->newQObject(in, QScriptEngine::QtOwnership, QScriptEngine::ExcludeDeleteLater | QScriptEngine::ExcludeChildObjects); +} + +void tabletFromScriptValue(const QScriptValue& value, TabletProxy* &out) { + qDebug() << "----------------> value to tabletProxy <----------------"; + out = qobject_cast(value.toQObject()); +} + TabletScriptingInterface::TabletScriptingInterface() { qmlRegisterType("Hifi", 1, 0, "SoundEffect"); } @@ -41,7 +52,7 @@ QObject* TabletScriptingInterface::getSystemToolbarProxy() { } } -QObject* TabletScriptingInterface::getTablet(const QString& tabletId) { +TabletProxy* TabletScriptingInterface::getTablet(const QString& tabletId) { std::lock_guard guard(_mutex); @@ -81,11 +92,6 @@ void TabletScriptingInterface::setQmlTabletRoot(QString tabletId, QQuickItem* qm QQuickWindow* TabletScriptingInterface::getTabletWindow() { TabletProxy* tablet = qobject_cast(getTablet("com.highfidelity.interface.tablet.system")); - - if (!tablet) { - return nullptr; - } - QObject* qmlSurface = tablet->getTabletSurface(); OffscreenQmlSurface* surface = dynamic_cast(qmlSurface); diff --git a/libraries/script-engine/src/TabletScriptingInterface.h b/libraries/script-engine/src/TabletScriptingInterface.h index 008f97222e..aff14128db 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.h +++ b/libraries/script-engine/src/TabletScriptingInterface.h @@ -14,7 +14,9 @@ #include #include -#include +#include +#include +#include #include #include @@ -45,7 +47,7 @@ public: * @param name {String} tablet name * @return {TabletProxy} tablet instance */ - Q_INVOKABLE QObject* getTablet(const QString& tabletId); + Q_INVOKABLE TabletProxy* getTablet(const QString& tabletId); void setToolbarMode(bool toolbarMode); @@ -259,6 +261,11 @@ protected: bool _landscape { false }; }; +Q_DECLARE_METATYPE(TabletProxy*); + +QScriptValue tabletToScriptValue(QScriptEngine* engine, TabletProxy* const &in); +void tabletFromScriptValue(const QScriptValue& value, TabletProxy* &out); + /**jsdoc * @class TabletButtonProxy * @property uuid {QUuid} READ_ONLY: uniquely identifies this button From cbd2a532a88e2513a1c3d8e6d2af4dfa4fc2c7b1 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Thu, 20 Apr 2017 23:28:41 +0100 Subject: [PATCH 3/4] remove debug statments --- libraries/script-engine/src/TabletScriptingInterface.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index fea7e1c720..bffe318c11 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -23,12 +23,10 @@ QScriptValue tabletToScriptValue(QScriptEngine* engine, TabletProxy* const &in) { - qDebug() << "------------------- converting tabletProxy to scriptValue <--------------------"; return engine->newQObject(in, QScriptEngine::QtOwnership, QScriptEngine::ExcludeDeleteLater | QScriptEngine::ExcludeChildObjects); } void tabletFromScriptValue(const QScriptValue& value, TabletProxy* &out) { - qDebug() << "----------------> value to tabletProxy <----------------"; out = qobject_cast(value.toQObject()); } From 8cfa03fa5699771240da8d5b14d4b612011fc2dd Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Fri, 21 Apr 2017 18:26:26 +0100 Subject: [PATCH 4/4] tablet cpp ownership --- libraries/ui/src/OffscreenUi.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/ui/src/OffscreenUi.cpp b/libraries/ui/src/OffscreenUi.cpp index 1cb9045e79..2a8f3ec9d5 100644 --- a/libraries/ui/src/OffscreenUi.cpp +++ b/libraries/ui/src/OffscreenUi.cpp @@ -96,6 +96,9 @@ void OffscreenUi::create(QOpenGLContext* context) { rootContext->setContextProperty("OffscreenUi", this); rootContext->setContextProperty("offscreenFlags", offscreenFlags = new OffscreenFlags()); rootContext->setContextProperty("fileDialogHelper", new FileDialogHelper()); + auto tabletScriptingInterface = DependencyManager::get(); + TabletProxy* tablet = tabletScriptingInterface->getTablet("com.highfidelity.interface.tablet.system"); + rootContext->engine()->setObjectOwnership(tablet, QQmlEngine::CppOwnership); } void OffscreenUi::show(const QUrl& url, const QString& name, std::function f) {