Spring is here and so is Miracle 0.9 🌱 !
This release is all about our new WebAssembly Plugin System for window management, configuration, and beyond. Miracle is a truly hackable window manager now. Check out the demo here: https://youtu.be/Kohl9wy3S7g
The Debian and Snap releases will come out some time this weekend 🐦
Enjoy!
Features ⭐
- A brand new WebAssembly-based Plugin System for window management, animation, and configuration (see: https://wiki.miracle-wm.org/develop/configuration/plugins/)
- A brand new Rust API for writing plugins for Miracle, which can be found at https://docs.miracle-wm.org/miracle_plugin/
- Added cursor theme support (https://wiki.miracle-wm.org/develop/configuration/cursor/)
Meta + Shift + Rnow reloads the configuration instead of having it auto-reload- A fantastic new icon from a member of the community
- Got rid of mini trees in favor of floating windows by themselves in a reasonable way (sorry all my mini tree peeps!)
- Speed improvements
- Display configurations now automatically reload when they are changed
Breaking Changes 💔 IMPORTANT
- Existing configurations that rely on Linux keycodes for custom actions and default keybind overrides should migrate to using XKbKeysyms instead! See the wiki for more details (https://wiki.miracle-wm.org/develop/configuration/custom_actions/)
Bugs fixed 🐛
- Fixed windows going into a tile when their not supposed to be tiled (e.g. dialogs, popups, etc.)
- Fixed resize by pointer logic to improve consistency
- Fixed bad timing of window open animations so that we wait for the first window buffer before animating
- Fixed poor use of locking (I was being dumb!)
What's Changed
- task: debian changelog 0.8.2 by @mattkae in #710
- Feature/back and forth config by @eliasreid in #694
- task: organize the public C API includes in preparation for adding more things to it by @mattkae in #713
- task: remove the 'current' rectangle from animations by @mattkae in #714
- New icons for miracle-wm by @TaseenA09 in #704
- task: cache visible area in leaf containers by @mattkae in #715
- task: add geometry helpers to facilitate going between mir and glm types by @mattkae in #716
- task: update year from 2024 to 2025 by @mattkae in #717
- task: remove version checks in order to assume latest by @mattkae in #720
- task: remove unused compositor state by @mattkae in #719
- task: rework parts of the Animation class to make it easier to work with by @mattkae in #722
- task: refactor ParentContainer::create_space for a zero-allocation strategy by @mattkae in #724
- feature: add wasmedge to the build and start it behind a feature flag by @mattkae in #725
- bugfix: only install libmirrenderer-dev if it is available by @mattkae in #734
- bugfix: disable the dev ppa in CI for now by @mattkae in #735
- feature: implementation of an animation plugin using WebAssembly by @mattkae in #730
- bugfix: add stdbool to config.h for generator's sakes by @mattkae in #736
- task: use pch better and reduce include requirements by @mattkae in #737
- (#732) bugfix: rotated monitors now have the right size on the clip area by @mattkae in #738
- (#739) bugfix: no longer crashing when switching workspaces early by @mattkae in #741
- feature: raise a floating tree when a leaf is focused by @mattkae in #744
- feature: implementation of a background on floating containers by @mattkae in #745
- Release/0.8.3 by @mattkae in #748
- (#197) bugfix: one source of truth for the version by @mattkae in #749
- feature: auto reload display configs on change by @aliihsancengiz in #747
- task: improve feature flag management by @mattkae in #750
- feature: implementation of resizing with the pointer by @mattkae in #752
- task: remove output animation handle + virtual workspace by @mattkae in #755
- bugfix: preferred index should be optional instead of int max when it cannot be found by @mattkae in #756
- (#751) bugfix: desktop files should be in usr/share instead of usr/local/share by @mattkae in #757
- bugfix: debian rules should run the build correctly by @mattkae in #758
- bugfix: fix minor issue with resizing causing a crash by @mattkae in #761
- task: simplify window placement algorithm in order to dispatch less by @mattkae in #763
- task: run Github workflow on Fedora rawhide by @mattkae in #764
- task: rename miracle-wm-config to miracle-wm-c by @mattkae in #765
- feature: custom window management via WebAssembly plugins by @mattkae in #762
- (#743) bugfix: manually fixing the rotated output saga once and for all by @mattkae in #766
- task: no longer need mircommon internal by @mattkae in #767
- refactor: remove the workspace layout strategy and place tiled windows directly into their parent by @mattkae in #768
- feature: working tiled placement via WebAssembly plugins by @mattkae in #771
- task: add plugin Rust builds to the project by @mattkae in #772
- feature: able to request focus on workspaces from the plugins by @mattkae in #773
- bugfix + feature: fading out animations can now set the rectangle on the surface by @mattkae in #774
- feature: configure the function name per plugin function so that it can be anything by @mattkae in #775
- feature: non-tiling windows can be placed on and associated with a workspace via the plugin system by @mattkae in #776
- feature: making the Rust plugin API 1000x times better by @mattkae in #778
- feature: implement a way to get the active workspace from the plugin by @mattkae in #779
- I forgot my own email address by @TaseenA09 in #777
- feature: adding mutablity to plugins and testing it by @mattkae in #781
- feature: add window_deleted notification to the plugin API by @mattkae in #782
- feature: saving the PluginHandle in the PluginManagedContainer by @mattkae in #783
- feature: add the ability to query the windows that are managed by a particular plugin by @mattkae in #784
- bugfix: fixed occlusion zones by @mattkae in #785
- feature: plugins can handle keyboard input by @mattkae in #786
- feature: letting plugins know when a window has been focused by @mattkae in #787
- feature: replace scan code keybinds with human-readable XKB keysym names by @mattkae in #788
- task: remove multi select experimental feature by @mattkae in #789
- refactor: introduce the idea of a WindowContainer which has window-specific actions defined for it by @mattkae in #790
- refactor: more containers refactor, specifically parent container by @mattkae in #791
- feature: introduce the idea of ContainerEffects so that we can safely apply multiple effects to a container by @mattkae in #793
- feature: adding transform and alpha to window placement in plugins by @mattkae in #792
- feature: piping the current transform and alpha to the WindowInfo by @mattkae in #794
- feature: modify managed windows from the plugins by @mattkae in #795
- feature: plugins can now be notified about window unfocus by @mattkae in #796
- feature: update set_size to set_rectangle in the plugin system by @mattkae in #797
- feature: handle pointer events from the plugin by @mattkae in #798
- feature: stable ids for plugin objects by @mattkae in #799
- feature: adding a request focus method for plugins by @mattkae in #800
- feature: notifying plugins when a workspace is added or deleted by @mattkae in #801
- bugfix: fix deadlock potential in plugins by @mattkae in #802
- feature: notifications about workspace resizes for plugins and allowing users to not always animate transitions by @mattkae in #803
- feature: plugins can now read their little section of the configuration file by @mattkae in #804
- feature: config now does NOT auto reload and must be reloaded with Meta + Shift + R by @mattkae in #805
- feature: windows can now be resized from their corners by @mattkae in #806
- feature: add animations to shell components by @mattkae in #807
- feature: disable animations on shell components by @mattkae in #808
- feature: notifying plugins when a workspace is added or deleted by @mattkae in #810
- feature: fixing a ton of things with window placement by @mattkae in #812
- feature: allow users to specify if the window is resizable and movable by @mattkae in #814
- feature: plugins always get first pick at input handling by @mattkae in #815
- bugfix: start all plugins at 8 instead of 0 because 0 is special null by @mattkae in #816
- feature: plugins can now queue custom, arbitrary animations by @mattkae in #817
- task: refactor the Rust plugin API for readability and understandability by @mattkae in #818
- feature: add Rust docs for miracle-plugin by @mattkae in #819
- task: make url docs.miracle-wm.org and add wrangler.toml by @mattkae in #820
- feature: plugins can now configure miracle by @mattkae in #822
- feature: use a proper enum for Placement in plugins by @mattkae in #823
- bugfix: add ForwardingSurface alpha by @mattkae in #824
- bugfix: make it so that miracle-plugin-rs can compile outside of its directory by @mattkae in #825
- bugfix: fix gap logic being swapped in LeafContainer by @mattkae in #827
- bugfix: fixing various shutdown issues by @mattkae in #826
- bugfix: containers are now movable between outputs again by @mattkae in #828
- bugfix: removing dying surfaces when they are done animating by @mattkae in #829
- Lots and lots of new plugin work by @mattkae in #830
- feature: add a unique ID to all containers to improve resolution by @mattkae in #831
- bugfix: getting rid of this absolutely terrible global mutex by @mattkae in #832
- bugfix: invoking window animation under lock by @mattkae in #833
- feature: reload a plugin when its hash changes + tests by @mattkae in #834
- feature: make it so that plugins reenter nicely on window focus and window unfocus by @mattkae in #835
- feature: enable plugin system by default by @mattkae in #836
- Add session wrapper script for Miracle WM snap by @mattkae in #780
- task: libmircommon dev is no longer a dependency by @mattkae in #841
- bugfix: fix locking issues around workspaces and timing issues by @mattkae in #840
- bugfix: catching exception when using grimshot by @mattkae in #842
- docs: update README by @mattkae in #843
- task: remove animation duration from animation plugins by @mattkae in #844
- bugfix: fixing bad ids for containers + improving animation significantly + fixing a bunch of silly deadlocks by @mattkae in #845
- task: greatly improve the slide animation with a new clip area field by @mattkae in #846
- bugfix: run open animation when window is ready, not when it is opened by @mattkae in #847
- bugfix: windows now open with opacity 0 and get fullscreened at the right layer by @mattkae in #848
- bugfix: make the container ID increment match the peeked number by @mattkae in #849
- task: add flag for MIR_VERSION_2_26_OR_GREATER by @mattkae in #852
- feature: early load the cursor theme so that it can be set from the config by @mattkae in #851
- feature: improve animating of window movement + proper border sizing by @mattkae in #853
- feature: removing mini trees in favor of floating single windows into freestyle mode by @mattkae in #854
- task: make click to focus default instead of hover by @mattkae in #855
- bugfix: only start moving and dragging when we selected the intersected window by @mattkae in #856
- bugfix: fix inability to resize windows with the pointer by @mattkae in #858
- task: bump version to 0.9.0 by @mattkae in #857
New Contributors
- @TaseenA09 made their first contribution in #704
- @aliihsancengiz made their first contribution in #747
Full Changelog: v0.8.3...v0.9.0