diff --git a/src/server/kernel/private/wserver_p.h b/src/server/kernel/private/wserver_p.h index 81173be27..5c5653461 100644 --- a/src/server/kernel/private/wserver_p.h +++ b/src/server/kernel/private/wserver_p.h @@ -22,11 +22,14 @@ class Q_DECL_HIDDEN WServerPrivate : public WObjectPrivate { public: WServerPrivate(WServer *qq); - ~WServerPrivate(); + ~WServerPrivate() override; void init(); void stop(); + void dispatchEvents(); + void flush(); + void initSocket(WSocket *socketServer); W_DECLARE_PUBLIC(WServer) diff --git a/src/server/kernel/wserver.cpp b/src/server/kernel/wserver.cpp index c0399f886..a0afdddea 100644 --- a/src/server/kernel/wserver.cpp +++ b/src/server/kernel/wserver.cpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include @@ -38,6 +38,8 @@ QW_USE_NAMESPACE WAYLIB_SERVER_BEGIN_NAMESPACE +Q_LOGGING_CATEGORY(qLcWlrServer, "waylib.server.core") + static bool globalFilter(const wl_client *client, const wl_global *global, void *data) { @@ -102,20 +104,20 @@ void WServerPrivate::init() } loop = wl_display_get_event_loop(display->handle()); - int fd = wl_event_loop_get_fd(loop); - - auto processWaylandEvents = [this] { - int ret = wl_event_loop_dispatch(loop, 0); - if (ret) - fprintf(stderr, "wl_event_loop_dispatch error: %d\n", ret); - wl_display_flush_clients(display->handle()); - }; + const int fd = wl_event_loop_get_fd(loop); + if (fd == -1) { + qCFatal(qLcWlrServer) << "Did not get the file descriptor for the event loop"; + } sockNot.reset(new QSocketNotifier(fd, QSocketNotifier::Read)); - QObject::connect(sockNot.get(), &QSocketNotifier::activated, q, processWaylandEvents); + QObject::connect(sockNot.get(), &QSocketNotifier::activated, q, [this] { + dispatchEvents(); + }); - QAbstractEventDispatcher *dispatcher = QThread::currentThread()->eventDispatcher(); - QObject::connect(dispatcher, &QAbstractEventDispatcher::aboutToBlock, q, processWaylandEvents); + QAbstractEventDispatcher *dispatcher = QCoreApplication::eventDispatcher(); + QObject::connect(dispatcher, &QAbstractEventDispatcher::aboutToBlock, q, [this] { + flush(); + }); for (auto socket : std::as_const(sockets)) initSocket(socket); @@ -142,6 +144,18 @@ void WServerPrivate::stop() QThread::currentThread()->eventDispatcher()->disconnect(q); } +void WServerPrivate::dispatchEvents() +{ + int ret = wl_event_loop_dispatch(loop, 0); + if (ret) + qCCritical(qLcWlrServer, "wl_event_loop_dispatch error: %d\n", ret); +} + +void WServerPrivate::flush() +{ + wl_display_flush_clients(display->handle()); +} + void WServerPrivate::initSocket(WSocket *socketServer) { bool ok = socketServer->listen(display->handle()); diff --git a/src/server/kernel/wsocket.cpp b/src/server/kernel/wsocket.cpp index 0e96d8cff..2c4ad7206 100644 --- a/src/server/kernel/wsocket.cpp +++ b/src/server/kernel/wsocket.cpp @@ -19,8 +19,6 @@ #include #include -struct wl_event_source; - WAYLIB_SERVER_BEGIN_NAMESPACE #define LOCK_SUFFIX ".lock" @@ -656,8 +654,8 @@ WClient *WSocket::addClient(wl_client *client) { W_D(WSocket); - WClient *wclient = nullptr; - if ((wclient = WClient::get(client))) { + WClient *wclient = WClient::get(client); + if (wclient) { if (wclient->socket() != this) return nullptr; if (d->clients.contains(wclient))