Skip to content

fix(linux/xdgportal): Properly support multiple screens by exposing pipewire streams as separate displays - #4931

Merged
ReenigneArcher merged 5 commits into
LizardByte:masterfrom
Kishi85:xdgportalgrab-better-multi-monitor-support
Apr 9, 2026
Merged

fix(linux/xdgportal): Properly support multiple screens by exposing pipewire streams as separate displays#4931
ReenigneArcher merged 5 commits into
LizardByte:masterfrom
Kishi85:xdgportalgrab-better-multi-monitor-support

Conversation

@Kishi85

@Kishi85 Kishi85 commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

Description

This PR adds proper multi-monitor support to Sunshine's XDG portal grab by exposing all streams of a capture portal as separate screens (utilizing the multiple capture mode of the screencast portal) with necessary fixes to make things work.

Things this PR does:

  • Improve logging done by portalgrab.cpp for easier debugging (could be moved to a separate PR if desired)
  • Properly implement XDG stop event based on DBus signal (as doing it based on matching the display resolution will break display switching)
  • Remove the (already more or less defunct) session caching.
  • Add missing error handling to pipewire code to prevent obvious segfaults
  • Fix the (currently broken) keyboard shortcut for the switch_display_event
  • Change screencast source selection mode to multiple
  • Expose separate displays for each screen stream provided by the screencast portal (ordering streams consistently by screen position) - Note: This is still dependent on the Portal implementation providing streams for each selected source. I've only tested with KDE6.6 in a combined Remotedesktop+Screencast session and it's working fully there.

Known issues:

  • Can segfault when trying to switch displays really quickly (by mashing the screen switch shortcut multiple times within a second) and even then it's not fully reproducible. This would have been happening even before this PR when just having a single stream but was masked due to the shortcut handling not being properly implemented in the capture logic (missing return on !push_captured_image_cb). This is a separate issue concerning other capturemethods as well (tested with KMS), see Coredump with SIGSEGV when switching displays #4943

Screenshot

Issues Fixed or Closed

Roadmap Issues

Type of Change

  • feat: New feature (non-breaking change which adds functionality)
  • fix: Bug fix (non-breaking change which fixes an issue)
  • docs: Documentation only changes
  • style: Changes that do not affect the meaning of the code (white-space, formatting, missing semicolons, etc.)
  • refactor: Code change that neither fixes a bug nor adds a feature
  • perf: Code change that improves performance
  • test: Adding missing tests or correcting existing tests
  • build: Changes that affect the build system or external dependencies
  • ci: Changes to CI configuration files and scripts
  • chore: Other changes that don't modify src or test files
  • revert: Reverts a previous commit
  • BREAKING CHANGE: Introduces a breaking change (can be combined with any type above)

Checklist

  • Code follows the style guidelines of this project
  • Code has been self-reviewed
  • Code has been commented, particularly in hard-to-understand areas
  • Code docstring/documentation-blocks for new or existing methods/components have been added or updated
  • Unit tests have been added or updated for any new or modified functionality

AI Usage

  • None: No AI tools were used in creating this PR
  • Light: AI provided minor assistance (formatting, simple suggestions)
  • Moderate: AI helped with code generation or debugging specific parts
  • Heavy: AI generated most or all of the code changes

@Kishi85 Kishi85 changed the title WIP: xdgportalgrab: Expose multiple streams as separate displays for better multi monitor support with client-side display switching fix(linux/xdgportal): WIP: Expose multiple streams as separate displays for better multi monitor support with client-side display switching Mar 31, 2026
@Kishi85
Kishi85 force-pushed the xdgportalgrab-better-multi-monitor-support branch 2 times, most recently from 1f4fa32 to 58efcab Compare March 31, 2026 18:44
@Kishi85

Kishi85 commented Mar 31, 2026

Copy link
Copy Markdown
Contributor Author

@psyke83 Sorry to ping you here but can you think of a reason why the keyboard shortcut to switch displays would not work with portalgrab?

I've been trying to do so after enumerating them properly for display_names (current state of this PR) but the switch_display_event from video.cpp does not seem to be firing or handled when using portalgrab and I can't figure what I'm missing.

@psyke83

psyke83 commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

@psyke83 Sorry to ping you here but can you think of a reason why the keyboard shortcut to switch displays would not work with portalgrab?

I've been trying to do so after enumerating them properly for display_names (current state of this PR) but the switch_display_event from video.cpp does not seem to be firing or handled when using portalgrab and I can't figure what I'm missing.

If you add some debug to video.cpp you'll see that your current code is hitting the switch_display_event->peek() case when the combination is first pressed, but the peek event then repeatedly triggers. The artificial reinit is not completing successfully for some reason.

@psyke83

psyke83 commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

Look:

case platf::capture_e::timeout:
if (!push_captured_image_cb(std::move(img_out), false)) {
return platf::capture_e::ok;
}
break;
case platf::capture_e::ok:
if (!push_captured_image_cb(std::move(img_out), true)) {
return platf::capture_e::ok;
}
break;

It seems that portalgrab is not checking the push_captured_image_cb callback the same way in the capture loop. The same logic may need to be added. I will look at this further later when I have time, if you don't figure it out.

@Kishi85

Kishi85 commented Apr 1, 2026

Copy link
Copy Markdown
Contributor Author

Look:

case platf::capture_e::timeout:
if (!push_captured_image_cb(std::move(img_out), false)) {
return platf::capture_e::ok;
}
break;
case platf::capture_e::ok:
if (!push_captured_image_cb(std::move(img_out), true)) {
return platf::capture_e::ok;
}
break;

It seems that portalgrab is not checking the push_captured_image_cb callback the same way in the capture loop. The same logic may need to be added. I will look at this further later when I have time, if you don't figure it out.

That is exactly what was missing to get the keyboard shortcut to work. Thanks!

@Kishi85
Kishi85 force-pushed the xdgportalgrab-better-multi-monitor-support branch 4 times, most recently from 5fa6e6f to 6d7942e Compare April 1, 2026 08:21
@Kishi85

Kishi85 commented Apr 1, 2026

Copy link
Copy Markdown
Contributor Author

I've got the basic functionality working now and can switch multiple displays using keyboard shortcuts.

The main issue right now is when the same display currently actively streaming is requested to be switched to again (e.g. currently streaming display 0 and trying to switch to it via shortcut) then the stream will disconnect due to https://github.com/Kishi85/Sunshine/blob/6d7942e0c82aeedfca16b77735f0fc6cf716a4ec/src/platform/linux/portalgrab.cpp#L1294-L1309

which is causing the stream to disconnect with Warning: PipeWire stream stopped by user. in the logs.

Problem here is that this is necessary to detect if the user stopped the stream via the XDG notification (according to @psyke83 notes in #4914 (comment)).

Possible solutions that need more research:

  • Have the check detect if it is currently handling a switch_display_event. I've already had to extend it by adding the current stream position values to the mix so we can discern switching different screens without disconnecting.

  • Figure out another way to detect the user disconnecting the portal manually and change that part of the stream logic.

  • Update video.cpp to not reinit if switching to the same display currently active and just keep streaming (might have side-effects I can't assess).

@Kishi85
Kishi85 force-pushed the xdgportalgrab-better-multi-monitor-support branch from 6d7942e to 3a22dff Compare April 1, 2026 09:09
@Kishi85

Kishi85 commented Apr 1, 2026

Copy link
Copy Markdown
Contributor Author

The main issue right now is when the same display currently actively streaming is requested to be switched to again (e.g. currently streaming display 0 and trying to switch to it via shortcut) then the stream will disconnect due to https://github.com/Kishi85/Sunshine/blob/6d7942e0c82aeedfca16b77735f0fc6cf716a4ec/src/platform/linux/portalgrab.cpp#L1294-L1309

Changing the check to also include currently active switch_display_events directly works (not sure if this is the best way to do it):

auto switch_display_event = mail::man->event<int>(mail::switch_display);
if (previous_width.load() == width && previous_height.load() == height && previous_pos_x.load() == pos_x && previous_pos_y.load() == pos_y && switch_display_event->peek()) {

Next issue is when changing displays via shortcut too quickly there seems to be a possible race condition which can happen that freezes Sunshine hard until it is restarted and then it is exiting with: Fatal: 10 seconds passed, yet Sunshine's still running: Forcing shutdown or Fatal: Hang detected! Session failed to terminate in 10 seconds. when the session is closed on the client-side.

@Kishi85
Kishi85 force-pushed the xdgportalgrab-better-multi-monitor-support branch 2 times, most recently from e097695 to 79773f8 Compare April 1, 2026 10:15
@Kishi85

Kishi85 commented Apr 1, 2026

Copy link
Copy Markdown
Contributor Author

The main issue right now is when the same display currently actively streaming is requested to be switched to again (e.g. currently streaming display 0 and trying to switch to it via shortcut) then the stream will disconnect due to https://github.com/Kishi85/Sunshine/blob/6d7942e0c82aeedfca16b77735f0fc6cf716a4ec/src/platform/linux/portalgrab.cpp#L1294-L1309

Changing the check to also include currently active switch_display_events directly works (not sure if this is the best way to do it):

auto switch_display_event = mail::man->event<int>(mail::switch_display);
if (previous_width.load() == width && previous_height.load() == height && previous_pos_x.load() == pos_x && previous_pos_y.load() == pos_y && switch_display_event->peek()) {

Scratch that solution as I've had a typo (missing inversion) there and didn't realize that the event is already popped when the display gets reset by video.cpp and the portal re-initialzies. Back to square one on that.

Next issue is when changing displays via shortcut too quickly there seems to be a possible race condition which can happen that freezes Sunshine hard until it is restarted and then it is exiting with: Fatal: 10 seconds passed, yet Sunshine's still running: Forcing shutdown or Fatal: Hang detected! Session failed to terminate in 10 seconds. when the session is closed on the client-side.

Sunshine hanging when switching too quickly is still an issue.

UPDATE: This could be related to chosen encoder, having tried vulkan and vaapi yields different results (hang vs. SEGV).
After running with a debugger I'm seeing the SEGV in https://github.com/FFmpeg/FFmpeg/blob/15504610b0dc12c56e5e9f94ff06c873382368f5/libavcodec/hw_base_encode.c#L508 related to ctx being invalid/missing. Could we have an issue with switching from one pipewire_stream to another upon calling portal_t->init() multiple times? Simply adding a lock mutex for the whole init function does not seem to do the trick. It's likely somewhere in the capture or encoder logic.

UPDATE 2: More or less consistently reproducible when switching screens back and forth without waiting for the stream to update to the new screen. Does not seem to trigger if waiting for the stream to update to the new screen after switching plus a second or two more.

@Kishi85
Kishi85 force-pushed the xdgportalgrab-better-multi-monitor-support branch 2 times, most recently from 36c8067 to 073e73d Compare April 1, 2026 14:14
@psyke83

psyke83 commented Apr 1, 2026

Copy link
Copy Markdown
Contributor

The crashing (whether hang or segfault) may be due to the pipewire loop still being active during fake reinit.

See this block here:

if (stream_stopped.load()) {
BOOST_LOG(warning) << "PipeWire stream stopped by user."sv;
capture_running.store(false);
stream_stopped.store(false);
previous_height.store(0);
previous_width.store(0);
pipewire.frame_cv().notify_all();
return platf::capture_e::error;

And here:

case platf::capture_e::interrupted:
capture_running.store(false);
stream_stopped.store(false);
previous_height.store(0);
previous_width.store(0);
pipewire.frame_cv().notify_all();
return status;

You may also need to set these same variables when you intend to signal an artificial reinit (i.e., when push_captured_image_cb returns false) to ensure the encoder fully stops.

Regarding the race condition that causes a hang, one of the changes in #4875 resolves a hang after disconnect that happens when there are no screen updates happening. Since the on_process callback doesn't fire, the capture loop gets stuck. I worked around that by checking the pull_free_image_cb result during timeout, so you may want to see if you need to do a similar check elsewhere (or perhaps find a better fix).

@ReenigneArcher ReenigneArcher added this to the xdg portal grab milestone Apr 1, 2026
@Kishi85

Kishi85 commented Apr 2, 2026

Copy link
Copy Markdown
Contributor Author

I'll stop force-pushing most things im doing right now and will be squashing the whole thing in the end after we've got all the kinks ironed out. A few things I've done and learned now:

  • 9146245 Adds a prefix to all log messages from portalgrab.cpp so messages can be easily identified in the log (could do that as a separate PR as well if desired)
  • Added a lot more logging on what goes on with pipewire_t and the session cache. Things learned from that:
    • When video.cpp switches displays it calls reset_display() which in term resets the shared_ptr to the current display implicitly destroying pipewire_t and then reinitialzing a new display from scratch.
    • pipewire_t::cleanup_stream() always invalidates the session cache. Since it is called by the destructor of pipewire_t the session cache is never actually used? (c432cb6 fixes this without any noticable changes in behaviour)
  • 20af084 Temporarily disables the session ending logic via XDG notification icon
    • If you try to access an ended session pipewire returns a specific error Pipewire Error, id:2 seq:8 message: no target node available (causing a green screen on the connected client) that could be used to better track a user ending the session via the xdg notification.

With all these changes I seemingly have managed to get a stable reproducer for the crash (SEGV) by switching to the same display that is currently streaming. This is working on a single monitor setup as well, allowed by the implementation in video.cpp and should just fully reset the display (+pipewire stream) without segfaulting. The crash only occurs when switching to the same display. Switching to another display and then back to the first one does not seem to crash (as easily) unless you're switching very quickly but that might just be resulting in a switch to the same display internally in the end.

I'm wondering if this is related to the whole session caching (which is currently more or less defunct on master anyway) and will try to remove the whole session cache to see what happens when this is using a fresh portal every time a new display is constructed. video.cpp already ensures that only one capture is active (due to other capture methods limitations) so multiple XDG notifications should never be an issue in the first place Without session cache the client is just getting a greenscreen.

UPDATE: Testing this again and again leads to the same result: Segfault is only happening when trying to switch to the same screen that is already streaming even though the display reset/initialization looks the same in the log as when switching from one screen to another. It is properly reusing the session cache now and connecting to the same pipewire_node for each display. Could this be some quirk when repeatedly streaming the same node from pipewire? Switching to a different node and then back to the first one does not seem to trigger this issue.

@Kishi85
Kishi85 force-pushed the xdgportalgrab-better-multi-monitor-support branch 2 times, most recently from ed38479 to 12c20b7 Compare April 2, 2026 14:28
@Kishi85

Kishi85 commented Apr 2, 2026

Copy link
Copy Markdown
Contributor Author

After a lot of trial and error I've managed to cut the hangs when switching display down to only when very quickly, repeatedly switching (to the same? haven't tried others) display. You have to basically mash the shortcut to get a segfault. My theory for that is that when switching really quickly something in the capture logic combined with pipewire just cannot keep up (some thread sync issue?).

This is still an issue but I'm wondering if it can be mitigated in video.cpp as it seems unreasonable to allow queuing another switch_display_event while the previous one's reset_display has not finished:

Sunshine/src/video.cpp

Lines 1478 to 1484 in b172a98

// Process any pending display switch with the new list of displays
if (switch_display_event->peek()) {
display_p = std::clamp(*switch_display_event->pop(), 0, (int) display_names.size() - 1);
}
// reset_display() will sleep between retries
reset_display(disp, encoder.platform_formats->dev_type, display_names[display_p], capture_ctxs.front().config);

All other issues I've had with this are basically ironed out now:

  • Hanging issue for switching to the same display is (almost fully) solved.
  • XDG notification stream end is implemented via the associated pipewire error and not by matching screen properties
  • The session cache is now properly invalidated only when a display_name that is not in the list is requested. This can happen as display_names enumerate directly from a separate portal instance (so that is always the current state). As display_names are just position and resolution values as "x,y,w,h" portal->init matches pipewire_streams based on those. Also we do not have to invalidate the session cache for removed portals as the related streams will just stay in there unused.

Things still todo before I'm likely to remove the draft status:

  • Tone down logging to debug level for most of the newly added messages.

@Kishi85
Kishi85 force-pushed the xdgportalgrab-better-multi-monitor-support branch 3 times, most recently from aa2ff1f to b346dd1 Compare April 3, 2026 07:14
@Kishi85

Kishi85 commented Apr 3, 2026

Copy link
Copy Markdown
Contributor Author

Squashed, rebased and description+title updated. This is ready for review.

There's still one known issue (that was there before this PR just masked, see description for details) but maybe someone reviewing this has an idea on how to fix or work around that.

@Kishi85
Kishi85 marked this pull request as ready for review April 3, 2026 07:19
@Kishi85
Kishi85 force-pushed the xdgportalgrab-better-multi-monitor-support branch 2 times, most recently from 4393d2e to 46070be Compare April 8, 2026 19:49
So the log can easily be filtered for messages related to xdg portalgrab
@Kishi85
Kishi85 force-pushed the xdgportalgrab-better-multi-monitor-support branch 3 times, most recently from 7dd27c2 to e483a17 Compare April 8, 2026 20:59
@psyke83

psyke83 commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

Unfortunately the XDG stop still doesn't stop for me on KDE or GNOME. My CPU should not be excessively slow (5700X), but I tried bumping the wait time to eliminate the possibility:

diff --git a/src/platform/linux/portalgrab.cpp b/src/platform/linux/portalgrab.cpp
index b7ff3100..2076d535 100644
--- a/src/platform/linux/portalgrab.cpp
+++ b/src/platform/linux/portalgrab.cpp
@@ -1431,8 +1431,9 @@ namespace portal {
       while (true) {
         // Check if PipeWire signaled a dead stream
         if (shared_state->stream_dead.exchange(false)) {
+          BOOST_LOG(warning) << "[portalgrab]: wait for dbus";
           // Wait 100ms so the portal session closed signal can catch up if it's late. Not sure if this can be handled better...
-          std::this_thread::sleep_for(std::chrono::milliseconds(100));
+          std::this_thread::sleep_for(std::chrono::milliseconds(2000));
           // If the pipewire stream stopped due to closed portal session stop the capture with an error
           if (dbus.is_session_closed()) {
             BOOST_LOG(warning) << "[portalgrab] PipeWire stream stopped by closed portal session."sv;

Still unsuccessful:

Apr 08 22:10:04 archlinux sunshine[10402]: [2026-04-08 22:10:04.826]: Debug: [portalgrab] PipeWire stream state: streaming -> paused
Apr 08 22:10:05 archlinux sunshine[10402]: [2026-04-08 22:10:05.836]: Warning: [portalgrab]: wait for dbus
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.836]: Warning: [portalgrab] PipeWire stream disconnected. Forcing session reset.
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.856]: Debug: [portalgrab] Destroying pipewire_t
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.856]: Debug: [portalgrab] Stop PW thread loop
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.856]: Debug: [portalgrab] Cleaning up stream
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.856]: Debug: [portalgrab] Stop fill_img
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.856]: Debug: [portalgrab] Disconnect stream
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.856]: Debug: [portalgrab] PipeWire stream state: paused -> unconnected
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.857]: Debug: [portalgrab] Destroy stream
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.857]: Debug: [portalgrab] Disconnect PW core
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.857]: Debug: [portalgrab] Destroy PW context
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.857]: Debug: [portalgrab] Close pipewire_fd
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.857]: Debug: [portalgrab] Stop PW thread loop
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.857]: Debug: [portalgrab] Destroy PW thread loop
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.857]: Debug: [portalgrab] Unsubscribing closed session signal: 77
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.858]: Warning: [portalgrab] Failed to explicitly close portal session: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: Object does not exist at path “/org/freedesktop/portal/desktop/session/1_128/Sunshine7”
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.858]: Info: [portalgrab] Loaded portal restore token from disk
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.858]: Debug: [portalgrab] Finalizing Portal security: dropping capabilities and resetting dumpable
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.860]: Debug: [portalgrab] RemoteDesktop CreateSession response_code: 0
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.860]: Debug: [portalgrab] RemoteDesktop CreateSession: got session handle: /org/freedesktop/portal/desktop/session/1_128/Sunshine8
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.866]: Debug: [portalgrab] SelectDevices response_code: 0
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.866]: Debug: [portalgrab] SelectSources response_code: 0
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.873]: Debug: [portalgrab] RemoteDesktop Start response_code: 0
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.876]: Debug: [portalgrab] Subscribed closed session signal: 88
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.877]: Info: [portalgrab] Found stream for display: 'DP-1' position: 0x0 resolution: 1536x864
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.877]: Debug: [portalgrab] Unsubscribing closed session signal: 88
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.877]: Debug: [portalgrab] Explicitly closed portal session: /org/freedesktop/portal/desktop/session/1_128/Sunshine8
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.877]: Debug: [portalgrab] Start PW thread loop
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.877]: Info: [portalgrab] Requested frame rate [60fps]
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.888]: Info: [portalgrab] Loaded portal restore token from disk
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.889]: Debug: [portalgrab] Finalizing Portal security: dropping capabilities and resetting dumpable
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.890]: Debug: [portalgrab] RemoteDesktop CreateSession response_code: 0
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.890]: Debug: [portalgrab] RemoteDesktop CreateSession: got session handle: /org/freedesktop/portal/desktop/session/1_135/Sunshine9
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.896]: Debug: [portalgrab] SelectDevices response_code: 0
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.897]: Debug: [portalgrab] SelectSources response_code: 0
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.904]: Debug: [portalgrab] RemoteDesktop Start response_code: 0
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.906]: Debug: [portalgrab] Subscribed closed session signal: 99
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.907]: Info: [portalgrab] Streaming display 'DP-1' from position: 0x0 resolution: 1536x864
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.907]: Debug: [portalgrab] Setup PW context
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.908]: Debug: [portalgrab] Connect PW context to fd
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.908]: Debug: [portalgrab] Create PW stream
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.908]: Debug: [portalgrab] Connect PW stream - fd 41 node 68
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.908]: Debug: [portalgrab] PipeWire stream state: unconnected -> connecting
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.909]: Info: [portalgrab] Connected to pipewire version 1.6.2
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.909]: Debug: [portalgrab] PipeWire stream state: connecting -> paused
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.911]: Info: [portalgrab] Video format: 12
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.911]: Info: [portalgrab] Size: 1920x1080
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.911]: Info: [portalgrab] Framerate (from compositor): 0/1 (variable rate capture)
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.911]: Info: [portalgrab] using DMA-BUF buffers
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.912]: Info: [portalgrab] Video format: 12
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.912]: Info: [portalgrab] Size: 1920x1080
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.912]: Info: [portalgrab] Framerate (from compositor): 0/1 (variable rate capture)
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.912]: Info: [portalgrab] using DMA-BUF buffers
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.912]: Debug: [portalgrab] PipeWire stream state: paused -> streaming
Apr 08 22:10:07 archlinux sunshine[10402]: [2026-04-08 22:10:07.918]: Info: [portalgrab] Using negotiated resolution 1920x1080

Same issue on GNOME:

Apr 08 22:14:05 archlinux sunshine[13437]: [2026-04-08 22:14:05.326]: Debug: [portalgrab] PipeWire stream state: streaming -> paused
Apr 08 22:14:06 archlinux sunshine[13437]: [2026-04-08 22:14:06.328]: Warning: [portalgrab]: wait for dbus
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.328]: Warning: [portalgrab] PipeWire stream disconnected. Forcing session reset.
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.348]: Debug: [portalgrab] Destroying pipewire_t
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.348]: Debug: [portalgrab] Stop PW thread loop
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.348]: Debug: [portalgrab] Cleaning up stream
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.348]: Debug: [portalgrab] Stop fill_img
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.348]: Debug: [portalgrab] Disconnect stream
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.348]: Debug: [portalgrab] PipeWire stream state: paused -> unconnected
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.349]: Debug: [portalgrab] Destroy stream
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.349]: Debug: [portalgrab] Disconnect PW core
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.349]: Debug: [portalgrab] Destroy PW context
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.349]: Debug: [portalgrab] Close pipewire_fd
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.349]: Debug: [portalgrab] Stop PW thread loop
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.349]: Debug: [portalgrab] Destroy PW thread loop
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.349]: Debug: [portalgrab] Unsubscribing closed session signal: 77
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.349]: Warning: [portalgrab] Failed to explicitly close portal session: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: Object does not exist at path “/org/freedesktop/portal/desktop/session/1_116/Sunshine7”
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.349]: Info: [portalgrab] Loaded portal restore token from disk
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.350]: Debug: [portalgrab] Finalizing Portal security: dropping capabilities and resetting dumpable
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.351]: Debug: [portalgrab] RemoteDesktop CreateSession response_code: 0
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.351]: Debug: [portalgrab] RemoteDesktop CreateSession: got session handle: /org/freedesktop/portal/desktop/session/1_116/Sunshine8
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.357]: Debug: [portalgrab] SelectDevices response_code: 0
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.357]: Debug: [portalgrab] SelectSources response_code: 0
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.367]: Debug: [portalgrab] RemoteDesktop Start response_code: 0
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.368]: Debug: [portalgrab] Subscribed closed session signal: 88
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.369]: Info: [portalgrab] Found stream for display: 'DP-1' position: 0x0 resolution: 1920x1080
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.369]: Debug: [portalgrab] Unsubscribing closed session signal: 88
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.370]: Debug: [portalgrab] Explicitly closed portal session: /org/freedesktop/portal/desktop/session/1_116/Sunshine8
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.370]: Debug: [portalgrab] Start PW thread loop
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.370]: Info: [portalgrab] Requested frame rate [60fps]
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.378]: Info: [portalgrab] Loaded portal restore token from disk
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.379]: Debug: [portalgrab] Finalizing Portal security: dropping capabilities and resetting dumpable
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.381]: Debug: [portalgrab] RemoteDesktop CreateSession response_code: 0
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.381]: Debug: [portalgrab] RemoteDesktop CreateSession: got session handle: /org/freedesktop/portal/desktop/session/1_122/Sunshine9
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.387]: Debug: [portalgrab] SelectDevices response_code: 0
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.387]: Debug: [portalgrab] SelectSources response_code: 0
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.395]: Debug: [portalgrab] RemoteDesktop Start response_code: 0
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.396]: Debug: [portalgrab] Subscribed closed session signal: 99
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.397]: Info: [portalgrab] Streaming display 'DP-1' from position: 0x0 resolution: 1920x1080
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.397]: Debug: [portalgrab] Setup PW context
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.398]: Debug: [portalgrab] Connect PW context to fd
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.398]: Debug: [portalgrab] Create PW stream
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.398]: Debug: [portalgrab] Connect PW stream - fd 41 node 100
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.398]: Debug: [portalgrab] PipeWire stream state: unconnected -> connecting
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.398]: Info: [portalgrab] Connected to pipewire version 1.6.2
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.398]: Debug: [portalgrab] PipeWire stream state: connecting -> paused
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.401]: Info: [portalgrab] Video format: 12
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.401]: Info: [portalgrab] Size: 1920x1080
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.401]: Info: [portalgrab] Framerate (from compositor): 0/1
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.401]: Info: [portalgrab] Framerate (from compositor, max): 60/1
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.401]: Info: [portalgrab] using DMA-BUF buffers
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.402]: Info: [portalgrab] Video format: 12
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.402]: Info: [portalgrab] Size: 1920x1080
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.402]: Info: [portalgrab] Framerate (from compositor): 0/1
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.402]: Info: [portalgrab] Framerate (from compositor, max): 60/1
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.402]: Info: [portalgrab] using DMA-BUF buffers
Apr 08 22:14:08 archlinux sunshine[13437]: [2026-04-08 22:14:08.403]: Debug: [portalgrab] PipeWire stream state: paused -> streaming

I also checked to see if it's an issue related to an idle desktop not firing callbacks, but keeping 60fps content running on the desktop while clicking the XDG icon has the same result.

@Kishi85

Kishi85 commented Apr 8, 2026

Copy link
Copy Markdown
Contributor Author

Unfortunately the XDG stop still doesn't stop for me on KDE or GNOME. My CPU should not be excessively slow (5700X), but I tried bumping the wait time to eliminate the possibility:
...

I also checked to see if it's an issue related to an idle desktop not firing callbacks, but keeping 60fps content running on the desktop while clicking the XDG icon has the same result.

I've changed the check to do a synchronized call (that fetches the version property of the portal.Session) and if that one fails then the portal must have closed.

Could you try with the latest version of this PR? It should work there, if it's still broken then something very weird is going on and the pipewire stream pauses/stops before the portal closed.

@psyke83

psyke83 commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

It's working now! The previous iteration of your PR was failing on my setup due to my system_tray = disabled config seemingly interfering with the g_dbus_connection_signal_subscribe call persisting. I didn't have time to check any deeper due to your refresh; the latest changes have correct XDG stop behaviour when system_tray is enabled or disabled. I also checked resolution change and it's still working fine on GNOME and KDE.

Apologies for not specifying my config earlier; I didn't expect that the systray setting would have such an interaction with portalgrab that we were seeing here.

@Kishi85

Kishi85 commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

All good. Honestly I'd never have guessed that the system tray would have interacted with the signaling. It's still better to do it with a calling a DBus Method on the session anyway as that gives an immediate and correct result without having to worry about synchronizing states between DBus and Pipewire. Also less complexity to understand if someone else has to look at it again.

@Kishi85
Kishi85 force-pushed the xdgportalgrab-better-multi-monitor-support branch from e483a17 to 3633d14 Compare April 9, 2026 06:56
Kishi85 added 4 commits April 9, 2026 09:05
…using DBus.

This improves stopping the stream drastically as it does no longer re-init before erroring out.
This commit also removes all of the old stream_stopped logic in favor of just erroring out on
stream_dead if the portal session is closed.
…nt XDG notification

When the session_cache is working properly the XDG notification for a
running session is always active while Sunshine is running. To avoid
this and also reduce complexity of the portalgrab logic remove the
session_cache handling for the portal session itself but keep it intact for
other uses (like tracking maxFramerateFailed).

Removing caching fully is possible after implementing the Portal.Session::Closed signal first.

Note: Sunshine already ensures that there is just one running Display
(therefore Portalsession) at a time.
* Add additional debug logging
* Ensure pipewire_fd's are not needlessly duplicated and closed at the correct point.
* Add minimal error handling for pipewire context/core to avoid obvious segfaults
* (From Sonarqube:) Add exception handler for cleanup_stream in destructor
…ipewire streams as separate displays

Enables display switching on the client-side with Sunshine's existing
shortcuts (CTRL+ALT+Fxx) when selecting multiple screens on the
screencast source selection dialog (or automatically all availabe screens
when using a combined remotedesktop+screencast session, tested with KDE).
Each pipewire stream given by the portal will be available as
a separate display (consistently ordered by position).
@Kishi85
Kishi85 force-pushed the xdgportalgrab-better-multi-monitor-support branch from 3633d14 to 5149ada Compare April 9, 2026 07:06
@sonarqubecloud

sonarqubecloud Bot commented Apr 9, 2026

Copy link
Copy Markdown

@ReenigneArcher

Copy link
Copy Markdown
Member

system_tray = disabled

FYI, I believe the original cause (crashing) for people disabling the tray was resolved in the following PRs

I'm also moving to a new tray backend on Linux in #4907

@Kishi85

Kishi85 commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

@ReenigneArcher Since we've fixed all fixable issues @psyke83 had so far this PR it should be good to go (at least for another CI run).

Would it be possible to do the final merge without squashing the commits? or should I consider putting them into separate PRs?
I've tried to fix pre-requisite issues in separate commits (with proper semantic commit messages) so the final one can implement the feature in a working condition and I think it would be helpful (for future referencing) not to squash everything into one huge commit.

@ReenigneArcher

Copy link
Copy Markdown
Member

Would it be possible to do the final merge without squashing the commits? or should I consider putting them into separate PRs?

Unfortunately not, the repo forces squash and merge, because the date of the commit will be used for the newly created pre-release. If we use the original commits instead of squashing then the new pre-release would end up being a lower version than the current pre-release

@Kishi85

Kishi85 commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

I see. Thanks for the explanation. Also since the squashed commit seems to reference back to this PR with the separate commits that should be sufficient anyway.

@ReenigneArcher
ReenigneArcher merged commit d3330d1 into LizardByte:master Apr 9, 2026
72 of 73 checks passed
eball added a commit to Above-Os/Sunshine that referenced this pull request Jun 24, 2026
* chore(l10n): update translations (#4793)

* build(homebrew): dynamic link opus (#4826)

* fix(linux/wlgrab): add frame_timestamp using wayland's ready timestamp (#4787)

Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>

* fix(linux): use FQDN naming for all Linux packaging types (#4779)

Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>

* build(deps): bump lucide-vue-next from 0.576.0 to 0.577.0 (#4818)

Bumps [lucide-vue-next](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-vue-next) from 0.576.0 to 0.577.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/0.577.0/packages/lucide-vue-next)

---
updated-dependencies:
- dependency-name: lucide-vue-next
  dependency-version: 0.577.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* refactor(confighttp): HTML page handlers into generic getPage function (#4645)

* build(deps): move nvapi to official NVIDIA repo and bump to R590 (#3725)

* build(deps): bump vue-i18n from 11.2.8 to 11.3.0 (#4828)

Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 11.2.8 to 11.3.0.
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v11.3.0/packages/vue-i18n)

---
updated-dependencies:
- dependency-name: vue-i18n
  dependency-version: 11.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat(linux/xdgportal): implement event-driven capture (#4768)

* build(windows): sign windows executables (#4829)

* build(deps): bump vue from 3.5.29 to 3.5.30 (#4834)

Bumps [vue](https://github.com/vuejs/core) from 3.5.29 to 3.5.30.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/compare/v3.5.29...v3.5.30)

---
updated-dependencies:
- dependency-name: vue
  dependency-version: 3.5.30
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(l10n): update translations (#4831)

* fix(web-ui): add missing featured apps platform icons (#4837)

* ci(windows): disable signing for arm64 (#4838)

* fix(linux/xdgportal): descriptor/pointer cleanups (#4840)

* feat(web-ui): add browse feature to find directories/executables/files (#4848)

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `5de4612` to `37eb3e5` (#4844)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `5de4612` to `37eb3e5`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/5de461271d05f43f267b954ac6010b410378ae47...37eb3e5bdc5a14d13ee27b85265aae2c5e9a60c2)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: 37eb3e5bdc5a14d13ee27b85265aae2c5e9a60c2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump actions/download-artifact from 8.0.0 to 8.0.1 in the github-actions group across 1 directory (#4842)

build(deps): bump actions/download-artifact

Bumps the github-actions group with 1 update in the / directory: [actions/download-artifact](https://github.com/actions/download-artifact).


Updates `actions/download-artifact` from 8.0.0 to 8.0.1
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3...3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: 8.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(l10n): update translations (#4841)

* build(Fedora): Adjust version ranges for GCC selection (#4851)

* fix(linux/xdgportal): avoid duplicate frame insertion (#4839)

* build(deps): bump vmactions/freebsd-vm from 1.4.2 to 1.4.3 (#4849)

Bumps [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm) from 1.4.2 to 1.4.3.
- [Release notes](https://github.com/vmactions/freebsd-vm/releases)
- [Commits](https://github.com/vmactions/freebsd-vm/compare/c9f815bc7aa0d34c9fdd0619b034a32d6ca7b57e...4807432c7cab1c3f97688665332c0b932062d31f)

---
updated-dependencies:
- dependency-name: vmactions/freebsd-vm
  dependency-version: 1.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/shared-modules from `fc11224` to `a61b494` (#4850)

build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `fc11224` to `a61b494`.
- [Commits](https://github.com/flathub/shared-modules/compare/fc1122496c63b13aa96ca2351a9662294291b9e0...a61b4949d10e96e5f8923284a1c847964ac3f9ad)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-version: a61b4949d10e96e5f8923284a1c847964ac3f9ad
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(linux): generate glad sources at compile time (#4798)

Co-authored-by: Conn O'Griofa <connogriofa@gmail.com>

* build(deps): bump third-party/doxyconfig from `ba47416` to `a9f0c38` (#4853)

Bumps [third-party/doxyconfig](https://github.com/LizardByte/doxyconfig) from `ba47416` to `a9f0c38`.
- [Commits](https://github.com/LizardByte/doxyconfig/compare/ba47416c88a7f5661fa1ed24b7300ef62185e877...a9f0c38766e53d29f1141098db237e51ba3d64d8)

---
updated-dependencies:
- dependency-name: third-party/doxyconfig
  dependency-version: a9f0c38766e53d29f1141098db237e51ba3d64d8
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(i18n): clarify cmd notes (#4856)

* build(deps): bump third-party/inputtino from `504f0ab` to `73e9fa1` (#4860)

Bumps [third-party/inputtino](https://github.com/games-on-whales/inputtino) from `504f0ab` to `73e9fa1`.
- [Commits](https://github.com/games-on-whales/inputtino/compare/504f0abc7da8ebc351f8300fb2ed98db5438ee48...73e9fa11179c86c8801e1dbce1c329d2ca07621a)

---
updated-dependencies:
- dependency-name: third-party/inputtino
  dependency-version: 73e9fa11179c86c8801e1dbce1c329d2ca07621a
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/glad from `dcc4f69` to `73db193` (#4858)

Bumps [third-party/glad](https://github.com/Dav1dde/glad) from `dcc4f69` to `73db193`.
- [Release notes](https://github.com/Dav1dde/glad/releases)
- [Commits](https://github.com/Dav1dde/glad/compare/dcc4f69620ce15e3d40b3e8d907d293bd297dbe1...73db193f853e2ee079bf3ca8a64aa2eaf6459043)

---
updated-dependencies:
- dependency-name: third-party/glad
  dependency-version: 73db193f853e2ee079bf3ca8a64aa2eaf6459043
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(linux/xdgportal): allow unified systemd service for all capture methods (#4854)

* feat(linux/keyboard): add F13-F24 keycodes (#4833)

* build(deps): bump apple-actions/import-codesign-certs from 6.0.0 to 6.1.0 (#4864)

build(deps): bump apple-actions/import-codesign-certs

Bumps [apple-actions/import-codesign-certs](https://github.com/apple-actions/import-codesign-certs) from 6.0.0 to 6.1.0.
- [Release notes](https://github.com/apple-actions/import-codesign-certs/releases)
- [Commits](https://github.com/apple-actions/import-codesign-certs/compare/b610f78488812c1e56b20e6df63ec42d833f2d14...fe74d46e82474f87e1ba79832ad28a4013d0e33a)

---
updated-dependencies:
- dependency-name: apple-actions/import-codesign-certs
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/nv-codec-headers from `22441b5` to `fe32761` (#4866)

build(deps): bump third-party/nv-codec-headers

Bumps [third-party/nv-codec-headers](https://github.com/FFmpeg/nv-codec-headers) from `22441b5` to `fe32761`.
- [Release notes](https://github.com/FFmpeg/nv-codec-headers/releases)
- [Commits](https://github.com/FFmpeg/nv-codec-headers/compare/22441b505d9d9afc1e3002290820909846c24bdc...fe32761e7a8bc79fcf560f356bf3898271bf4d56)

---
updated-dependencies:
- dependency-name: third-party/nv-codec-headers
  dependency-version: fe32761e7a8bc79fcf560f356bf3898271bf4d56
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump actions/cache from 5.0.3 to 5.0.4 in the github-actions group across 1 directory (#4870)

build(deps): bump actions/cache

Bumps the github-actions group with 1 update in the / directory: [actions/cache](https://github.com/actions/cache).


Updates `actions/cache` from 5.0.3 to 5.0.4
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/cdf6c1fa76f9f475f3d7449005a359c84ca0f306...668228422ae6a00e4ad889ee87cd7109ec5666a7)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 5.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump codecov/codecov-action from 5.5.2 to 5.5.3 (#4871)

Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.5.2 to 5.5.3.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/671740ac38dd9b0130fbe1cec585b89eea48d3de...1af58845a975a7985b0beb0cbe6fbbb71a41dbad)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-version: 5.5.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `37eb3e5` to `cc1d7b8` (#4872)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `37eb3e5` to `cc1d7b8`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/37eb3e5bdc5a14d13ee27b85265aae2c5e9a60c2...cc1d7b8ddc859d611faed53c263af78a0aeb0c5c)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: cc1d7b8ddc859d611faed53c263af78a0aeb0c5c
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/inputtino from `73e9fa1` to `f4ce2b0` (#4873)

Bumps [third-party/inputtino](https://github.com/games-on-whales/inputtino) from `73e9fa1` to `f4ce2b0`.
- [Commits](https://github.com/games-on-whales/inputtino/compare/73e9fa11179c86c8801e1dbce1c329d2ca07621a...f4ce2b0df536ef309e9ff318f75b460f7097d7c1)

---
updated-dependencies:
- dependency-name: third-party/inputtino
  dependency-version: f4ce2b0df536ef309e9ff318f75b460f7097d7c1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(linux): use FQDN service name in desktop launcher (#4874)

* fix(linux/xdgportal): portalgrab capture stability & mutter compatibility (#4875)

* feat(macOS): Capture audio on macOS using Tap API (#4209)

Co-authored-by: David Lane <42013603+ReenigneArcher@users.noreply.github.com>

* feat(linux/glad): implement EGL_IMG_context_priority (#4857)

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `cc1d7b8` to `5c73dc4` (#4880)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `cc1d7b8` to `5c73dc4`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/cc1d7b8ddc859d611faed53c263af78a0aeb0c5c...5c73dc44f2be1cc5968e4700ba67c32dfa11ba23)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: 5c73dc44f2be1cc5968e4700ba67c32dfa11ba23
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump marked from 17.0.4 to 17.0.5 (#4881)

Bumps [marked](https://github.com/markedjs/marked) from 17.0.4 to 17.0.5.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Commits](https://github.com/markedjs/marked/compare/v17.0.4...v17.0.5)

---
updated-dependencies:
- dependency-name: marked
  dependency-version: 17.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/doxyconfig from `a9f0c38` to `334ad6a` (#4888)

Bumps [third-party/doxyconfig](https://github.com/LizardByte/doxyconfig) from `a9f0c38` to `334ad6a`.
- [Release notes](https://github.com/LizardByte/doxyconfig/releases)
- [Commits](https://github.com/LizardByte/doxyconfig/compare/a9f0c38766e53d29f1141098db237e51ba3d64d8...334ad6a7421663be9edbaf4897c33b524642ca70)

---
updated-dependencies:
- dependency-name: third-party/doxyconfig
  dependency-version: 334ad6a7421663be9edbaf4897c33b524642ca70
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/libdisplaydevice from `b46492b` to `fe7e6a8` (#4887)

build(deps): bump third-party/libdisplaydevice

Bumps [third-party/libdisplaydevice](https://github.com/LizardByte/libdisplaydevice) from `b46492b` to `fe7e6a8`.
- [Release notes](https://github.com/LizardByte/libdisplaydevice/releases)
- [Commits](https://github.com/LizardByte/libdisplaydevice/compare/b46492be8e5d1933ead8fb8867a7910ed10b610a...fe7e6a81f65deae91594702e1a185f47229745b9)

---
updated-dependencies:
- dependency-name: third-party/libdisplaydevice
  dependency-version: fe7e6a81f65deae91594702e1a185f47229745b9
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/shared-modules from `a61b494` to `2f1fb18` (#4886)

build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `a61b494` to `2f1fb18`.
- [Commits](https://github.com/flathub/shared-modules/compare/a61b4949d10e96e5f8923284a1c847964ac3f9ad...2f1fb187252a619f4775e3126395584041b071fb)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-version: 2f1fb187252a619f4775e3126395584041b071fb
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(csrf): make errors more apparent (#4889)

* fix: clear tray icon when unpairing the last paired client (#4890)

* feat(linux): add thread priority support for POSIX systems (#4885)

* build: fix build-deps tag matching (#4899)

* build(deps): bump third-party/tray from `4caf0d0` to `563dee4` (#4894)

Bumps [third-party/tray](https://github.com/LizardByte/tray) from `4caf0d0` to `563dee4`.
- [Release notes](https://github.com/LizardByte/tray/releases)
- [Commits](https://github.com/LizardByte/tray/compare/4caf0d0868aa45b98373249db8761551f7da7b03...563dee475f8878d252ab2b9938d3a014e776ed08)

---
updated-dependencies:
- dependency-name: third-party/tray
  dependency-version: 563dee475f8878d252ab2b9938d3a014e776ed08
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump msys2/setup-msys2 from 2.30.0 to 2.31.0 (#4893)

Bumps [msys2/setup-msys2](https://github.com/msys2/setup-msys2) from 2.30.0 to 2.31.0.
- [Release notes](https://github.com/msys2/setup-msys2/releases)
- [Changelog](https://github.com/msys2/setup-msys2/blob/main/CHANGELOG.md)
- [Commits](https://github.com/msys2/setup-msys2/compare/4f806de0a5a7294ffabaff804b38a9b435a73bda...cafece8e6baf9247cf9b1bf95097b0b983cc558d)

---
updated-dependencies:
- dependency-name: msys2/setup-msys2
  dependency-version: 2.31.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump lucide-vue-next from 0.577.0 to 1.0.0 (#4905)

Bumps [lucide-vue-next](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-vue-next) from 0.577.0 to 1.0.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.0.0/packages/lucide-vue-next)

---
updated-dependencies:
- dependency-name: lucide-vue-next
  dependency-version: 1.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump azure/trusted-signing-action from 1.1.0 to 1.2.0 (#4903)

Bumps [azure/trusted-signing-action](https://github.com/azure/trusted-signing-action) from 1.1.0 to 1.2.0.
- [Release notes](https://github.com/azure/trusted-signing-action/releases)
- [Commits](https://github.com/azure/trusted-signing-action/compare/87c2e83e6868da99d3380aa309851b32ed9a8346...b443cf8ea4124818d2ea9f043cba29fc3ec47b16)

---
updated-dependencies:
- dependency-name: azure/trusted-signing-action
  dependency-version: 1.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `5c73dc4` to `caca92b` (#4910)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `5c73dc4` to `caca92b`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/5c73dc44f2be1cc5968e4700ba67c32dfa11ba23...caca92bc6898ea40d6521b581fef2402ba3b3aae)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: caca92bc6898ea40d6521b581fef2402ba3b3aae
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump vue from 3.5.30 to 3.5.31 (#4911)

Bumps [vue](https://github.com/vuejs/core) from 3.5.30 to 3.5.31.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/compare/v3.5.30...v3.5.31)

---
updated-dependencies:
- dependency-name: vue
  dependency-version: 3.5.31
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump LizardByte/actions from 2026.227.200013 to 2026.328.161128 in the lizardbyte-actions group across 1 directory (#4920)

build(deps): bump LizardByte/actions

Bumps the lizardbyte-actions group with 1 update in the / directory: [LizardByte/actions](https://github.com/lizardbyte/actions).


Updates `LizardByte/actions` from 2026.227.200013 to 2026.328.161128
- [Release notes](https://github.com/lizardbyte/actions/releases)
- [Commits](https://github.com/lizardbyte/actions/compare/70bb8d394d1c92f6113aeec6ae9cc959a5763d15...0affa4f7bcb27562658960eee840eff8ff844578)

---
updated-dependencies:
- dependency-name: LizardByte/actions
  dependency-version: 2026.328.161128
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: lizardbyte-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* test(windows): fix display device tests with clang (#4921)

* chore: update global workflows (#4916)

* build(deps): bump codecov/codecov-action from 5.5.3 to 6.0.0 (#4913)

Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.5.3 to 6.0.0.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/1af58845a975a7985b0beb0cbe6fbbb71a41dbad...57e3a136b779b570ffcdbf80b3bdc90e7fab3de2)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build: Allow FFMPEG_PLATFORM_LIBRARIES to be overridden by the user (#4915)

* fix: restore stdin-based pairing (#4912)

* build(deps): bump third-party/moonlight-common-c from `6268780` to `7022b33` (#4923)

build(deps): bump third-party/moonlight-common-c

Bumps [third-party/moonlight-common-c](https://github.com/moonlight-stream/moonlight-common-c) from `6268780` to `7022b33`.
- [Commits](https://github.com/moonlight-stream/moonlight-common-c/compare/62687809b1f7410c3db4be2527503a54ae408d70...7022b337a9a682f1d974aed69f6065fa57b4164f)

---
updated-dependencies:
- dependency-name: third-party/moonlight-common-c
  dependency-version: 7022b337a9a682f1d974aed69f6065fa57b4164f
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat(api/ui): add client enable/disable access control (#4771)

* fix(windows): update-path.bat registry command syntax in installer (#4902)

* build(deps): bump vmactions/freebsd-vm from 1.4.3 to 1.4.4 (#4928)

Bumps [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm) from 1.4.3 to 1.4.4.
- [Release notes](https://github.com/vmactions/freebsd-vm/releases)
- [Commits](https://github.com/vmactions/freebsd-vm/compare/4807432c7cab1c3f97688665332c0b932062d31f...7ca82f79fe3078fecded6d3a2bff094995447bbd)

---
updated-dependencies:
- dependency-name: vmactions/freebsd-vm
  dependency-version: 1.4.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat(linux): Add Vulkan video encoder (#4603)

* build(deps): bump third-party/moonlight-common-c from `7022b33` to `7b026e7` (#4930)

build(deps): bump third-party/moonlight-common-c

Bumps [third-party/moonlight-common-c](https://github.com/moonlight-stream/moonlight-common-c) from `7022b33` to `7b026e7`.
- [Commits](https://github.com/moonlight-stream/moonlight-common-c/compare/7022b337a9a682f1d974aed69f6065fa57b4164f...7b026e77be62175104640e7e722b758df6d3d0d7)

---
updated-dependencies:
- dependency-name: third-party/moonlight-common-c
  dependency-version: 7b026e77be62175104640e7e722b758df6d3d0d7
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/nvapi from `9296d67` to `9b181ea` (#4917)

Bumps [third-party/nvapi](https://github.com/NVIDIA/nvapi) from `9296d67` to `9b181ea`.
- [Commits](https://github.com/NVIDIA/nvapi/compare/9296d671e71608d6d6b7749ed93989af4ada8858...9b181ea572f680327fe01a14a0f1f41c78034104)

---
updated-dependencies:
- dependency-name: third-party/nvapi
  dependency-version: 9b181ea572f680327fe01a14a0f1f41c78034104
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore: update global workflows (#4936)

* build(deps): bump vue from 3.5.31 to 3.5.32 (#4941)

Bumps [vue](https://github.com/vuejs/core) from 3.5.31 to 3.5.32.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/compare/v3.5.31...v3.5.32)

---
updated-dependencies:
- dependency-name: vue
  dependency-version: 3.5.32
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump marked from 17.0.5 to 18.0.0 (#4957)

Bumps [marked](https://github.com/markedjs/marked) from 17.0.5 to 18.0.0.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Commits](https://github.com/markedjs/marked/compare/v17.0.5...v18.0.0)

---
updated-dependencies:
- dependency-name: marked
  dependency-version: 18.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump vue-i18n from 11.3.0 to 11.3.1 (#4953)

Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 11.3.0 to 11.3.1.
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v11.3.1/packages/vue-i18n)

---
updated-dependencies:
- dependency-name: vue-i18n
  dependency-version: 11.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/shared-modules from `2f1fb18` to `6ea20c8` (#4949)

build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `2f1fb18` to `6ea20c8`.
- [Commits](https://github.com/flathub/shared-modules/compare/2f1fb187252a619f4775e3126395584041b071fb...6ea20c834ed5378c4ab5d36676650921eeac1367)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-version: 6ea20c834ed5378c4ab5d36676650921eeac1367
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix: redact logging of sensitive config & CSRF validation (#4955)

* fix(linux): correct "Pulseadio" typo in PulseAudio log messages (#4956)

* fix(linux/vulkan): add 16-bit DRM format support for HDR DMA-BUF import (#4962)

* fix(linux/xdgportal): Properly support multiple screens by exposing pipewire streams as separate displays (#4931)

* fix(linux/postins): allow running on rpm-ostree environments (#4963)

* build(deps): bump actions/github-script from 8.0.0 to 9.0.0 (#4970)

build(deps): bump actions/github-script in /

Bumps [actions/github-script](https://github.com/actions/github-script) in `/` from 8.0.0 to 9.0.0.


Updates `actions/github-script` from 8.0.0 to 9.0.0
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/ed597411d8f924073f98dfc5c65a23a2325f34cd...3a2844b7e9c422d3c10d287c895573f7108da1b3)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github_actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump vue-i18n from 11.3.1 to 11.3.2 (#4964)

Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 11.3.1 to 11.3.2.
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v11.3.2/packages/vue-i18n)

---
updated-dependencies:
- dependency-name: vue-i18n
  dependency-version: 11.3.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(linux/xdgportal): Improve multi-monitor support and work around breaking kmsgrab (#4969)

* chore: update global workflows (#4976)

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `caca92b` to `9d9ad80` (#4983)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `caca92b` to `9d9ad80`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/caca92bc6898ea40d6521b581fef2402ba3b3aae...9d9ad80a55d730e4284d1f09a93da667c84a118a)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: 9d9ad80a55d730e4284d1f09a93da667c84a118a
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/shared-modules from `6ea20c8` to `b8236c7` (#4975)

build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `6ea20c8` to `b8236c7`.
- [Commits](https://github.com/flathub/shared-modules/compare/6ea20c834ed5378c4ab5d36676650921eeac1367...b8236c7961e3dd447b1b9605375a54a12f9f24b6)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-version: b8236c7961e3dd447b1b9605375a54a12f9f24b6
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump peter-evans/create-pull-request from 8.1.0 to 8.1.1 (#4974)

build(deps): bump peter-evans/create-pull-request in /

Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) in `/` from 8.1.0 to 8.1.1.


Updates `peter-evans/create-pull-request` from 8.1.0 to 8.1.1
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/c0f553fe549906ede9cf27b5156039d195d2ece0...5f6978faf089d4d20b00c7766989d076bb2fc7f1)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-version: 8.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github_actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump actions/upload-artifact from 7.0.0 to 7.0.1 (#4973)

build(deps): bump actions/upload-artifact in /

Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) in `/` from 7.0.0 to 7.0.1.


Updates `actions/upload-artifact` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github_actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(linux/xdgportal): Additional error handling and minor code improvements (#4979)

* feat(linux/vulkan): enable RADV low-latency Vulkan Video encoding (#4984)

* build(deps-dev): bump vite from 6.4.1 to 6.4.2 (#4985)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.4.1 to 6.4.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v6.4.2/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.4.2/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.4.2
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* revert: "feat(linux/vulkan): enable RADV low-latency Vulkan Video encoding" (#4989)

* chore: update global workflows (#4990)

* fix(linux/vulkan): encoder not working on NVIDIA GPUs (#4994)

* chore(deps): update dependency @vitejs/plugin-vue to v6.0.6 (#4992)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update actions/cache action to v5.0.5 (#4991)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(linux/vulkan): guard deprecated FFmpeg Vulkan queue lock/unlock (#5005)

* chore(deps): update dependency setuptools to v81 (#5003)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update lizardbyte/actions action to v2026.417.35446 (#5012)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency marked to v18.0.1 (#5011)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update vmactions/freebsd-vm action to v1.4.5 (#5001)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `9d9ad80` to `34ecf07` (#5015)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `9d9ad80` to `34ecf07`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/9d9ad80a55d730e4284d1f09a93da667c84a118a...34ecf07ef4843f36b3078637ca13f1dbb1c2963a)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: 34ecf07ef4843f36b3078637ca13f1dbb1c2963a
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): update msys2/setup-msys2 action to v2.31.1 (#5016)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency @codecov/vite-plugin to v2 (#4996)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(linux): auto-detect GPU with connected display for VAAPI and Vulkan (#4961)

* refactor(linux/xdgportal): Split pipewire code into it's own file so it can be reused (#5008)

* fix(rtsp): ignore clientRefreshRateX100 if more than 1% variance from framerate (#5027)

Co-authored-by: Andy Grundman <105828+andygrundman@users.noreply.github.com>

* fix: Resolve minimum_fps_target related issues on all platforms (#4967)

* fix(linux/vulkan): remove deprecated FFmpeg Vulkan queue lock/unlock (#5031)

* feat(nvenc): support for split frame encoding on GPUs with 2+ nvenc blocks (#4892)

Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>

* refactor(linux/xdgportal): Move elevated privilege check/drop to misc.cpp (#5026)

* fix(linux/vulkan): change default rate control from VBR to CBR (#5032)

* chore(deps): update actions/setup-node action to v6.4.0 (#5033)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency marked to v18.0.2 (#5022)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): bump third-party/nv-codec-headers from `e844e5b` to `33a9ede` (#5035)

build(deps): bump third-party/nv-codec-headers

Bumps [third-party/nv-codec-headers](https://github.com/FFmpeg/nv-codec-headers) from `e844e5b` to `33a9ede`.
- [Release notes](https://github.com/FFmpeg/nv-codec-headers/releases)
- [Commits](https://github.com/FFmpeg/nv-codec-headers/compare/e844e5b26f46bb77479f063029595293aa8f812d...33a9ede8d9914299d9262539c576a15bd0a19621)

---
updated-dependencies:
- dependency-name: third-party/nv-codec-headers
  dependency-version: 33a9ede8d9914299d9262539c576a15bd0a19621
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(linux): multi-GPU segfault + wlr GPU auto selection, DMA-BUF metadata planes and revert wlr vulkan support (#5030)

* chore(deps): update apple-actions/import-codesign-certs action to v7 (#5037)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix: touch scaling bug and initialize display variables as 0 (#4758)

Co-authored-by: Chase Payne <27069224+nonary@users.noreply.github.com>

* fix(network): restore ExternalIP in server info response (#5043)

* chore(deps): update dependency vue to v3.5.33 (#5042)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(linux/pipewire): Fix absolute touchinput for multi-monitor (#5041)

* refactor(linux): remove leftovers from portalgrab -> pipewire split (#5039)

* docs(readme): restructure feature compatibility tables (#5040)

* fix(linux/pipewire): calculate env_width/env_height from all displays for pipewire_display_t  (#5050)

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `34ecf07` to `e39e586` (#5052)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `34ecf07` to `e39e586`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/34ecf07ef4843f36b3078637ca13f1dbb1c2963a...e39e58633c61060e3705b5a24d1b52e99a79f1b5)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: e39e58633c61060e3705b5a24d1b52e99a79f1b5
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): update dependency vue-i18n to v11.4.0 (#5048)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* feat(linux/xdgportal): Simplify display matching logic (#5053)

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `e39e586` to `50a0768` (#5055)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `e39e586` to `50a0768`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/e39e58633c61060e3705b5a24d1b52e99a79f1b5...50a07682428880637a315e4225499b719317344f)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: 50a07682428880637a315e4225499b719317344f
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat(linux/pipewire): Add support for pipewire stream selection by object serial (#5054)

* build(deps): bump third-party/build-deps from `c08f69d` to `cd7d45a` (#5056)

* build(deps): bump third-party/build-deps from `c08f69d` to `cd7d45a`

Bumps [third-party/build-deps](https://github.com/LizardByte/build-deps) from `c08f69d` to `cd7d45a`.
- [Release notes](https://github.com/LizardByte/build-deps/releases)
- [Commits](https://github.com/LizardByte/build-deps/compare/c08f69db10450bd06cf79045e79b9179c99bae70...cd7d45a4a1916d7949046162d81e859112ad3ab1)

---
updated-dependencies:
- dependency-name: third-party/build-deps
  dependency-version: cd7d45a4a1916d7949046162d81e859112ad3ab1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update FFmpeg flatpak sources to v2026.425

Bump the FFmpeg prebuilt artifacts used by the Flatpak module to release v2026.425.130933. Updated download URLs and SHA256 checksums for x86_64 and aarch64 builds (dest-filename remains ffmpeg.tar.gz). No other changes.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>

* feat(capture/linux): add KWin direct screencast capture method (#5009)

Co-authored-by: Ramalama2 <6314556+Ramalama2@users.noreply.github.com>

* feat(linux/pipewire): Handle HDR(Rec. 2020/SMPTE 2084 PQ) visuals (#5025)

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `50a0768` to `1895ec8` (#5073)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `50a0768` to `1895ec8`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/50a07682428880637a315e4225499b719317344f...1895ec86e460198100089435ecb7c387ebd2264d)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: 1895ec86e460198100089435ecb7c387ebd2264d
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/shared-modules from `b8236c7` to `2dfad85` (#5070)

build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `b8236c7` to `2dfad85`.
- [Commits](https://github.com/flathub/shared-modules/compare/b8236c7961e3dd447b1b9605375a54a12f9f24b6...2dfad855131c70ff7cafd32f3f4901c6d82b9247)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-version: 2dfad855131c70ff7cafd32f3f4901c6d82b9247
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/wlr-protocols from `a741f0a` to `bf4fc79` (#5072)

Bumps [third-party/wlr-protocols](https://github.com/LizardByte-infrastructure/wlr-protocols) from `a741f0a` to `bf4fc79`.
- [Commits](https://github.com/LizardByte-infrastructure/wlr-protocols/compare/a741f0ac5d655338a5100fc34bc8cec87d237346...bf4fc79abc359eea5a0edec0ac6d4a2b2955f82a)

---
updated-dependencies:
- dependency-name: third-party/wlr-protocols
  dependency-version: bf4fc79abc359eea5a0edec0ac6d4a2b2955f82a
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): update dependency marked to v18.0.3 (#5068)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* feat(input): implement multiseat support and virtual device naming (#4954)

* fix(linux): security: drop CAP_SYS_ADMIN when possible, retain CAP_SYS_NICE (#5075)

* feat(linux/wlgrab): match output_name by xdg_output name (#5071)

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `1895ec8` to `dda10aa` (#5077)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `1895ec8` to `dda10aa`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/1895ec86e460198100089435ecb7c387ebd2264d...dda10aa5949811589747e6e485da6ae2e86b5d2b)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: dda10aa5949811589747e6e485da6ae2e86b5d2b
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): update dependency vue to v3.5.34 (#5078)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(linux): add ubuntu 26.04 support (#5051)

* build(linux): fix gcov detection for ArchLinux (#5081)

* chore(deps): update dependency vue-i18n to v11.4.2 (#5080)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Merge commit from fork

* build(web-ui): commit lock file (#5083)

* fix: show actual bind address in Web UI log message (#4897)

* build(windows): Always setup Node.js in Windows CI (#5084)

* feat(nvenc): support intraRefresh for h264, add outputRecoveryPointSEI=1 to intra-refresh config for h264 and hevc (#5091)

* fix: building without the system tray enabled (#5092)

* build(deps): bump third-party/build-deps from `cd7d45a` to `d8b1d18` (#5097)

Bumps [third-party/build-deps](https://github.com/LizardByte/build-deps) from `cd7d45a` to `d8b1d18`.
- [Release notes](https://github.com/LizardByte/build-deps/releases)
- [Commits](https://github.com/LizardByte/build-deps/compare/cd7d45a4a1916d7949046162d81e859112ad3ab1...d8b1d18b7e82f8ee396bdd05e226896fa523b0df)

---
updated-dependencies:
- dependency-name: third-party/build-deps
  dependency-version: d8b1d18b7e82f8ee396bdd05e226896fa523b0df
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/shared-modules from `2dfad85` to `8c3f3cf` (#5098)

build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `2dfad85` to `8c3f3cf`.
- [Commits](https://github.com/flathub/shared-modules/compare/2dfad855131c70ff7cafd32f3f4901c6d82b9247...8c3f3cfa5a4af9a696ff0bfb3ed0eba404faaf5d)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-version: 8c3f3cfa5a4af9a696ff0bfb3ed0eba404faaf5d
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* ci: remove moonlight discord release announcement (#5099)

* build(deps): Add SUNSHINE_SYSTEM_VULKAN_HEADERS option (#5103)

Signed-off-by: James Le Cuirot <chewi@gentoo.org>

* build(macos): configure C++ standard and ICU root (#5101)

* fix(macos): preserve modifier state in input events (#5102)

* build(windows): drop unused boost-locale (#5116)

* ci(windows): add linkage check (#5118)

* chore(deps): update azure/trusted-signing-action action to v2 (#5117)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(macos): provide left/right identity for modifiers (#5115)

* feat(web-ui): add logout (#5121)

* build(deps): bump third-party/moonlight-common-c from `7b026e7` to `2600bea` (#5123)

build(deps): bump third-party/moonlight-common-c

Bumps [third-party/moonlight-common-c](https://github.com/moonlight-stream/moonlight-common-c) from `7b026e7` to `2600bea`.
- [Commits](https://github.com/moonlight-stream/moonlight-common-c/compare/7b026e77be62175104640e7e722b758df6d3d0d7...2600beaf13f18bfa43453609cf5e3b84a4227760)

---
updated-dependencies:
- dependency-name: third-party/moonlight-common-c
  dependency-version: 2600beaf13f18bfa43453609cf5e3b84a4227760
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): update dependency @vitejs/plugin-vue to v6.0.7 (#5122)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): bump third-party/plasma-wayland-protocols from `18afc45` to `4c015e9` (#5124)

build(deps): bump third-party/plasma-wayland-protocols

Bumps [third-party/plasma-wayland-protocols](https://github.com/KDE/plasma-wayland-protocols) from `18afc45` to `4c015e9`.
- [Commits](https://github.com/KDE/plasma-wayland-protocols/compare/18afc45c092857e998c890afce1e7e71f808d819...4c015e90ae6c88f2ffa766e899387ef431eade49)

---
updated-dependencies:
- dependency-name: third-party/plasma-wayland-protocols
  dependency-version: 4c015e90ae6c88f2ffa766e899387ef431eade49
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(linux/pipewire): Add 10-bit RGB formats with 2-bit Alpha to format_map (#5088)

* chore: update global workflows (#5126)

* fix(audio): fix install of Steam Streaming Speakers driver (#5125)

* build(deps): bump third-party/doxyconfig from `334ad6a` to `e552f7c` (#5127)

Bumps [third-party/doxyconfig](https://github.com/LizardByte/doxyconfig) from `334ad6a` to `e552f7c`.
- [Release notes](https://github.com/LizardByte/doxyconfig/releases)
- [Commits](https://github.com/LizardByte/doxyconfig/compare/334ad6a7421663be9edbaf4897c33b524642ca70...e552f7c9f00cd0cf24764a37d0905935b3d2c188)

---
updated-dependencies:
- dependency-name: third-party/doxyconfig
  dependency-version: e552f7c9f00cd0cf24764a37d0905935b3d2c188
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build: bump freebsd version to 14.4 and build-deps to v2026.516.30821 (#5129)

* build(deps): bump third-party/inputtino from `f4ce2b0` to `b887f6a` (#5135)

Bumps [third-party/inputtino](https://github.com/games-on-whales/inputtino) from `f4ce2b0` to `b887f6a`.
- [Commits](https://github.com/games-on-whales/inputtino/compare/f4ce2b0df536ef309e9ff318f75b460f7097d7c1...b887f6a37a4f6babea66ee7b9a79bc8f520d7554)

---
updated-dependencies:
- dependency-name: third-party/inputtino
  dependency-version: b887f6a37a4f6babea66ee7b9a79bc8f520d7554
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(macos): scale remote scroll input using macOS scroll speed (#5133)

* chore(deps): update dependency vue-i18n to v11.4.3 (#5139)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore: fixes for release automation (#5142)

* chore(deps): update dependency vue-i18n to v11.4.4 (#5143)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency date-fns to v4.2.1 (#5145)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update codecov/codecov-action action to v6.0.1 (#5149)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(web): disconnect only the disabled client instead of all sessions (#5138)

* chore(deps): update dependency marked to v18.0.4 (#5151)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore: rename copilot-instructions.md to AGENTS.md (#5156)

* fix(Windows-installer): move ViGEmBus to ThirdParty group (#5157)

* feat(rtsp): add option to limit packetsize for clients that cannot configure it (#5153)

Signed-off-by: Georgi Valkov <gvalkov@gmail.com>

* feat(web-ui): Added Filtering & Searching to the Apps page (#5158)

Co-authored-by: Noklef <281545466+Noklef@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `dda10aa` to `ee65dc7` (#5155)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `dda10aa` to `ee65dc7`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/dda10aa5949811589747e6e485da6ae2e86b5d2b...ee65dc7a798be56de8c4c1ab73411461cac020b4)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: ee65dc7a798be56de8c4c1ab73411461cac020b4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(crowdin): set commit message (#5160)

* chore(l10n): update translations (#5161)

* fix(web): the packetsize upper limit is 65535 (#5167)

Signed-off-by: Georgi Valkov <gvalkov@gmail.com>

* chore(l10n): update translations (#5162)

* chore(deps): update dependency date-fns to v4.3.0 (#5172)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `ee65dc7` to `96e2fe8` (#5165)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `ee65dc7` to `96e2fe8`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/ee65dc7a798be56de8c4c1ab73411461cac020b4...96e2fe8bf7d2e5791ca1bdce2dba373f1e27c425)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: 96e2fe8bf7d2e5791ca1bdce2dba373f1e27c425
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): update lizardbyte/actions action to v2026.522.121358 (#5173)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(web-ui): add documentation link and version-aware URLs (#5176)

* chore(deps): update lizardbyte/actions action to v2026.524.145234 (#5177)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): migrate from lucide-vue-next to @lucide/vue (#5179)

* chore(l10n): update translations (#5178)

* chore: Add CLion run configuration for 'sunshine' (#5181)

* build(freebsd): fix npm install (#5182)

* fix(linux): migrate to qt tray (#4907)

Co-authored-by: Kishi <41839133+Kishi85@users.noreply.github.com>

* fix: explicitly check construct function error in thread_safe.h (#5184)

* build(macos): quote SHOULD_SIGN env expansion in install script (#5185)

* fix(macos/packaging): add NSLocalNetworkUsageDescription so Bonjour can register (#5186)

* chore(l10n): update translations (#5193)

* fix(linux/vulkan): preserve host aspect ratio in encoder output (#5130)

* fix(macos): drop max_ref_frames=1 for h264_videotoolbox and enable PARALLEL_ENCODING (#5200)

* chore(deps): update dependency vue to v3.5.35 (#5204)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(l10n): update translations (#5196)

* build(Archlinux): Shallow clone dependent submodules (#5206)

* chore(deps): update dependency @lucide/vue to v1.17.0 (#5210)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update actions/setup-dotnet action to v5.3.0 (#5208)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(linux/vulkan): Ensure RADV vulkan video encoding is enabled on newer versions of Mesa (#5211)

* fix(linux/kwin): retry init with fully dropped elevated privileges in case KWin is missing CAP_SYS_NICE on linux (#5212)

* feat(web-ui): Updated `Add` / `Edit` app form to use modals + new `Delete` App UI flow (#5166)

* chore(deps): bump wayland-protocols to 1.48 (#5219)

* chore(deps): update dependency date-fns to v4.4.0 (#5215)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(l10n): update translations (#5220)

* build(deps): bump third-party/tray from `6332649` to `df9af11` (#5221)

Bumps [third-party/tray](https://github.com/LizardByte/tray) from `6332649` to `df9af11`.
- [Release notes](https://github.com/LizardByte/tray/releases)
- [Commits](https://github.com/LizardByte/tray/compare/6332649ac6c051453c00327919e84472c7a2f660...df9af119085e2cd3f1a9e88e4cc865963879d468)

---
updated-dependencies:
- dependency-name: third-party/tray
  dependency-version: df9af119085e2cd3f1a9e88e4cc865963879d468
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(python): migrate to uv (#5222)

* build(homebrew): fix service install on linux (#5223)

* chore(gh-pages): remove unused jquery dependency (#5235)

* docs(contributing): refresh clang-format guidance (#5233)

* chore(deps): update vmactions/freebsd-vm action to v1.4.6 (#5226)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(l10n): update translations (#5229)

* chore(deps): update dependency bootstrap-icons to v1.13.1 (#5239)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency vite to v6.4.3 (#5238)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update official github actions to v6.0.3 (#5242)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency simple-icons to v13 (#5243)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency simple-icons to v16 (#5248)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: David Lane <42013603+ReenigneArcher@users.noreply.github.com>

* chore(deps): use lizardbyte-common for python helpers (#5250)

* chore(deps): update lizardbyte/actions action to v2026.605.34721 (#5253)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency marked to v18.0.5 (#5251)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update astral-sh/setup-uv action to v8.2.0 (#5245)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update codecov/codecov-action action to v7 (#5262)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency vue-i18n to v11.4.5 (#5256)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `96e2fe8` to `ac5a296` (#5263)

build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `96e2fe8` to `ac5a296`.
- [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/96e2fe8bf7d2e5791ca1bdce2dba373f1e27c425...ac5a296ac6111aa2319daf532f609a067b88d8a9)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: ac5a296ac6111aa2319daf532f609a067b88d8a9
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump third-party/wayland-protocols from `02e63e7` to `ee78491` (#5271)

build(deps): bump third-party/wayland-protocols

Bumps [third-party/wayland-protocols](https://github.com/LizardByte-infrastructure/wayland-protocols) from `02e63e7` to `ee78491`.
- [Commits](https://github.com/LizardByte-infrastructure/wayland-protocols/compare/02e63e74a807afed95bc25a386173110afef24e3...ee78491a237eaff9389a0ccf8680521d074407d3)

---
updated-dependencies:
- dependency-name: third-party/wayland-protocols
  dependency-version: ee78491a237eaff9389a0ccf8680521d074407d3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(homebrew): bump ubuntu to 24.04 (#5272)

* fix(wayland): support DMA-BUF modifiers for wlroots capture (#5132)

* chore(deps): bump libdisplaydevice (#5280)

* chore(deps): update vue monorepo to v3.5.37 (#5281)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(tray): fix compiling without system tray enabled (#5284)

* chore(deps): update msys2/setup-msys2 action to v2.32.0 (#5285)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update lucide monorepo to v1.18.0 (#5287)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update vue monorepo to v3.5.38 (#5283)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(Linux/AppImage): replace gtk plugin with qt plugin for system tray (#5295)

* feat(linux): Add hardware yuv444 chromasubsampling support on nvidia cards (cuda/cuda gl) (#4965)

* chore(deps): lock file maintenance (#5269)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* build(deps): bump third-party/tray from `df9af11` to `8ea4c68` (#5296)

Bumps [third-party/tray](https://github.com/LizardByte/tray) from `df9af11` to `8ea4c68`.
- [Release notes](https://github.com/LizardByte/tray/releases)
- [Commits](https://github.com/LizardByte/tray/compare/df9af119085e2cd3f1a9e88e4cc865963879d468...8ea4c6835d623b1095a6c8885d70e6c836ca2307)

---
updated-dependencies:
- dependency-name: third-party/tray
  dependency-version: 8ea4c6835d623b1095a6c8885d70e6c836ca2307
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): update lucide monorepo to v1.20.0 (#5297)

Co-authored-by: renovate[bot] <29139614+renovate[…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

XDG portalgrab with multiple displays squishes all into one stream

3 participants