From what I can tell `CClientUIInterface::[signal_name]_disconnect` is a no-op.

In other words calling it does *not* disconnect the slot:

For example `uiInterface.NotifyBlockTip_disconnect(BlockNotifyGenesisWait);` in `AppInitMain(...)` does not disconnect `BlockNotifyGenesisWait` as one would expect. The result being that `BlockNotifyGenesisWait` is invoked for every new block :-)

Running `bitcoind` with some debug printing added shows the issue:

```
[signals] CClientUIInterface::ThreadSafeMessageBox_connect(...) entered with 0 connected slots.
[signals] CClientUIInterface::ThreadSafeMessageBox_connect(...) exited with 1 connected slots.
[signals] CClientUIInterface::ThreadSafeQuestion_connect(...) entered with 0 connected slots.
[signals] CClientUIInterface::ThreadSafeQuestion_connect(...) exited with 1 connected slots.
[signals] CClientUIInterface::InitMessage_connect(...) entered with 0 connected slots.
[signals] CClientUIInterface::InitMessage_connect(...) exited with 1 connected slots.
[signals] CClientUIInterface::InitMessage_connect(...) entered with 1 connected slots.
[signals] CClientUIInterface::InitMessage_connect(...) exited with 2 connected slots.
[signals] Calling uiInterface.NotifyBlockTip_connect(&RPCNotifyBlockChange) in OnRPCStarted()
[signals] CClientUIInterface::NotifyBlockTip_connect(...) entered with 0 connected slots.
[signals] CClientUIInterface::NotifyBlockTip_connect(...) exited with 1 connected slots.
[signals] Calling uiInterface.NotifyBlockTip_connect(BlockNotifyGenesisWait) in AppInitMain(...)
[signals] CClientUIInterface::NotifyBlockTip_connect(...) entered with 1 connected slots.
[signals] CClientUIInterface::NotifyBlockTip_connect(...) exited with 2 connected slots.
[signals] RPCNotifyBlockChange(...) was invoked.
[signals] BlockNotifyGenesisWait(...) was invoked.
[signals] Calling uiInterface.NotifyBlockTip_disconnect(BlockNotifyGenesisWait) in AppInitMain(...)
[signals] CClientUIInterface::NotifyBlockTip_disconnect(...) entered with 2 connected slots.
[signals] CClientUIInterface::NotifyBlockTip_disconnect(...) exited with 2 connected slots.
[signals] RPCNotifyBlockChange(...) was invoked.
[signals] BlockNotifyGenesisWait(...) was invoked.
[signals] RPCNotifyBlockChange(...) was invoked.
[signals] BlockNotifyGenesisWait(...) was invoked.
[signals] RPCNotifyBlockChange(...) was invoked.
[signals] BlockNotifyGenesisWait(...) was invoked.
... and so on ...
```

Note how `BlockNotifyGenesisWait(...)` is called also after `uiInterface.NotifyBlockTip_disconnect(BlockNotifyGenesisWait)`.

I think the problem is that the `disconnect(...)` member function of `boost::signals2::signal` expects a function pointer to be passed in (the same that was passed to `.connect(...)`), but we're doing:

```
void CClientUIInterface::signal_name##_disconnect(std::function<signal_name##Sig> fn)
{
    return g_ui_signals.signal_name.disconnect(&fn);
}
```
ADD_SIGNALS_DECL_WRAPPER(InitMessage, void, const std::string& message);
    
    ADD_SIGNALS_DECL_WRAPPER(NotifyNumConnectionsChanged, void, int newNumConnections);
    
    ADD_SIGNALS_DECL_WRAPPER(NotifyNetworkActiveChanged, void, bool networkActive);
    /**
     * Status bar alerts changed.
     */
    ADD_SIGNALS_DECL_WRAPPER(NotifyAlertChanged, void, );
    
    ADD_SIGNALS_DECL_WRAPPER(LoadWallet, void, std::unique_ptr<interfaces::Wallet>& wallet);
    /**
     * Show progress e.g. for verifychain.
     * resume_possible indicates shutting down now will result in the current progress action resuming upon restart.
     */
    ADD_SIGNALS_DECL_WRAPPER(ShowProgress, void, const std::string& title, int nProgress, bool resume_possible);
    
    ADD_SIGNALS_DECL_WRAPPER(NotifyBlockTip, void, bool, const CBlockIndex*);
    
    ADD_SIGNALS_DECL_WRAPPER(NotifyHeaderTip, void, bool, const CBlockIndex*);
    
    ADD_SIGNALS_DECL_WRAPPER(BannedListChanged, void, void);
};
void InitWarning(const std::string& str);
bool InitError(const std::string& str);
std::string AmountHighWarn(const std::string& optname);
std::string AmountErrMsg(const char* const optname, const std::string& strValue);
extern CClientUIInterface uiInterface;
#endif