13#if QT_CONFIG(clipboard)
16#if QT_CONFIG(wayland_datadevice)
20#if QT_CONFIG(wayland_client_primary_selection)
24#include <wayland-cursor.h>
41#if QT_CONFIG(tabletevent)
46#include <QtWaylandClient/private/qwayland-text-input-unstable-v1.h>
47#include <QtWaylandClient/private/qwayland-text-input-unstable-v2.h>
48#include <QtWaylandClient/private/qwayland-text-input-unstable-v3.h>
49#include <QtWaylandClient/private/qwayland-wp-primary-selection-unstable-v1.h>
50#include <QtWaylandClient/private/qwayland-qt-text-input-method-unstable-v1.h>
51#include <QtWaylandClient/private/qwayland-fractional-scale-v1.h>
52#include <QtWaylandClient/private/qwayland-viewporter.h>
53#include <QtWaylandClient/private/qwayland-cursor-shape-v1.h>
54#include <QtWaylandClient/private/qwayland-xdg-toplevel-drag-v1.h>
56#include <QtCore/private/qcore_unix_p.h>
58#include <QtCore/QAbstractEventDispatcher>
59#include <QtGui/qpa/qwindowsysteminterface.h>
60#include <QtGui/private/qguiapplication_p.h>
62#include <QtCore/QDebug>
81 EventThread(
struct wl_display * wl,
struct wl_event_queue * ev_queue,
83 : m_fd(wl_display_get_fd(wl))
86 , m_wlevqueue(ev_queue)
109 if (dispatchQueuePending() < 0) {
115 wl_display_flush(m_wldisplay);
122 if (prepareReadQueue() == 0) {
135 if (m_pipefd[1] != -1 &&
write(m_pipefd[1],
"\0", 1) == -1)
136 qWarning(
"Failed to write to the pipe: %s.", strerror(errno));
162 qWarning(
"Pipe creation failed. Quitting may hang.");
177 while (waitForReading()) {
181 pollfd
fds[2] = { { m_fd, POLLIN, 0 }, { m_pipefd[0], POLLIN, 0 } };
184 if (
fds[1].revents & POLLIN) {
186 wl_display_cancel_read(m_wldisplay);
190 if (
fds[0].revents & POLLIN)
191 wl_display_read_events(m_wldisplay);
196 wl_display_cancel_read(m_wldisplay);
201 bool waitForReading()
216 m_cond.
wait(&m_mutex);
222 int dispatchQueuePending()
225 return wl_display_dispatch_queue_pending(m_wldisplay, m_wlevqueue);
227 return wl_display_dispatch_pending(m_wldisplay);
230 int prepareReadQueue()
233 return wl_display_prepare_read_queue(m_wldisplay, m_wlevqueue);
235 return wl_display_prepare_read(m_wldisplay);
240 wl_display *m_wldisplay;
241 wl_event_queue *m_wlevqueue;
253 QAtomicInteger<bool> m_reading;
263 struct wl_surface *surface = mGlobals.compositor->create_surface();
264 wl_surface_set_user_data(surface,
handle);
270 struct ::wl_region *region = mGlobals.compositor->create_region();
280 if (!mGlobals.subCompositor) {
281 qCWarning(lcQpaWayland) <<
"Can't create subsurface, not supported by the compositor.";
289 return mGlobals.subCompositor->get_subsurface(
window->wlSurface(),
parent->wlSurface());
294 if (!mGlobals.viewporter) {
295 qCWarning(lcQpaWayland) <<
"Can't create wp_viewport, not supported by the compositor.";
300 return mGlobals.viewporter->get_viewport(
window->wlSurface());
315 return mGlobals.windowManagerIntegration.get();
319 : mWaylandIntegration(waylandIntegration)
321 qRegisterMetaType<uint32_t>(
"uint32_t");
323 mDisplay = wl_display_connect(
nullptr);
333void QWaylandDisplay::setupConnection()
335 struct ::wl_registry *registry = wl_display_get_registry(mDisplay);
338#if QT_CONFIG(xkbcommon)
339 mXkbContext.reset(xkb_context_new(XKB_CONTEXT_NO_FLAGS));
341 qCWarning(lcQpaWayland,
"failed to create xkb context");
343 if (mWaylandInputContextRequested)
344 checkTextInputProtocol();
350 m_eventThread->stop();
352 if (m_frameEventQueueThread)
353 m_frameEventQueueThread->stop();
356 wl_callback_destroy(mSyncCallback);
366 mCursorThemes.clear();
369 if (m_frameEventQueue)
370 wl_event_queue_destroy(m_frameEventQueue);
376 wl_registry_destroy(
object());
379 wl_display_disconnect(mDisplay);
386 if (!isInitialized())
393 if (!mWaitingScreens.isEmpty()) {
397 if (mWaylandInputContextRequested)
398 mTextInputManagerIndex = INT_MAX;
405 if (!mScreens.empty() || mPlaceholderScreen)
408 qCInfo(lcQpaWayland) <<
"Creating a fake screen in order for Qt not to crash";
415void QWaylandDisplay::reconnect()
417 qCWarning(lcQpaWayland) <<
"Attempting wayland reconnect";
418 m_eventThread->stop();
419 m_frameEventQueueThread->stop();
420 m_eventThread->wait();
421 m_frameEventQueueThread->wait();
424 mWaitingScreens.clear();
426 while (!mScreens.isEmpty()) {
427 auto screen = mScreens.takeLast();
432 mCursorThemes.clear();
435 mGlobals = GlobalHolder();
437 mWaylandIntegration->
reset();
440 mLastInputDevice =
nullptr;
445 mRegistryGlobals.clear();
447 mLastInputSerial = 0;
448 mLastInputWindow.clear();
449 mLastKeyboardFocus.clear();
450 mActiveWindows.clear();
453 for (
auto window : windows) {
454 if (
auto waylandWindow =
static_cast<QWaylandWindow *
>(
window->handle()))
455 waylandWindow->closeChildPopups();
458 QList<QWaylandWindow *> recreateWindows;
459 for (
auto window :
std::as_const(windows)) {
460 auto waylandWindow =
static_cast<QWaylandWindow*
>(
window->handle());
461 if (waylandWindow && waylandWindow->wlSurface()) {
462 waylandWindow->reset();
463 recreateWindows.push_back(waylandWindow);
468 wl_callback_destroy(mSyncCallback);
469 mSyncCallback =
nullptr;
473 wl_registry_destroy(
object());
474 mDisplay = wl_display_connect(
nullptr);
481 if (m_frameEventQueue)
482 wl_event_queue_destroy(m_frameEventQueue);
486 return window && !
static_cast<QWaylandWindow *
>(
window)->wlSurface();
488 auto window = recreateWindows.begin();
489 while (!recreateWindows.isEmpty()) {
490 if (!needsRecreate((*window)->QPlatformWindow::parent()) && !needsRecreate((*window)->transientParent())) {
496 if (
window == recreateWindows.end())
497 window = recreateWindows.begin();
505 m_eventThread->readAndDispatchEvents();
519 m_eventThread->start();
522 m_frameEventQueue = wl_display_create_queue(mDisplay);
523 m_frameEventQueueThread.reset(
525 m_frameEventQueueThread->start();
528void QWaylandDisplay::checkWaylandError()
530 int ecode = wl_display_get_error(mDisplay);
531 if ((ecode == EPIPE || ecode == ECONNRESET)) {
532 qWarning(
"The Wayland connection broke. Did the Wayland compositor die?");
533 if (mWaylandTryReconnect) {
538 qWarning(
"The Wayland connection experienced a fatal error: %s", strerror(ecode));
545 if (wl_display_dispatch(mDisplay) < 0) {
546 int ecode = wl_display_get_error(mDisplay);
547 if ((ecode == EPIPE || ecode == ECONNRESET))
548 qWarning(
"The Wayland connection broke during blocking read event. Did the Wayland compositor die?");
550 qWarning(
"The Wayland connection experienced a fatal error during blocking read event: %s", strerror(ecode));
555void QWaylandDisplay::checkTextInputProtocol()
566 timps <<
QLatin1String(QtWayland::qt_text_input_method_manager_v1::interface()->
name)
572 qCDebug(lcQpaWayland) <<
"QT_WAYLAND_TEXT_INPUT_PROTOCOL=" << tiProtocols;
574 if (!tiProtocols.isEmpty()) {
577 while (
it !=
keys.end()) {
578 if (tips.contains(*
it))
579 mTextInputManagerList.append(timps.at(tips.indexOf(*
it)));
581 qCDebug(lcQpaWayland) <<
"text input: unknown protocol - " << *
it;
585 if (mTextInputManagerList.isEmpty())
586 mTextInputManagerList = timps;
591 for (
auto screen : std::as_const(mScreens)) {
600 if (!mWaitingScreens.removeOne(
screen))
604 if (mPlaceholderScreen) {
607 mPlaceholderScreen =
nullptr;
611template <
typename T, auto f>
623 struct ::wl_registry *registry =
object();
626 if (interfaceBlacklist.contains(
interface)) {
633 mGlobals.compositor.reset(
634 new WithDestructor<QtWayland::wl_compositor, wl_compositor_destroy>(
635 registry,
id,
qMin((
int)version, 6)));
637 mGlobals.shm.reset(
new QWaylandShm(
this, version,
id));
640 mInputDevices.append(inputDevice);
641#if QT_CONFIG(wayland_datadevice)
646 mGlobals.surfaceExtension.reset(
647 new WithDestructor<QtWayland::qt_surface_extension, qt_surface_extension_destroy>(
650 mGlobals.subCompositor.reset(
651 new WithDestructor<QtWayland::wl_subcompositor, wl_subcompositor_destroy>(registry,
657#if QT_CONFIG(tabletevent)
663#if QT_CONFIG(wayland_client_primary_selection)
665 mGlobals.primarySelectionManager.reset(
668 inputDevice->setPrimarySelectionDevice(
669 mGlobals.primarySelectionManager->createDevice(inputDevice));
672 && (mTextInputManagerList.contains(
interface) && mTextInputManagerList.indexOf(
interface) < mTextInputManagerIndex)) {
673 qCDebug(lcQpaWayland) <<
"text input: register qt_text_input_method_manager_v1";
674 if (mTextInputManagerIndex < INT_MAX) {
675 mGlobals.textInputManagerv1.reset();
676 mGlobals.textInputManagerv2.reset();
677 mGlobals.textInputManagerv3.reset();
679 inputDevice->setTextInput(
nullptr);
682 mGlobals.textInputMethodManager.reset(
684 qt_text_input_method_manager_v1_destroy>(registry,
id, 1));
688 mGlobals.textInputMethodManager->get_text_input_method(
689 inputDevice->wl_seat())));
691 mTextInputManagerIndex = mTextInputManagerList.indexOf(
interface);
693 && (mTextInputManagerList.contains(
interface) && mTextInputManagerList.indexOf(
interface) < mTextInputManagerIndex)) {
694 qCDebug(lcQpaWayland) <<
"text input: register zwp_text_input_v1";
695 if (mTextInputManagerIndex < INT_MAX) {
696 mGlobals.textInputMethodManager.reset();
697 mGlobals.textInputManagerv2.reset();
698 mGlobals.textInputManagerv3.reset();
700 inputDevice->setTextInputMethod(
nullptr);
703 mGlobals.textInputManagerv1.reset(
705 zwp_text_input_manager_v1_destroy>(registry,
id, 1));
709 textInput->setSeat(inputDevice->wl_seat());
710 inputDevice->setTextInput(textInput);
714 mTextInputManagerIndex = mTextInputManagerList.indexOf(
interface);
716 && (mTextInputManagerList.contains(
interface) && mTextInputManagerList.indexOf(
interface) < mTextInputManagerIndex)) {
717 qCDebug(lcQpaWayland) <<
"text input: register zwp_text_input_v2";
718 if (mTextInputManagerIndex < INT_MAX) {
719 mGlobals.textInputMethodManager.reset();
720 mGlobals.textInputManagerv1.reset();
721 mGlobals.textInputManagerv3.reset();
723 inputDevice->setTextInputMethod(
nullptr);
726 mGlobals.textInputManagerv2.reset(
728 zwp_text_input_manager_v2_destroy>(registry,
id, 1));
731 this, mGlobals.textInputManagerv2->get_text_input(inputDevice->wl_seat())));
733 mTextInputManagerIndex = mTextInputManagerList.indexOf(
interface);
735 && (mTextInputManagerList.contains(
interface) && mTextInputManagerList.indexOf(
interface) < mTextInputManagerIndex)) {
736 qCDebug(lcQpaWayland) <<
"text input: register zwp_text_input_v3";
737 if (mTextInputManagerIndex < INT_MAX) {
738 mGlobals.textInputMethodManager.reset();
739 mGlobals.textInputManagerv2.reset();
741 inputDevice->setTextInputMethod(
nullptr);
743 mGlobals.textInputManagerv3.reset(
745 zwp_text_input_manager_v3_destroy>(registry,
id, 1));
748 this, mGlobals.textInputManagerv3->get_text_input(inputDevice->wl_seat())));
751 mTextInputManagerIndex = mTextInputManagerList.indexOf(
interface);
754 if (!disableHardwareIntegration) {
762 for (
auto *
screen : std::as_const(mWaitingScreens))
765 mGlobals.fractionalScaleManager.reset(
767 wp_fractional_scale_manager_v1_destroy>(registry,
id, 1));
769 mGlobals.viewporter.reset(
770 new WithDestructor<QtWayland::wp_viewporter, wp_viewporter_destroy>(
771 registry,
id,
qMin(1u, version)));
773 mGlobals.cursorShapeManager.reset(
new WithDestructor<QtWayland::wp_cursor_shape_manager_v1,
774 wp_cursor_shape_manager_v1_destroy>(
775 registry,
id, std::min(1u, version)));
778 mGlobals.xdgToplevelDragManager.reset(
780 xdg_toplevel_drag_manager_v1_destroy>(registry,
id, 1));
782 mGlobals.windowManagerIntegration.reset(
789 const auto copy = mRegistryListeners;
790 for (Listener l :
copy)
791 (*l.listener)(l.data, registry,
id,
interface, version);
796 for (
int i = 0, ie = mRegistryGlobals.size();
i != ie; ++
i) {
800 for (
auto *
screen : mWaitingScreens) {
802 mWaitingScreens.removeOne(
screen);
810 mScreens.removeOne(
screen);
819 mGlobals.textInputManagerv1.reset();
821 inputDevice->setTextInput(
nullptr);
825 mGlobals.textInputManagerv2.reset();
827 inputDevice->setTextInput(
nullptr);
831 mGlobals.textInputManagerv3.reset();
833 inputDevice->setTextInput(
nullptr);
837 mGlobals.textInputMethodManager.reset();
839 inputDevice->setTextInputMethod(
nullptr);
842#if QT_CONFIG(wayland_client_primary_selection)
843 if (
global.interface ==
QLatin1String(QtWayland::zwp_primary_selection_device_manager_v1::interface()->
name)) {
844 mGlobals.primarySelectionManager.reset();
846 inputDevice->setPrimarySelectionDevice(
nullptr);
866 Listener l = { listener,
data };
867 mRegistryListeners.
append(l);
868 for (
int i = 0, ie = mRegistryGlobals.size();
i != ie; ++
i)
869 (*l.listener)(l.data, mRegistryGlobals[
i].registry, mRegistryGlobals[
i].id,
870 mRegistryGlobals[
i].interface, mRegistryGlobals[
i].version);
875 auto iter = std::remove_if(mRegistryListeners.
begin(), mRegistryListeners.
end(), [=](Listener l){
876 return (l.listener == listener && l.data == data);
878 mRegistryListeners.
erase(
iter, mRegistryListeners.
end());
883 wl_display_roundtrip(mDisplay);
888 static bool disabled =
qgetenv(
"QT_WAYLAND_DISABLE_WINDOWDECORATION").toInt();
895 if (!mWaylandIntegration->mClientBufferIntegrationInitialized)
900 return integrationSupport;
905 return mLastInputWindow.data();
910 mLastInputDevice =
device;
911 mLastInputSerial = serial;
912 mLastInputWindow =
win;
922 if (mActiveWindows.contains(
window))
925 mActiveWindows.append(
window);
926 requestWaylandSync();
936 if (mActiveWindows.last() ==
window)
937 requestWaylandSync();
939 mActiveWindows.removeOne(
window);
952 if (mLastKeyboardFocus == keyboardFocus)
957 if (mLastKeyboardFocus)
960 mLastKeyboardFocus = keyboardFocus;
965 if (mActiveWindows.contains(
window))
969void QWaylandDisplay::handleWaylandSync()
974 QWindow *activeWindow = mActiveWindows.empty() ?
nullptr : mActiveWindows.last()->window();
980#if QT_CONFIG(clipboard)
982 dataDevice->invalidateSelectionOffer();
984#if QT_CONFIG(wayland_client_primary_selection)
986 device->invalidateSelectionOffer();
992const wl_callback_listener QWaylandDisplay::syncCallbackListener = {
993 [](
void *
data,
struct wl_callback *callback, uint32_t
time){
995 wl_callback_destroy(callback);
996 QWaylandDisplay *
display =
static_cast<QWaylandDisplay *
>(
data);
997 display->mSyncCallback =
nullptr;
1002void QWaylandDisplay::requestWaylandSync()
1007 mSyncCallback = wl_display_sync(mDisplay);
1008 wl_callback_add_listener(mSyncCallback, &syncCallbackListener,
this);
1013 return mInputDevices.isEmpty() ?
nullptr : mInputDevices.first();
1019 mInputDevices.constBegin(), mInputDevices.constEnd(),
1024 return mWaylandInputContextRequested;
1027#if QT_CONFIG(cursor)
1029QWaylandCursor *QWaylandDisplay::waylandCursor()
1033 return mCursor.data();
1036auto QWaylandDisplay::findExistingCursorTheme(
const QString &
name,
int pixelSize)
const noexcept
1037 -> FindExistingCursorThemeResult
1039 const auto byNameAndSize = [](
const WaylandCursorTheme &lhs,
const WaylandCursorTheme &rhs) {
1040 return std::tie(lhs.pixelSize, lhs.name) < std::tie(rhs.pixelSize, rhs.name);
1043 const WaylandCursorTheme prototype = {
name, pixelSize,
nullptr};
1045 const auto it = std::lower_bound(mCursorThemes.cbegin(), mCursorThemes.cend(), prototype, byNameAndSize);
1046 if (
it != mCursorThemes.
cend() &&
it->name ==
name &&
it->pixelSize == pixelSize)
1052QWaylandCursorTheme *QWaylandDisplay::loadCursorTheme(
const QString &
name,
int pixelSize)
1054 const auto result = findExistingCursorTheme(
name, pixelSize);
1058 if (
auto theme = QWaylandCursorTheme::create(
shm(), pixelSize,
name))
1059 return mCursorThemes.insert(
result.position, {name, pixelSize, std::move(theme)})->theme.get();
1070#include "qwaylanddisplay.moc"
1071#include "moc_qwaylanddisplay_p.cpp"
IOBluetoothDevice * device
T loadAcquire() const noexcept
void storeRelease(T newValue) noexcept
T loadRelaxed() const noexcept
static bool closingDown()
Returns true if the application objects are being destroyed; otherwise returns false.
static QWindowList allWindows()
Returns a list of all the windows in the application.
static QWindow * focusWindow()
Returns the QWindow that receives events tied to focus, such as key events.
static QList< QScreen * > screens()
Returns a list of all the screens associated with the windowing system the application is connected t...
iterator erase(const_iterator begin, const_iterator end)
void append(parameter_type t)
QObject * parent() const
Returns a pointer to the parent object.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Q_WEAK_OVERLOAD void setObjectName(const QString &name)
Sets the object's name to name.
\inmodule QtCore\reentrant
The QRegion class specifies a clip region for a painter.
const_iterator cend() const noexcept
\macro QT_RESTRICTED_CAST_FROM_ASCII
QStringList split(const QString &sep, Qt::SplitBehavior behavior=Qt::KeepEmptyParts, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Splits the string into substrings wherever sep occurs, and returns the list of those strings.
static QString fromLocal8Bit(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static QThread * currentThread()
bool wait(QDeadlineTimer deadline=QDeadlineTimer(QDeadlineTimer::Forever))
bool wait(QMutex *, QDeadlineTimer=QDeadlineTimer(QDeadlineTimer::Forever))
static const wl_interface * interface()
Returns the Wayland interface for QWaylandXdgOutputManagerV1.
static void handleFocusWindowChanged(QWindow *window, Qt::FocusReason r=Qt::OtherFocusReason)
static void handleScreenAdded(QPlatformScreen *screen, bool isPrimary=false)
Should be called by the implementation whenever a new screen is added.
static void handleScreenRemoved(QPlatformScreen *screen)
Should be called by the implementation whenever a screen is removed.
EventThread(struct wl_display *wl, struct wl_event_queue *ev_queue, OperatingMode mode)
void needReadAndDispatch()
void readAndDispatchEvents()
virtual bool supportsWindowDecoration() const
void removeListener(RegistryListener listener, void *data)
struct wl_surface * createSurface(void *handle)
QWaylandScreen * screenForOutput(struct wl_output *output) const
void globalAdded(const RegistryGlobal &global)
QWaylandClientBufferIntegration * clientBufferIntegration() const
struct::wl_region * createRegion(const QRegion &qregion)
QWaylandWindow * lastInputWindow() const
QWaylandDisplay(QWaylandIntegration *waylandIntegration)
struct::wp_viewport * createViewport(QWaylandWindow *window)
bool isKeyboardAvailable() const
void handleWindowActivated(QWaylandWindow *window)
struct::wl_subsurface * createSubSurface(QWaylandWindow *window, QWaylandWindow *parent)
~QWaylandDisplay(void) override
void handleWindowDestroyed(QWaylandWindow *window)
void registry_global(uint32_t id, const QString &interface, uint32_t version) override
bool isWindowActivated(const QWaylandWindow *window)
QWaylandShellIntegration * shellIntegration() const
QWaylandInputDevice * lastInputDevice() const
void handleWindowDeactivated(QWaylandWindow *window)
bool supportsWindowDecoration() const
void setLastInputDevice(QWaylandInputDevice *device, uint32_t serial, QWaylandWindow *window)
void blockingReadEvents()
void globalRemoved(const RegistryGlobal &global)
void handleScreenInitialized(QWaylandScreen *screen)
QWaylandShm * shm() const
QWaylandWindowManagerIntegration * windowManagerIntegration() const
void handleKeyboardFocusChanged(QWaylandInputDevice *inputDevice)
bool hasRegistryGlobal(QStringView interfaceName) const
QWaylandXdgOutputManagerV1 * xdgOutputManager() const
QWaylandInputDevice * defaultInputDevice() const
void registry_global_remove(uint32_t id) override
void addRegistryListener(RegistryListener listener, void *data)
bool isWaylandInputContextRequested() const
virtual QWaylandCursor * createPlatformCursor(QWaylandDisplay *display) const
virtual QWaylandScreen * createPlatformScreen(QWaylandDisplay *waylandDisplay, int version, uint32_t id) const
virtual QWaylandShellIntegration * shellIntegration() const
virtual QWaylandClientBufferIntegration * clientBufferIntegration() const
void reconfigureInputContext()
virtual QWaylandInputDevice * createInputDevice(QWaylandDisplay *display, int version, uint32_t id) const
EGLint EGLint EGLint EGLint int int int int * fds
qDeleteAll(list.begin(), list.end())
QSet< QString >::iterator it
void qErrnoWarning(const char *msg,...)
struct wl_display * display
Combined button and popup list for selecting options.
void(* RegistryListener)(void *data, struct wl_registry *registry, uint32_t id, const QString &interface, uint32_t version)
static jboolean copy(JNIEnv *, jobject)
static int qt_safe_pipe(int pipefd[2], int flags=0)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter * iter
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char * interface
#define Q_LOGGING_CATEGORY(name,...)
#define qCInfo(category,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
constexpr const T & qMin(const T &a, const T &b)
GLuint64 GLenum void * handle
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
QAnyStringView interfaceName(const Interface &iface)
QLatin1StringView QLatin1String
#define QStringLiteral(str)
QString qEnvironmentVariable(const char *varName, const QString &defaultValue)
Q_CORE_EXPORT QByteArray qgetenv(const char *varName)
Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) noexcept
Q_CORE_EXPORT int qEnvironmentVariableIntValue(const char *varName, bool *ok=nullptr) noexcept
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
QT_BEGIN_NAMESPACE typedef uchar * output
QtWaylandClient::QWaylandDisplay::RegistryGlobal RegistryGlobal
gzip write("uncompressed data")
\inmodule QtCore \reentrant