aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside/signalmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libpyside/signalmanager.cpp')
-rw-r--r--libpyside/signalmanager.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp
index b7b9b3d93..c0dffd431 100644
--- a/libpyside/signalmanager.cpp
+++ b/libpyside/signalmanager.cpp
@@ -43,6 +43,7 @@
#endif
#define PYSIDE_SLOT '1'
#define PYSIDE_SIGNAL '2'
+#include "globalreceiverv2.h"
#include "globalreceiver.h"
#define PYTHON_TYPE "PyObject"
@@ -177,7 +178,26 @@ using namespace PySide;
struct SignalManager::SignalManagerPrivate
{
+ SharedMap m_globalReceivers;
+
+ //Deprecated
GlobalReceiver m_globalReceiver;
+
+ SignalManagerPrivate()
+ {
+ m_globalReceivers = SharedMap( new QMap<QByteArray, GlobalReceiverV2*>() );
+ }
+
+ ~SignalManagerPrivate()
+ {
+ if (!m_globalReceivers.isNull()) {
+ QList<GlobalReceiverV2*> values = m_globalReceivers->values();
+ m_globalReceivers->clear();
+ if (values.size()) {
+ qDeleteAll(values);
+ }
+ }
+ }
};
static void clearSignalManager()
@@ -245,6 +265,50 @@ int SignalManager::addGlobalSlotGetIndex(const char* slot, PyObject* callback)
return m_d->m_globalReceiver.addSlot(slot, callback);
}
+QObject* SignalManager::globalReceiver(QObject *sender, PyObject *callback)
+{
+ SharedMap globalReceivers = m_d->m_globalReceivers;
+ QByteArray hash = GlobalReceiverV2::hash(callback);
+ GlobalReceiverV2* gr = 0;
+ if (!globalReceivers->contains(hash) && sender) {
+ gr = (*globalReceivers)[hash] = new GlobalReceiverV2(callback, globalReceivers);
+ gr->incRef(sender); // create a link reference
+ gr->decRef(); // remove extra reference
+ } else {
+ gr = (*globalReceivers)[hash];
+ if (sender)
+ gr->incRef(sender);
+ }
+
+ return reinterpret_cast<QObject*>(gr);
+}
+
+int SignalManager::countConnectionsWith(const QObject *object)
+{
+ int count = 0;
+ foreach(GlobalReceiverV2* g, m_d->m_globalReceivers->values()) {
+ if (g->refCount(object))
+ count++;
+ }
+ return count;
+}
+
+void SignalManager::notifyGlobalReceiver(QObject* receiver)
+{
+ reinterpret_cast<GlobalReceiverV2*>(receiver)->notify();
+}
+
+void SignalManager::releaseGlobalReceiver(const QObject* source, QObject* receiver)
+{
+ GlobalReceiverV2* gr = reinterpret_cast<GlobalReceiverV2*>(receiver);
+ gr->decRef(source);
+}
+
+int SignalManager::globalReceiverSlotIndex(QObject* receiver, const char* signature) const
+{
+ return reinterpret_cast<GlobalReceiverV2*>(receiver)->addSlot(signature);
+}
+
static bool emitShortCircuitSignal(QObject* source, int signalIndex, PyObject* args)
{
void* signalArgs[2] = {0, args};
@@ -480,6 +544,7 @@ bool SignalManager::hasConnectionWith(const QObject *object)
return m_d->m_globalReceiver.hasConnectionWith(object);
}
+
const QMetaObject* SignalManager::retriveMetaObject(PyObject *self)
{
Shiboken::GilState gil;
@@ -498,3 +563,4 @@ const QMetaObject* SignalManager::retriveMetaObject(PyObject *self)
return mo;
}
+