New year, new Hyprland release brought to you by Yours Truly.
This update is quite large, so you might want to read these patch notes.
There have been quite a bunch of internal rewrites, mostly around memory safety, the renderer, and animation system. Although performance shouldn't change
much, it should improve stability in edge cases. Please do report any regressions you might find, if they aren't reported already.
Notes for packagers:
- new dependency: glaze
- I've dropped binary releases. Please use the source to build.
Breaking changes:
master:always_center_master
has been replaced with a more flexiblemaster:slave_count_for_center_master
New features:
- CMake, Meson: add option controlling hyprpm building
- config: add exec(-onec) with rules and execr(-once) (#8953)
- core/renderer: Add GPU hotplug support (#8980)
- core: Add a periodic donation request (#8981)
- core: Add render:allow_early_buffer_release to make buffer release configurable (#9019)
- core: Add support for HDR and color management protocols (#8715)
- core: add --verify-config to verify the config with Hyprland
- ctm: add an internal fade animation to ctm transitions
- debug: add debug:pass for debugging the render pass
- hyprpm: add an option to force reload all plugins (#8883)
- hyprpm: add glaze dependency FetchContent fallback (#8899)
- keybinds: add new window destruction dispatchers (#8962)
- keybinds: add visible arg for cyclenext (#9045)
- master: add option to show slaves on left in center orientation (#8940)
- pluginAPI: add register dispatcher v2
- protocols: add hyprland_lock_notify_v1 implementation (#9092)
- protocols: add hyprland_surface_v1 implementation (#8877)
- protocols: add hyprland_surface_v1.set_visible_region implementation (#9120)
- renderer: Add supercircular window corners (#8943)
- selectors: add a tag: to for matching window tag(s) by regex (#8985)
- socket2: add focusedmonv2 event (#8921)
- windowrules: add negative: prefix for negating a regex
Fixes:
- animation: fixup adding animvars during ::tick (#9030)
- animations: fix XWayland cursor glitch and refactor skill issues (#9033)
- animations: fix borderangle once (#9149)
- ci: fix "Resource not accessible by integration" for cf workflow (#9144)
- compositor: fix incorrect cast, use lambda capture instead (#9161)
- config: fix animations requiring all args
- config: fix float animation speeds < 0 (#9123)
- config/ConfigWatcher.cpp: add missing include needed for clang (#9166)
- configmgr: fix crash on very early plugin loads
- core/compositor: fix too early buffer release (#8966)
- core: fix custom resolutions (#8897)
- core: fix possible crash on null active workspace
- data-device: fix edge case crash on null xwm
- debug: fix ISDEBUG checking (#8823)
- debug: fix overlay not rendering
- desktop/DesktopTypes.hpp: fix include (#9104)
- dwindle: fix possible crash on null ws
- functionHooks: wait for hyprland pages before returning addr for trampo
- helpers/Monitor.cpp: fix include path (#9039)
- hyprctl: Fix
hyprctl
batch JSON command (#8749) - hyprctl: fix hyprctl --batch not working with exec rules (#8952)
- hyprpm: fix hyrpm sometimes returning 0 despite errors occuring (#8761)
- keybinds: fix movefocus fallback for special workspaces (#9040)
- keybinds: fix nullptr deref in forcekillactive (#9021)
- keybinds: fix previous_per_monitor logic (#9010)
- logging: fix Gpu info (#8764)
- pass: fixup debug mode rendering of input boxes
- protocols: fix alpha-modifier noncompliance (#8929)
- protocols: fix compilation error (#8988)
- renderer: fix CRendererHintsPassElement reset duplication issue (#8928)
- renderer: fix fullscreen hdr check (#9076)
- renderer: fix oversized blur precalcs not blurring at all
- renderer: fix rare case when a tiled window would be rendered over fs
- shaders: fix blank windows when using corner rounding (#8969) (#8971)
- window: fixup fade out animation on silent moves
- xwayland: fix clipboard mime name and atom mismatch (#9137)
- xwayland: fix compile with no xwayland
- xwayland: fix crash when trying to initialize without Xwayland installed (#9077)
- xwayland: fix dnd including xwayland
- xwayland: fix pointer mismatches with multiple monitors (#9179)
- xwayland: fix sending large clipboard data (#9134)
- xwayland: various window handling fixes
- xwm: fixup targets in selection requests
Other:
- Meson: properly install 'hyprland' symlink (#9091)
- Renderer: rewrite render scheduling (#8683)
- animation: avoid crashes in ::tick() on mutations
- animationmgr: don't warp based on POINTY value (#9000)
- binds: cycle within group on single monitor if no window found in the argument direction. (#8714)
- ci(clang-format): directly do the clang-format instead of error (#8955)
- config: avoid querying the fs every tick
- config: disable borderangle by default (#9165)
- config: update animation even if disabled
- config/ConfigManager.cpp: add instruction to edit config (#9130)
- core: add LIKELY and UNLIKELY macros
- core: Unbreak build on FreeBSD (#8762)
- core: always use goal size to send to clients
- core: avoid activating toplevel-less surfaces
- core: cleanup header includes (#9088)
- core: fade in windows when they are brought from invisible workspaces
- core: guard workspace and monitor in moveWorkspaceToMonitor
- core: make persistent workspaces always follow the config
- core: move all shared_ptrs from the STL to hyprutils (#9143)
- core: move parts of the animation system to hyprutils (#8868)
- core: move sendWindowSize off of xwaylandmgr
- core: move to inotify for monitoring the config files
- core: refactor/improve monitor mode selection (#8804)
- core: reserve vector sizes as much as we can (#9118)
- core: update groups on movewindow (#9183)
- core: use cpu-buffer hw cursors on nvidia by default
- core: use readFileAsString instead of cat for os-release
- ctm: disable fade animation by default on nvidia
- datadevice: do the unfocus surface stuff before dndActive is true (#9157)
- datadevice: guard XWayland server against crashes
- desktop: move desktop types to memory-safe pointers
- dnd/seat: avoid sending button events during a dnd op
- foreign-toplevel: update active on null window focus (#8860)
- fractional-scale: avoid redundant and duplicate scale events
- github: bug issue template improvements (#8894)
- groupbar: unify title rendering
- groups: honor group lock window rule (#8782)
- hooksystem: avoid huge include for HANDLE
- hyprpm: use glaze to parse hyprctl plugin list (#8812)
- input: abord dnd op on escape pressed
- input: pass touch events to lock screens (#9129)
- internal: Make static analysis more happy (#8767)
- internal: added reference to CTimer class in KeybindManager (#8836)
- internal: few small monitor improvements (#8890)
- internal: remove dead code (#8748)
- internal: removed Herobrine
- internal: update window position/size after changing fullscreenstate (#8865)
- keybinds: attempt to wrap around if fallback is allowed in movefocus
- layershell: check if layer is valid (#9156)
- layershell: return focus to a valid ls on close if possible
- layout: apply group rules after window creation (#8779)
- layout: damage window properly on float mode changes
- layout: force full damage on toggling floating mode
- layout: set window size after toggling floating
- logging: get broader GPUINFO (#8753)
- master: make loop around optional when cycling (#8926)
- master: replace always_center_master with slave_count_for_center_master (#8871)
- monitor: avoid crashes on no good modes
- monitor: bring back old description behavior
- nix/module.nix: expand nixos module for configuring hyprland
- opengl: only allocate offMainFB on demand
- opengl: use uv to avoid rendering the entire blurbox
- pass: allow removing all pass elements of a given type
- pass: ignore empty rectangles queued
- pass: improve blur region detection
- pass: improve pass debug mode
- pass: improve pass debugging
- pass: mark crucial elements as undiscardable
- pass: scale blur region in ::render
- pass: scale blur regions properly
- pointer: always scale the cpu cursor to the right size
- protocols: allow hyprland-toplevel-export to capture hidden windows (#9041)
- protocols: do not capture cursor in toplevel without pointer focus (#9042)
- protocols: do not destroy screencopy resources before client request (#9048)
- protocols: immediately copy toplevel content when ignoreDamage set (#9049)
- regex: log an error if regex parsing fails
- renderer/internal: stop using box pointers
- renderer: Auto enable wide color gamut in HDR mode (#9090)
- renderer: Do not set hdr metadata unless needed (#9014)
- renderer: allow plugins to know what window was rendered in post
- renderer: don't access hdrMetadata optional if it has no value (#8987)
- renderer: unload background texture if it's disabled
- renderer: use a render pass for render modif in client render
- renderer: use cairo for cpu buffer rendering (#9071)
- shadow: avoid drawing empty shadows
- snap: don't snap to any windows if workspace has a fullscreen window (#8870)
- snap: give edge snapping precedence over corner snapping (#8873)
- snap: revert #8659, use bounds checking instead of bit mask (#8872)
- subsurface: damage the entire parent on size change
- tablet: send
motion
s on tip events (#9132) - window: only set m_iMonitorMovedFrom, when moving to a different monitor (#9160)
- windowrules: precompute regexes for window/layer rules
- windows: honor xdg_toplevel_set_fullscreen output hint (#8965)
- windows: minor initial workspace improvements
- xwayland: avoid sending value of real size to xwayland
- xwayland: don't create an abstract unix domain socket on linux (#8874)
- xwayland: don't define atoms on no_xwayland builds
- xwayland: support sending clipboard change notification on focus (#9111)
Special Thanks
Special thanks for these people for donating $$$ to help the project continue:
- Xoores
- johndoe42
- yyyyyyan
- taigrr
- SomeMediocreGamer
- Azelphur
- alukortti
- Theory_Lukas
- MasterHowToLearn
- ari-cake
- AuHunter
- Amaan Q
- Jas Singh
- matipan
- SViN Drawing
- NextDreamJob.LIVE
- Plyply
- atomicptr
- Skidam
- Avid
- FUTO
- XoZu
- System64
- Pascal Nitsche
- JustOptimize
- billybo_o
- denast
- gorfxx
- LCLP
- Ben
- Dainatello
- Diego
- Riesi
- Xellor
- Daniel
- Abdulaziz Al-Khater
- Cassio Fernando
- Efo
- Adrian Dobkowski
- Ricardo C
- JanRi3D
- andmars
- SiliconVillager
- Frank Huurman
- Francois
- Fan2Shrek
- anna//bool
MRs
- flake.lock: update by @khaneliman in #8742
movefocus_cycle_groupfirst
: cycle within group on single monitor if no window found in the argument direction. by @normaltaro in #8714- remove dead code by @ikalco in #8748
- Fix
hyprctl
batch JSON command by @khalid151 in #8749 - get broader GPUINFO by @ikalco in #8753
- Unbreak build on FreeBSD by @jbeich in #8762
- Fix GPU info by @Kam1k4dze in #8764
- hyprpm: fix hyrpm sometimes returning 0 despite errors occuring by @alba4k in #8761
- Make static analysis more happy by @ikalco in #8767
- apply group rules after window creation by @Aqa-Ib in #8779
- groups: honor the group lock window rule by @Aqa-Ib in #8782
- Renderer: rewrite render scheduling by @vaxerski in #8683
- added reference to CTimer class in KeybindManager by @avih7531 in #8836
- Use glaze to parse hyprctl json output, other improvements by @zjeffer in #8812
- Updated window position/size for grouped fullscreen-windows in setGroupCurrent fn by @khushal-solves in #8865
- update ForeignTopLevel on null window focus by @user111111111111111111111111111111111 in #8860
- snap: revert #8659, use bounds checking instead of bit mask by @myQwil in #8872
- refactor/improve monitor mode selection by @ikalco in #8804
- xwayland: don't create an abstract unix domain socket on linux by @netadr in #8874
- snap: give edge snapping precedence over corner snapping by @myQwil in #8873
- make
hyprpm reload -f
unload & load all enabled plugins by @zjeffer in #8883 - Replaced always_center_master to slave_count_for_center_master by @khushal-solves in #8871
- few small monitor improvements by @ikalco in #8890
- fix custom resolutions by @ikalco in #8897
- hyprpm: add glaze dependency FetchContent fallback by @davc0n in #8899
- protocols: add hyprland_surface_v1 implementation by @outfoxxed in #8877
- renderer: fix CRendererHintsPassElement reset duplication issue by @raybbian in #8928
- protocols: fix alpha modifier noncompliance by @outfoxxed in #8929
- bug issue template improvements by @rszyma in #8894
- socket2: add focusedmonv2 event by @davc0n in #8921
- master: make loop around optional when cycling by @lonyelon in #8926
- feat: add support for supercircular (e.g. squircles) window corner rounding by @polluxcodes in #8943
- flake.lock: update by @MrSom3body in #8970
- snap: snap only to windows floating over top of fullscreen window if one exists by @myQwil in #8870
- Fix a bunch of issues with dropCurrentBuffer by @UjinT34 in #8966
- Bug fix for hyprctl --batch doesn't work with exec rules by @Jakenv in #8952
- bug: fix blank windows when using corner rounding (#8969) by @polluxcodes in #8971
- Add option to show slaves on left in master layout center orientation by @Zetta1Reid0 in #8940
- core: move parts of the animation system to hyprutils by @PaideiaDilemma in #8868
- Support color management protocols by @UjinT34 in #8715
- protocols: fix compilation error by @alyanser in #8988
- renderer: don't access hdrMetadata optional if it has no value by @PaideiaDilemma in #8987
- windows destruction dispatchers by @littleblack111 in #8962
- animationmgr: don't warp based on POINTY value by @PaideiaDilemma in #9000
- Add tag: to window parameters for matching tag(s) by regex by @zakk4223 in #8985
- ci(clang-format): directly do the clang-format instead of error by @littleblack111 in #8955
- WIP : honor xdg_toplevel_set_fullscreen output by @dardok in #8965
- fix: nullptr in forcekillactive when no window is present by @littleblack111 in #9021
- Add a periodic donation nag by @vaxerski in #8981
- Add render:allow_early_buffer_release to restore old behavior by @UjinT34 in #9019
- exec(-onec) with rules and execr(-once) by @littleblack111 in #8953
- fix: previous_per_monitor logic by @Truenya in #9010
- animation: fixup adding animvars during ::tick by @PaideiaDilemma in #9030
- animations: fix XWayland cursor glitch and refactor skill issues by @PaideiaDilemma in #9033
- Fix include paths. by @ninetailedtori in #9039
- Fix movefocus fallback for special workspaces by @alyanser in #9040
- Do not set hdr metadata unless needed by @UjinT34 in #9014
- protocols: do not capture cursor in hyprland-toplevel-export without pointer focus by @outfoxxed in #9042
- protocols: allow hyprland-toplevel-export to capture hidden windows by @outfoxxed in #9041
- protocols: immediately copy toplevel content when ignoreDamage set by @outfoxxed in #9049
- Fix HDR check for FS windows by @UjinT34 in #9076
- renderer: use cairo for cpu buffer rendering by @vaxerski in #9071
- cleanup header includes by @user111111111111111111111111111111111 in #9088
- Auto enable wide color gamut in HDR mode by @UjinT34 in #9090
- Meson: properly install 'hyprland' symlink by @fufexan in #9091
- CMake, Meson: add option controlling building hyprpm by @fufexan in #9106
- nix/module.nix: expand nixos module for configuring hyprland by @bloxx12 in #9006
- reserve vector sizes as much as we can by @gulafaran in #9118
- protocols: do not destroy screencopy resources before client request by @outfoxxed in #9048
- protocols: add hyprland_lock_notify_v1 implementation by @PaideiaDilemma in #9092
- config: fix float animation speeds by @PaideiaDilemma in #9123
- xwayland: support sending clipboard change notification on focus by @DDoSolitary in #9111
- Check that Xwayland exists before enabling it by @earboxer in #9077
- feat: cyclenext, visible parameter by @Truenya in #9045
- flake.lock: update by @hrdinka in #9128
- Added instruction to edit config by @amnesiacsardine in #9130
- xwayland: fix clipboard mime name and atom mismatch by @DDoSolitary in #9137
- xwayland: fix sending large clipboard data by @DDoSolitary in #9134
- GPU hotplug support by @maround95 in #8980
- clang-format: fix "Resource not accessible by integration" by @littleblack111 in #9144
- tablet: send
motion
s on tip events by @MikeWalrus in #9132 - core: move all unique_ptrs from the STL to hyprutils by @vaxerski in #9143
- protocols: add hyprland_surface_v1.set_visible_region implementation by @outfoxxed in #9120
- datadevice: do the unfocus surface stuff before dndActive is true by @PaideiaDilemma in #9157
- layershell: check if layer is valid by @heather7283 in #9156
- animation: fix borderangle once by @PaideiaDilemma in #9149
- compositor: fix incorrect cast, use lambda capture instead by @heather7283 in #9161
- window: only set m_iMonitorMovedFrom, when moving to a different monitor by @PaideiaDilemma in #9160
- config: disable borderangle by default by @PaideiaDilemma in #9165
- config/ConfigWatcher.cpp: add missing include needed for clang by @heather7283 in #9166
- input: pass touch events to lock screens by @MikeWalrus in #9129
- xwayland: fix pointer mismatches with multiple monitors by @PaideiaDilemma in #9179
- window: only set m_iMonitorMovedFrom when the workspace is visible by @PaideiaDilemma in #9178
- update groups on movewindow by @user111111111111111111111111111111111 in #9183
New Contributors
- @avih7531 made their first contribution in #8836
- @khushal-solves made their first contribution in #8865
- @user111111111111111111111111111111111 made their first contribution in #8860
- @netadr made their first contribution in #8874
- @raybbian made their first contribution in #8928
- @lonyelon made their first contribution in #8926
- @polluxcodes made their first contribution in #8943
- @MrSom3body made their first contribution in #8970
- @Jakenv made their first contribution in #8952
- @Zetta1Reid0 made their first contribution in #8940
- @dardok made their first contribution in #8965
- @ninetailedtori made their first contribution in #9039
- @bloxx12 made their first contribution in #9006
- @hrdinka made their first contribution in #9128
- @amnesiacsardine made their first contribution in #9130
- @maround95 made their first contribution in #8980
- @heather7283 made their first contribution in #9156
Full Changelog: v0.46.0...v0.47.0