File indexing completed on 2024-05-12 17:05:48

0001 #ifndef oxygeninnershadowdata_h
0002 #define oxygeninnershadowdata_h
0003 /*
0004 * this file is part of the oxygen gtk engine
0005 * SPDX-FileCopyrightText: 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0006 * SPDX-FileCopyrightText: 2010 Ruslan Kabatsayev <b7.10110111@gmail.com>
0007 *
0008 * SPDX-License-Identifier: LGPL-2.0-or-later
0009 */
0010 
0011 #include "oxygensignal.h"
0012 
0013 #include <gtk/gtk.h>
0014 #include <algorithm>
0015 #include <map>
0016 
0017 namespace Oxygen
0018 {
0019     //! handle inner shadow drawing using composited GdkWindow API
0020     class InnerShadowData
0021     {
0022 
0023         public:
0024 
0025         //! constructor
0026         InnerShadowData( void ):
0027             _target(0)
0028         {}
0029 
0030         //! destructor
0031         virtual ~InnerShadowData( void )
0032         { disconnect( _target ); }
0033 
0034         //! setup connections
0035         void connect( GtkWidget* );
0036 
0037         //! disconnect
0038         void disconnect( GtkWidget* );
0039 
0040         //! register child
0041         /*! needed to restore composited state on disconnect */
0042         void registerChild( GtkWidget* );
0043 
0044         protected:
0045 
0046         //! unregister child
0047         void unregisterChild( GtkWidget* );
0048 
0049         //!@ callbacks
0050         //@{
0051         static gboolean childUnrealizeNotifyEvent( GtkWidget*, gpointer );
0052         static gboolean targetExposeEvent( GtkWidget*, GdkEventExpose*, gpointer );
0053         //@}
0054 
0055         private:
0056 
0057         //! target widget
0058         GtkWidget* _target;
0059 
0060         //! expose
0061         Signal _exposeId;
0062 
0063         //! child data
0064         class ChildData
0065         {
0066             public:
0067 
0068             //! constructor
0069             ChildData( void ):
0070                 _initiallyComposited( false )
0071             {}
0072 
0073             //! destructor
0074             virtual ~ChildData( void )
0075             {}
0076 
0077             //! disconnect all signals
0078             void disconnect( GtkWidget* );
0079 
0080             //! signal
0081             Signal _unrealizeId;
0082 
0083             //! keep track of composited state
0084             bool _initiallyComposited;
0085         };
0086 
0087         //! map registered children and corresponding data
0088         typedef std::map<GtkWidget*, ChildData> ChildDataMap;
0089         ChildDataMap _childrenData;
0090 
0091     };
0092 
0093 }
0094 
0095 #endif