Renaming workspaces on Hyprland will now work as expected.
This also refactors the workspace code to depend on IDs rather than
names which should make it more robust against the same sort of issue
in future.
Fixes#469
Finally, Ironbar will respond to events of monitors being (dis)connected, and will create bars when a monitor connects.
This means at last - resolves#291
yaay
This does away with `lazy_static` singletons for all the clients, instead putting them all inside a `Clients` struct on the `Ironbar` struct.
Client code has been refactored in places to accommodate this, and module code has been updated to get the clients the new way.
The Wayland client has been re-written from the ground up to remove a lot of the needless complications, provide a nicer interface and reduce some duplicate data.
The MPD music client has been overhauled to use the `mpd_utils` crate, which simplifies the code within Ironbar and should offer more robustness and better recovery when connection is lost to the server.
The launcher module in particular has been affected by the refactor.
This is a major refactor which updates GTK, GLib and GTK Layer Shell to their latest versions.
GLib channels, previously used for receiving events on the GLib Main Context thread have been deprecated and a new method for running Futures on the main thread has been added instead. This commit also replaces all the deprecated code with this.
As part of the above, a bug was uncovered related to creating the GLib main context inside the Tokio runtime. Spawning of Tokio tasks has been refactored to fix this.
This is a first pass towards trying to structure things a bit better, with data generally encapsulated under a single hierarchical tree, rather than lots of globals all over the place. Lots of work is still required.
The plan is that with this and some more work, #291 should become a lot easier to sort.
THe music module expects an event to be sent on subscription to the
client to set up the initial state. This ensures an event is sent when
in MPRIS mode when no player is initially found.