File indexing completed on 2024-12-01 05:01:41

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2019 Martin Flöser <mgraesslin@kde.org>
0006     SPDX-FileCopyrightText: 2019 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
0007 
0008     SPDX-License-Identifier: GPL-2.0-or-later
0009 */
0010 #pragma once
0011 
0012 #include "core/graphicsbuffer.h"
0013 #include "window.h"
0014 
0015 namespace KWin
0016 {
0017 
0018 struct InternalWindowFrame
0019 {
0020     GraphicsBuffer *buffer = nullptr;
0021     QRegion bufferDamage;
0022     GraphicsBufferOrigin bufferOrigin = GraphicsBufferOrigin::TopLeft;
0023 };
0024 
0025 class KWIN_EXPORT InternalWindow : public Window
0026 {
0027     Q_OBJECT
0028 
0029 public:
0030     explicit InternalWindow(QWindow *handle);
0031     ~InternalWindow() override;
0032 
0033     bool eventFilter(QObject *watched, QEvent *event) override;
0034 
0035     QString captionNormal() const override;
0036     QString captionSuffix() const override;
0037     QSizeF minSize() const override;
0038     QSizeF maxSize() const override;
0039     NET::WindowType windowType() const override;
0040     void killWindow() override;
0041     bool isClient() const override;
0042     bool isPopupWindow() const override;
0043     QString windowRole() const override;
0044     void closeWindow() override;
0045     bool isCloseable() const override;
0046     bool isMovable() const override;
0047     bool isMovableAcrossScreens() const override;
0048     bool isResizable() const override;
0049     bool isPlaceable() const override;
0050     bool noBorder() const override;
0051     bool userCanSetNoBorder() const override;
0052     bool wantsInput() const override;
0053     bool isInternal() const override;
0054     bool isLockScreen() const override;
0055     bool isOutline() const override;
0056     QRectF resizeWithChecks(const QRectF &geometry, const QSizeF &size) override;
0057     Window *findModal(bool allow_itself = false) override;
0058     bool takeFocus() override;
0059     void setNoBorder(bool set) override;
0060     void invalidateDecoration() override;
0061     void destroyWindow() override;
0062     bool hasPopupGrab() const override;
0063     void popupDone() override;
0064     bool hitTest(const QPointF &point) const override;
0065     void pointerEnterEvent(const QPointF &globalPos) override;
0066     void pointerLeaveEvent() override;
0067 
0068     GraphicsBuffer *graphicsBuffer() const;
0069     GraphicsBufferOrigin graphicsBufferOrigin() const;
0070 
0071     void present(const InternalWindowFrame &frame);
0072     qreal bufferScale() const;
0073     QWindow *handle() const;
0074 
0075 protected:
0076     bool acceptsFocus() const override;
0077     bool belongsToSameApplication(const Window *other, SameApplicationChecks checks) const override;
0078     void doInteractiveResizeSync(const QRectF &rect) override;
0079     void updateCaption() override;
0080     void moveResizeInternal(const QRectF &rect, MoveResizeMode mode) override;
0081     std::unique_ptr<WindowItem> createItem(Scene *scene) override;
0082 
0083 private:
0084     void requestGeometry(const QRectF &rect);
0085     void commitGeometry(const QRectF &rect);
0086     void setCaption(const QString &caption);
0087     void markAsMapped();
0088     void syncGeometryToInternalWindow();
0089     void updateInternalWindowGeometry();
0090     void updateDecoration(bool check_workspace_pos, bool force = false);
0091     void createDecoration(const QRectF &oldGeometry);
0092     void destroyDecoration();
0093 
0094     QWindow *m_handle = nullptr;
0095     QString m_captionNormal;
0096     QString m_captionSuffix;
0097     Qt::WindowFlags m_internalWindowFlags = Qt::WindowFlags();
0098     bool m_userNoBorder = false;
0099     GraphicsBufferRef m_graphicsBufferRef;
0100     GraphicsBufferOrigin m_graphicsBufferOrigin;
0101 
0102     Q_DISABLE_COPY(InternalWindow)
0103 };
0104 
0105 }