File indexing completed on 2024-05-05 05:34:56

0001 
0002 /*
0003 * this file is part of the oxygen gtk engine
0004 * SPDX-FileCopyrightText: 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0005 *
0006 * SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #include "oxygensignalhandler.h"
0010 
0011 namespace Oxygen
0012 {
0013 
0014     //________________________________________________________
0015     SignalHandler::~SignalHandler( void )
0016     {
0017 
0018         // disconnect all signals
0019         for( std::vector<Signal>::iterator iter = _signals.begin(); iter != _signals.end(); ++iter )
0020         { iter->disconnect(); }
0021 
0022     }
0023 
0024     //________________________________________________________
0025     void SignalHandler::connect( GObject* object, const std::string& signal, GCallback callback, gpointer data )
0026     {
0027         // check if object is already connected
0028         if( _objects.find( object ) == _objects.end() )
0029         {
0030 
0031             // insert object
0032             _objects.insert( object );
0033 
0034             // insert destroy signal
0035             Signal destroyId;
0036             destroyId.connect( object, "destroy", (GCallback) destroyNotifyEvent, this );
0037             _signals.push_back( destroyId );
0038 
0039         }
0040 
0041         // insert signal
0042         Signal signalId;
0043         signalId.connect( object, signal, callback, data );
0044         _signals.push_back( signalId );
0045 
0046     }
0047 
0048     //________________________________________________________
0049     gboolean SignalHandler::destroyNotifyEvent( GtkWidget* widget, gpointer pointer )
0050     {
0051         SignalHandler& data( *static_cast<SignalHandler*>( pointer ) );
0052         for( std::vector<Signal>::iterator iter = data._signals.begin(); iter != data._signals.end(); ++iter )
0053         { if( iter->belongsTo( G_OBJECT( widget ) ) ) iter->disconnect(); }
0054 
0055         // remove from objects
0056         data._objects.erase( G_OBJECT( widget ) );
0057         return FALSE;
0058 
0059     }
0060 
0061 }