File indexing completed on 2024-05-05 05:35:25

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 //* forward declaration
0028 class ShadowCache;
0029 class StyleHelper;
0030 
0031 //* handle shadow pixmaps passed to window manager via X property
0032 class ShadowHelper : public QObject
0033 {
0034     Q_OBJECT
0035 
0036 public:
0037     //* constructor
0038     ShadowHelper(QObject *, StyleHelper &);
0039 
0040     //* destructor
0041     ~ShadowHelper(void) override;
0042 
0043     //* reset
0044     void reset(void);
0045 
0046     //* register widget
0047     bool registerWidget(QWidget *, bool force = false);
0048 
0049     //* unregister widget
0050     void unregisterWidget(QWidget *);
0051 
0052     //* reparse cache config (must be followed by loadConfig)
0053     void reparseCacheConfig(void);
0054 
0055     //* load config
0056     void loadConfig(void);
0057 
0058     //* event filter
0059     bool eventFilter(QObject *, QEvent *) override;
0060 
0061 private Q_SLOTS:
0062 
0063     //* unregister widget
0064     void widgetDeleted(QObject *);
0065 
0066     //* unregister window
0067     void windowDeleted(QObject *);
0068 
0069 private:
0070     //* true if widget is a menu
0071     bool isMenu(QWidget *) const;
0072 
0073     //* true if widget is a tooltip
0074     bool isToolTip(QWidget *) const;
0075 
0076     //* dock widget
0077     bool isDockWidget(QWidget *) const;
0078 
0079     //* toolbar
0080     bool isToolBar(QWidget *) const;
0081 
0082     //* accept widget
0083     bool acceptWidget(QWidget *) const;
0084 
0085     //* shadow cache
0086     const ShadowCache &shadowCache(void) const
0087     {
0088         return *_shadowCache;
0089     }
0090 
0091     //* shadow cache
0092     ShadowCache &shadowCache(void)
0093     {
0094         return *_shadowCache;
0095     }
0096 
0097     // create shadow tiles from tileset
0098     const QVector<KWindowShadowTile::Ptr> &createPlatformTiles(bool isDockWidget);
0099 
0100     // create a shadow tile from pixmap
0101     KWindowShadowTile::Ptr createPlatformTile(const QPixmap &);
0102 
0103     //* installs shadow on given widget in a platform independent way
0104     void installShadows(QWidget *);
0105 
0106     //* uninstalls shadow on given widget in a platform independent way
0107     void uninstallShadows(QWidget *);
0108 
0109     //* gets the shadow margins for the given widget
0110     QMargins shadowMargins(QWidget *) const;
0111 
0112     //* helper
0113     StyleHelper &_helper;
0114 
0115     //* cache
0116     ShadowCache *_shadowCache;
0117 
0118     //* set of registered widgets
0119     QSet<QWidget *> _widgets;
0120 
0121     //* map of managed shadows
0122     QMap<QWindow *, KWindowShadow *> _shadows;
0123 
0124     //*@name shadow tilesets
0125     //@{
0126     TileSet _tiles;
0127     TileSet _dockTiles;
0128     //@}
0129 
0130     //* number of shadow tiles
0131     enum { numTiles = 8 };
0132 
0133     //*@name shared shadow tiles
0134     //@{
0135     QVector<KWindowShadowTile::Ptr> _platformTiles;
0136     QVector<KWindowShadowTile::Ptr> _platformDockTiles;
0137     //@}
0138 
0139     //* shadow size
0140     int _size;
0141 };
0142 }
0143 
0144 #endif