OP, it seems like you are overdesigning. IPC takes way more effort than direct function calls - it's effort that is better spent on something actually useful. Let the requirements pick design patterns, don't try to cram in as many design patterns as possible.
Event handlers, model/view, independent-ish subsystems, frontend/backend are some typical patterns in desktop applications. Some of it depends on your framework - much of the architecture will be defined by the framework. The default should be doing things in the canonical way for the framework.