From f7f86d5cfacb796b031ff3e8ead1f35d252481a4 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Sun, 31 Oct 2021 17:02:43 +0100 Subject: [PATCH] Pass env to `WrapperCache::get()` --- .../QtGui/QApplication/napplication.hpp | 27 ++++++++++--------- .../nodegui/QtWidgets/QWidget/qwidget_macro.h | 2 +- .../nodegui/core/WrapperCache/wrappercache.h | 5 ++-- .../QtGui/QApplication/qapplication_wrap.cpp | 4 +-- src/cpp/lib/QtGui/QWindow/qwindow_wrap.cpp | 7 +++-- src/lib/QtGui/QWindow.ts | 2 +- 6 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/cpp/include/nodegui/QtGui/QApplication/napplication.hpp b/src/cpp/include/nodegui/QtGui/QApplication/napplication.hpp index 498b2fa0f..3d051945c 100644 --- a/src/cpp/include/nodegui/QtGui/QApplication/napplication.hpp +++ b/src/cpp/include/nodegui/QtGui/QApplication/napplication.hpp @@ -6,6 +6,7 @@ #include "Extras/Export/export.h" #include "QtCore/QObject/qobject_macro.h" #include "QtGui/QScreen/qscreen_wrap.h" +#include "core/WrapperCache/wrappercache.h" #include "napi.h" class DLL_EXPORT NApplication : public QApplication, public EventWidget { @@ -28,8 +29,8 @@ class DLL_EXPORT NApplication : public QApplication, public EventWidget { this, &QGuiApplication::primaryScreenChanged, [=](QScreen* screen) { Napi::Env env = this->emitOnNode.Env(); Napi::HandleScope scope(env); - auto instance = QScreenWrap::constructor.New( - {Napi::External::New(env, screen)}); + auto instance = + WrapperCache::instance.get(env, screen); this->emitOnNode.Call( {Napi::String::New(env, "primaryScreenChanged"), instance}); }); @@ -37,19 +38,19 @@ class DLL_EXPORT NApplication : public QApplication, public EventWidget { QObject::connect(this, &QGuiApplication::screenAdded, [=](QScreen* screen) { Napi::Env env = this->emitOnNode.Env(); Napi::HandleScope scope(env); - auto instance = QScreenWrap::constructor.New( - {Napi::External::New(env, screen)}); + auto instance = + WrapperCache::instance.get(env, screen); this->emitOnNode.Call({Napi::String::New(env, "screenAdded"), instance}); }); - QObject::connect(this, &QGuiApplication::screenRemoved, - [=](QScreen* screen) { - Napi::Env env = this->emitOnNode.Env(); - Napi::HandleScope scope(env); - auto instance = QScreenWrap::constructor.New( - {Napi::External::New(env, screen)}); - this->emitOnNode.Call( - {Napi::String::New(env, "screenRemoved"), instance}); - }); + QObject::connect( + this, &QGuiApplication::screenRemoved, [=](QScreen* screen) { + Napi::Env env = this->emitOnNode.Env(); + Napi::HandleScope scope(env); + auto instance = + WrapperCache::instance.get(env, screen); + this->emitOnNode.Call( + {Napi::String::New(env, "screenRemoved"), instance}); + }); } }; diff --git a/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h b/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h index 4d50885e7..e287b6a17 100644 --- a/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h +++ b/src/cpp/include/nodegui/QtWidgets/QWidget/qwidget_macro.h @@ -545,7 +545,7 @@ Napi::HandleScope scope(env); \ QWindow* window = this->instance->windowHandle(); \ if (window) { \ - return WrapperCache::instance.get(info, window); \ + return WrapperCache::instance.get(env, window); \ } else { \ return env.Null(); \ } \ diff --git a/src/cpp/include/nodegui/core/WrapperCache/wrappercache.h b/src/cpp/include/nodegui/core/WrapperCache/wrappercache.h index ba4e25906..822200104 100644 --- a/src/cpp/include/nodegui/core/WrapperCache/wrappercache.h +++ b/src/cpp/include/nodegui/core/WrapperCache/wrappercache.h @@ -39,13 +39,12 @@ class DLL_EXPORT WrapperCache : public QObject { * e.g. `QScreen`. * @param W - (template argument) The wrapper type which matches the object * `QScreenWrap`. + * @param env = Napi environment * @param object - Pointer to the QObject for which a wrapper is required. * @return The JS wrapper object. */ template - Napi::Object get(const Napi::CallbackInfo& info, T* object) { - Napi::Env env = info.Env(); - + Napi::Object get(Napi::Env env, T* object) { if (this->cache.contains(object)) { napi_value result = nullptr; napi_get_reference_value(this->cache[object].env, this->cache[object].ref, diff --git a/src/cpp/lib/QtGui/QApplication/qapplication_wrap.cpp b/src/cpp/lib/QtGui/QApplication/qapplication_wrap.cpp index f4f165088..f38df9d96 100644 --- a/src/cpp/lib/QtGui/QApplication/qapplication_wrap.cpp +++ b/src/cpp/lib/QtGui/QApplication/qapplication_wrap.cpp @@ -176,7 +176,7 @@ Napi::Value StaticQApplicationWrapMethods::primaryScreen( Napi::HandleScope scope(env); auto screen = QApplication::primaryScreen(); if (screen) { - return WrapperCache::instance.get(info, screen); + return WrapperCache::instance.get(env, screen); } else { return env.Null(); } @@ -192,7 +192,7 @@ Napi::Value StaticQApplicationWrapMethods::screens( for (int i = 0; i < screens.size(); i++) { QScreen* screen = screens[i]; auto instance = - WrapperCache::instance.get(info, screen); + WrapperCache::instance.get(env, screen); jsArray[i] = instance; } return jsArray; diff --git a/src/cpp/lib/QtGui/QWindow/qwindow_wrap.cpp b/src/cpp/lib/QtGui/QWindow/qwindow_wrap.cpp index 81f92398a..df2c9abc2 100644 --- a/src/cpp/lib/QtGui/QWindow/qwindow_wrap.cpp +++ b/src/cpp/lib/QtGui/QWindow/qwindow_wrap.cpp @@ -40,7 +40,10 @@ void QWindowWrap::connectSignalsToEventEmitter() { this->instance.data(), &QWindow::screenChanged, [=](QScreen* screen) { Napi::Env env = this->emitOnNode.Env(); Napi::HandleScope scope(env); - this->emitOnNode.Call({Napi::String::New(env, "screenChanged")}); + auto instance = + WrapperCache::instance.get(env, screen); + this->emitOnNode.Call( + {Napi::String::New(env, "screenChanged"), instance}); }); } @@ -50,7 +53,7 @@ Napi::Value QWindowWrap::screen(const Napi::CallbackInfo& info) { QScreen* screen = this->instance->screen(); if (screen) { - return WrapperCache::instance.get(info, screen); + return WrapperCache::instance.get(env, screen); } else { return env.Null(); } diff --git a/src/lib/QtGui/QWindow.ts b/src/lib/QtGui/QWindow.ts index 2e13d7220..6795f4ead 100644 --- a/src/lib/QtGui/QWindow.ts +++ b/src/lib/QtGui/QWindow.ts @@ -22,5 +22,5 @@ export class QWindow extends NodeObject { } export interface QWindowSignals extends QObjectSignals { - screenChanged: () => void; + screenChanged: (screen: QScreen) => void; }