13#if QT_CONFIG(clipboard)
16#if QT_CONFIG(wayland_datadevice)
20#if QT_CONFIG(wayland_client_primary_selection)
24#include <wayland-cursor.h>
29#if QT_WAYLAND_TEXT_INPUT_V4_WIP
30#include "qwaylandtextinputv4_p.h"
43#if QT_CONFIG(tabletevent)
48#include <QtWaylandClient/private/qwayland-text-input-unstable-v1.h>
49#include <QtWaylandClient/private/qwayland-text-input-unstable-v2.h>
50#include <QtWaylandClient/private/qwayland-text-input-unstable-v4-wip.h>
51#include <QtWaylandClient/private/qwayland-wp-primary-selection-unstable-v1.h>
52#include <QtWaylandClient/private/qwayland-qt-text-input-method-unstable-v1.h>
53#include <QtWaylandClient/private/qwayland-fractional-scale-v1.h>
54#include <QtWaylandClient/private/qwayland-viewporter.h>
55#include <QtWaylandClient/private/qwayland-cursor-shape-v1.h>
56#include <QtWaylandClient/private/qwayland-qt-toplevel-drag-v1.h>
58#include <QtCore/private/qcore_unix_p.h>
60#include <QtCore/QAbstractEventDispatcher>
61#include <QtGui/qpa/qwindowsysteminterface.h>
62#include <QtGui/private/qguiapplication_p.h>
64#include <QtCore/QDebug>
83 EventThread(
struct wl_display * wl,
struct wl_event_queue * ev_queue,
85 : m_fd(wl_display_get_fd(wl))
88 , m_wlevqueue(ev_queue)
111 if (dispatchQueuePending() < 0) {
117 wl_display_flush(m_wldisplay);
124 if (prepareReadQueue() == 0) {
137 if (m_pipefd[1] != -1 &&
write(m_pipefd[1],
"\0", 1) == -1)
138 qWarning(
"Failed to write to the pipe: %s.", strerror(errno));
164 qWarning(
"Pipe creation failed. Quitting may hang.");
179 while (waitForReading()) {
183 pollfd
fds[2] = { { m_fd, POLLIN, 0 }, { m_pipefd[0], POLLIN, 0 } };
186 if (
fds[1].revents & POLLIN) {
188 wl_display_cancel_read(m_wldisplay);
192 if (
fds[0].revents & POLLIN)
193 wl_display_read_events(m_wldisplay);
198 wl_display_cancel_read(m_wldisplay);
203 bool waitForReading()
218 m_cond.
wait(&m_mutex);
224 int dispatchQueuePending()
227 return wl_display_dispatch_queue_pending(m_wldisplay, m_wlevqueue);
229 return wl_display_dispatch_pending(m_wldisplay);
232 int prepareReadQueue()
235 return wl_display_prepare_read_queue(m_wldisplay, m_wlevqueue);
237 return wl_display_prepare_read(m_wldisplay);
242 wl_display *m_wldisplay;
243 wl_event_queue *m_wlevqueue;
265 struct wl_surface *surface = mCompositor.create_surface();
266 wl_surface_set_user_data(surface,
handle);
272 struct ::wl_region *region = mCompositor.create_region();
282 if (!mGlobals.subCompositor) {
283 qCWarning(lcQpaWayland) <<
"Can't create subsurface, not supported by the compositor.";
291 return mGlobals.subCompositor->get_subsurface(
window->wlSurface(),
parent->wlSurface());
296 if (!mGlobals.viewporter) {
297 qCWarning(lcQpaWayland) <<
"Can't create wp_viewport, not supported by the compositor.";
302 return mGlobals.viewporter->get_viewport(
window->wlSurface());
317 return mWindowManagerIntegration.data();
321 : mWaylandIntegration(waylandIntegration)
323 qRegisterMetaType<uint32_t>(
"uint32_t");
325 mDisplay = wl_display_connect(
nullptr);
335void QWaylandDisplay::setupConnection()
337 struct ::wl_registry *registry = wl_display_get_registry(mDisplay);
342#if QT_CONFIG(xkbcommon)
343 mXkbContext.reset(xkb_context_new(XKB_CONTEXT_NO_FLAGS));
345 qCWarning(lcQpaWayland,
"failed to create xkb context");
347 if (!mClientSideInputContextRequested)
348 checkTextInputProtocol();
354 m_eventThread->stop();
356 if (m_frameEventQueueThread)
357 m_frameEventQueueThread->stop();
360 wl_callback_destroy(mSyncCallback);
370 mCursorThemes.clear();
373 if (m_frameEventQueue)
374 wl_event_queue_destroy(m_frameEventQueue);
379 wl_display_disconnect(mDisplay);
386 if (!isInitialized())
391 if (!mWaitingScreens.isEmpty()) {
395 if (!mClientSideInputContextRequested)
396 mTextInputManagerIndex = INT_MAX;
403 if (!mScreens.empty() || mPlaceholderScreen)
406 qCInfo(lcQpaWayland) <<
"Creating a fake screen in order for Qt not to crash";
413void QWaylandDisplay::reconnect()
415 qCWarning(lcQpaWayland) <<
"Attempting wayland reconnect";
416 m_eventThread->stop();
417 m_frameEventQueueThread->stop();
418 m_eventThread->wait();
419 m_frameEventQueueThread->wait();
422 mWaitingScreens.clear();
424 const auto screens = std::exchange(mScreens, {});
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 =
dynamic_cast<QWaylandWindow *
>(
window->handle()))
455 waylandWindow->closeChildPopups();
459 for (
auto window :
std::as_const(windows)) {
460 auto waylandWindow =
dynamic_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;
472 mDisplay = wl_display_connect(
nullptr);
479 if (m_frameEventQueue)
480 wl_event_queue_destroy(m_frameEventQueue);
486 return window && !
static_cast<QWaylandWindow *
>(
window)->wlSurface();
489 while (!recreateWindows.
isEmpty()) {
490 if (!needsRecreate((*window)->QPlatformWindow::parent()) && !needsRecreate((*window)->transientParent())) {
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()
561 timps <<
QLatin1String(QtWayland::qt_text_input_method_manager_v1::interface()->
name)
564#if QT_WAYLAND_TEXT_INPUT_V4_WIP
570 qCDebug(lcQpaWayland) <<
"QT_WAYLAND_TEXT_INPUT_PROTOCOL=" << tiProtocols;
575 while (
it !=
keys.end()) {
576 if (tips.contains(*
it))
577 mTextInputManagerList.append(timps.at(tips.indexOf(*
it)));
579 qCDebug(lcQpaWayland) <<
"text input: unknown protocol - " << *
it;
583 if (mTextInputManagerList.isEmpty())
584 mTextInputManagerList = timps;
589 for (
auto screen : std::as_const(mScreens)) {
598 if (!mWaitingScreens.removeOne(
screen))
602 if (mPlaceholderScreen) {
605 mPlaceholderScreen =
nullptr;
611 struct ::wl_registry *registry =
object();
614 if (interfaceBlacklist.contains(
interface)) {
621 mCompositor.init(registry,
id,
qMin((
int)version, 4));
626 mInputDevices.append(inputDevice);
627#if QT_CONFIG(wayland_datadevice)
632 mGlobals.surfaceExtension.reset(
new QtWayland::qt_surface_extension(registry,
id, 1));
634 mGlobals.subCompositor.reset(
new QtWayland::wl_subcompositor(registry,
id, 1));
639#if QT_CONFIG(tabletevent)
645#if QT_CONFIG(wayland_client_primary_selection)
647 mGlobals.primarySelectionManager.reset(
650 inputDevice->setPrimarySelectionDevice(
651 mGlobals.primarySelectionManager->createDevice(inputDevice));
654 && (mTextInputManagerList.contains(
interface) && mTextInputManagerList.indexOf(
interface) < mTextInputManagerIndex)) {
655 qCDebug(lcQpaWayland) <<
"text input: register qt_text_input_method_manager_v1";
656 if (mTextInputManagerIndex < INT_MAX) {
657 mGlobals.textInputManagerv1.reset();
658 mGlobals.textInputManagerv2.reset();
659#if QT_WAYLAND_TEXT_INPUT_V4_WIP
660 mGlobals.textInputManagerv4.reset();
663 inputDevice->setTextInput(
nullptr);
666 mGlobals.textInputMethodManager.reset(
667 new QtWayland::qt_text_input_method_manager_v1(registry,
id, 1));
671 mGlobals.textInputMethodManager->get_text_input_method(
672 inputDevice->wl_seat())));
674 mTextInputManagerIndex = mTextInputManagerList.indexOf(
interface);
676 && (mTextInputManagerList.contains(
interface) && mTextInputManagerList.indexOf(
interface) < mTextInputManagerIndex)) {
677 qCDebug(lcQpaWayland) <<
"text input: register zwp_text_input_v1";
678 if (mTextInputManagerIndex < INT_MAX) {
679 mGlobals.textInputMethodManager.reset();
680 mGlobals.textInputManagerv2.reset();
681#if QT_WAYLAND_TEXT_INPUT_V4_WIP
682 mGlobals.textInputManagerv4.reset();
685 inputDevice->setTextInputMethod(
nullptr);
688 mGlobals.textInputManagerv1.reset(
689 new QtWayland::zwp_text_input_manager_v1(registry,
id, 1));
693 textInput->setSeat(inputDevice->wl_seat());
694 inputDevice->setTextInput(textInput);
698 mTextInputManagerIndex = mTextInputManagerList.indexOf(
interface);
700 && (mTextInputManagerList.contains(
interface) && mTextInputManagerList.indexOf(
interface) < mTextInputManagerIndex)) {
701 qCDebug(lcQpaWayland) <<
"text input: register zwp_text_input_v2";
702 if (mTextInputManagerIndex < INT_MAX) {
703 mGlobals.textInputMethodManager.reset();
704 mGlobals.textInputManagerv1.reset();
705#if QT_WAYLAND_TEXT_INPUT_V4_WIP
706 mGlobals.textInputManagerv4.reset();
709 inputDevice->setTextInputMethod(
nullptr);
712 mGlobals.textInputManagerv2.reset(
713 new QtWayland::zwp_text_input_manager_v2(registry,
id, 1));
716 this, mGlobals.textInputManagerv2->get_text_input(inputDevice->wl_seat())));
718 mTextInputManagerIndex = mTextInputManagerList.indexOf(
interface);
719#if QT_WAYLAND_TEXT_INPUT_V4_WIP
721 && (mTextInputManagerList.contains(
interface) && mTextInputManagerList.indexOf(
interface) < mTextInputManagerIndex)) {
722 qCDebug(lcQpaWayland) <<
"text input: register zwp_text_input_v4";
723 if (mTextInputManagerIndex < INT_MAX) {
724 mGlobals.textInputMethodManager.reset();
725 mGlobals.textInputManagerv2.reset();
727 inputDevice->setTextInputMethod(
nullptr);
730 mGlobals.textInputManagerv4.reset(
731 new QtWayland::zwp_text_input_manager_v4(registry,
id, 1));
734 this, mGlobals.textInputManagerv4->get_text_input(inputDevice->wl_seat())));
736 mTextInputManagerIndex = mTextInputManagerList.indexOf(
interface);
740 if (!disableHardwareIntegration) {
748 for (
auto *
screen : std::as_const(mWaitingScreens))
751 mGlobals.fractionalScaleManager.reset(
752 new QtWayland::wp_fractional_scale_manager_v1(registry,
id, 1));
754 mGlobals.viewporter.reset(
new QtWayland::wp_viewporter(registry,
id,
qMin(1u, version)));
756 mGlobals.cursorShapeManager.reset(
757 new QtWayland::wp_cursor_shape_manager_v1(registry,
id, std::min(1u, version)));
760 mGlobals.xdgToplevelDragManager.reset(
761 new QtWayland::qt_toplevel_drag_manager_v1(registry,
id, 1));
767 const auto copy = mRegistryListeners;
768 for (Listener l :
copy)
769 (*l.listener)(l.data, registry,
id,
interface, version);
774 for (
int i = 0, ie = mRegistryGlobals.size();
i != ie; ++
i) {
778 for (
auto *
screen : mWaitingScreens) {
780 mWaitingScreens.removeOne(
screen);
788 mScreens.removeOne(
screen);
797 mGlobals.textInputManagerv1.reset();
799 inputDevice->setTextInput(
nullptr);
803 mGlobals.textInputManagerv2.reset();
805 inputDevice->setTextInput(
nullptr);
808#if QT_WAYLAND_TEXT_INPUT_V4_WIP
810 mGlobals.textInputManagerv4.reset();
812 inputDevice->setTextInput(
nullptr);
817 mGlobals.textInputMethodManager.reset();
819 inputDevice->setTextInputMethod(
nullptr);
822#if QT_CONFIG(wayland_client_primary_selection)
823 if (
global.interface ==
QLatin1String(QtWayland::zwp_primary_selection_device_manager_v1::interface()->
name)) {
824 mGlobals.primarySelectionManager.reset();
826 inputDevice->setPrimarySelectionDevice(
nullptr);
838 if (
global.interface == interfaceName)
846 Listener l = { listener,
data };
847 mRegistryListeners.
append(l);
848 for (
int i = 0, ie = mRegistryGlobals.size();
i != ie; ++
i)
849 (*l.listener)(l.data, mRegistryGlobals[
i].registry, mRegistryGlobals[
i].id,
850 mRegistryGlobals[
i].interface, mRegistryGlobals[
i].version);
855 auto iter = std::remove_if(mRegistryListeners.
begin(), mRegistryListeners.
end(), [=](Listener l){
856 return (l.listener == listener && l.data == data);
858 mRegistryListeners.
erase(
iter, mRegistryListeners.
end());
865 int ret = gettimeofday(&tv,
nullptr);
867 return tv.tv_sec*1000 + tv.tv_usec/1000;
873 wl_display_roundtrip(mDisplay);
885 return integrationSupport;
890 return mLastInputWindow.data();
895 mLastInputDevice =
device;
896 mLastInputSerial = serial;
897 mLastInputWindow =
win;
907 if (mActiveWindows.contains(
window))
910 mActiveWindows.append(
window);
911 requestWaylandSync();
921 if (mActiveWindows.last() ==
window)
922 requestWaylandSync();
924 mActiveWindows.removeOne(
window);
937 if (mLastKeyboardFocus == keyboardFocus)
942 if (mLastKeyboardFocus)
945 mLastKeyboardFocus = keyboardFocus;
950 if (mActiveWindows.contains(
window))
954void QWaylandDisplay::handleWaylandSync()
959 QWindow *activeWindow = mActiveWindows.empty() ?
nullptr : mActiveWindows.last()->window();
965#if QT_CONFIG(clipboard)
967 dataDevice->invalidateSelectionOffer();
969#if QT_CONFIG(wayland_client_primary_selection)
971 device->invalidateSelectionOffer();
977const wl_callback_listener QWaylandDisplay::syncCallbackListener = {
978 [](
void *
data,
struct wl_callback *callback, uint32_t
time){
980 wl_callback_destroy(callback);
981 QWaylandDisplay *
display =
static_cast<QWaylandDisplay *
>(
data);
982 display->mSyncCallback =
nullptr;
987void QWaylandDisplay::requestWaylandSync()
992 mSyncCallback = wl_display_sync(mDisplay);
993 wl_callback_add_listener(mSyncCallback, &syncCallbackListener,
this);
998 return mInputDevices.isEmpty() ?
nullptr : mInputDevices.first();
1004 mInputDevices.constBegin(), mInputDevices.constEnd(),
1009 return mClientSideInputContextRequested;
1012#if QT_CONFIG(cursor)
1014QWaylandCursor *QWaylandDisplay::waylandCursor()
1018 return mCursor.data();
1021auto QWaylandDisplay::findExistingCursorTheme(
const QString &
name,
int pixelSize)
const noexcept
1022 -> FindExistingCursorThemeResult
1024 const auto byNameAndSize = [](
const WaylandCursorTheme &lhs,
const WaylandCursorTheme &rhs) {
1025 return std::tie(lhs.pixelSize, lhs.name) < std::tie(rhs.pixelSize, rhs.name);
1028 const WaylandCursorTheme prototype = {
name, pixelSize,
nullptr};
1030 const auto it = std::lower_bound(mCursorThemes.cbegin(), mCursorThemes.cend(), prototype, byNameAndSize);
1031 if (
it != mCursorThemes.
cend() &&
it->name ==
name &&
it->pixelSize == pixelSize)
1037QWaylandCursorTheme *QWaylandDisplay::loadCursorTheme(
const QString &
name,
int pixelSize)
1039 const auto result = findExistingCursorTheme(
name, pixelSize);
1043 if (
auto theme = QWaylandCursorTheme::create(
shm(), pixelSize,
name))
1044 return mCursorThemes.insert(
result.position, {name, pixelSize, std::move(theme)})->theme.get();
1055#include "qwaylanddisplay.moc"
1056#include "moc_qwaylanddisplay_p.cpp"
IOBluetoothDevice * device
T loadAcquire() const noexcept
void storeRelease(T newValue) noexcept
T loadRelaxed() const noexcept
int toInt(bool *ok=nullptr, int base=10) const
Returns the byte array converted to an int using base base, which is ten by default.
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...
bool isEmpty() const noexcept
iterator erase(const_iterator begin, const_iterator end)
void push_back(parameter_type t)
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...
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
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 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.
static void handleWindowActivated(QWindow *window, Qt::FocusReason r=Qt::OtherFocusReason)
EventThread(struct wl_display *wl, struct wl_event_queue *ev_queue, OperatingMode mode)
void needReadAndDispatch()
void readAndDispatchEvents()
virtual bool supportsWindowDecoration() const
bool isClientSideInputContextRequested() 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)
static uint32_t currentTimeMillisec()
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)
QList< QWaylandScreen * > screens() 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
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
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent