File indexing completed on 2024-05-12 05:34:35

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 "oxygensignal.h"
0010 #include "../config.h"
0011 
0012 #include <iostream>
0013 
0014 namespace Oxygen
0015 {
0016 
0017     #if OXYGEN_DEBUG
0018     static int counter( 0 );
0019     #endif
0020 
0021     //____________________________________________________________________
0022     bool Signal::connect( GObject* object, const std::string& signal, GCallback callback, gpointer data, bool after )
0023     {
0024         // make sure that signal is not already connected
0025         assert( _object == 0L && _id == 0 );
0026 
0027         // check object
0028         if( !object ) return false;
0029 
0030         // first try lookup signal
0031         if( !g_signal_lookup( signal.c_str(), G_OBJECT_TYPE(object) ) )
0032         {
0033 
0034             #if OXYGEN_DEBUG
0035             std::cerr << "Oxygen::Signal::connect - signal " << signal << " not installed on widget " << object << std::endl;
0036             #endif
0037 
0038             return false;
0039 
0040         }
0041 
0042         // store attributes and create connection
0043         _object = object;
0044         if(after) _id = g_signal_connect_after( object, signal.c_str(), callback, data );
0045         else _id = g_signal_connect( object, signal.c_str(), callback, data );
0046 
0047         #if OXYGEN_DEBUG
0048         ++counter;
0049         std::cerr << "Oxygen::Signal::connect - _id: " << _id << " counter: " << counter << std::endl;
0050         #endif
0051 
0052         return true;
0053 
0054     }
0055 
0056     //____________________________________________________________________
0057     void Signal::disconnect( void )
0058     {
0059 
0060         // disconnect signal
0061         if( _object && _id > 0 )
0062         {
0063 
0064             #if OXYGEN_DEBUG
0065             --counter;
0066             std::cerr << "Oxygen::Signal::disconnect - _id: " << _id << " counter: " << counter << std::endl;
0067             #endif
0068 
0069             g_signal_handler_disconnect( _object, _id );
0070 
0071         }
0072 
0073         // reset members
0074         _object = 0L;
0075         _id = 0;
0076 
0077     }
0078 
0079 }