diff options
author | Harald Fernengel <harald.fernengel@nokia.com> | 2010-01-29 15:06:06 (GMT) |
---|---|---|
committer | Harald Fernengel <harald.fernengel@nokia.com> | 2010-03-03 14:16:32 (GMT) |
commit | 5d1735d6cf1820107145e7fdfe41ac502d0020f9 (patch) | |
tree | 0af3444064421831a375e9feebe689b2a912a3bd /src/gui/styles/qgtkstyle_p.h | |
parent | a1b0dba9971ef88dc1e079d1ea49230a4dd3c514 (diff) | |
download | Qt-5d1735d6cf1820107145e7fdfe41ac502d0020f9.zip Qt-5d1735d6cf1820107145e7fdfe41ac502d0020f9.tar.gz Qt-5d1735d6cf1820107145e7fdfe41ac502d0020f9.tar.bz2 |
Optimize QGtkStyle
Use latin1 literals instead of QString to prevent
one malloc/memcpy/free per rendered table cell.
Reviewed-By: Robert Griebl
Diffstat (limited to 'src/gui/styles/qgtkstyle_p.h')
-rw-r--r-- | src/gui/styles/qgtkstyle_p.h | 73 |
1 files changed, 64 insertions, 9 deletions
diff --git a/src/gui/styles/qgtkstyle_p.h b/src/gui/styles/qgtkstyle_p.h index db5b9b9..5ded4dd 100644 --- a/src/gui/styles/qgtkstyle_p.h +++ b/src/gui/styles/qgtkstyle_p.h @@ -56,6 +56,9 @@ #include <QtCore/qglobal.h> #if !defined(QT_NO_STYLE_GTK) +#include <QtCore/qstringbuilder.h> +#include <QtCore/qcoreapplication.h> + #include <QtGui/QFileDialog> #include <QtGui/QGtkStyle> @@ -72,6 +75,50 @@ typedef unsigned long XID; #define QLS(x) QLatin1String(x) +// ### Qt 4.7 - merge with QLatin1Literal +class QHashableLatin1Literal +{ +public: + int size() const { return m_size; } + const char *data() const { return m_data; } + + template <int N> + QHashableLatin1Literal(const char (&str)[N]) + : m_size(N - 1), m_data(str) {} + + QHashableLatin1Literal(const QHashableLatin1Literal &other) + : m_size(other.m_size), m_data(other.m_data) + {} + + QHashableLatin1Literal &operator=(const QHashableLatin1Literal &other) + { + if (this == &other) + return *this; + *const_cast<int *>(&m_size) = other.m_size; + *const_cast<char **>(&m_data) = const_cast<char *>(other.m_data); + return *this; + } + + QString toString() const { return QString::fromLatin1(m_data, m_size); } + + static QHashableLatin1Literal fromData(const char *str) + { + return QHashableLatin1Literal(str, qstrlen(str)); + } + +private: + QHashableLatin1Literal(const char *str, int length) + : m_size(length), m_data(str) + {} + + const int m_size; + const char *m_data; +}; + +bool operator==(const QHashableLatin1Literal &l1, const QHashableLatin1Literal &l2); +inline bool operator!=(const QHashableLatin1Literal &l1, const QHashableLatin1Literal &l2) { return !operator==(l1, l2); } +uint qHash(const QHashableLatin1Literal &key); + class GConf; class GConfClient; @@ -252,7 +299,6 @@ typedef char* (*Ptr_gnome_icon_lookup_sync) ( GnomeIconLookupFlags flags, GnomeIconLookupResultFlags *result); - class QGtkStylePrivate : public QCleanlooksStylePrivate { Q_DECLARE_PUBLIC(QGtkStyle) @@ -262,8 +308,8 @@ public: QGtkStyleFilter filter; - static GtkWidget* gtkWidget(const QString &path); - static GtkStyle* gtkStyle(const QString &path = QLatin1String("GtkWindow")); + static GtkWidget* gtkWidget(const QHashableLatin1Literal &path); + static GtkStyle* gtkStyle(const QHashableLatin1Literal &path = QHashableLatin1Literal("GtkWindow")); virtual void resolveGtk() const; virtual void initGtkMenu() const; @@ -418,17 +464,25 @@ public: static Ptr_gnome_icon_lookup_sync gnome_icon_lookup_sync; static Ptr_gnome_vfs_init gnome_vfs_init; - virtual QPalette gtkWidgetPalette(const QString >kWidgetName) const; + virtual QPalette gtkWidgetPalette(const QHashableLatin1Literal >kWidgetName) const; protected: - typedef QHash<QString, GtkWidget*> WidgetMap; + typedef QHash<QHashableLatin1Literal, GtkWidget*> WidgetMap; + + static inline void destroyWidgetMap() + { + cleanupGtkWidgets(); + delete widgetMap; + widgetMap = 0; + } static inline WidgetMap *gtkWidgetMap() { - static WidgetMap *map = 0; - if (!map) - map = new WidgetMap(); - return map; + if (!widgetMap) { + widgetMap = new WidgetMap(); + qAddPostRoutine(destroyWidgetMap); + } + return widgetMap; } static QStringList extract_filter(const QString &rawFilter); @@ -443,6 +497,7 @@ protected: private: static QList<QGtkStylePrivate *> instances; + static WidgetMap *widgetMap; friend class QGtkStyleUpdateScheduler; }; |