A massive update brought to you by the All Hyprland Corp!
Breaking changes
dwindle:pseudotilehas been removed as it wasn't doing anythingdecoration:shadow:ignore_windowhas been removed (defaults to enabled)render:cm_fs_passthroughhas been removed, should be automatic withrender:cm_auto_hdrmisc:vfrmoved todebug:as it's a debug variable that should not be changed in prod environments
New features:
- algo/scroll: add center for centering the current col (#14059)
- algo/scrolling: add config options for focus and swapcol wrapping (#13518)
- algo/scrolling: add expel, consume, and consume_or_expel (#13869)
- animations: add springs (#14171)
- binds: add an auto_consuming flag (#13919)
- config/lua: add ExpressionVec2, allow using a table for vec2 rules (#14197)
- config/lua: add clear tag api (#14273)
- config/lua: add noop
- config/lua: add simple layout API (#14258)
- config/workspacerule: add animation style (#13380)
- config: add device tags (#13728)
- debug-tools: add flame
- desktop/window: add alpha container for alpha calculations
- desktop/windowRule: add
confine_pointerwindow rule (#13379) - desktop/windowRule: add parser switch for confine pointer (#14263)
- dispatchers: add moveintoorcreategroup (#13325)
- dwindle: add rotatesplit layoutmsg and tests (#13235)
- gestures: add live pinch cursor zoom (#14049)
- gestures: add scroll_move (#14063)
- groups: add groupbar middle_click_close option (#14242)
- hl.mata.lua: add string to NotificationOptions's icon param. (#14334)
- hyprctl: add hw cursor flag
- hyprland.pc.in: add src include flag
- i18n: add Greek translations (#13865)
- i18n: add Punjabi translations (#13807)
- input: add device specific binds (#13073)
- layerrules: add dynamically registered rules for plugins (#13331)
- layout/windowTarget: add visualBox (#13626)
- render/cm: add ICC profile pipeline (#12711)
- renderer/deco: add glow decoration (#13862)
- renderer: add a cm settings cache
- window/rules: add scrolling_width (#13754)
- windows/focus: add fallbacks when focussing workspaces (#14270)
Fixes:
- config/descriptions: add missing desc entry
- cmake: add -fno-omit-frame-pointer to debug
- InputManager: add guards to confineToRegion to avoid issues (#14269)
- algo/dwindle: add back splitratio (#13498)
- algo/dwindle: fix precise mouse setting (#13678)
- algo/master: fix crash after dpms (#13522)
- algo/master: fix crash on null target in getNextTarget
- algo/scroll: fix std::clamp assertion crash on resume from suspend (#13737)
- algo/scroll: fix unsigned wrap (#13634)
- algo/scrolling: fix offset on removeTarget (#13515)
- algo/scrolling: fix rare crash
- algo/scrolling: various scrolling view related bugfixes (#13974)
- build: add glaze dependency with FetchContent fallback (#13666)
- build: add format-check and format-fix Makefile targets (#13936)
- build: fix build on gcc 16.x after #6b2c08d (#13429)
- clang-tidy: fix duplicate entry in .clang-tidy (#14045)
- cmake: fix permissions for directories by default
- cmakelists: fixup errors failing build on arch ci (#14259)
- compositor: fix floating input/visual z-order desync after fullscreen (#14015)
- compositor: fix focus edge detection (#13425)
- compositor: fix missing recheckWorkArea to prevent CReservedArea assert failure (#13590)
- config/actions: fix misuse of ActionResult's error type (#14221)
- config/legacy: fix crash on getConfigValue of plugin fns
- config/legacy: fix missing fallbacks crashing device getters
- config/lua: fix device bool int reads (#14313)
- config/lua: fix dispatcher shapes to not be callable (#14268)
- config/lua: fix unbind behavior (#14199)
- config/lua: fix window object to selector logic
- config/refresher: fix refreshing of cursor zooms (#14283)
- config: fix crash in safe mode due to null
Config::mgr()(#13855) - config: fix propRefresher to not run on first launch
- config: fix safe mode config generation (#14024)
- config: fix type confusion in getOption with complex types
- core: fix i586 build (#13550)
- deco/border: fix damage region
- deco/border: fix damageEntire
- desktop/group: fix movegroupwindow not following focus (#13426)
- desktop/rule: fix matching for content type by str
- desktop/rules: fix empty workspace handling (#13544)
- desktop/rules: fix static rules and content type. (#13725)
- desktop/view: fix SIGABRT in CWindow::onUnmap when monitor is expired (#14148)
- desktop/window: fix floating windows being auto-grouped (#13475)
- desktop/window: fix idealBB reserved (#13421)
- desktop/windowRule: fix matching CONTENT (#13636)
- desktop/workspace: fix visibility criteria matching (#14349)
- example/hyprland.lua: fix wiki links for new stuff (#14172)
- examples: fix missing permissions entry in lua example config (#14177)
- groups: fix
movewindoworgroupwhen moving from group to group (#14086) - hyprctl: fix bools in getoption
- hyprctl: fix buffer overflowing writes to the socket
- hyprctl: fix getoption with custom types (#14243)
- hyprctl: fix invalid type cast
- hyprctl: fix json output for the submap command (#13726)
- hyprctl: fix lib64 pkgconfig for version-checking (#14051)
- hyprctl: fix workspace dynamic effect reloading (#13537)
- hyprpm: fix url sanitization in add
- input: fix device configs for pointer devices
- input: fix focus_on_close=2 (MRU) routing to cursor path instead of getNextCandidate (#13969)
- input: fix the multimon touch fix (#13819)
- input: fix touch monitor focus ordering (#14310)
- input: fix touch screen focus on multi monitor (#13764)
- internal: fix relative path header locations (#13650)
- keybinds: fix keycode matching on lua (#14254)
- keybinds: fix missing z-order update on floating toggle (#14100)
- keybinds: fix wrong space assignment in pin (#14061)
- keybinds: fixup changegroupactive
- layershell: fix popup crash with nullptr mon (#13763)
- layout/algo: fix swar on removing a target (#13427)
- layout/groupTarget: fix crash on null space assignment (#13614)
- layout/master: fix rollprev/rollnext focusing the wrong window (#14209)
- layout/scroll: fix configuredWidths not setting properly on new workspaces (#13476)
- layout/scrolling: fix edge detection in recalculate() (#14359)
- layout/scrolling: fix size_t underflow in idxForHeight (#13465)
- layout/windowTarget: fix size_limits_tiled (#13445)
- layout: fix crash on monitor reconnect due to stale workspace state
- layout: fix drag_threshold window snap regression (rebased for #12890) (#13140)
- layout: fix null deref in focalPointForDir and moveInDirection (#13652)
- layouts: fix crash on missed relayout updates (#13444)
- meta/stubs: fix notification icon type (#14320)
- misc: fix missing noreturn attribute for throwError (#13746)
- monitor: fix centered floating windows off-screen in special workspace (#14203)
- opengl/shadow: fix shadow offset rendering (#14156)
- overridableVar: fix reassignment
- pointer: fix hardware cursor rendering on rotated/flipped monitors (#13574)
- propRefresher: fix misnamed value
- protocols/compositor: fix presentFeedback being blocked
- protocols/sessionLock: fix crash when monitor is gone during lock surface creation
- protocols: fix image-copy-capture stop handling and remove non protocol errors (#13706)
- render/pass: fix debug:pass rendering
- render: fix SIGFPE in
addWindowToRenderUnfocusedwhenmisc:render_unfocused_fpsis 0 (#13973) - render: fix layer blur_popups ignoring ignore_alpha when blur is off (#13947)
- renderer/groupbar: fix a group indicator rounding bug (#13975)
- renderer/groupbar: fix gradients rendering (#13875)
- renderer: Various CM fixes, part 8 of refactors (#13860)
- renderer: fix blockBlurOptimization check (#13685)
- renderer: fix crash on mirrored outputs needing recalc (#13534)
- renderer: fix crash on null blur framebuffer during monitor disconnect
- renderer: fix crash when shader path isn't a file (#13756)
- renderer: fix crash with nullptr FBs (#13641)
- renderer: fix decoration colors with linear FP16 (#14361)
- renderer: fix sdr mod (#13630)
- renderer: fix shadow CM calculations (#14364)
- renderer: fix share window projection (#13695)
- renderer: more FP16 fixes (#14070)
- renderer: refactor part 7: api fixes (#13631)
- renderer: small fixes in OpenGL.cpp and OpenGL.hpp (#13842)
- screencopy: fix crash in screensharing toplevel with invalid handle (#13781)
- screencopy: fix isOutputBeingSSd (#13586)
- screencopy: fix minor crash (#13566)
- screencopy: fix nullptr deref if shm format is weird
- screenshare: round captureBox after scaling to fix region capture at fractional scales (#14257)
- seat/compositor: fix minor issues (#13958)
- seat: fix dropped wl_keyboard.enter after stale keyboardFocusResource (#14143)
- tests/workspace: fix one test case failing
- tests: Fix more tests failing on CI (#14159)
- tests: fix ConfigLuaValueTypes - boolBadType test, 0 and 1 are allowed integer values for bool type (#14240)
- tests: fix gtests crashing (#14244)
- workspace: fix missing null access guard (#14119)
- xwayland: fix compiler warnings (#13920)
Other:
- CI/Nix/Test: check gtest exit status
- CI/Nix: use org-wide actions
- CI/build: remove commented-out clang-format action (#13893)
- Nix: always test in debug mode
- NotificationOverlay: take reserved space into account (#14184)
- algo/dwindle: Respect
force_splitwhen moving windows to workspaces (#13038) - algo/dwindle: do NOT use smart_split for overridden focal point (#13635)
- algo/dwindle: don't crash on empty swapsplit (#13533)
- algo/dwindle: use focal point correctly for x-ws moves (#13514)
- algo/scroll: improve directional moves (#13423)
- algo/scroll: reverse horizontal dir mapping of vertical scroll directions (#13647)
- algo/scrolling: improve behavior with focus_fit_method = center (#13795)
- animation: avoid redundant damage calls in tick
- build: bump hyprgraphics to 0.5.1 (#14013)
- build: bump hyprutils to 0.13.1 (#14365)
- build: remove auto-generated hyprctl/hw-protocols/ files during make clear (#13399)
- build: remove legacy clang-format workflow (#13887)
- clang-format: run formatter
- cleanup: avoid repeated weak_ptr lock() calls in conditions (#14057)
- cleanup: avoid repeated weak_ptr::lock() usage in MasterAlgorithm (#14226)
- cmake: install the default example hyprland.lua (#14174)
- cmake: remove dependence on hyprland.conf
- cmakelists: search for any possible lua package name (#14204)
- compositor: When processing fullscreen states, only use effective mode where necessary (#13607)
- compositor: be more selective about how we expand the window box in getting coord (#13720)
- compositor: damage monitors on workspace attachment updates
- compositor: move SessionLockManager init from STAGE_LATE to STAGE_BASICINIT (#14272)
- compositor: recalculate workspace state after fs state update (#14369)
- config/actions: remove spammy errors and make them silent
- config/errors: Report and categorize errors properly for actions (#14192)
- config/executor: actually execute exec-shutdown (#13872)
- config/legacy: default to active window for movetoworkspace dispatchers (#14170)
- config/legacy: translate default window args properly
- config/lua: cannot disable animation (#14215)
- config/lua: don't pop up an error if no target was found (#14175)
- config/lua: expand properties in the workspace object (#14194)
- config/lua: init lua config manager, use lua if available (#13817)
- config/lua: workspace.move/rename should accept "workspace" instead of "id" as a parameter (#14232)
- config/refresher: refresh watcher state properly (#14307)
- config/workspace-rules: support modifying persistent and monitor (#14217)
- config: allow hashes for parsing colors (#14337)
- config: always call refresh after config reload (#14346)
- config: cleanup the entire config infrastructure (#13785)
- config: find lua paths first (#14335)
- config: move misc:vfr to debug: (#14021)
- config: refresh window states on border_size changes (#14201)
- config: use lua by default, generate lua if no config present
- data/dnd: guard against expired dndPointerFocus and ensure consistent usage (#13996)
- debug/overlay: optimize rendering, cleanup and nicetify (#14097)
- decoration/border: simplify damage callback
- desktop/group: respect direction when moving window out of group (#13490)
- desktop/history: include ranges header (#14000)
- desktop/layerRule: use variants for storage internally
- desktop/popup: cache popup extents
- desktop/popup: cache tree count
- desktop/reserved: do not crash on invalid box init (#13880)
- desktop/rule: cleanup inheritance, use templates to avoid dup
- desktop/rule: recheck eating the applied rule (#14362)
- desktop/rule: use Numeric for number parsing
- desktop/window: don't group modals
- desktop/window: expand hidden into proper states
- desktop/window: guard null monitor in xwaylandSizeToReal (#13876)
- desktop/window: optimize getRealBorderSize()
- desktop/window: reduce window deco updates (#13980)
- desktop/window: refactor over fullscreen state
- desktop/windowRule: use variants for storage internally
- desktop/workspaceHistory: small refactor to work better with multi monitor setups (#13632)
- egl: move over to use hyprgraphics (#12988)
- errorOverlay: modernize, refactor, use GPU rendering (#14122)
- example: remove old .conf file
- examples: merge config blocks in lua example as demo
- format: safeguard drmGetFormat functions (#13416)
- gitignore: ignore pointer scroll test artifact
- helpers/systemInfo: extract info fns (#14222)
- hyprtester: minor refactoring/restructure (#14154)
- i18n: update Tatar translations (#13930)
- i18n: update Vietnamese translations (#13489)
- i18n: update brazillian portuguese (pt_BR) translation (#14248)
- init: drop CAP_SYS_NICE from ambient set after gaining SCHED_RR (#14082)
- input: allow focus to switch to most recently used window on closed (#13769)
- input: avoid repeated weak_ptr::lock() and ensure consistent usage (#14039)
- input: focus monitor on touch down events (#13773)
- input: implement follow_mouse_shrink (#13707)
- input: keep pointer focus on layer surfaces during keyboard refocus (#14018)
- input: lazy cache getWindowIdeal()
- internal: improve cursor size logging (#14180)
- internal: include setByUser in CConfigManager::getConfigValue (#14155)
- internal: removed Herobrine
- internal: rewrite deviceNameToInternalString using a single range pipeline (#13806)
- internal: silence compiler warnings about unused return values (#13997)
- keybind/actions:
cycle_nextw/tiled = truedoesn't choose only tiled windows (#14164) - keybindMgr: use legacy behavior for single-key binds on lua (#14176)
- keybinds: Remove removed keybinds (#13605)
- layersurface: simulate mouse movement on layer change (#13747)
- layout/algo: preserve focused target if applicable on layout switches (#14058)
- layout/algos: use binds:window_direction_monitor_fallback for moves (#13508)
- layout/dwindle,master: return invalid layoutmsg errors
- layout/scrolling: handle fullscreen manually (#14190)
- layout/windowTarget: damage before and after moves (#13496)
- layout/windowTarget: don't use swar on maximized (#13501)
- layout/windowTarget: override maximized box status in updateGeom (#13535)
- layout: guard null workspace in CWindowTarget::updatePos() (#13861)
- layout: replace string comparison with ID-based matching in WorkspaceAlgoMatcher (#13943)
- layout: revert "replace string comparison with ID-based matching in WorkspaceAlgoMatcher (#13943)"
- layout: store and preserve size and pos after fullscreen (#13500)
- layouts/dwindle: override force after window drags (#14002)
- logging: update uri of debug log in ConfigManager to reflect change in wiki (#14185)
- main: improve error reporting during initialization in main.cpp (#14181)
- meta/stubs: update gesture hints to match new fields (#14195)
- miscfunctions: reuse monitor pointer instead of repeated calls (#13977)
- monitor: centralize solitary and scanout eligibility checks
- monitor: damage old special monitor on change
- monitor: ensure swapchain is updated before mode test (#14065)
- monitor: keep workspace monitor bindings on full reconnect (#13384)
- monitor: set format back after failing DS activation (#14168)
- monitor: update pinned window states properly on changeWorkspace (#13441)
- monocle: avoid repeated workspace monitor lock() calls (#14085)
- nix/tests: print gtests logs
- nix: separate overlay with deps
- notifications: move and small refactor (#14094)
- notifications: optimize rendering (#14088)
- opengl: minor egl changes (#14147)
- pass/surface: cache texBox
- pointer: damage entire buffer in begin of rendering hw
- protocolMgr: set m_self properly when updating mirrored outputs
- protocols/workspace: schedule done after output update (#13743)
- protocols: allow xdg-foreign to be used by sandboxed apps (#13854)
- protocols: avoid repeated per-client work in hot paths
- protocols: prune stale subsurface refs in hot traversals
- protocols: reimplement unstable/xdg-foreign-v2 (#13716)
- refactor: improve readability of monitor rule comparison (#13884)
- render/decoration: cache input extents as well
- render/decoration: improve extent calculations
- render/decorations: improve cache performance
- render/opengl: optimize getShaderVariant's map access
- render/pass: optimize simplification and blur calculations
- render: scale background to monitor resolution (#14250)
- renderer/cm: Support wp-cm-v1 version 2 (#12817)
- renderer: don't damage decos individually in damageWindow
- renderer: extract window skip conditions into named booleans (#14005)
- renderer: guard against null monitor in renderMonitor (#13823)
- renderer: handle HDR -> SDR with cm_auto_hdr (#14102)
- renderer: move m_renderData to renderer (#13474)
- renderer: only set presentationmode when required (#14252)
- renderer: refactor Texture, Framebuffer and Renderbuffer (#13437)
- renderer: refactor gl renderer (#13488)
- renderer: refactor projection setting (#13485)
- renderer: refactor render elements (#13438)
- renderer: refactor resources and flags (#13471)
- renderer: shader variants refactor (#13434)
- renderer: simplify renderWorkspaceWindowsFullscreen
- renderer: simplify shadows (#14047)
- renderer: skip redundant render-path work
- renderer: swizzle on shm screencopy (#14167)
- repo: ignore the autogen file
meta/hl.meta.lua(#14336) - rules: make rule prop reset less cursed (#14003)
- scheduler: keep a strong monitor ref in frame callbacks
- screencopy: check share session state (#13839)
- screencopy: clear buffer before rendering (#14064)
- screencopy: scale window region for toplevel export (#13442)
- screenshare/frame: set m_copied after shm copy succeeds (#14165)
- screenshare: adjust session cleanup and event emission order (#14229)
- screenshare: improve destroy logic of objects (#13554)
- scroll: clamp column widths properly
- seat: store surface in pointerFocus before sendEnter (#13941)
- sessionLock: send locked instead of denied when missing a lock frame for 5 seconds (#14271)
- shader: delete shader on success path (#13682)
- socket2: emit
killevent (hyprctl kill) (#13104) - source: c-f for new clang version
- splashes: update splashes
- subsurface: use geometry-aware damage and recurse into nested trees (#13933)
- tests: add unit tests for ByteOperations helpers (#13886)
- tests: add unit tests for CDamageRing (#13995)
- tests: add unit tests for CHyprColor (#13891)
- tests: add unit tests for CMType helpers (#13888)
- tests: add unit tests for CMonitorRuleParser (#13895)
- tests: add unit tests for CTagKeeper (#13970)
- tests: add unit tests for Direction helpers (#13885)
- tests: add unit tests for Format utilities (#13923)
- tests: add unit tests for Math transform utilities (#13935)
- tests: add unit tests for Math::CExpression (#13924)
- tests: add unit tests for MiscFunctions helpers (#13934)
- tests: add unit tests for TransferFunction helpers (#13889)
- tests: add unit tests for match engine types (#13903)
- tests: skip pointer tests in CI due to missing input environment (#14238)
- tests: stabilize CI by relaxing env-dependent checks and timing-sensitive assertions (#14142)
- tests: tolerate plugin config mismatch in CI (#14173)
- treewide: alejandra -> nixfmt
- view: consolidate group flags and apply window rules (#13694)
- workspace: remove deprecated and unused members (#14198)
- xdg-foreign-v2: Keep invalid imported objects alive (#14166)
- xdg-shell: queue state updates for toplevel (#14227)
- xwayland: handle transient read errors in selection transfer (#14135)
- xwayland: pipe through monitor in coordinate mapping (#13700)
- xwayland: prevent potential buffer overflow in socket path handling (#13797)
Special Thanks
As always, special thanks to these people / companies for supporting Hyprland's continued development:
Sponsors
Diamond
37Signals
Gold
Framework, Butterfly
Donators
Top Supporters:
Tonao Paneguini, Semtex, soy_3l.beantser, Seishin, Nox Æterna, Illyan, Snorezor, Bonsai, Joshua Weaver, ExBhal, DHH, Mikko_Nyman, Kay, iain, TyrHeimdal, miget.com, alexmanman5, Hunter Wesson, --, RaymondLC92, Theory_Lukas, Brandon Wang, Insprill, lzieniew, 3RM, johndoe42, Jas Singh, RayJameson, MadCatX, Xoores, d, Ammar Hossain, Ki☆, inittux111, Arkevius, John Shelburne, DeWattaUnk, ari-cake, gfunnymoney, alukortti, taigrr
New Monthly Supporters:
tubid2wenty, Uros Cotman, yafantik, Guy, goblin_engineer, Julius John Puno, Peter Buijs, mb, StellaBuckley, haikuolin, Antibaddy, sludge10123, C Money, Lipski, KampotKaca, Kazuhide Takahashi, Skeptomai, bombadurelli, Rebellen, Álan, StreamCyper, taras, Yury, Sherab, Filinto Delgado, Taddelladius
One-time Donators:
Quuton, Selvan, Tyler Adams, tonis, Sam, Dimitrios Liappis, Chivtar, Eric, aponsasan888, bkode, LonestarF1, Chris, Dogmatic Polack, Larry, maxx, MonolithImmortal, edrix, I like GameNative, take my money., nyxloom, Frederic Toemboel, Schmendiey, himes, brandonia, Xphelus, New user, Miguel Flores-Acton, R3dGh0st, Glen, Vitor Moura GUEDES, Anersyum, le_04, Dan, AT, chorr, Awesome, IdeaSpring, Jacobrale, anonymous, Elias Griffin, w00z4, Marcus Edvardsson, Gerhard, Bashmaks, Benjaneb, R4dicalEdward, Matýsek ^^, Michael, Gene Raymond, naivesheep, Neginja, anarchuser, Uta, Francois KERISIT, ay4, Lorenzo santacreu, Gitznik, Jure S, Oliver, Pipes, Mein, ironick, Nlight, Pfoid, DasCleverle, Jaf Endee, DIEBUSTER, senorBeard, alex, Mike, luxxa, JasonPettys, One, Daniel, Sven Eppler, L3rdy, Ilunn, Thorff, XurxoMF, Wonkhester, Brian, Doc O, Mortja, Spook, Miguel Cordero Collar, bennyzen, deah, Sean, Higor, nanea808, Torsten Schieber, I3lack5hield, Kevin Steffer, Zarenno, vfosterm, Nikola, EGB, Dietmar, KilahDentist, Wilf Lin, Rad, Yuza, Supporter, nooob, esseonline, Naresh, darquill, BrnPrs, Pani, BYK, Amaury, nythix, Mika, Patriarch, Gambit, GoatCedric, Adam, MirasM, bl4ckb1rd, Loon, KevOlek, AsciiWolf, Brian Barrow, Anon, Kilian, Cristian M., abhinavmishra094, Dejv78, LinoDB, Trofim, Konstantin, JoaquinCamposPlaza(Ximo), Gabo, Phil, dev2and0m, Neil Brown, zarilion, JavierArias(Javi), Thank you, Mystrasun, Skrazzo, MeguminLoli, revitalist, barcellos-pedro, Juh, Goldie, benabrig, mynus, Daniel Zudel, Grant, Jacob Felknor, Noah, e033x, Nick, Niklas, mkami, Slippy, joenu, Oleksandr, t.i.m., Joss001, M4CETO, Nighty, Donater, David N, Cameron, Ekoban, Kieran, brotiii, Doug, Hypruser#0224975, Shadesofastar, sonicbhoc, GKL, Damien, João Seixas, mothmashine, James Freiwirth, Mek, Krizzkrozz, Panzer, mika.dev, Franky Valley, Sycho sMILEz, Roy, Amundis, willibenmula ❤️, Justin, marvelousIT, pablo, Alex, Ryan, cito, Juergen, Eric Koslow, valerius21, jfk, Andrejs, tyforupdate, skwrl, DaintyFox
Full Changelog: v0.54.0...v0.55.0