diff --git a/egl_wayland_backend.cpp b/egl_wayland_backend.cpp index 12378d133d..ccac0b58a1 100644 --- a/egl_wayland_backend.cpp +++ b/egl_wayland_backend.cpp @@ -27,6 +27,8 @@ along with this program. If not, see . // KDE #include #include +// Qt +#include // xcb #include // Wayland @@ -521,7 +523,8 @@ void WaylandSeat::resetCursor() } WaylandBackend::WaylandBackend() - : m_display(wl_display_connect(NULL)) + : QObject(NULL) + , m_display(wl_display_connect(NULL)) , m_registry(wl_display_get_registry(m_display)) , m_compositor(NULL) , m_shell(NULL) @@ -535,6 +538,9 @@ WaylandBackend::WaylandBackend() // setup the registry wl_registry_add_listener(m_registry, &s_registryListener, this); wl_display_dispatch(m_display); + int fd = wl_display_get_fd(m_display); + QSocketNotifier *notifier = new QSocketNotifier(fd, QSocketNotifier::Read, this); + connect(notifier, SIGNAL(activated(int)), SLOT(readEvents())); } WaylandBackend::~WaylandBackend() @@ -564,6 +570,13 @@ WaylandBackend::~WaylandBackend() kDebug(1212) << "Destroyed Wayland display"; } +void WaylandBackend::readEvents() +{ + // TODO: this still seems to block + wl_display_flush(m_display); + wl_display_dispatch(m_display); +} + void WaylandBackend::createSeat(uint32_t name) { wl_seat *seat = reinterpret_cast(wl_registry_bind(m_registry, name, &wl_seat_interface, 1)); @@ -786,10 +799,10 @@ bool EglWaylandBackend::initBufferConfigs() void EglWaylandBackend::present() { setLastDamage(QRegion()); + // need to dispatch pending events as eglSwapBuffers can block wl_display_dispatch_pending(m_wayland->display()); wl_display_flush(m_wayland->display()); eglSwapBuffers(m_display, m_surface); - eglWaitGL(); } void EglWaylandBackend::screenGeometryChanged(const QSize &size) diff --git a/egl_wayland_backend.h b/egl_wayland_backend.h index afdf8c43ad..66519372f9 100644 --- a/egl_wayland_backend.h +++ b/egl_wayland_backend.h @@ -120,8 +120,9 @@ private: * It creates the connection to the Wayland Compositor, set's up the registry and creates * the Wayland surface and it's shell and egl mapping. */ -class WaylandBackend +class WaylandBackend : public QObject { + Q_OBJECT public: WaylandBackend(); virtual ~WaylandBackend(); @@ -138,6 +139,8 @@ public: void ping(uint32_t serial); bool createSurface(); +private Q_SLOTS: + void readEvents(); private: wl_display *m_display; wl_registry *m_registry;