summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2013-04-12 12:53:13 +0200
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2013-04-12 12:53:13 +0200
commitaa3754d1058c08b18dc5c3f38ca9496ce152c584 (patch)
treef2df5de02aab5d82a75e63c54f1bb9882ff89583 /src/gui
parenta12a67c820fb010bc0396233528d652b717842e6 (diff)
parent8c81b282f8e18897257b93cb3fc149d74441c40e (diff)
Merge remote-tracking branch 'origin/stable' into dev
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/accessible/qaccessible.cpp2
-rw-r--r--src/gui/kernel/qguiapplication.cpp8
-rw-r--r--src/gui/kernel/qguiapplication_p.h2
-rw-r--r--src/gui/text/qfont.cpp23
-rw-r--r--src/gui/text/qfont_p.h3
-rw-r--r--src/gui/text/qfontdatabase.cpp23
-rw-r--r--src/gui/text/qfontdatabase_qpa.cpp3
-rw-r--r--src/gui/text/qfontengine_ft.cpp2
8 files changed, 37 insertions, 29 deletions
diff --git a/src/gui/accessible/qaccessible.cpp b/src/gui/accessible/qaccessible.cpp
index 7487aabde5..4fd595ed5a 100644
--- a/src/gui/accessible/qaccessible.cpp
+++ b/src/gui/accessible/qaccessible.cpp
@@ -1507,7 +1507,7 @@ QAccessibleInterface *QAccessibleEvent::accessibleInterface() const
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(m_object);
if (!iface || !iface->isValid()) {
static bool hasWarned = false;
- if (!hasWarned) {
+ if (!iface && !hasWarned) {
qWarning() << "Problem creating accessible interface for: " << m_object << endl
<< "Make sure to deploy Qt with accessibility plugins.";
hasWarned = true;
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index c2e19ca2a8..432929fec5 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -602,6 +602,12 @@ bool QGuiApplicationPrivate::isWindowBlocked(QWindow *window, QWindow **blocking
return false;
}
+bool QGuiApplicationPrivate::synthesizeMouseFromTouchEventsEnabled()
+{
+ return QCoreApplication::testAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents)
+ && QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::SynthesizeMouseFromTouchEvents).toBool();
+}
+
/*!
Returns the QWindow that receives events tied to focus,
such as key events.
@@ -2054,7 +2060,7 @@ void QGuiApplicationPrivate::processTouchEvent(QWindowSystemInterfacePrivate::To
}
QGuiApplication::sendSpontaneousEvent(w, &touchEvent);
- if (!e->synthetic && !touchEvent.isAccepted() && qApp->testAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents)) {
+ if (!e->synthetic && !touchEvent.isAccepted() && synthesizeMouseFromTouchEventsEnabled()) {
// exclude touchpads as those generate their own mouse events
if (touchEvent.device()->type() != QTouchDevice::TouchPad) {
Qt::MouseButtons b = eventType == QEvent::TouchEnd ? Qt::NoButton : Qt::LeftButton;
diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h
index 22d95b2121..376890ef47 100644
--- a/src/gui/kernel/qguiapplication_p.h
+++ b/src/gui/kernel/qguiapplication_p.h
@@ -191,6 +191,8 @@ public:
static void updateBlockedStatus(QWindow *window);
virtual bool isWindowBlocked(QWindow *window, QWindow **blockingWindow = 0) const;
+ static bool synthesizeMouseFromTouchEventsEnabled();
+
static Qt::MouseButtons buttons;
static ulong mousePressTime;
static Qt::MouseButton mousePressButton;
diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp
index fc694dc497..1d6cf3ceca 100644
--- a/src/gui/text/qfont.cpp
+++ b/src/gui/text/qfont.cpp
@@ -191,8 +191,8 @@ QFontPrivate::QFontPrivate(const QFontPrivate &other)
QFontPrivate::~QFontPrivate()
{
- if (engineData)
- engineData->ref.deref();
+ if (engineData && !engineData->ref.deref())
+ delete engineData;
engineData = 0;
if (scFont && scFont != this)
scFont->ref.deref();
@@ -210,7 +210,8 @@ QFontEngine *QFontPrivate::engineForScript(int script) const
script = QChar::Script_Common;
if (engineData && engineData->fontCache != QFontCache::instance()) {
// throw out engineData that came from a different thread
- engineData->ref.deref();
+ if (!engineData->ref.deref())
+ delete engineData;
engineData = 0;
}
if (!engineData || !QT_FONT_ENGINE_FROM_DATA(engineData, script))
@@ -316,13 +317,14 @@ void QFontPrivate::resolve(uint mask, const QFontPrivate *other)
QFontEngineData::QFontEngineData()
- : ref(1), fontCache(QFontCache::instance())
+ : ref(0), fontCache(QFontCache::instance())
{
memset(engines, 0, QChar::ScriptCount * sizeof(QFontEngine *));
}
QFontEngineData::~QFontEngineData()
{
+ Q_ASSERT(ref.load() == 0);
for (int i = 0; i < QChar::ScriptCount; ++i) {
if (engines[i]) {
if (!engines[i]->ref.deref())
@@ -637,8 +639,8 @@ QFont::QFont(QFontPrivate *data)
void QFont::detach()
{
if (d->ref.load() == 1) {
- if (d->engineData)
- d->engineData->ref.deref();
+ if (d->engineData && !d->engineData->ref.deref())
+ delete d->engineData;
d->engineData = 0;
if (d->scFont && d->scFont != d.data())
d->scFont->ref.deref();
@@ -2641,7 +2643,7 @@ QFontCache::~QFontCache()
EngineDataCache::ConstIterator it = engineDataCache.constBegin(),
end = engineDataCache.constEnd();
while (it != end) {
- if (it.value()->ref.load() == 0)
+ if (!it.value()->ref.deref())
delete it.value();
else
FC_DEBUG("QFontCache::~QFontCache: engineData %p still has refcount %d",
@@ -2713,7 +2715,9 @@ void QFontCache::insertEngineData(const QFontDef &def, QFontEngineData *engineDa
def.pixelSize, def.weight, def.style, def.fixedPitch);
}
#endif
+ Q_ASSERT(!engineDataCache.contains(def));
+ engineData->ref.ref();
engineDataCache.insert(def, engineData);
increaseCost(sizeof(QFontEngineData));
}
@@ -2829,7 +2833,7 @@ void QFontCache::timerEvent(QTimerEvent *)
for (; it != end; ++it) {
FC_DEBUG(" %p: ref %2d", it.value(), int(it.value()->ref.load()));
- if (it.value()->ref.load() != 0)
+ if (it.value()->ref.load() != 1)
in_use_cost += engine_data_cost;
}
}
@@ -2894,9 +2898,10 @@ void QFontCache::timerEvent(QTimerEvent *)
// clean out all unused engine data
EngineDataCache::Iterator it = engineDataCache.begin();
while (it != engineDataCache.end()) {
- if (it.value()->ref.load() == 0) {
+ if (it.value()->ref.load() == 1) {
FC_DEBUG(" %p", it.value());
decreaseCost(sizeof(QFontEngineData));
+ it.value()->ref.deref();
delete it.value();
it = engineDataCache.erase(it);
} else {
diff --git a/src/gui/text/qfont_p.h b/src/gui/text/qfont_p.h
index 4cbf51d59c..115e866f24 100644
--- a/src/gui/text/qfont_p.h
+++ b/src/gui/text/qfont_p.h
@@ -143,6 +143,9 @@ public:
QFontCache *fontCache;
QFontEngine *engines[QChar::ScriptCount];
+
+private:
+ Q_DISABLE_COPY(QFontEngineData)
};
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index e3270b430f..62379cd592 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -344,6 +344,7 @@ struct QtFontFamily
bool askedForFallback;
unsigned char writingSystems[QFontDatabase::WritingSystemsCount];
+ bool matchesFamilyName(const QString &familyName) const;
QtFontFoundry *foundry(const QString &f, bool = false);
};
@@ -383,6 +384,11 @@ QtFontFoundry *QtFontFamily::foundry(const QString &f, bool create)
return foundries[count++];
}
+bool QtFontFamily::matchesFamilyName(const QString &familyName) const
+{
+ return name.compare(familyName, Qt::CaseInsensitive) == 0 || aliases.contains(familyName, Qt::CaseInsensitive);
+}
+
class QFontDatabasePrivate
{
@@ -613,9 +619,8 @@ static void getEngineData(const QFontPrivate *d, const QFontDef &def)
// create a new one
d->engineData = new QFontEngineData;
QFontCache::instance()->insertEngineData(def, d->engineData);
- } else {
- d->engineData->ref.ref();
}
+ d->engineData->ref.ref();
}
static QStringList familyList(const QFontDef &req)
@@ -852,19 +857,7 @@ static bool matchFamilyName(const QString &familyName, QtFontFamily *f)
{
if (familyName.isEmpty())
return true;
-
- if (f->name.compare(familyName, Qt::CaseInsensitive) == 0)
- return true;
-
- QStringList::const_iterator it = f->aliases.constBegin();
- while (it != f->aliases.constEnd()) {
- if ((*it).compare(familyName, Qt::CaseInsensitive) == 0)
- return true;
-
- ++it;
- }
-
- return false;
+ return f->matchesFamilyName(familyName);
}
/*!
diff --git a/src/gui/text/qfontdatabase_qpa.cpp b/src/gui/text/qfontdatabase_qpa.cpp
index be42e892fa..32580ada7a 100644
--- a/src/gui/text/qfontdatabase_qpa.cpp
+++ b/src/gui/text/qfontdatabase_qpa.cpp
@@ -110,8 +110,7 @@ static QStringList fallbackFamilies(const QString &family, QFont::Style style, Q
for (i = retList.begin(); i != retList.end(); ++i) {
bool contains = false;
for (int j = 0; j < db->count; j++) {
- QtFontFamily *qtFamily = db->families[j];
- if (!(i->compare(qtFamily->name,Qt::CaseInsensitive))) {
+ if (db->families[j]->matchesFamilyName(*i)) {
contains = true;
break;
}
diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp
index 19b4411b47..10225febcb 100644
--- a/src/gui/text/qfontengine_ft.cpp
+++ b/src/gui/text/qfontengine_ft.cpp
@@ -232,7 +232,7 @@ QFreetypeFace *QFreetypeFace::getFace(const QFontEngine::FaceId &face_id,
QScopedPointer<QFreetypeFace> newFreetype(new QFreetypeFace);
FT_Face face;
if (!face_id.filename.isEmpty()) {
- QString fileName = QString::fromUtf8(face_id.filename);
+ QString fileName = QFile::decodeName(face_id.filename);
if (face_id.filename.startsWith(":qmemoryfonts/")) {
// from qfontdatabase.cpp
QByteArray idx = face_id.filename;