13#if QT_CONFIG(clipboard)
21#if defined(Q_OS_MACOS)
22# include <QtGui/private/qcoretextfontdatabase_p.h>
23# include <QtGui/private/qfontengine_coretext_p.h>
25# include <QtGui/private/qgenericunixfontdatabase_p.h>
27#include <QtGui/private/qgenericunixeventdispatcher_p.h>
28#include <QtGui/private/qgenericunixthemes_p.h>
30#include <QtGui/private/qguiapplication_p.h>
32#include <qpa/qwindowsysteminterface.h>
33#include <qpa/qplatformcursor.h>
34#include <QtGui/QSurfaceFormat>
36#include <QtGui/QOpenGLContext>
38#include <QSocketNotifier>
40#include <qpa/qplatforminputcontextfactory_p.h>
41#include <qpa/qplatformaccessibility.h>
42#include <qpa/qplatforminputcontext.h>
59#if QT_CONFIG(accessibility_atspi_bridge)
60#include <QtGui/private/qspiaccessiblebridge_p.h>
63#if QT_CONFIG(xkbcommon)
64#include <QtGui/private/qxkbcommon_p.h>
76QWaylandIntegration *QWaylandIntegration::sInstance =
nullptr;
79#if defined(Q_OS_MACOS)
105 return mNativeInterface.
data();
113 return mDisplay->clientBufferIntegration();
115 return mDisplay->clientBufferIntegration() &&
mDisplay->clientBufferIntegration()->supportsThreadedOpenGL();
134 &&
mDisplay->clientBufferIntegration())
135 return mDisplay->clientBufferIntegration()->createEglWindow(
window);
148 if (
mDisplay->clientBufferIntegration())
149 return mDisplay->clientBufferIntegration()->createPlatformOpenGLContext(
context->format(),
context->shareHandle());
161 return createUnixEventDispatcher();
170void QWaylandIntegration::initializePlatform()
175 initializeInputDeviceIntegration();
176#if QT_CONFIG(clipboard)
179#if QT_CONFIG(draganddrop)
188 initializePlatform();
201 return mFontDb.
data();
204#if QT_CONFIG(clipboard)
207 return mClipboard.data();
211#if QT_CONFIG(draganddrop)
226 return mDisplay->windowManagerIntegration()->showIsFullScreen();
231#if QT_CONFIG(accessibility)
232QPlatformAccessibility *QWaylandIntegration::accessibility()
const
234 if (!mAccessibility) {
235#if QT_CONFIG(accessibility_atspi_bridge)
237 "Initializing accessibility without event-dispatcher!");
240 mAccessibility.reset(
new QPlatformAccessibility());
243 return mAccessibility.data();
249 return mDisplay->windowManagerIntegration();
259 if (
auto *seat =
mDisplay->currentInputDevice(); seat && seat->keyboardFocus()) {
260 return seat->modifiers();
267 if (
auto *seat =
mDisplay->currentInputDevice())
268 return seat->possibleKeys(
event);
289 return new QWaylandCursor(
display);
303 if (
Q_UNLIKELY(!mClientBufferIntegrationInitialized))
306 Q_ASSERT(mClientBufferIntegrationInitialized);
312 if (!mServerBufferIntegrationInitialized)
320 if (!mShellIntegrationInitialized)
327void QWaylandIntegration::initializeClientBufferIntegration()
330 if (mClientBufferIntegrationInitialized)
337 &&
mDisplay->hardwareIntegration()->clientBufferIntegration() !=
QLatin1String(
"wayland-eglstream-controller")
338 &&
mDisplay->hardwareIntegration()->clientBufferIntegration() !=
QLatin1String(
"linux-dmabuf-unstable-v1")) {
339 targetKey =
mDisplay->hardwareIntegration()->clientBufferIntegration();
346 qWarning(
"Failed to determine what client buffer integration to use");
349 qCDebug(lcQpaWayland) <<
"Available client buffer integrations:" <<
keys;
351 if (
keys.contains(targetKey))
355 qCDebug(lcQpaWayland) <<
"Initializing client buffer integration" << targetKey;
358 qCWarning(lcQpaWayland) <<
"Failed to load client buffer integration:" << targetKey;
359 qCWarning(lcQpaWayland) <<
"Available client buffer integrations:" <<
keys;
365 mClientBufferIntegrationInitialized =
true;
368void QWaylandIntegration::initializeServerBufferIntegration()
370 mServerBufferIntegrationInitialized =
true;
375 targetKey =
mDisplay->hardwareIntegration()->serverBufferIntegration();
378 qWarning(
"Failed to determine what server buffer integration to use");
383 qCDebug(lcQpaWayland) <<
"Available server buffer integrations:" <<
keys;
385 if (
keys.contains(targetKey))
389 qCDebug(lcQpaWayland) <<
"Initializing server buffer integration" << targetKey;
392 qCWarning(lcQpaWayland) <<
"Failed to load server buffer integration: " << targetKey;
393 qCWarning(lcQpaWayland) <<
"Available server buffer integrations:" <<
keys;
397void QWaylandIntegration::initializeShellIntegration()
399 mShellIntegrationInitialized =
true;
413 for (
const QString &preferredShell :
std::as_const(preferredShells)) {
416 qCDebug(lcQpaWayland,
"Using the '%s' shell integration",
qPrintable(preferredShell));
422 qCWarning(lcQpaWayland) <<
"Loading shell integration failed.";
423 qCWarning(lcQpaWayland) <<
"Attempted to load the following shells" << preferredShells;
437void QWaylandIntegration::initializeInputDeviceIntegration()
447 if (
keys.contains(targetKey)) {
451 qWarning(
"Wayland inputdevice integration '%s' not found, using default",
qPrintable(targetKey));
467 qCWarning(lcQpaWayland) <<
"qtvirtualkeyboard currently is not supported at client-side,"
468 " use QT_IM_MODULE=qtvirtualkeyboard at compositor-side.";
470 if (!
mDisplay->isClientSideInputContextRequested()) {
471 if (
mDisplay->textInputMethodManager() !=
nullptr)
473#if QT_WAYLAND_TEXT_INPUT_V4_WIP
474 else if (
mDisplay->textInputManagerv1() !=
nullptr ||
mDisplay->textInputManagerv2() !=
nullptr ||
mDisplay->textInputManagerv4() !=
nullptr)
476 else if (
mDisplay->textInputManagerv1() !=
nullptr ||
mDisplay->textInputManagerv2() !=
nullptr)
487#if QT_CONFIG(xkbcommon)
490 waylandInput->setXkbContext(
mDisplay->xkbContext());
502 qCWarning(lcQpaWayland) <<
"No shell integration named" << integrationName <<
"found";
510 mServerBufferIntegrationInitialized =
false;
515 mClientBufferIntegrationInitialized =
false;
520 auto unixServices =
mDisplay->windowManagerIntegration();
521 unixServices->setApplicationBadge(
number);
static QAbstractEventDispatcher * eventDispatcher
static QAbstractEventDispatcher * eventDispatcher()
Returns a pointer to the event dispatcher object for the main thread.
static QPlatformTheme * createUnixTheme(const QString &name)
Creates a UNIX theme according to the detected desktop environment.
static QStringList themeNames()
The QKeyEvent class describes a key event.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
static QString requested()
static QPlatformInputContext * create()
The QPlatformInputContext class abstracts the input method dependent data and composing state.
virtual bool isValid() const
Returns input context validity.
The QPlatformOpenGLContext class provides an abstraction for native GL contexts.
T * data() const noexcept
Returns the value of the pointer referenced by this object.
void reset(T *other=nullptr) noexcept(noexcept(Cleanup::cleanup(std::declval< T * >())))
Deletes the existing object it is pointing to (if any), and sets its pointer to other.
\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.
The QVulkanInstance class represents a native Vulkan instance, enabling Vulkan rendering onto a QSurf...
static void setPlatformSynthesizesMouse(bool v)
static void setXkbContext(QPlatformInputContext *inputContext, struct xkb_context *context)
static QStringList keys()
static QWaylandClientBufferIntegration * create(const QString &name, const QStringList &args)
QScopedPointer< QWaylandInputDeviceIntegration > mInputDeviceIntegration
QVariant styleHint(StyleHint hint) const override
virtual QWaylandServerBufferIntegration * serverBufferIntegration() const
QPlatformNativeInterface * nativeInterface() const override
QPlatformWindow * createPlatformWindow(QWindow *window) const override
Factory function for QPlatformWindow.
QPlatformFontDatabase * fontDatabase() const override
Accessor for the platform integration's fontdatabase.
bool hasCapability(QPlatformIntegration::Capability cap) const override
QScopedPointer< QWaylandClientBufferIntegration > mClientBufferIntegration
QPlatformTheme * createPlatformTheme(const QString &name) const override
virtual QWaylandCursor * createPlatformCursor(QWaylandDisplay *display) const
virtual QWaylandScreen * createPlatformScreen(QWaylandDisplay *waylandDisplay, int version, uint32_t id) const
QStringList themeNames() const override
static QWaylandIntegration * instance()
QScopedPointer< QWaylandDisplay > mDisplay
QPlatformServices * services() const override
QScopedPointer< QWaylandShellIntegration > mShellIntegration
virtual QWaylandShellIntegration * shellIntegration() const
QWaylandDisplay * display() const
void initialize() override
Performs initialization steps that depend on having an event dispatcher available.
QScopedPointer< QWaylandServerBufferIntegration > mServerBufferIntegration
virtual QWaylandClientBufferIntegration * clientBufferIntegration() const
QPlatformInputContext * inputContext() const override
Returns the platforms input context.
virtual QPlatformNativeInterface * createPlatformNativeInterface()
QList< int > possibleKeys(const QKeyEvent *event) const override
Should be used to obtain a list of possible shortcuts for the given key event.
QPlatformBackingStore * createPlatformBackingStore(QWindow *window) const override
Factory function for QPlatformBackingStore.
void reconfigureInputContext()
QScopedPointer< QPlatformInputContext > mInputContext
virtual QWaylandInputDevice * createInputDevice(QWaylandDisplay *display, int version, uint32_t id) const
Qt::KeyboardModifiers queryKeyboardModifiers() const override
QAbstractEventDispatcher * createEventDispatcher() const override
Factory function for the GUI event dispatcher.
~QWaylandIntegration() override
void setApplicationBadge(qint64 number) override
static QWaylandServerBufferIntegration * create(const QString &name, const QStringList &args)
static QStringList keys()
static QStringList keys()
static QWaylandShellIntegration * create(const QString &name, QWaylandDisplay *display, const QStringList &args=QStringList())
static bool fixedToplevelPositions
struct wl_display * display
Combined button and popup list for selecting options.
QPlatformFontDatabase QGenericUnixFontDatabase
#define qCWarning(category,...)
#define qCDebug(category,...)
static bool contains(const QJsonArray &haystack, unsigned needle)
#define Q_ASSERT_X(cond, x, msg)
#define qPrintable(string)
QLatin1StringView QLatin1String
#define QStringLiteral(str)
static QT_BEGIN_NAMESPACE QVariant hint(QPlatformIntegration::StyleHint h)
Q_CORE_EXPORT QByteArray qgetenv(const char *varName)
Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) noexcept
\inmodule QtCore \reentrant