File indexing completed on 2024-12-01 08:07:48

0001 /*
0002  *   SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
0003  *   SPDX-FileCopyrightText: 2018 Drew DeVault <sir@cmpwn.com>
0004  *
0005  *   SPDX-License-Identifier: LGPL-3.0-or-later
0006  */
0007 
0008 #ifndef LAYERSHELLQTWINDOW_H
0009 #define LAYERSHELLQTWINDOW_H
0010 
0011 #include <QObject>
0012 #include <QScreen>
0013 #include <QWindow>
0014 
0015 #include "layershellqt_export.h"
0016 
0017 namespace LayerShellQt
0018 {
0019 class WindowPrivate;
0020 
0021 class LAYERSHELLQT_EXPORT Window : public QObject
0022 {
0023     Q_OBJECT
0024     Q_PROPERTY(Anchors anchors READ anchors WRITE setAnchors NOTIFY anchorsChanged)
0025     Q_PROPERTY(QString scope READ scope WRITE setScope)
0026     Q_PROPERTY(QMargins margins READ margins WRITE setMargins NOTIFY marginsChanged)
0027     Q_PROPERTY(qint32 exclusionZone READ exclusionZone WRITE setExclusiveZone NOTIFY exclusionZoneChanged)
0028     Q_PROPERTY(Layer layer READ layer WRITE setLayer NOTIFY layerChanged)
0029     Q_PROPERTY(KeyboardInteractivity keyboardInteractivity READ keyboardInteractivity WRITE setKeyboardInteractivity NOTIFY keyboardInteractivityChanged)
0030     Q_PROPERTY(ScreenConfiguration screenConfiguration READ screenConfiguration WRITE setScreenConfiguration)
0031 
0032 public:
0033     ~Window() override;
0034 
0035     enum Anchor {
0036         AnchorNone = 0,
0037         AnchorTop = 1, ///< The top edge of the anchor rectangle
0038         AnchorBottom = 2, ///< The bottom edge of the anchor rectangle
0039         AnchorLeft = 4, ///< The left edge of the anchor rectangle
0040         AnchorRight = 8, ///< The right edge of the anchor rectangle
0041     };
0042     Q_ENUM(Anchor);
0043     Q_DECLARE_FLAGS(Anchors, Anchor)
0044 
0045     /**
0046      * This enum type is used to specify the layer where a surface can be put in.
0047      */
0048     enum Layer {
0049         LayerBackground = 0,
0050         LayerBottom = 1,
0051         LayerTop = 2,
0052         LayerOverlay = 3,
0053     };
0054     Q_ENUM(Layer)
0055 
0056     /**
0057      * This enum type is used to specify how the layer surface handles keyboard focus.
0058      */
0059     enum KeyboardInteractivity {
0060         KeyboardInteractivityNone = 0,
0061         KeyboardInteractivityExclusive = 1,
0062         KeyboardInteractivityOnDemand = 2,
0063     };
0064     Q_ENUM(KeyboardInteractivity)
0065 
0066     /**
0067      * This enum type is used to specify which screen to place the surface on.
0068      * ScreenFromQWindow (the default) reads QWindow::screen() while ScreenFromCompositor
0069      * passes nil and lets the compositor decide.
0070      */
0071     enum ScreenConfiguration {
0072         ScreenFromQWindow = 0,
0073         ScreenFromCompositor = 1,
0074     };
0075     Q_ENUM(ScreenConfiguration)
0076 
0077     void setAnchors(Anchors anchor);
0078     Anchors anchors() const;
0079 
0080     void setExclusiveZone(int32_t zone);
0081     int32_t exclusionZone() const;
0082 
0083     void setExclusiveEdge(Window::Anchor edge);
0084     Window::Anchor exclusiveEdge() const;
0085 
0086     void setMargins(const QMargins &margins);
0087     QMargins margins() const;
0088 
0089     void setKeyboardInteractivity(KeyboardInteractivity interactivity);
0090     KeyboardInteractivity keyboardInteractivity() const;
0091 
0092     void setLayer(Layer layer);
0093     Layer layer() const;
0094 
0095     void setScreenConfiguration(ScreenConfiguration screenConfiguration);
0096     ScreenConfiguration screenConfiguration() const;
0097 
0098     /**
0099      * Sets a string based identifier for this window.
0100      * This may be used by a compositor to determine stacking
0101      * order within a given layer.
0102      *
0103      * May also be referred to as a role
0104      */
0105     void setScope(const QString &scope);
0106     QString scope() const;
0107 
0108     /**
0109      * Whether the QWindow should be closed when the layer surface is dismissed by the compositor.
0110      * For example, if the associated screen has been removed.
0111      *
0112      * This can be used to map the window on another screen.
0113      */
0114     void setCloseOnDismissed(bool close);
0115     bool closeOnDismissed() const;
0116 
0117     /**
0118      * Gets the LayerShell Window for a given Qt Window
0119      * Ownership is not transferred
0120      */
0121     static Window *get(QWindow *window);
0122 
0123     static Window *qmlAttachedProperties(QObject *object);
0124 
0125 Q_SIGNALS:
0126     void anchorsChanged();
0127     void exclusionZoneChanged();
0128     void exclusiveEdgeChanged();
0129     void marginsChanged();
0130     void keyboardInteractivityChanged();
0131     void layerChanged();
0132 
0133 private:
0134     Window(QWindow *window);
0135     QScopedPointer<WindowPrivate> d;
0136 };
0137 
0138 }
0139 
0140 #endif