summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/global/qglobal.cpp41
-rw-r--r--src/corelib/global/qnamespace.h8
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp8
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