summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/kernel/qwindowsysteminterface.cpp19
-rw-r--r--src/gui/kernel/qwindowsysteminterface_p.h25
2 files changed, 26 insertions, 18 deletions
diff --git a/src/gui/kernel/qwindowsysteminterface.cpp b/src/gui/kernel/qwindowsysteminterface.cpp
index f97dcdf7f3..23c23ba159 100644
--- a/src/gui/kernel/qwindowsysteminterface.cpp
+++ b/src/gui/kernel/qwindowsysteminterface.cpp
@@ -58,8 +58,7 @@ QElapsedTimer QWindowSystemInterfacePrivate::eventTime;
// Callback functions for plugins:
//
-QList<QWindowSystemInterfacePrivate::WindowSystemEvent *> QWindowSystemInterfacePrivate::windowSystemEventQueue;
-QMutex QWindowSystemInterfacePrivate::queueMutex;
+QWindowSystemInterfacePrivate::WindowSystemEventList QWindowSystemInterfacePrivate::windowSystemEventQueue;
extern QPointer<QWindow> qt_last_mouse_receiver;
@@ -330,29 +329,17 @@ QWindowSystemInterfacePrivate::ExposeEvent::ExposeEvent(QWindow *exposed, const
int QWindowSystemInterfacePrivate::windowSystemEventsQueued()
{
- queueMutex.lock();
- int ret = windowSystemEventQueue.count();
- queueMutex.unlock();
- return ret;
+ return windowSystemEventQueue.count();
}
QWindowSystemInterfacePrivate::WindowSystemEvent * QWindowSystemInterfacePrivate::getWindowSystemEvent()
{
- queueMutex.lock();
- QWindowSystemInterfacePrivate::WindowSystemEvent *ret;
- if (windowSystemEventQueue.isEmpty())
- ret = 0;
- else
- ret = windowSystemEventQueue.takeFirst();
- queueMutex.unlock();
- return ret;
+ return windowSystemEventQueue.takeFirstOrReturnNull();
}
void QWindowSystemInterfacePrivate::queueWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent *ev)
{
- queueMutex.lock();
windowSystemEventQueue.append(ev);
- queueMutex.unlock();
QAbstractEventDispatcher *dispatcher = QGuiApplicationPrivate::qt_qpa_core_dispatcher();
if (dispatcher)
diff --git a/src/gui/kernel/qwindowsysteminterface_p.h b/src/gui/kernel/qwindowsysteminterface_p.h
index 26f4cd68bb..f39e473b29 100644
--- a/src/gui/kernel/qwindowsysteminterface_p.h
+++ b/src/gui/kernel/qwindowsysteminterface_p.h
@@ -45,6 +45,8 @@
#include <QElapsedTimer>
#include <QPointer>
+#include <QMutex>
+#include <QList>
QT_BEGIN_HEADER
@@ -323,8 +325,27 @@ public:
qint64 uid;
};
- static QList<WindowSystemEvent *> windowSystemEventQueue;
- static QMutex queueMutex;
+ class WindowSystemEventList {
+ QList<WindowSystemEvent *> impl;
+ mutable QMutex mutex;
+ public:
+ WindowSystemEventList() : impl(), mutex() {}
+ ~WindowSystemEventList()
+ { const QMutexLocker locker(&mutex); qDeleteAll(impl); impl.clear(); }
+
+ void prepend(WindowSystemEvent *e)
+ { const QMutexLocker locker(&mutex); impl.prepend(e); }
+ WindowSystemEvent *takeFirstOrReturnNull()
+ { const QMutexLocker locker(&mutex); return impl.empty() ? 0 : impl.takeFirst(); }
+ void append(WindowSystemEvent *e)
+ { const QMutexLocker locker(&mutex); impl.append(e); }
+ int count() const
+ { const QMutexLocker locker(&mutex); return impl.count(); }
+ private:
+ Q_DISABLE_COPY(WindowSystemEventList);
+ };
+
+ static WindowSystemEventList windowSystemEventQueue;
static int windowSystemEventsQueued();
static WindowSystemEvent * getWindowSystemEvent();