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 }