Here are some things that are annoying about the current code, though they are probably not that important.
- Too much repetitive delegation: For instance, the App contains the Frame, which contains a Notebook. Often the notebook signals to the Frame, which signals to the App, which asks the Frame something, which asks the Notebook. Sometimes it goes deeper, down into widgets on the notebook.
- Too much if/else/else/else with dynamic_cast<> (actually sharedptr<>::cast_dynamic()). A switch/case would be prettier, by dynamic_cast<> doesn't allow that.
- ConnectionPool is quite messy. It would be nice to divide up the code for connecting, self-hosting, and avahi-advertizing.