This is required for the QQmlBoundSignal optimizations.
Change-Id: I63540b96cd7d4523ec49973a2540054c83d82b12
Reviewed-by: Chris Adams <christopher.adams@nokia.com>
#include "qquickcustomaffector_p.h"
#include <private/qv8engine_p.h>
#include <private/qqmlengine_p.h>
+#include <private/qqmlglobal_p.h>
#include <QQmlEngine>
#include <QDebug>
QT_BEGIN_NAMESPACE
bool QQuickCustomAffector::isAffectConnected()
{
- static int idx = QObjectPrivate::get(this)->signalIndex("affectParticles(QQmlV8Handle,qreal)");
- return QObjectPrivate::get(this)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(this, "affectParticles(QQmlV8Handle,qreal)");
}
void QQuickCustomAffector::affectSystem(qreal dt)
#include "qquickparticleaffector_p.h"
#include <QDebug>
+#include <private/qqmlglobal_p.h>
QT_BEGIN_NAMESPACE
/*!
bool QQuickParticleAffector::isAffectedConnected()
{
- static int idx = QObjectPrivate::get(this)->signalIndex("affected(qreal,qreal)");
- return QObjectPrivate::get(this)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(this, "affected(qreal,qreal)");
}
#include "qquickparticleemitter_p.h"
#include <private/qqmlengine_p.h>
+#include <private/qqmlglobal_p.h>
QT_BEGIN_NAMESPACE
bool QQuickParticleEmitter::isEmitConnected()
{
- static int idx = QObjectPrivate::get(this)->signalIndex("emitParticles(QQmlV8Handle)");
- return QObjectPrivate::get(this)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(this, "emitParticles(QQmlV8Handle)");
}
void QQuickParticleEmitter::componentComplete()
#include "qquicktrailemitter_p.h"
#include <private/qqmlengine_p.h>
+#include <private/qqmlglobal_p.h>
#include <cmath>
QT_BEGIN_NAMESPACE
bool QQuickTrailEmitter::isEmitFollowConnected()
{
- static int idx = QObjectPrivate::get(this)->signalIndex("emitFollowParticles(QQmlV8Handle,QQmlV8Handle)");
- return QObjectPrivate::get(this)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(this, "emitFollowParticles(QQmlV8Handle,QQmlV8Handle)");
}
void QQuickTrailEmitter::recalcParticlesPerSecond(){
inline QQmlNotifierEndpoint *notify(int index);
void addNotify(int index, QQmlNotifierEndpoint *);
int endpointCount(int index);
+ bool signalHasEndpoint(int index);
// The context that created the C++ object
QQmlContextData *context;
#include <QtCore/qmetaobject.h>
#include <QNetworkAccessManager>
#include <QDebug>
-#include <QMetaObject>
#include <QtCore/qcoreapplication.h>
#include <QtCore/qdir.h>
#include <QtCore/qmutex.h>
#include <QtNetwork/qnetworkconfigmanager.h>
#include <private/qobject_p.h>
+#include <private/qmetaobject_p.h>
#include <private/qqmllocale_p.h>
}
}
+bool QQml_isSignalConnected(QObject *obj, int signal_index, int index)
+{
+ QQmlData *data = QQmlData::get(obj);
+ return QObjectPrivate::get(obj)->isSignalConnected(signal_index) || (data && data->signalHasEndpoint(index));
+}
+
+/*
+ index MUST be the index returned by QMetaMethod::index()
+ This is different than the index returned by QObjectPrivate::signalIndex()
+*/
+bool QQmlData::signalHasEndpoint(int index)
+{
+ return notifyList && (notifyList->connectionMask & (1ULL << quint64(index % 64)));
+}
+
QQmlNotifier *QQmlData::objectNameNotifier() const
{
if (!extendedData) extendedData = new QQmlDataExtended;
QMetaObject::connect(sender, signalIdx, receiver, methodIdx, Qt::DirectConnection); \
}
+bool Q_QML_EXPORT QQml_isSignalConnected(QObject*, int, int);
+
+#define IS_SIGNAL_CONNECTED(Sender, Signal) \
+do { \
+ QObject *sender = (Sender); \
+ const char *signal = (Signal); \
+ static int signalIdx = -1; \
+ static int methodIdx = -1; \
+ if (signalIdx < 0) { \
+ signalIdx = QObjectPrivate::get(sender)->signalIndex(signal); \
+ methodIdx = sender->metaObject()->indexOfSignal(signal); \
+ } \
+ return QQml_isSignalConnected(sender, signalIdx, methodIdx); \
+} while (0)
+
struct QQmlGraphics_DerivedObject : public QObject
{
void setParent_noEvent(QObject *parent) {
return d_func()->context;
}
+bool QQuickCanvasItem::isPaintConnected()
+{
+ IS_SIGNAL_CONNECTED(this, "paint(QRect)");
+}
+
void QQuickCanvasItem::sceneGraphInitialized()
{
Q_D(QQuickCanvasItem);
if (!d->contextType.isNull())
QMetaObject::invokeMethod(this, "delayedCreate", Qt::QueuedConnection);
- else if (receivers(SIGNAL(paint(QRect))) > 0)
+ else if (isPaintConnected())
QMetaObject::invokeMethod(this, "requestPaint", Qt::QueuedConnection);
}
bool createContext(const QString &contextType);
void initializeContext(QQuickCanvasContext *context, const QVariantMap &args = QVariantMap());
QRect tiledRect(const QRectF &window, const QSize &tileSize);
+ bool isPaintConnected();
};
QT_END_NAMESPACE
{ 0, 0 }
};
-bool QQuickKeysAttachedPrivate::isConnected(const char *signalName)
+bool QQuickKeysAttached::isConnected(const char *signalName)
{
- return isSignalConnected(signalIndex(signalName));
+ Q_D(QQuickKeysAttached);
+ //### doing two string-based lookups isn't ideal
+ int signal_index = d->signalIndex(signalName);
+ int index = metaObject()->indexOfSignal(signalName);
+ return QQml_isSignalConnected(this, signal_index, index);
}
/*!
QByteArray keySignal = keyToSignal(event->key());
if (!keySignal.isEmpty()) {
keySignal += "(QQuickKeyEvent*)";
- if (d->isConnected(keySignal)) {
+ if (isConnected(keySignal)) {
// If we specifically handle a key then default to accepted
ke.setAccepted(true);
int idx = QQuickKeysAttached::staticMetaObject.indexOfSignal(keySignal);
, inIM(false), enabled(true), imeItem(0), item(0)
{}
- bool isConnected(const char *signalName);
-
//loop detection
bool inPress:1;
bool inRelease:1;
return keySignal;
}
+ bool isConnected(const char *signalName);
+
struct SigMap {
int key;
const char *sig;
#include "qquickevents_p_p.h"
#include "qquickdrag_p.h"
+#include <private/qqmldata_p.h>
+
#include <QtGui/qevent.h>
#include <QtGui/qguiapplication.h>
#include <QtGui/qstylehints.h>
bool QQuickMouseAreaPrivate::isPressAndHoldConnected()
{
Q_Q(QQuickMouseArea);
- static int idx = QObjectPrivate::get(q)->signalIndex("pressAndHold(QQuickMouseEvent*)");
- return QObjectPrivate::get(q)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(q, "pressAndHold(QQuickMouseEvent*)");
}
bool QQuickMouseAreaPrivate::isDoubleClickConnected()
{
Q_Q(QQuickMouseArea);
- static int idx = QObjectPrivate::get(q)->signalIndex("doubleClicked(QQuickMouseEvent*)");
- return QObjectPrivate::get(q)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(q, "doubleClicked(QQuickMouseEvent*)");
}
bool QQuickMouseAreaPrivate::isClickConnected()
{
Q_Q(QQuickMouseArea);
- static int idx = QObjectPrivate::get(q)->signalIndex("clicked(QQuickMouseEvent*)");
- return QObjectPrivate::get(q)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(q, "clicked(QQuickMouseEvent*)");
}
bool QQuickMouseAreaPrivate::isWheelConnected()
{
Q_Q(QQuickMouseArea);
- static int idx = QObjectPrivate::get(q)->signalIndex("wheel(QQuickWheelEvent*)");
- return QObjectPrivate::get(q)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(q, "wheel(QQuickWheelEvent*)");
}
void QQuickMouseAreaPrivate::propagate(QQuickMouseEvent* event, PropagateType t)
bool QQuickTextPrivate::isLineLaidOutConnected()
{
- static int idx = this->signalIndex("lineLaidOut(QQuickTextLine*)");
- return this->isSignalConnected(idx);
+ Q_Q(QQuickText);
+ IS_SIGNAL_CONNECTED(q, "lineLaidOut(QQuickTextLine*)");
}
void QQuickTextPrivate::setupCustomLineGeometry(QTextLine &line, qreal &height, int lineOffset)
bool QQuickTextPrivate::isLinkActivatedConnected()
{
- static int idx = this->signalIndex("linkActivated(QString)");
- return this->isSignalConnected(idx);
+ Q_Q(QQuickText);
+ IS_SIGNAL_CONNECTED(q, "linkActivated(QString)");
}
/*! \internal */
group = g;
}
+static bool isChangedConnected(QObject *obj)
+{
+ IS_SIGNAL_CONNECTED(obj, "changed(QQmlV8Handle,QQmlV8Handle)");
+}
+
void QQuickVisualDataGroupPrivate::emitChanges(QV8Engine *engine)
{
Q_Q(QQuickVisualDataGroup);
- static int idx = signalIndex("changed(QQmlV8Handle,QQmlV8Handle)");
- if (isSignalConnected(idx) && !changeSet.isEmpty()) {
+ if (isChangedConnected(q) && !changeSet.isEmpty()) {
v8::HandleScope handleScope;
v8::Context::Scope contextScope(engine->context());
v8::Local<v8::Array> removed = QQuickVisualDataModelPrivate::buildChangeList(changeSet.removes());