Revision control
++ // Copyright (C) 2021 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
++ // Qt-Security score:critical reason:network-protocol
++
++ #include "qwaylandqtsurface_p.h"
++ #include <qpa/qwindowsysteminterface.h>
++ #include <qpa/qplatformwindow.h>
++
++ QT_BEGIN_NAMESPACE
++
++ namespace QtWaylandClient {
++
++ QWaylandQtSurface::QWaylandQtSurface(struct ::zqt_shell_surface_v1 *shell_surface, QWaylandWindow *window)
++ : QWaylandShellSurface(window)
++ , QtWayland::zqt_shell_surface_v1(shell_surface)
++ {
++ sendSizeHints();
++ }
++
++ QWaylandQtSurface::~QWaylandQtSurface()
++ {
++ zqt_shell_surface_v1::destroy();
++ }
++
++ void QWaylandQtSurface::resetConfiguration()
++ {
++ m_pendingPosition = QPoint(-1, -1);
++ m_pendingSize = QSize();
++ m_pendingPositionValid = false;
++ m_pendingStates = m_currentStates;
++ }
++
++ void QWaylandQtSurface::applyConfigure()
++ {
++ ack_configure(m_currentConfigureSerial);
++
++ if (m_pendingSize.isValid() && m_pendingPositionValid)
++ setGeometryFromApplyConfigure(m_pendingPosition, m_pendingSize);
++ else if (m_pendingSize.isValid())
++ resizeFromApplyConfigure(m_pendingSize);
++ else if (m_pendingPositionValid)
++ repositionFromApplyConfigure(m_pendingPosition);
++
++ if (m_pendingStates != m_currentStates) {
++ QWindowSystemInterface::handleWindowStateChanged(platformWindow()->window(), m_pendingStates);
++ m_currentStates = m_pendingStates;
++ }
++
++ resetConfiguration();
++ m_currentConfigureSerial = UINT32_MAX;
++ }
++
++ void QWaylandQtSurface::setTitle(const QString &title)
++ {
++ set_window_title(title);
++ }
++
++ void QWaylandQtSurface::zqt_shell_surface_v1_set_capabilities(uint32_t capabilities)
++ {
++ m_capabilities = capabilities;
++ }
++
++ void QWaylandQtSurface::zqt_shell_surface_v1_set_position(uint32_t serial, int32_t x, int32_t y)
++ {
++ if (serial < m_currentConfigureSerial && m_currentConfigureSerial != UINT32_MAX)
++ return;
++
++ if (serial != m_currentConfigureSerial) {
++ m_currentConfigureSerial = serial;
++ resetConfiguration();
++ }
++
++ m_pendingPosition = QPoint(x, y);
++ m_pendingPositionValid = true;
++ }
++
++ void QWaylandQtSurface::zqt_shell_surface_v1_resize(uint32_t serial, int32_t width, int32_t height)
++ {
++ if (serial < m_currentConfigureSerial && m_currentConfigureSerial != UINT32_MAX)
++ return;
++
++ if (serial != m_currentConfigureSerial) {
++ m_currentConfigureSerial = serial;
++ resetConfiguration();
++ }
++
++ m_pendingSize = QSize(width, height);
++ }
++
++ void QWaylandQtSurface::zqt_shell_surface_v1_configure(uint32_t serial)
++ {
++ if (serial < m_currentConfigureSerial)
++ return;
++
++ if (serial > m_currentConfigureSerial) {
++ m_currentConfigureSerial = serial;
++ resetConfiguration();
++ }
++
++ applyConfigureWhenPossible();
++ }
++
++ void QWaylandQtSurface::zqt_shell_surface_v1_close()
++ {
++ platformWindow()->window()->close();
++ }
++
++ void QWaylandQtSurface::zqt_shell_surface_v1_set_frame_margins(uint32_t left, uint32_t right,
++ uint32_t top, uint32_t bottom)
++ {
++ QPlatformWindow *win = platformWindow();
++ m_frameMargins = QMargins(left, top, right, bottom);
++ m_pendingPosition = win->geometry().topLeft();
++ m_pendingPositionValid = true;
++ m_pendingSize = win->geometry().size();
++ applyConfigureWhenPossible();
++ }
++
++ bool QWaylandQtSurface::requestActivate()
++ {
++ request_activate();
++ return true;
++ }
++
++ void QWaylandQtSurface::propagateSizeHints()
++ {
++ sendSizeHints();
++ }
++
++ void QWaylandQtSurface::sendSizeHints()
++ {
++ QPlatformWindow *win = platformWindow();
++ if (win) {
++ const int minWidth = qMax(0, win->windowMinimumSize().width());
++ const int minHeight = qMax(0, win->windowMinimumSize().height());
++ set_minimum_size(minWidth, minHeight);
++
++ int maxWidth = qMax(0, win->windowMaximumSize().width());
++ if (maxWidth == QWINDOWSIZE_MAX)
++ maxWidth = -1;
++ int maxHeight = qMax(0, win->windowMaximumSize().height());
++ if (maxHeight == QWINDOWSIZE_MAX)
++ maxHeight = -1;
++ set_maximum_size(maxWidth, maxHeight);
++ }
++ }
++
++ void QWaylandQtSurface::zqt_shell_surface_v1_set_window_state(uint32_t serial, uint32_t state)
++ {
++ if (serial < m_currentConfigureSerial && m_currentConfigureSerial != UINT32_MAX)
++ return;
++
++ if (serial != m_currentConfigureSerial) {
++ m_currentConfigureSerial = serial;
++ resetConfiguration();
++ }
++ m_pendingStates = Qt::WindowStates(state);
++ }
++
++ void QWaylandQtSurface::setWindowPosition(const QPoint &position)
++ {
++ reposition(position.x(), position.y());
++ }
++
++ void QWaylandQtSurface::setWindowSize(const QSize &size)
++ {
++ set_size(size.width(), size.height());
++ }
++
++ void QWaylandQtSurface::setWindowFlags(Qt::WindowFlags flags)
++ {
++ set_window_flags(flags);
++ }
++
++ void QWaylandQtSurface::requestWindowStates(Qt::WindowStates states)
++ {
++ change_window_state(states & ~Qt::WindowActive);
++ }
++
++ bool QWaylandQtSurface::resize(QWaylandInputDevice *inputDevice, Qt::Edges edge)
++ {
++ if (m_capabilities & ZQT_SHELL_SURFACE_V1_CAPABILITIES_INTERACTIVE_RESIZE) {
++ start_system_resize(getSerial(inputDevice), uint(edge));
++ return true;
++ }
++
++ return false;
++ }
++
++ bool QWaylandQtSurface::move(QWaylandInputDevice *inputDevice)
++ {
++ if (m_capabilities & ZQT_SHELL_SURFACE_V1_CAPABILITIES_INTERACTIVE_RESIZE) {
++ start_system_move(getSerial(inputDevice));
++ return true;
++ }
++
++ return false;
++ }
++
++ QMargins QWaylandQtSurface::serverSideFrameMargins() const
++ {
++ return m_frameMargins;
++ }
++
++ void QWaylandQtSurface::raise()
++ {
++ QtWayland::zqt_shell_surface_v1::raise();
++ }
++
++ void QWaylandQtSurface::lower()
++ {
++ QtWayland::zqt_shell_surface_v1::lower();
++ }
++
++ }
++
++ QT_END_NAMESPACE