File indexing completed on 2024-05-19 09:27:58

0001 #ifndef oxygenshadowhelper_h
0002 #define oxygenshadowhelper_h
0003 
0004 //////////////////////////////////////////////////////////////////////////////
0005 // oxygenshadowhelper.h
0006 // handle shadow pixmaps passed to window manager via X property
0007 // -------------------
0008 //
0009 // SPDX-FileCopyrightText: 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0010 // SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
0011 //
0012 // SPDX-License-Identifier: MIT
0013 //////////////////////////////////////////////////////////////////////////////
0014 
0015 #include "oxygen.h"
0016 #include "oxygentileset.h"
0017 
0018 #include <KWindowShadow>
0019 
0020 #include <QMap>
0021 #include <QMargins>
0022 #include <QObject>
0023 #include <QSet>
0024 
0025 namespace Oxygen
0026 {
0027 
0028 //* forward declaration
0029 class ShadowCache;
0030 class StyleHelper;
0031 
0032 //* handle shadow pixmaps passed to window manager via X property
0033 class ShadowHelper : public QObject
0034 {
0035     Q_OBJECT
0036 
0037 public:
0038     //* constructor
0039     ShadowHelper(QObject *, StyleHelper &);
0040 
0041     //* destructor
0042     ~ShadowHelper(void) override;
0043 
0044     //* reset
0045     void reset(void);
0046 
0047     //* register widget
0048     bool registerWidget(QWidget *, bool force = false);
0049 
0050     //* unregister widget
0051     void unregisterWidget(QWidget *);
0052 
0053     //* reparse cache config (must be followed by loadConfig)
0054     void reparseCacheConfig(void);
0055 
0056     //* load config
0057     void loadConfig(void);
0058 
0059     //* event filter
0060     bool eventFilter(QObject *, QEvent *) override;
0061 
0062 private Q_SLOTS:
0063 
0064     //* unregister widget
0065     void widgetDeleted(QObject *);
0066 
0067     //* unregister window
0068     void windowDeleted(QObject *);
0069 
0070 private:
0071     //* true if widget is a menu
0072     bool isMenu(QWidget *) const;
0073 
0074     //* true if widget is a tooltip
0075     bool isToolTip(QWidget *) const;
0076 
0077     //* dock widget
0078     bool isDockWidget(QWidget *) const;
0079 
0080     //* toolbar
0081     bool isToolBar(QWidget *) const;
0082 
0083     //* accept widget
0084     bool acceptWidget(QWidget *) const;
0085 
0086     //* shadow cache
0087     const ShadowCache &shadowCache(void) const
0088     {
0089         return *_shadowCache;
0090     }
0091 
0092     //* shadow cache
0093     ShadowCache &shadowCache(void)
0094     {
0095         return *_shadowCache;
0096     }
0097 
0098     // create shadow tiles from tileset
0099     const QVector<KWindowShadowTile::Ptr> &createPlatformTiles(bool isDockWidget);
0100 
0101     // create a shadow tile from pixmap
0102     KWindowShadowTile::Ptr createPlatformTile(const QPixmap &);
0103 
0104     //* installs shadow on given widget in a platform independent way
0105     void installShadows(QWidget *);
0106 
0107     //* uninstalls shadow on given widget in a platform independent way
0108     void uninstallShadows(QWidget *);
0109 
0110     //* gets the shadow margins for the given widget
0111     QMargins shadowMargins(QWidget *) const;
0112 
0113     //* helper
0114     StyleHelper &_helper;
0115 
0116     //* cache
0117     ShadowCache *_shadowCache;
0118 
0119     //* set of registered widgets
0120     QSet<QWidget *> _widgets;
0121 
0122     //* map of managed shadows
0123     QMap<QWindow *, KWindowShadow *> _shadows;
0124 
0125     //*@name shadow tilesets
0126     //@{
0127     TileSet _tiles;
0128     TileSet _dockTiles;
0129     //@}
0130 
0131     //* number of shadow tiles
0132     enum { numTiles = 8 };
0133 
0134     //*@name shared shadow tiles
0135     //@{
0136     QVector<KWindowShadowTile::Ptr> _platformTiles;
0137     QVector<KWindowShadowTile::Ptr> _platformDockTiles;
0138     //@}
0139 
0140     //* shadow size
0141     int _size;
0142 };
0143 }
0144 
0145 #endif