summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/xcb/qxcbcursor.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/xcb/qxcbcursor.h')
-rw-r--r--src/plugins/platforms/xcb/qxcbcursor.h30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/plugins/platforms/xcb/qxcbcursor.h b/src/plugins/platforms/xcb/qxcbcursor.h
index 081300868c..f224aae4e0 100644
--- a/src/plugins/platforms/xcb/qxcbcursor.h
+++ b/src/plugins/platforms/xcb/qxcbcursor.h
@@ -47,6 +47,31 @@
QT_BEGIN_NAMESPACE
+#ifndef QT_NO_CURSOR
+
+struct QXcbCursorCacheKey
+{
+ explicit QXcbCursorCacheKey(const QCursor &c);
+ explicit QXcbCursorCacheKey(Qt::CursorShape s) : shape(s), bitmapCacheKey(0), maskCacheKey(0) {}
+ QXcbCursorCacheKey() : shape(Qt::CustomCursor), bitmapCacheKey(0), maskCacheKey(0) {}
+
+ Qt::CursorShape shape;
+ qint64 bitmapCacheKey;
+ qint64 maskCacheKey;
+};
+
+inline bool operator==(const QXcbCursorCacheKey &k1, const QXcbCursorCacheKey &k2)
+{
+ return k1.shape == k2.shape && k1.bitmapCacheKey == k2.bitmapCacheKey && k1.maskCacheKey == k2.maskCacheKey;
+}
+
+inline uint qHash(const QXcbCursorCacheKey &k, uint seed) Q_DECL_NOTHROW
+{
+ return (uint(k.shape) + uint(k.bitmapCacheKey) + uint(k.maskCacheKey)) ^ seed;
+}
+
+#endif // !QT_NO_CURSOR
+
class QXcbCursor : public QXcbObject, public QPlatformCursor
{
public:
@@ -62,6 +87,8 @@ public:
private:
#ifndef QT_NO_CURSOR
+ typedef QHash<QXcbCursorCacheKey, xcb_cursor_t> CursorHash;
+
xcb_cursor_t createFontCursor(int cshape);
xcb_cursor_t createBitmapCursor(QCursor *cursor);
xcb_cursor_t createNonStandardCursor(int cshape);
@@ -69,8 +96,7 @@ private:
QXcbScreen *m_screen;
#ifndef QT_NO_CURSOR
- QMap<int, xcb_cursor_t> m_shapeCursorMap;
- QMap<qint64, xcb_cursor_t> m_bitmapCursorMap;
+ CursorHash m_cursorHash;
#endif
#ifdef XCB_USE_XLIB
static void cursorThemePropertyChanged(QXcbScreen *screen,