Lets take another look at the g_signal_connect() declaration.
gulong g_signal_connect( gpointer object, const gchar *name, GCallback func, gpointer func_data );
Notice the gulong return value? This is a tag that identifies your callback function. As stated above, you may have as many callbacks per signal and per object as you need, and each will be executed in turn, in the order they were attached.
This tag allows you to remove this callback from the list by using:
void g_signal_handler_disconnect( gpointer object, gulong id );
So, by passing in the widget you wish to remove the handler from, and the tag returned by one of the signal_connect functions, you can disconnect a signal handler.
You can also temporarily disable signal handlers with the g_signal_handler_block() and g_signal_handler_unblock() family of functions.
void g_signal_handler_block( gpointer object, gulong id ); void g_signal_handlers_block_by_func( gpointer object, GCallback func, gpointer data ); void g_signal_handler_unblock( gpointer object, gulong id ); void g_signal_handlers_unblock_by_func( gpointer object, GCallback func, gpointer data );