File indexing completed on 2024-04-28 05:26:22

0001 /*
0002  * SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0003  * SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
0004  *
0005  * SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #pragma once
0009 
0010 #include "breezetileset.h"
0011 
0012 #include <KWindowShadow>
0013 
0014 #include <QMap>
0015 #include <QMargins>
0016 #include <QObject>
0017 #include <QPointer>
0018 #include <QSet>
0019 
0020 namespace Breeze
0021 {
0022 //* forward declaration
0023 class Helper;
0024 
0025 struct ShadowParams {
0026     ShadowParams() = default;
0027 
0028     ShadowParams(const QPoint &offset, int radius, qreal opacity)
0029         : offset(offset)
0030         , radius(radius)
0031         , opacity(opacity)
0032     {
0033     }
0034 
0035     QPoint offset;
0036     int radius = 0;
0037     qreal opacity = 0;
0038 
0039     void operator*=(qreal factor)
0040     {
0041         offset *= factor;
0042         radius = qRound(radius * factor);
0043     }
0044 };
0045 
0046 struct CompositeShadowParams {
0047     CompositeShadowParams() = default;
0048 
0049     CompositeShadowParams(const QPoint &offset, const ShadowParams &shadow1, const ShadowParams &shadow2)
0050         : offset(offset)
0051         , shadow1(shadow1)
0052         , shadow2(shadow2)
0053     {
0054     }
0055 
0056     bool isNone() const
0057     {
0058         return qMax(shadow1.radius, shadow2.radius) == 0;
0059     }
0060 
0061     QPoint offset;
0062     ShadowParams shadow1;
0063     ShadowParams shadow2;
0064 
0065     void operator*=(qreal factor)
0066     {
0067         offset *= factor;
0068         shadow1 *= factor;
0069         shadow2 *= factor;
0070     }
0071 };
0072 
0073 //* handle shadow pixmaps passed to window manager via X property
0074 class ShadowHelper : public QObject
0075 {
0076     Q_OBJECT
0077 
0078 public:
0079     //* constructor
0080     ShadowHelper(QObject *, Helper &);
0081 
0082     //* destructor
0083     ~ShadowHelper() override;
0084 
0085     //* shadow params from size enum
0086     static CompositeShadowParams lookupShadowParams(int shadowSizeEnum);
0087 
0088     //* reset
0089     void reset();
0090 
0091     //* load config
0092     void loadConfig();
0093 
0094     //* register widget
0095     bool registerWidget(QWidget *, bool force = false);
0096 
0097     //* unregister widget
0098     void unregisterWidget(QWidget *);
0099 
0100     //* event filter
0101     bool eventFilter(QObject *, QEvent *) override;
0102 
0103     //* shadow tiles
0104     /** is public because it is also needed for mdi windows */
0105     TileSet shadowTiles(QWidget *);
0106 
0107     //* return device pixel ratio for the window containing the widget
0108     static qreal devicePixelRatio(QWidget *);
0109 
0110 protected Q_SLOTS:
0111 
0112     //* unregister widget
0113     void widgetDeleted(QObject *);
0114 
0115     //* unregister window
0116     void windowDeleted(QObject *);
0117 
0118 protected:
0119     //* true if widget is a menu
0120     bool isMenu(QWidget *) const;
0121 
0122     //* true if widget is a tooltip
0123     bool isToolTip(QWidget *) const;
0124 
0125     //* dock widget
0126     bool isDockWidget(QWidget *) const;
0127 
0128     //* toolbar
0129     bool isToolBar(QWidget *) const;
0130 
0131     //* accept widget
0132     bool acceptWidget(QWidget *) const;
0133 
0134     // create shared shadow tiles from tileset
0135     const QVector<KWindowShadowTile::Ptr> &createShadowTiles();
0136 
0137     // create shadow tile from pixmap
0138     KWindowShadowTile::Ptr createTile(const QPixmap &);
0139 
0140     //* installs shadow on given widget in a platform independent way
0141     void installShadows(QWidget *);
0142 
0143     //* uninstalls shadow on given widget in a platform independent way
0144     void uninstallShadows(QWidget *);
0145 
0146     //* gets the shadow margins for the given widget
0147     QMargins shadowMargins(QWidget *) const;
0148 
0149 private:
0150     //* helper
0151     Helper &_helper;
0152 
0153     //* registered widgets
0154     QSet<QWidget *> _widgets;
0155 
0156     //* managed shadows
0157     QMap<QWindow *, KWindowShadow *> _shadows;
0158 
0159     //* tileset
0160     TileSet _shadowTiles;
0161 
0162     //* number of tiles
0163     enum { numTiles = 8 };
0164 
0165     //* shared shadow tiles
0166     QVector<KWindowShadowTile::Ptr> _tiles;
0167 };
0168 
0169 }