File indexing completed on 2024-05-19 13:21:36
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 }