All callbacks were brought to a common stardard, and now API of some abstract callback looks as follows (For C# replace void* with System.IntPtr):

void *addSomeCallback(Callback *func);Registers a new handler without checking if it already exists in the list (so, you can subscribe two or more times). Returns callback ID, to be used later to unsubscribe.

bool removeSomeCallback(void *id);Removes a handler registered earlier and returns true. Will return false if there's no hadler with the specified ID.

void clearSomeCallbacks(); Removes all registered handlers.

New callbacks API is thread-safe, i.e., add, remove and clear can be called from different threads, even simultaneously. Moreover, callback functions are now reentrant, this means that you can call add, remove, or clear right from a callback handler. For example, if we need a callback handler to be executed only for the very first click, we can use the following:

clear and remove called from a handler will be executed immediately, so all other handlers, that were removed by this "transaction" (if any), will not be executed at all.
The result of calling add inside a handler shall be applied in the beginning of the next "transaction": i.e. if inside a CLICK event handler we add a new one, it will be executed only for the next CLICK event.

You can check the way it works in the following sample: engine/samples/Api/Widgets/WidgetCallbacks

The complete list of changes for each of affected classes is given below.