summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/xcb/qxcbeventdispatcher.cpp
blob: 7049fd86562fbf51ce9a37a966376a89dd2b9d2b (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
// Copyright (C) 2018 The Qt Company Ltd.// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#include"qxcbeventdispatcher.h"#include"qxcbconnection.h"#include <QtCore/QCoreApplication>#include <qpa/qwindowsysteminterface.h> QT_BEGIN_NAMESPACE QXcbUnixEventDispatcher::QXcbUnixEventDispatcher(QXcbConnection *connection, QObject *parent):QEventDispatcherUNIX(parent),m_connection(connection){}QXcbUnixEventDispatcher::~QXcbUnixEventDispatcher(){}boolQXcbUnixEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags){const bool didSendEvents =QEventDispatcherUNIX::processEvents(flags); m_connection->processXcbEvents(flags);// The following line should not be necessary after QTBUG-70095returnQWindowSystemInterface::sendWindowSystemEvents(flags) || didSendEvents;}#if QT_CONFIG(glib)struct XcbEventSource { GSource source; QXcbGlibEventDispatcher *dispatcher; QXcbGlibEventDispatcherPrivate *dispatcher_p; QXcbConnection *connection =nullptr;};static gboolean xcbSourcePrepare(GSource *source, gint *timeout){Q_UNUSED(timeout);auto xcbEventSource =reinterpret_cast<XcbEventSource *>(source);return xcbEventSource->dispatcher_p->wakeUpCalled;}static gboolean xcbSourceCheck(GSource *source){returnxcbSourcePrepare(source,nullptr);}static gboolean xcbSourceDispatch(GSource *source, GSourceFunc, gpointer){auto xcbEventSource =reinterpret_cast<XcbEventSource *>(source);QEventLoop::ProcessEventsFlags flags = xcbEventSource->dispatcher->flags(); xcbEventSource->connection->processXcbEvents(flags);// The following line should not be necessary after QTBUG-70095QWindowSystemInterface::sendWindowSystemEvents(flags);return true;}QXcbGlibEventDispatcher::QXcbGlibEventDispatcher(QXcbConnection *connection, QObject *parent):QEventDispatcherGlib(*newQXcbGlibEventDispatcherPrivate(), parent){Q_D(QXcbGlibEventDispatcher); m_xcbEventSourceFuncs.prepare = xcbSourcePrepare; m_xcbEventSourceFuncs.check = xcbSourceCheck; m_xcbEventSourceFuncs.dispatch = xcbSourceDispatch; m_xcbEventSourceFuncs.finalize =nullptr; GSource *source =g_source_new(&m_xcbEventSourceFuncs,sizeof(XcbEventSource));g_source_set_name(source,"[Qt] XcbEventSource"); m_xcbEventSource =reinterpret_cast<XcbEventSource *>(source); m_xcbEventSource->dispatcher =this; m_xcbEventSource->dispatcher_p =d_func(); m_xcbEventSource->connection = connection;g_source_set_can_recurse(&m_xcbEventSource->source,true);g_source_attach(&m_xcbEventSource->source, d->mainContext);}QXcbGlibEventDispatcherPrivate::QXcbGlibEventDispatcherPrivate(){}QXcbGlibEventDispatcher::~QXcbGlibEventDispatcher(){g_source_destroy(&m_xcbEventSource->source);g_source_unref(&m_xcbEventSource->source);}boolQXcbGlibEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags){ m_flags = flags;returnQEventDispatcherGlib::processEvents(m_flags);}#endif// QT_CONFIG(glib) QAbstractEventDispatcher *QXcbEventDispatcher::createEventDispatcher(QXcbConnection *connection){#if QT_CONFIG(glib)if(qEnvironmentVariableIsEmpty("QT_NO_GLIB") &&QEventDispatcherGlib::versionSupported()) {qCDebug(lcQpaXcb,"using glib dispatcher");return newQXcbGlibEventDispatcher(connection);}else#endif{qCDebug(lcQpaXcb,"using unix dispatcher");return newQXcbUnixEventDispatcher(connection);}} QT_END_NAMESPACE #include"moc_qxcbeventdispatcher.cpp"
close