Files
helvum/docs/architecture.md

51 lines
2.8 KiB
Markdown

# Architecture
If you want to understand the high-level architecture of helvum,
this document is the right place.
It provides a birds-eye view of the general architecture, and also goes into details on some
components like the view.
# Top Level Architecture
Helvum uses an architecture with the components laid out like this:
```
┌──────┐
│ GTK │
│ View │
└────┬─┘
Λ ┆
│<───── updates view ┌───────┐
│ ┆ │ State │
│ ┆<─ notifies of user input └───────┘
│ ┆ (using signals) Λ
│ ┆ │
│ ┆ │<─── updates/reads state
│ V notifies of remote changes │
┌┴────────────┐ via messages ┌─────────┴─────────┐
│ Application │<╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ Seperate │
│ Object ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌>│ Pipewire Thread │
└─────────────┘ request changes to remote └───────────────────┘
via messages Λ
V
[ Remote Pipewire Server ]
```
The program is split between two cooperating threads.
The GTK thread (displayed on the left side) will sit in a GTK event processing loop, while the pipewire thread (displayed on the right side) will sit in a pipewire event processing loop.
The `Application` object inside the GTK thread communicates with the pipewire thread using two channels,
where each message sent by one thread will trigger the loop of the other thread to invoke a callback
with the received message.
For each change on the remote pipewire server, the pipewire thread updates the state and notifies
the `Application` in the GTK thread if changes are needed.
The `Application` then updates the view to reflect those changes.
Additionally, a user may also make changes using the view.
For each change, the view notifies the `Application` by emitting a matching signal.
The `Application` will then ask the pipewire thread to make those changes on the remote. \
These changes will then be applied to the view like any other remote changes as explained above.
# View Architecture
TODO