13#if QT_CONFIG(clipboard)
22#if defined(Q_OS_MACOS)
23# include <QtGui/private/qcoretextfontdatabase_p.h>
24# include <QtGui/private/qfontengine_coretext_p.h>
26# include <QtGui/private/qgenericunixfontdatabase_p.h>
28#include <QtGui/private/qgenericunixeventdispatcher_p.h>
29#include <QtGui/private/qgenericunixthemes_p.h>
31#include <QtGui/private/qguiapplication_p.h>
33#include <qpa/qwindowsysteminterface.h>
34#include <qpa/qplatformcursor.h>
35#include <QtGui/QSurfaceFormat>
37#include <QtGui/QOpenGLContext>
39#include <QSocketNotifier>
41#include <qpa/qplatforminputcontextfactory_p.h>
42#include <qpa/qplatformaccessibility.h>
43#include <qpa/qplatforminputcontext.h>
60#if QT_CONFIG(accessibility_atspi_bridge)
61#include <QtGui/private/qspiaccessiblebridge_p.h>
64#if QT_CONFIG(xkbcommon)
65#include <QtGui/private/qxkbcommon_p.h>
77QWaylandIntegration *QWaylandIntegration::sInstance =
nullptr;
80#if defined(Q_OS_MACOS)
81 : mFontDb(
new QCoreTextFontDatabaseEngineFactory<QCoreTextFontEngine>)
107 return mNativeInterface.
data();
115 return mDisplay->clientBufferIntegration();
117 return mDisplay->clientBufferIntegration() &&
mDisplay->clientBufferIntegration()->supportsThreadedOpenGL();
136 &&
mDisplay->clientBufferIntegration())
137 return mDisplay->clientBufferIntegration()->createEglWindow(
window);
150 if (
mDisplay->clientBufferIntegration())
151 return mDisplay->clientBufferIntegration()->createPlatformOpenGLContext(
context->format(),
context->shareHandle());
163 return createUnixEventDispatcher();
172void QWaylandIntegration::initializePlatform()
177 initializeInputDeviceIntegration();
178#if QT_CONFIG(clipboard)
181#if QT_CONFIG(draganddrop)
190 initializePlatform();
203 return mFontDb.
data();
206#if QT_CONFIG(clipboard)
209 return mClipboard.data();
213#if QT_CONFIG(draganddrop)
228 return mDisplay->windowManagerIntegration()->showIsFullScreen();
233#if QT_CONFIG(accessibility)
234QPlatformAccessibility *QWaylandIntegration::accessibility()
const
236 if (!mAccessibility) {
237#if QT_CONFIG(accessibility_atspi_bridge)
239 "Initializing accessibility without event-dispatcher!");
242 mAccessibility.reset(
new QPlatformAccessibility());
245 return mAccessibility.data();
251 return mPlatformServices.data();
261 if (
auto *seat =
mDisplay->currentInputDevice(); seat && seat->keyboardFocus()) {
262 return seat->modifiers();
269 if (
auto *seat =
mDisplay->currentInputDevice())
270 return seat->possibleKeys(
event);
291 return new QWaylandCursor(
display);
305 if (
Q_UNLIKELY(!mClientBufferIntegrationInitialized))
308 Q_ASSERT(mClientBufferIntegrationInitialized);
314 if (!mServerBufferIntegrationInitialized)
322 if (!mShellIntegrationInitialized)
329void QWaylandIntegration::initializeClientBufferIntegration()
332 if (mClientBufferIntegrationInitialized)
337 if (targetKey.isEmpty()) {
339 &&
mDisplay->hardwareIntegration()->clientBufferIntegration() !=
QLatin1String(
"wayland-eglstream-controller")
340 &&
mDisplay->hardwareIntegration()->clientBufferIntegration() !=
QLatin1String(
"linux-dmabuf-unstable-v1")) {
341 targetKey =
mDisplay->hardwareIntegration()->clientBufferIntegration();
347 if (targetKey.isEmpty()) {
348 qWarning(
"Failed to determine what client buffer integration to use");
351 qCDebug(lcQpaWayland) <<
"Available client buffer integrations:" <<
keys;
353 if (
keys.contains(targetKey))
357 qCDebug(lcQpaWayland) <<
"Initializing client buffer integration" << targetKey;
360 qCWarning(lcQpaWayland) <<
"Failed to load client buffer integration:" << targetKey;
361 qCWarning(lcQpaWayland) <<
"Available client buffer integrations:" <<
keys;
367 mClientBufferIntegrationInitialized =
true;
370void QWaylandIntegration::initializeServerBufferIntegration()
372 mServerBufferIntegrationInitialized =
true;
376 if (targetKey.isEmpty() &&
mDisplay->hardwareIntegration())
377 targetKey =
mDisplay->hardwareIntegration()->serverBufferIntegration();
379 if (targetKey.isEmpty()) {
380 qWarning(
"Failed to determine what server buffer integration to use");
385 qCDebug(lcQpaWayland) <<
"Available server buffer integrations:" <<
keys;
387 if (
keys.contains(targetKey))
391 qCDebug(lcQpaWayland) <<
"Initializing server buffer integration" << targetKey;
394 qCWarning(lcQpaWayland) <<
"Failed to load server buffer integration: " << targetKey;
395 qCWarning(lcQpaWayland) <<
"Available server buffer integrations:" <<
keys;
399void QWaylandIntegration::initializeShellIntegration()
401 mShellIntegrationInitialized =
true;
407 if (!targetKeys.isEmpty()) {
408 preferredShells = targetKeys.split(
QLatin1Char(
';'));
415 for (
const QString &preferredShell :
std::as_const(preferredShells)) {
418 qCDebug(lcQpaWayland,
"Using the '%s' shell integration",
qPrintable(preferredShell));
424 qCWarning(lcQpaWayland) <<
"Loading shell integration failed.";
425 qCWarning(lcQpaWayland) <<
"Attempted to load the following shells" << preferredShells;
439void QWaylandIntegration::initializeInputDeviceIntegration()
444 if (targetKey.isEmpty()) {
449 if (
keys.contains(targetKey)) {
453 qWarning(
"Wayland inputdevice integration '%s' not found, using default",
qPrintable(targetKey));
469 qCWarning(lcQpaWayland) <<
"qtvirtualkeyboard currently is not supported at client-side,"
470 " use QT_IM_MODULES=qtvirtualkeyboard at compositor-side.";
472 if (
mDisplay->isWaylandInputContextRequested()
477 if (!requested.contains(defaultInputContext))
478 requested.append(defaultInputContext);
480 for (
const QString &imKey : requested) {
483 if (
mDisplay->textInputMethodManager() !=
nullptr)
485 else if (
mDisplay->textInputManagerv1() !=
nullptr
486 ||
mDisplay->textInputManagerv2() !=
nullptr
487 ||
mDisplay->textInputManagerv3() !=
nullptr)
497#if QT_CONFIG(xkbcommon)
500 waylandInput->setXkbContext(
mDisplay->xkbContext());
512 qCWarning(lcQpaWayland) <<
"No shell integration named" << integrationName <<
"found";
520 mServerBufferIntegrationInitialized =
false;
525 mClientBufferIntegrationInitialized =
false;
530 mPlatformServices->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 QPlatformInputContext * create()
static QStringList requested()
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
static QString fromLocal8Bit(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
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.
QList< QString > QStringList
Constructs a string list that contains the given string, str.
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