diff options
author | Bradley T. Hughes <bradley.hughes@nokia.com> | 2011-12-05 13:46:39 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-12-05 23:03:03 +0100 |
commit | 2c9d042476e04c5045d238859c7b4402fcadf354 (patch) | |
tree | 02612c564cc96a7add0ffc1a3aab5b931217e59b | |
parent | d242d78339db2f2443c61dc10b55b6c68ab87f18 (diff) |
Re-add QInternal::EventNotifyCallback
This is needed by QtScript, so we need to keep it for now.
Change-Id: Iee6bd7daf7e86a09242523f5aca72ede413a6981
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
-rw-r--r-- | src/corelib/global/qglobal.cpp | 41 | ||||
-rw-r--r-- | src/corelib/global/qnamespace.h | 8 | ||||
-rw-r--r-- | src/corelib/kernel/qcoreapplication.cpp | 8 |
3 files changed, 57 insertions, 0 deletions
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index 8b60cdb5c3..615598b378 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -2831,6 +2831,47 @@ int qrand() with meaningful parameter names in their signatures. */ +struct QInternal_CallBackTable { + QVector<QList<qInternalCallback> > callbacks; +}; + +Q_GLOBAL_STATIC(QInternal_CallBackTable, global_callback_table) + +bool QInternal::registerCallback(Callback cb, qInternalCallback callback) +{ + if (cb >= 0 && cb < QInternal::LastCallback) { + QInternal_CallBackTable *cbt = global_callback_table(); + cbt->callbacks.resize(cb + 1); + cbt->callbacks[cb].append(callback); + return true; + } + return false; +} + +bool QInternal::unregisterCallback(Callback cb, qInternalCallback callback) +{ + if (cb >= 0 && cb < QInternal::LastCallback) { + QInternal_CallBackTable *cbt = global_callback_table(); + return (bool) cbt->callbacks[cb].removeAll(callback); + } + return false; +} + +bool QInternal::activateCallbacks(Callback cb, void **parameters) +{ + Q_ASSERT_X(cb >= 0, "QInternal::activateCallback()", "Callback id must be a valid id"); + + QInternal_CallBackTable *cbt = global_callback_table(); + if (cbt && cb < cbt->callbacks.size()) { + QList<qInternalCallback> callbacks = cbt->callbacks[cb]; + bool ret = false; + for (int i=0; i<callbacks.size(); ++i) + ret |= (callbacks.at(i))(parameters); + return ret; + } + return false; +} + /*! \macro Q_BYTE_ORDER \relates <QtGlobal> diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index 16b4b0b093..91bfbfd526 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -1599,6 +1599,14 @@ public: BottomDock, DockCount }; + + enum Callback { + EventNotifyCallback, + LastCallback + }; + static bool registerCallback(Callback, qInternalCallback); + static bool unregisterCallback(Callback, qInternalCallback); + static bool activateCallbacks(Callback, void **); }; QT_END_NAMESPACE diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index 18ec217d2a..7ff82b1bca 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -787,6 +787,14 @@ bool QCoreApplication::testAttribute(Qt::ApplicationAttribute attribute) */ bool QCoreApplication::notifyInternal(QObject *receiver, QEvent *event) { + // Make it possible for QtScript to hook into events even + // though QApplication is subclassed... + bool result = false; + void *cbdata[] = { receiver, event, &result }; + if (QInternal::activateCallbacks(QInternal::EventNotifyCallback, cbdata)) { + return result; + } + // Qt enforces the rule that events can only be sent to objects in // the current thread, so receiver->d_func()->threadData is // equivalent to QThreadData::current(), just without the function |