aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside
diff options
context:
space:
mode:
authorrenatofilho <renato.filho@openbossa.org>2010-09-17 17:03:01 -0300
committerrenatofilho <renato.filho@openbossa.org>2010-09-17 18:54:08 -0300
commit6974551674d72a828ff9ae19af510c90a62a09ec (patch)
tree1dac32e9240ede7429569b4d25b672e8c017022a /libpyside
parentb8436f6b1e1efb4da51c6bcc6c22d997541d10c6 (diff)
Created PySide cleanup functions used to register functions to be called before the python die.
Reviewer: Hugo Parente Lima <hugo.pl@gmail.com> Luciano Wolf <luciano.wolf@openbossa.org>
Diffstat (limited to 'libpyside')
-rw-r--r--libpyside/pyside.cpp21
-rw-r--r--libpyside/pyside.h9
-rw-r--r--libpyside/signalmanager.cpp7
3 files changed, 36 insertions, 1 deletions
diff --git a/libpyside/pyside.cpp b/libpyside/pyside.cpp
index ddec19803..bd4ab7c64 100644
--- a/libpyside/pyside.cpp
+++ b/libpyside/pyside.cpp
@@ -24,18 +24,22 @@
#include "pyside.h"
#include "signalmanager.h"
#include "qproperty.h"
+#include "qsignal.h"
#include <basewrapper.h>
#include <conversions.h>
#include <algorithm>
-#include "qsignal.h"
+#include <QStack>
extern "C" void init_signal(PyObject* module);
extern "C" void init_slot(PyObject* module);
extern "C" void init_qproperty(PyObject* module);
+static QStack<PySide::CleanupFunction> cleanupFunctionList;
+
namespace PySide
{
+
void init(PyObject *module)
{
init_signal(module);
@@ -82,5 +86,20 @@ bool fillQtProperties(PyObject* qObj, const QMetaObject* metaObj, PyObject* kwds
return true;
}
+void registerCleanupFunction(CleanupFunction func)
+{
+ cleanupFunctionList.push(func);
+}
+
+void runCleanupFunctions()
+{
+ while (!cleanupFunctionList.isEmpty()) {
+ CleanupFunction f = cleanupFunctionList.pop();
+ f();
+ }
+}
+
+
+
} //namespace PySide
diff --git a/libpyside/pyside.h b/libpyside/pyside.h
index cae050b5d..2c5afb536 100644
--- a/libpyside/pyside.h
+++ b/libpyside/pyside.h
@@ -75,6 +75,15 @@ template<typename T>
struct initQtMetaType<T, false> {
};
+
+typedef void (*CleanupFunction)(void);
+
+/**
+ * Register a function to be called before python die
+ */
+PYSIDE_API void registerCleanupFunction(CleanupFunction func);
+PYSIDE_API void runCleanupFunctions();
+
} //namespace PySide
diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp
index 8208796b2..3724500d5 100644
--- a/libpyside/signalmanager.cpp
+++ b/libpyside/signalmanager.cpp
@@ -22,6 +22,7 @@
#include "signalmanager.h"
#include "qproperty.h"
+#include "pyside.h"
#include <QHash>
#include <QStringList>
@@ -223,6 +224,11 @@ struct SignalManager::SignalManagerPrivate
GlobalReceiver m_globalReceiver;
};
+static void clearSignalManager()
+{
+ PySide::SignalManager::instance().clear();
+}
+
SignalManager::SignalManager() : m_d(new SignalManagerPrivate)
{
// Register Qt primitive typedefs used on signals.
@@ -234,6 +240,7 @@ SignalManager::SignalManager() : m_d(new SignalManagerPrivate)
TypeResolver::createValueTypeResolver<PyObjectWrapper>(PYTHON_TYPE);
TypeResolver::createValueTypeResolver<PyObjectWrapper>("object");
TypeResolver::createValueTypeResolver<PyObjectWrapper>("PySide::PyObjectWrapper");
+ PySide::registerCleanupFunction(clearSignalManager);
}
void SignalManager::clear()