diff options
Diffstat (limited to 'src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgsurface.cpp')
-rw-r--r-- | src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgsurface.cpp | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgsurface.cpp b/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgsurface.cpp new file mode 100644 index 000000000..ec096540a --- /dev/null +++ b/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgsurface.cpp @@ -0,0 +1,241 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the config.tests of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or 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.GPL2 and 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-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwaylandxdgsurface_p.h" +#include "qwaylandxdgshell_p.h" + +#include <QtWaylandClient/private/qwaylanddisplay_p.h> +#include <QtWaylandClient/private/qwaylanddisplay_p.h> +#include <QtWaylandClient/private/qwaylandwindow_p.h> +#include <QtWaylandClient/private/qwaylandinputdevice_p.h> +#include <QtWaylandClient/private/qwaylandabstractdecoration_p.h> +#include <QtWaylandClient/private/qwaylandscreen_p.h> +#include <QtWaylandClient/private/qwaylandextendedsurface_p.h> + +QT_BEGIN_NAMESPACE + +namespace QtWaylandClient { + +QWaylandXdgSurface::QWaylandXdgSurface(QWaylandXdgShell *shell, QWaylandWindow *window) + : QWaylandShellSurface(window) + , QtWayland::xdg_surface(shell->get_xdg_surface(window->object())) + , m_window(window) + , m_shell(shell) +{ + if (window->display()->windowExtension()) + m_extendedWindow = new QWaylandExtendedSurface(window); +} + +QWaylandXdgSurface::~QWaylandXdgSurface() +{ + if (m_acked.states & Qt::WindowActive) + window()->display()->handleWindowDeactivated(m_window); + + xdg_surface_destroy(object()); + delete m_extendedWindow; +} + +void QWaylandXdgSurface::resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) +{ + // May need some conversion if types get incompatibles, ATM they're identical + enum resize_edge const * const arg = reinterpret_cast<enum resize_edge const * const>(&edges); + resize(inputDevice, *arg); +} + +void QWaylandXdgSurface::resize(QWaylandInputDevice *inputDevice, enum resize_edge edges) +{ + resize(inputDevice->wl_seat(), + inputDevice->serial(), + edges); +} + +bool QWaylandXdgSurface::move(QWaylandInputDevice *inputDevice) +{ + move(inputDevice->wl_seat(), + inputDevice->serial()); + return true; +} + +void QWaylandXdgSurface::updateTransientParent(QWaylandWindow *parent) +{ + if (!parent) + return; + auto parentXdgSurface = qobject_cast<QWaylandXdgSurface *>(parent->shellSurface()); + Q_ASSERT(parentXdgSurface); + set_parent(parentXdgSurface->object()); +} + +void QWaylandXdgSurface::setTitle(const QString & title) +{ + return QtWayland::xdg_surface::set_title(title); +} + +void QWaylandXdgSurface::setAppId(const QString & appId) +{ + return QtWayland::xdg_surface::set_app_id(appId); +} + +void QWaylandXdgSurface::raise() +{ + if (m_extendedWindow) + m_extendedWindow->raise(); +} + +void QWaylandXdgSurface::lower() +{ + if (m_extendedWindow) + m_extendedWindow->lower(); +} + +void QWaylandXdgSurface::setContentOrientationMask(Qt::ScreenOrientations orientation) +{ + if (m_extendedWindow) + m_extendedWindow->setContentOrientationMask(orientation); +} + +void QWaylandXdgSurface::setWindowFlags(Qt::WindowFlags flags) +{ + if (m_extendedWindow) + m_extendedWindow->setWindowFlags(flags); +} + +void QWaylandXdgSurface::sendProperty(const QString &name, const QVariant &value) +{ + if (m_extendedWindow) + m_extendedWindow->updateGenericProperty(name, value); +} + +void QWaylandXdgSurface::setType(Qt::WindowType type, QWaylandWindow *transientParent) +{ + Q_UNUSED(type) + if (transientParent) + updateTransientParent(transientParent); +} + +void QWaylandXdgSurface::applyConfigure() +{ + if (m_pending.isResizing) + m_normalSize = m_pending.size; + else if (!(m_acked.states & (Qt::WindowMaximized|Qt::WindowFullScreen))) + m_normalSize = m_window->window()->frameGeometry().size(); + + if ((m_pending.states & Qt::WindowActive) && !(m_acked.states & Qt::WindowActive)) + m_window->display()->handleWindowActivated(m_window); + + if (!(m_pending.states & Qt::WindowActive) && (m_acked.states & Qt::WindowActive)) + m_window->display()->handleWindowDeactivated(m_window); + + // TODO: none of the other plugins send WindowActive either, but is it on purpose? + Qt::WindowStates statesWithoutActive = m_pending.states & ~Qt::WindowActive; + + m_window->handleWindowStatesChanged(statesWithoutActive); + if (!m_pending.size.isEmpty()) + m_window->resizeFromApplyConfigure(m_pending.size); + else if (!m_normalSize.isEmpty()) + m_window->resizeFromApplyConfigure(m_normalSize); + ack_configure(m_pending.serial); + m_acked = m_pending; +} + +void QWaylandXdgSurface::requestWindowStates(Qt::WindowStates states) +{ + Qt::WindowStates changedStates = m_acked.states ^ states; + + if (changedStates & Qt::WindowMaximized) { + if (states & Qt::WindowMaximized) + set_maximized(); + else + unset_maximized(); + } + + if (changedStates & Qt::WindowFullScreen) { + if (states & Qt::WindowFullScreen) + set_fullscreen(nullptr); + else + unset_fullscreen(); + } + + // Minimized state is not reported by the protocol, so always send it + if (states & Qt::WindowMinimized) { + set_minimized(); + window()->handleWindowStatesChanged(states & ~Qt::WindowMinimized); + } +} + +bool QWaylandXdgSurface::wantsDecorations() const +{ + return !(m_pending.states & Qt::WindowFullScreen); +} + +void QWaylandXdgSurface::xdg_surface_configure(int32_t width, int32_t height, struct wl_array *states,uint32_t serial) +{ + uint32_t *xdgStates = reinterpret_cast<uint32_t*>(states->data); + size_t numStates = states->size / sizeof(uint32_t); + m_pending.serial = serial; + m_pending.size = QSize(width, height); + m_pending.isResizing = false; + m_pending.states = Qt::WindowNoState; + for (size_t i = 0; i < numStates; i++) { + switch (xdgStates[i]) { + case XDG_SURFACE_STATE_MAXIMIZED: + m_pending.states |= Qt::WindowMaximized; + break; + case XDG_SURFACE_STATE_FULLSCREEN: + m_pending.states |= Qt::WindowFullScreen; + break; + case XDG_SURFACE_STATE_RESIZING: + m_pending.isResizing = true; + break; + case XDG_SURFACE_STATE_ACTIVATED: + m_pending.states |= Qt::WindowActive; + break; + default: + break; + } + } + m_window->applyConfigureWhenPossible(); +} + +void QWaylandXdgSurface::xdg_surface_close() +{ +} + +} + +QT_END_NAMESPACE |