7764 Commits
Author SHA1 Message Date
Tom EnglundandGitHub 4afc273db2 internal: fix tokens for xdg-desktop-portals (#15433)
* tokens: expire one shot initial workspace tokens

tokens are only removed once a window maps, so things like
xdg-desktop-portal got the 1337 month duration token added and always
first launch in the wrong workspace. check PINITIALWSTRACKING and if
mode 1 just give them a 1 second token. like other code paths does.

* tokens: increase timeout to 10 seconds

increase the timeout to 10 seconds, slow launching things like krita is
above the 1 second we have now. if 10 seconds is to much it can always
be fine tuned lower later.

* tokens: add a config option for timeout

add initial_workspace_token_timeout as a config option to be able to set
the default timeout for the initial workspace tracking token.

* tokens: rename timeout to actually timeout

urgl, to much going on at the same time. TIMEOUT certainly makes more
sense for an timeout.
2026-07-17 17:54:36 +02:00
Vaxry ad317198d9 init: revert "gain real-time through rtkit (#15411)"
This reverts commit 83cd85b3d5.
2026-07-17 16:41:07 +02:00
NotPppp1116GitHubPppp1116 <ACCOUNT1_NOREPLY>
3f6055bdbf xwayland: preserve title fallback state (#15449)
Co-authored-by: Pppp1116 <ACCOUNT1_NOREPLY>
2026-07-17 14:30:26 +02:00
linandGitHub de530935a0 hyprpm: continue after repository update failures (#15391) 2026-07-17 14:28:36 +02:00
CirenandGitHub 46f64d36b8 ipc/lua: rxpose tearingHint for windows (#15431)
* Expose tearingHint in hyprctl clients

* Add tearing_hint field to HL.Window
2026-07-17 14:28:18 +02:00
VaxryandGitHub 44d16e9bd1 config/lua: allow wildcards or absolute paths in require (#15461) 2026-07-17 14:27:54 +02:00
164aed999d desktop/view: fix IView virtual inheritance and erase_if ptr (#15421)
* desktoå/view: fix IView virtual inheritance and erase_if ptr

CSubsurface and CSessionLock inherited IView non-virtually while
CWindow/CLayerSurface/CPopup inherited it virtually.

erase_if compared event.address with the derived complete object
pointer. under virtual inheritance those addresses differ.

* desktop/view: use dynamic casting over static casting

change to dynamic casting instead of static casting.

* better

* more better

more better is more.

---------

Co-authored-by: Vaxry <vaxry@vaxry.net>
2026-07-17 14:27:15 +02:00
NotPppp1116GitHubPppp1116 <ACCOUNT1_NOREPLY>
229bca7b1a build: link Glaze to the compositor core (#15454)
Co-authored-by: Pppp1116 <ACCOUNT1_NOREPLY>
2026-07-17 11:42:56 +02:00
NotPppp1116GitHubPppp1116 <ACCOUNT1_NOREPLY>
5663e6d129 xwayland: validate ICCCM hint replies (#15450)
Co-authored-by: Pppp1116 <ACCOUNT1_NOREPLY>
2026-07-17 10:24:19 +02:00
Tom EnglundandGitHub d3e1411d94 screenshare: minor fence and copy fixes (#15429)
* screenshare: don recopy a dmabuf while fence is pending

copy is called for every pending frame on the output commit. and output
commit fires on any output commit not just buffer ones. so the fence can
easily be not signaled yet.

* screenshare: erase done frames too

erase done frames from m_pendingFrames to avoid growing to huge
numbers. a finished frame copied/failed/session gone is skipped by the
copy but was only erased once it expired. a slow client could let the
vector grow.
2026-07-17 10:22:41 +02:00
Vaxry 4a753eaa03 presentation: revert "associate feedback with committed surface state (#15243)"
This reverts commit 0cf705600f.
2026-07-17 10:20:20 +02:00
Vaxry 9d1813ad29 dmabuf: revert "ensure both create and create_immed verify v4 (#15424)"
This reverts commit 031579e722.
2026-07-16 23:44:34 +02:00
NotPppp1116GitHubPppp1116 <ACCOUNT1_NOREPLY>
0cf705600f presentation: associate feedback with committed surface state (#15243)
* presentation: associate feedback with committed surface state

* presentation: avoid shared ownership for feedback state

* presentation: format feedback ownership declarations

* presentation: release destroyed feedback resources

* presentation: own feedbacks uniquely

* presentation: format feedback ownership update

---------

Co-authored-by: Pppp1116 <ACCOUNT1_NOREPLY>
2026-07-16 20:13:52 +02:00
NotPppp1116GitHubPppp1116Pppp1116 <ACCOUNT1_NOREPLY>
82baeb5e92 render: handle explicit sync fallback safely (#14986)
* render: handle explicit sync fallback safely

* render: avoid blocking explicit sync fallback

* ci: retry flaky Hyprland VM tests

* render: avoid blocking explicit sync fallback

---------

Co-authored-by: Pppp1116 <pcaiadoguerreiro@gmail.com>
Co-authored-by: Pppp1116 <ACCOUNT1_NOREPLY>
2026-07-16 20:12:32 +02:00
André SilvaandGitHub 83cd85b3d5 init: gain real-time through rtkit (#15411)
* init: gain real-time through rtkit

* init: use sdbus to talk with rtkit

* init: simplify

* ci: add sdbus-cpp dependency

* init: add HAS_RTKIT def
2026-07-16 20:11:37 +02:00
Tom EnglundandGitHub b500399878 renderer: block solitary on fadeouts (#15428)
after 254d6bae77 fadeouts now live in
fadingOutState() instead of the normal containers, so add SC_FADEOUT and
iterate the new fadingOutState() and block solitary for fadeouts.
2026-07-16 12:02:27 +02:00
Tom EnglundandGitHub ee773e85e4 renderer: fix mirror draw buffers on rotating work buffers (#15427)
glDrawBuffers is per FBO state, but it was only set when mirroring was
first enabled on whatever work buffer happened to be mainFB that frame.
since work buffers rotate other FBO's kept default single draw buffer.

move the draw buffer selection into internalAlloc so it always follows
the mirror attachment.
2026-07-16 12:01:54 +02:00
Tom EnglundandGitHub 031579e722 dmabuf: ensure both create and create_immed verify v4 (#15424)
invalid_format check was only done in the create handler and missed
create_immed, move it into verify() instead so it catches both.
2026-07-16 12:00:45 +02:00
Tom EnglundandGitHub 11c38d62fa algo/master: avoid nullptr dereferences (#15422)
there are a few random crashes reported with master, safeguard two
potential nullptr derefs. and remove a unusued PNODE.
2026-07-16 11:57:05 +02:00
Tom EnglundandGitHub a97a2850c8 core: fix --verify-config crash (#15418)
verify path returned early without cleanup(), which made it destruct
to late and call CWorkspaceAlgoMatcher thats already destroyed.
2026-07-16 11:50:05 +02:00
Roman GundarinandGitHub 26dbbb4f69 renderer: allow blurring of the session lock surface (#15283) 2026-07-16 11:21:34 +02:00
0b0d7ede21 input-capture: impl protocol (#7919)
Co-authored-by: Gerben Meijer <infernix@gmail.com>
Co-authored-by: Emerson Matos <emegson@live.com>
Co-authored-by: Mihai Fufezan <mihai@fufexan.net>
Co-authored-by: Ashley Stonham <reddrop@reddrop.net>
Co-authored-by: extra-salad <87635414+extra-salad@users.noreply.github.com>
2026-07-15 23:56:05 +02:00
Tom EnglundandGitHub d7fc7240f4 protocols: avoid crash in lease (#15417)
when lease is destroyed the destroy listener nullptr deref m_lease, and
all it uses it for is logging the fd number. capture the fd by value to
avoid crashing.
2026-07-15 14:32:14 +02:00
Tom EnglundandGitHub 338bdbb323 dwindle: avoid crashing on expired weakptr (#15415)
* dwindle: avoid crashing on expired weakptr

pTarget can be expired when toggling a tiled window to floating during a
drag move that triggers removeTarget -> recalculate -> calculateWorkspace
before the dead node has been cleaned up.

* hyprtester: wait for enabled monitor

without waiting for enabled monitor we can race the tests and call focus
on non enabled monitors.
2026-07-15 14:31:12 +02:00
Tom EnglundandGitHub 0f6f2792e4 desktop/popup: fix crash on destroy (#15416)
* popup: fix crash on destroyed xdg surface resource

the xdg_surface can be destroyed before the xdg_popup, so CPopup::onDestroy
hasnt run yet and the popup is still in its parents m_children with m_wlSurface set.

if guard it in popupTreeExtents.

* popup: safe guard bad resource

popups can be fading out while the resource is dead, ifguard it and
return m_lastPos if thats the case.
2026-07-15 14:30:45 +02:00
feelameeandGitHub 79bc0ca16e groups: add groupbar disable_when_only option (#15009)
* groups: add groupbar disable_when_only option

* groups: improve `groups` test

`groups_disable_when_only` test fails because it checks windows sizes after
`disable_when_only` option changed. Changing option currently don't
trigger window size update.

Same problem with `groups` test, but it worked because it or:
- didn't checked window size after changing option.
- called `hl.dsp.group.toggle()`, which trigger size update
- at the begining set `enable = 1` while it `== 1` by default
Now it fails too :D

Seems it works in usual Hyprland usage because:
- `CHyprGroupBarDecoration::draw` calls
- `g_pDecorationPositioner->repositionDeco(this)`,
  which will invalidate cache and update sizes.

* groups: fix `disable_when_only` and `groups` tests

REFRESH_LAYOUTS is not required 'cause REFRESH_WINDOW_STATES will
trigger update of window position too.

* groups: fix groupbar drawing
2026-07-14 17:32:22 +02:00
NotPppp1116GitHubPppp1116 <ACCOUNT1_NOREPLY>
f2eafdf105 hyprctl: handle partial IPC transfers (#15408)
Co-authored-by: Pppp1116 <ACCOUNT1_NOREPLY>
2026-07-14 17:32:05 +02:00
NotPppp1116GitHubPppp1116 <ACCOUNT1_NOREPLY>
6984188eb0 xwayland: guard unknown selection events (#15409)
Co-authored-by: Pppp1116 <ACCOUNT1_NOREPLY>
2026-07-14 15:23:43 +02:00
DreguandGitHub e0d9283897 config: fix cycle_next using nonexist layoutmsg for prev (#15396) 2026-07-14 12:45:00 +02:00
Tom EnglundandGitHub 30588bec76 protocols: fix SHM cursor partial damage copy (#15399)
use the current row and the SHM stride when calculating copy offsets,
the previous code calculated the copy offset incorrectly by always using
the first damaged row and by assuming each row as only as wide as the
damaged region.
2026-07-14 11:46:33 +02:00
Tom EnglundandGitHub d371ad2760 config: fix initial workspace tracking (#15395)
* config: fix initial workspace tracking

previous refactor over to Executor missed m_isLaunchingExecOnce meaning
any hl.exec_cmd(hyprlauncher) got the token of 1337 month duration at
the first launched workspace, so the initial launch of things gets that
token and opens on the wrong workspace.

add m_isLaunchingExecOnce back, and make getHyprlandLaunchEnv a member
of CExecutor aswell.

the needle counting also missed the final partial chunk if the read
failed to read 512 bytes but still read a chunk.

* hyprtester: fix monitor rule

ID's are unreliable. try to parse it directly from name.
2026-07-14 11:45:55 +02:00
VaxryandGitHub e7996dc9bd desktop: remove using directives, move to geometric functions (#15402) 2026-07-14 11:35:26 +02:00
Vaxry ed11458bbc README: update showcase 2026-07-14 11:35:12 +02:00
Vaxry b348ff780c cursor: revert "transform hardware cursors within content bounds (#14988)"
This reverts commit 5033ab954b.

Bad cursor on transformed.
2026-07-14 11:10:14 +02:00
Vaxry 30983d6ff0 splashes: add 5th comp winner's splash 2026-07-14 08:46:14 +02:00
NotPppp1116GitHubPppp1116 <ACCOUNT1_NOREPLY>
402eceea96 protocols: fix protocol null dereference paths (#15275)
* Fix protocol null dereference paths

* protocol: align image description state assignment

---------

Co-authored-by: Pppp1116 <ACCOUNT1_NOREPLY>
2026-07-13 20:47:22 +02:00
NotPppp1116GitHubPppp1116Pppp1116 <ACCOUNT1_NOREPLY>
5033ab954b cursor: transform hardware cursors within content bounds (#14988)
* cursor: transform hardware cursors within content bounds

* cursor: transform hotspot as a pixel

---------

Co-authored-by: Pppp1116 <pcaiadoguerreiro@gmail.com>
Co-authored-by: Pppp1116 <ACCOUNT1_NOREPLY>
2026-07-13 20:44:34 +02:00
NotPppp1116GitHubPppp1116 <ACCOUNT1_NOREPLY>
2c3ed5f66e window: cache process environment lookups (#15264)
Co-authored-by: Pppp1116 <ACCOUNT1_NOREPLY>
2026-07-13 20:43:20 +02:00
VaxryandGitHub 1eebdac356 config/lua: add lua-driven custom live gestures (#15393)
fixes https://github.com/hyprwm/Hyprland/issues/15020
2026-07-13 20:42:06 +02:00
VaxryandGitHub 2633ecff39 algo/dwindle: do not remove node before assigning (#15373)
this skips proper recalcs for windows on the old space. No other algo does this.

fixes #13456
2026-07-13 18:37:20 +02:00
50d301d34a core/output: don't destroy bound wl_output resources on same-name global replace (#15351)
* core/output: don't destroy bound wl_output resources on same-name global replace

When a monitor is unplugged and replugged quickly (e.g. an external screen
losing power for a second), the new monitor's wl_output global replaces the
old defunct one in PROTO::outputs by name. Erasing the map entry destroyed
the old CWLOutputProtocol and, with it, every wl_output resource clients
still held. Clients processing the global_remove would then send
wl_output.release on an id the server had already destroyed, get
"invalid object N" posted on wl_display, and be fatally disconnected -
killing nearly every connected client (browsers, IMEs, shells, portals).

Repro (no hardware needed):
  hyprctl output create headless test
  # let any client bind it, then:
  hyprctl --batch "output remove test ; output create headless test"
  -> every client that bound the output is disconnected.

Fix: retire the old global instead of destroying it. It is removed from the
registry (removeGlobal) but kept alive in PROTO::defunctOutputs until every
client has released its resources; CWLOutputProtocol::destroyResource then
drains it. Resource destroy/release handlers now route through m_owner
instead of a name lookup so releases reach the defunct global they belong
to, and the self-erase on drain is identity-checked so a defunct global can
no longer erase the healthy same-name global that replaced it.

* core/output: clarify defunctOutputs comment

Reword per review: these globals are gone-but-not-yet-unref'd-by-all-clients,
not necessarily replaced.

* clang-format

* clang-format

---------

Co-authored-by: Titosy <dev.titosy@gmail.com>
2026-07-13 15:02:21 +02:00
erStarrandGitHub 2b6f6cb831 layout/monocle: fix w[tv1] workspace rule not working on monocle layout (#15382)
* update window input-ability and update work area before setting window pos to ensure the correct window size is obtained.

* Test
2026-07-13 09:27:32 +02:00
Ryan HoltandGitHub 7d90874c96 renderer/cm: fix blur clipping with HDR (#15371)
Problem: The blurprepare intermediate used an 80-nit range but HDR
pixels can be much brighter. A 200-nit pixel was encoded as:

    (200/80)^(1/2.2) = 1.52

which would get clamped to 1 causing clipping.

Solution: Use the workbuffer's configured max luminance (1000, for
example) for the range so that a 200-nit pixel becomes:

    (200/1000)^(1/2.2) = 0.48

We also must consistently use the EXT_LINEAR transfer function range in
blurprepare/blurFinish.

Note: KDE somewhat similarly uses gamma 2.2 encoding where 1.0 == max
luminance of monitor:
https://zamundaaa.github.io/wayland/2024/11/02/hdr-and-color-management-in-kwin-part-4.html
2026-07-13 09:21:32 +02:00
Tom EnglundandGitHub 8684c154ae glframebuffer: fix spurious incomplete framebuffer errors (#15380)
paths like enableMirror internalAllocs a new framebuffer in begin()
which means the previously bound currenfFB is reset to 0. if guard it at
end of alloc and restore the previously fb instead of setting it to 0.

there is also codepaths where manually allocated CFLFramebuffers are
created renderbuffers that later called ->bind() that also expects to be
able to read it. bind GL_FRAMEBUFFER in those cases in bind()

and same on release() can be called mid frame on temp buffers deleting
the framebuffer and binding 0 while we still want currentFB bound.
2026-07-13 09:20:03 +02:00
erStarrandGitHub f4b9c1ab24 Tests/scroll: fix window hiding test passing inconsistently (#15384)
* fix test passing only inconsistently - use acceptsInput to test since `visible` and `hidden` are unreliable

* comment fix

* remove residual sync calls
2026-07-12 20:30:54 +02:00
Tom EnglundandGitHub c4cfe0e830 pointer: fix two stale cursor images clearings (#15376)
if previous display manager set a hwcursor and never clears it, we wont
clear it until we actually set a new hw cursor ourself, so add
initialPlaneCleared and clear it once on start. the !CROSSES if case
only clears it if we have actually set it ourself.

if software cursor has been rendered and it now doesnt intersect with
the monitor, clear it out once, guarded by swRendered.
2026-07-12 17:49:11 +02:00
VaxryandGitHub f25f2ff048 ci: fix codeownersplus (#15383)
this perm is sensitive, but for this one it should be ok
2026-07-12 17:40:12 +02:00
VaxryandGitHub e3ece11992 config/actions: unfocus last window on changeWorkspace when moving monitors (#15374) 2026-07-12 17:20:30 +02:00
Tom EnglundandGitHub ef18043b5c layersurface: dont nullptr deref on compositor cleanup (#15379)
State::monitorState() is destroyed before the renderer during compositor
exit and render pass elements can keep the layersurface alive until the
renderer dies. causing a nullptr deref in ~CLayerSurface() , if guard it
and return early.
2026-07-12 16:24:01 +02:00
erStarrandGitHub 824ed12c9d fullscreen: fix some bars remaining invisible when unfullscreening (#15370)
* window() already gets the current window

* fix layer invisibility when infullscreening

* format

* smol fix for loop early return

* add current alpha value of layers to `hyprctl layers`

* spacing is hard

* Test - Both default and scrolling

* use .goal() not .value(). also clamp for inf case

* `syncTargetSizeAndPosition()`: use .goal() only as .value() will be overwritten anyway
2026-07-11 23:10:59 +02:00