diff options
Diffstat (limited to 'Swiften/EventLoop/Qt/QtEventLoop.h')
-rw-r--r-- | Swiften/EventLoop/Qt/QtEventLoop.h | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/Swiften/EventLoop/Qt/QtEventLoop.h b/Swiften/EventLoop/Qt/QtEventLoop.h index 0e048e5..389b0a7 100644 --- a/Swiften/EventLoop/Qt/QtEventLoop.h +++ b/Swiften/EventLoop/Qt/QtEventLoop.h @@ -3,45 +3,57 @@ * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <QObject> -#include <QEvent> +#include <boost/thread.hpp> + #include <QCoreApplication> +#include <QEvent> +#include <QObject> #include <Swiften/EventLoop/EventLoop.h> namespace Swift { class QtEventLoop : public QObject, public EventLoop { public: - QtEventLoop() {} + QtEventLoop() : isEventInQtEventLoop_(false) {} virtual ~QtEventLoop() { QCoreApplication::removePostedEvents(this); } - virtual void post(const Swift::Event& event) { - QCoreApplication::postEvent(this, new Event(event)); + protected: + virtual void eventPosted() { + boost::recursive_mutex::scoped_lock lock(isEventInQtEventLoopMutex_); + if (!isEventInQtEventLoop_) { + isEventInQtEventLoop_ = true; + QCoreApplication::postEvent(this, new Event()); + } } virtual bool event(QEvent* qevent) { Event* event = dynamic_cast<Event*>(qevent); if (event) { - handleEvent(event->event_); + { + boost::recursive_mutex::scoped_lock lock(isEventInQtEventLoopMutex_); + isEventInQtEventLoop_ = false; + } + handleNextEvent(); //event->deleteLater(); FIXME: Leak? return true; } return false; } private: struct Event : public QEvent { - Event(const Swift::Event& event) : - QEvent(QEvent::User), event_(event) { + Event() : + QEvent(QEvent::User) { } - - Swift::Event event_; }; + + bool isEventInQtEventLoop_; + boost::recursive_mutex isEventInQtEventLoopMutex_; }; } |