diff options
Diffstat (limited to 'src/compositor/compositor_api/qwaylandcompositor.cpp')
-rw-r--r-- | src/compositor/compositor_api/qwaylandcompositor.cpp | 127 |
1 files changed, 67 insertions, 60 deletions
diff --git a/src/compositor/compositor_api/qwaylandcompositor.cpp b/src/compositor/compositor_api/qwaylandcompositor.cpp index 3102177c9..e6f5955b8 100644 --- a/src/compositor/compositor_api/qwaylandcompositor.cpp +++ b/src/compositor/compositor_api/qwaylandcompositor.cpp @@ -1,32 +1,6 @@ -/**************************************************************************** -** -** Copyright (C) 2017 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com> -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWaylandCompositor module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2017 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com> +// Copyright (C) 2020 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include "qtwaylandcompositorglobal_p.h" #include "qwaylandcompositor.h" @@ -67,6 +41,7 @@ #include <QtCore/QCoreApplication> #include <QtCore/QStringList> #include <QtCore/QSocketNotifier> +#include <QStandardPaths> #include <QtGui/QDesktopServices> #include <QtGui/QScreen> @@ -88,6 +63,7 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(qLcWaylandCompositor, "qt.waylandcompositor") Q_LOGGING_CATEGORY(qLcWaylandCompositorHardwareIntegration, "qt.waylandcompositor.hardwareintegration") Q_LOGGING_CATEGORY(qLcWaylandCompositorInputMethods, "qt.waylandcompositor.inputmethods") +Q_LOGGING_CATEGORY(qLcWaylandCompositorTextInput, "qt.waylandcompositor.textinput") namespace QtWayland { @@ -124,13 +100,15 @@ public: ke->nativeScanCode += offset; #endif uint32_t code = ke->nativeScanCode; + if (code == 0) + code = seat->keyboard()->keyToScanCode(ke->key); bool isDown = ke->keyType == QEvent::KeyPress; #if QT_CONFIG(xkbcommon) xkb_state *xkbState = keyb->xkbState(); - Qt::KeyboardModifiers modifiers = QXkbCommon::modifiers(xkbState); const xkb_keysym_t sym = xkb_state_key_get_one_sym(xkbState, code); + Qt::KeyboardModifiers modifiers = QXkbCommon::modifiers(xkbState, sym); int qtkey = QXkbCommon::keysymToQtKey(sym, modifiers, xkbState, code); QString text = QXkbCommon::lookupString(xkbState, code); @@ -158,6 +136,9 @@ public: QWaylandCompositorPrivate::QWaylandCompositorPrivate(QWaylandCompositor *compositor) { + // Create XDG_RUNTIME_DIR, if it does not already exist + QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation); + if (QGuiApplication::platformNativeInterface()) display = static_cast<wl_display*>(QGuiApplication::platformNativeInterface()->nativeResourceForIntegration("server_wl_display")); @@ -189,6 +170,8 @@ void QWaylandCompositorPrivate::init() const int socketArg = arguments.indexOf(QLatin1String("--wayland-socket-name")); if (socketArg != -1 && socketArg + 1 < arguments.size()) socket_name = arguments.at(socketArg + 1).toLocal8Bit(); + if (socket_name.isEmpty()) + socket_name = qgetenv("WAYLAND_DISPLAY"); } wl_compositor::init(display, 4); wl_subcompositor::init(display, 1); @@ -226,12 +209,17 @@ void QWaylandCompositorPrivate::init() QAbstractEventDispatcher *dispatcher = QGuiApplicationPrivate::eventDispatcher; QObject::connect(dispatcher, SIGNAL(aboutToBlock()), q, SLOT(processWaylandEvents())); + QObject::connect(static_cast<QGuiApplication *>(QGuiApplication::instance()), + &QGuiApplication::applicationStateChanged, + q, + &QWaylandCompositor::applicationStateChanged); + initializeHardwareIntegration(); initializeSeats(); initialized = true; - for (const QPointer<QObject> &object : qExchange(polish_objects, {})) { + for (const QPointer<QObject> &object : std::exchange(polish_objects, {})) { if (object) { QEvent polishEvent(QEvent::Polish); QCoreApplication::sendEvent(object.data(), &polishEvent); @@ -307,7 +295,7 @@ void QWaylandCompositorPrivate::addPolishObject(QObject *object) void QWaylandCompositorPrivate::connectToExternalSockets() { // Clear out any backlog of user-supplied external socket descriptors - for (int fd : qAsConst(externally_added_socket_fds)) { + for (int fd : std::as_const(externally_added_socket_fds)) { if (wl_display_add_socket_fd(display, fd) != 0) qWarning() << "Failed to integrate user-supplied socket fd into the Wayland event loop"; } @@ -391,14 +379,14 @@ void QWaylandCompositorPrivate::initializeHardwareIntegration() loadClientBufferIntegration(); loadServerBufferIntegration(); - for (auto *integration : qAsConst(client_buffer_integrations)) + for (auto *integration : std::as_const(client_buffer_integrations)) integration->initializeHardware(display); #endif } void QWaylandCompositorPrivate::initializeSeats() { - for (QWaylandSeat *seat : qAsConst(seats)) + for (QWaylandSeat *seat : std::as_const(seats)) seat->initialize(); } @@ -428,7 +416,7 @@ void QWaylandCompositorPrivate::loadClientBufferIntegration() QString hwIntegrationName; - for (auto targetKey : qAsConst(targetKeys)) { + for (auto targetKey : std::as_const(targetKeys)) { auto *integration = QtWayland::ClientBufferIntegrationFactory::create(targetKey, QStringList()); if (integration) { integration->setCompositor(q); @@ -475,8 +463,22 @@ void QWaylandCompositorPrivate::loadServerBufferIntegration() #endif } +QWaylandSeat *QWaylandCompositorPrivate::seatFor(QInputEvent *inputEvent) +{ + QWaylandSeat *dev = nullptr; + for (int i = 0; i < seats.size(); i++) { + QWaylandSeat *candidate = seats.at(i); + if (candidate->isOwner(inputEvent)) { + dev = candidate; + break; + } + } + return dev; +} + /*! \qmltype WaylandCompositor + \instantiates QWaylandCompositor \inqmlmodule QtWayland.Compositor \since 5.8 \brief Manages the Wayland display server. @@ -508,7 +510,7 @@ void QWaylandCompositorPrivate::loadServerBufferIntegration() */ /*! - \qmlsignal void QtWaylandCompositor::WaylandCompositor::surfaceRequested(WaylandClient client, int id, int version) + \qmlsignal void QtWayland.Compositor::WaylandCompositor::surfaceRequested(WaylandClient client, int id, int version) This signal is emitted when a \a client has created a surface with id \a id. The interface \a version is also available. @@ -530,7 +532,7 @@ void QWaylandCompositorPrivate::loadServerBufferIntegration() */ /*! - \qmlsignal void QtWaylandCompositor::WaylandCompositor::surfaceCreated(WaylandSurface surface) + \qmlsignal void QtWayland.Compositor::WaylandCompositor::surfaceCreated(WaylandSurface surface) This signal is emitted when a new WaylandSurface instance \a surface has been created. */ @@ -577,7 +579,7 @@ void QWaylandCompositor::create() } /*! - * \qmlproperty bool QtWaylandCompositor::WaylandCompositor::created + * \qmlproperty bool QtWayland.Compositor::WaylandCompositor::created * * This property is true if WaylandCompositor has been initialized, * otherwise it's false. @@ -596,7 +598,7 @@ bool QWaylandCompositor::isCreated() const } /*! - * \qmlproperty string QtWaylandCompositor::WaylandCompositor::socketName + * \qmlproperty string QtWayland.Compositor::WaylandCompositor::socketName * * This property holds the socket name used by WaylandCompositor to communicate with * clients. It must be set before the component is completed. @@ -639,7 +641,7 @@ QByteArray QWaylandCompositor::socketName() const } /*! - * \qmlmethod QtWaylandCompositor::WaylandCompositor::addSocketDescriptor(fd) + * \qmlmethod QtWayland.Compositor::WaylandCompositor::addSocketDescriptor(fd) * \since 5.12 * * Listen for client connections on a file descriptor, \a fd, referring to a @@ -702,7 +704,7 @@ QList<QWaylandClient *>QWaylandCompositor::clients() const } /*! - * \qmlmethod QtWaylandCompositor::WaylandCompositor::destroyClientForSurface(surface) + * \qmlmethod QtWayland.Compositor::WaylandCompositor::destroyClientForSurface(surface) * * Destroys the client for the WaylandSurface \a surface. */ @@ -716,7 +718,7 @@ void QWaylandCompositor::destroyClientForSurface(QWaylandSurface *surface) } /*! - * \qmlmethod QtWaylandCompositor::WaylandCompositor::destroyClient(client) + * \qmlmethod QtWayland.Compositor::WaylandCompositor::destroyClient(client) * * Destroys the given WaylandClient \a client. */ @@ -774,7 +776,7 @@ QWaylandOutput *QWaylandCompositor::outputFor(QWindow *window) const } /*! - * \qmlproperty WaylandOutput QtWaylandCompositor::WaylandCompositor::defaultOutput + * \qmlproperty WaylandOutput QtWayland.Compositor::WaylandCompositor::defaultOutput * * This property contains the first in the list of outputs added to the * WaylandCompositor, or null if no outputs have been added. @@ -875,7 +877,7 @@ QWaylandTouch *QWaylandCompositor::createTouchDevice(QWaylandSeat *seat) } /*! - * \qmlproperty bool QtWaylandCompositor::WaylandCompositor::retainedSelection + * \qmlproperty bool QtWayland.Compositor::WaylandCompositor::retainedSelection * * This property holds whether retained selection is enabled. */ @@ -921,7 +923,7 @@ void QWaylandCompositor::overrideSelection(const QMimeData *data) } /*! - * \qmlproperty WaylandSeat QtWaylandCompositor::WaylandCompositor::defaultSeat + * \qmlproperty WaylandSeat QtWayland.Compositor::WaylandCompositor::defaultSeat * * This property contains the default seat for this * WaylandCompositor. @@ -942,27 +944,17 @@ QWaylandSeat *QWaylandCompositor::defaultSeat() const } /*! - * \internal - * - * Currently, Qt only supports a single seat, so this exists for - * future proofing the APIs. + * Select the seat for a given input event \a inputEvent. + * Currently, Qt only supports a single seat. */ QWaylandSeat *QWaylandCompositor::seatFor(QInputEvent *inputEvent) { Q_D(QWaylandCompositor); - QWaylandSeat *dev = nullptr; - for (int i = 0; i < d->seats.size(); i++) { - QWaylandSeat *candidate = d->seats.at(i); - if (candidate->isOwner(inputEvent)) { - dev = candidate; - break; - } - } - return dev; + return d->seatFor(inputEvent); } /*! - * \qmlproperty bool QtWaylandCompositor::WaylandCompositor::useHardwareIntegrationExtension + * \qmlproperty bool QtWayland.Compositor::WaylandCompositor::useHardwareIntegrationExtension * * This property holds whether the hardware integration extension should be enabled for * this WaylandCompositor. @@ -1048,7 +1040,7 @@ void QWaylandCompositor::grabSurface(QWaylandSurfaceGrabber *grabber, const QWay } /*! - * \qmlproperty list<enum> QtWaylandCompositor::WaylandCompositor::additionalShmFormats + * \qmlproperty list<enum> QtWayland.Compositor::WaylandCompositor::additionalShmFormats * * This property holds the list of additional wl_shm formats advertised as supported by the * compositor. @@ -1093,6 +1085,21 @@ QVector<QWaylandCompositor::ShmFormat> QWaylandCompositor::additionalShmFormats( return d->shmFormats; } +void QWaylandCompositor::applicationStateChanged(Qt::ApplicationState state) +{ +#if QT_CONFIG(xkbcommon) + if (state == Qt::ApplicationInactive) { + auto *seat = defaultSeat(); + if (seat != nullptr) { + QWaylandKeyboardPrivate *keyb = QWaylandKeyboardPrivate::get(seat->keyboard()); + keyb->resetKeyboardState(); + } + } +#else + Q_UNUSED(state); +#endif +} + QT_END_NAMESPACE #include "moc_qwaylandcompositor.cpp" |