- Refactored the `Node` concept into `LeafNode`s and `ParentNode`s so that we always know what we're working with
- Implemented the concept of a `Node::commit_changes()` which is used at the end of a series of complex operations to push changes to the screen at the end.
- Prepared the `TilingWindowTree` for testing, which will come next
* Establish the concept of `WindowMetadata` which every window must have. This data is used to associate a `Window` to its `OutputContent` and `Tree`
* The `Policy` now defers to the `OutputContent` for decisions on how a window should behave. The `Policy` is more of a metadata-resolver than anything, as it leaves the heavy-lifting to the `OutputContent`
* Prepares for the integration of a `FloatingWindowManager` that the `OutputContent` will be able to defer to when a window is of type `WindowType::floating`
* feature: selecting a sensible terminal, configurable terminal command, and notifying when we can't open it
* bugfix: using CMAKE_INSTALL_BINDIR for miracle-wm-sensible-terminal
Co-authored-by: Cosima Neidahl <opna2608@protonmail.com>
* enhancement: update program_exists check wihout bounds check
---------
Co-authored-by: Cosima Neidahl <opna2608@protonmail.com>
* Refactored window management and node discovery in preparation for a floating window manager
* This includes making node discovery a pointer jump instead of a tree search (huge for performance!)
* Renamed WindowTree to Tree
* Renamed MiracleWindowManagementPolicy to TilingWindowManagementPolicy
* Switching workspaces now emits a signal to i3 IPC clients which makes it so that waybar works
* Refactored a lot of workspace code for readability and usability