Skip to content

Conversation

@Be-ing
Copy link
Contributor

@Be-ing Be-ing commented Nov 13, 2025

This adds support for screen sharing on Wayland (fixes #28754). I am not able to test on Windows and macOS, so I will need help testing those.

libwebrtc replaces scap, which aims to be cross platform but was only used on Windows and X11. The X11 support relied on an out-of-tree branch on which the original author closed their own pull request (CapSoftware/scap#124). This also replaces Zed's platform-specific code on macOS. Switching to a single cross platform library simplifies the code by removing the need for Zed to have its own traits for cross platform abstraction.

This uses my branch of the Livekit Rust SDK. This branch merges several pull requests I have awaiting review upstream:

Currently, the webrtc-sys crate from Livekit downloads a prebuilt static libwebrtc C++ library (which is a nonstarter for Linux distro packagers). This branch requires changes to how the C++ library is built. Because those changes in livekit/rust-sdks#725 have not yet been merged upstream, you must build libwebrtc from source to build this branch on Linux. My Livekit branch will build libwebrtc from source during the Cargo build if you set the LK_LIBWEBRTC_SOURCE environment variable to the absolute path of an archive of the libwebrtc source code. In my Livekit branch, there is a script to generate this source code archive, which you can do by running:

git clone https://github.com/Be-ing/rust-sdks.git -b zed
cd rust-sdks/webrtc-sys/libwebrtc/
./generate-source-archive.sh

This script takes a long time to run because libwebrtc is developed as part of Chromium. Thus, it requires downloading about 9 GB of junk that isn't needed for libwebrtc. The generate-source-archive.sh script removes a bunch of that junk to strip it down to a 125 MB .tar.xz archive, which I hope will be published upstream by Livekit when my PRs are reviewed and merged.

Release Notes:

  • Added screen sharing support on Wayland (Linux)

TODO:

  • Get all tests, examples, and collab server building
  • Upstream release of prebuilt libwebrtc C++ library
  • Rework screen selection GUI for Wayland
  • HELP WANTED: Update Nix's livekit-libwebrtc package
  • HELP WANTED: Test on Windows
  • HELP WANTED: Test on macOS

@cla-bot cla-bot bot added the cla-signed The user has signed the Contributor License Agreement label Nov 13, 2025
@maxdeviant maxdeviant changed the title use libwebrtc's DesktopCapturer for screen capture Use libwebrtc's DesktopCapturer for screen capture Nov 13, 2025
@Be-ing Be-ing force-pushed the libwebrtc_desktop_capture branch from 0c5daae to b078823 Compare November 13, 2025 21:39
@Be-ing Be-ing force-pushed the libwebrtc_desktop_capture branch from b078823 to 0e67b6b Compare November 13, 2025 21:44
@ConradIrwin
Copy link
Member

Nice! I'm very excited about fixing Wayland screen-sharing.

We'd definitely need the webrtc build caching stuff to merge this though... thanks for fighting with that.

Also looks like you removed the screen selector; is there an easy path to bring that back through webRTC's stuff?

@Be-ing
Copy link
Contributor Author

Be-ing commented Nov 14, 2025

We'd definitely need the webrtc build caching stuff to merge this though...

I split off the required build changes to a trivially small PR so it's easy for upstream to review that quickly: livekit/rust-sdks#784 (Edit: that has been merged, waiting on upstream to tag a new release)

thanks for fighting with that.

Yeah, that took several weeks of yak shaving before I could actually work on Zed. 🪒 My CPU is not super fast (Intel Core i7 8550U) so there was lots of waiting involved.

Also looks like you removed the screen selector; is there an easy path to bring that back through webRTC's stuff?

I have not removed that, though the existing GUI code will need some work because applications can't have their own UI for that on Wayland. The XDG Desktop Portal doesn't expose the available screens/windows to applications; libwebrtc returns a single dummy CaptureSource with an empty string for a title. When DesktopCapturer::start_capture is called, the XDG Desktop Portal presents its GUI for the user to choose the screen (and/or window if enabled).

@Be-ing
Copy link
Contributor Author

Be-ing commented Nov 17, 2025

I tested this on a call with my friend @NOTtheMessiah and he was able to see me sharing my screen from Wayland! 🎉

@Be-ing Be-ing force-pushed the libwebrtc_desktop_capture branch 10 times, most recently from 0a1b90c to 7fbf32f Compare November 18, 2025 04:43
@Be-ing Be-ing force-pushed the libwebrtc_desktop_capture branch 15 times, most recently from 96bd7d8 to a429980 Compare November 26, 2025 05:23
@Be-ing Be-ing force-pushed the libwebrtc_desktop_capture branch from a429980 to c95550c Compare December 1, 2025 04:04
@Be-ing
Copy link
Contributor Author

Be-ing commented Dec 1, 2025

The main upstream PR adding Rust bindings for libwebrtc's DesktopCapturer class (livekit/rust-sdks#725) has been merged. 🎉 There are still several smaller PRs awaiting review upstream (tracked in the PR description) that would need to be merged for Zed to be able to use Livekit's crates.io releases.

@NOTtheMessiah will be working on updating the livekit-libwebrtc Nix package this week to get it working with this branch.

@Be-ing Be-ing force-pushed the libwebrtc_desktop_capture branch from c95550c to 38d1465 Compare December 1, 2025 19:09
@ConradIrwin
Copy link
Member

@Be-ing Amazing! I'm also happy to pull your changes into Zed's fork if you think it'll be a while before those are merged.

Did you figure out the screen-share freezing issue we saw when sharing from macOS -> Wayland?

@Be-ing
Copy link
Contributor Author

Be-ing commented Dec 2, 2025

@Be-ing Amazing! I'm also happy to pull your changes into Zed's fork if you think it'll be a while before those are merged.

We could do that, but let's see where those Livekit PRs are at by the time the Nix package is updated.

Did you figure out the screen-share freezing issue we saw when sharing from macOS -> Wayland?

I have not reproduced that.

@Be-ing
Copy link
Contributor Author

Be-ing commented Dec 3, 2025

@NOTtheMessiah and I were on a call yesterday trying to update the Nix livekit-libwebrtc package. We tried using Nix's gclient2nix script to update the package's sources from the Chromium build system's bespoke gclient tool. However, that script's output didn't specify some of the required Git repositories and the build failed.

Rather than spend more time troubleshooting gclient2nix, I will polish my script to generate a source code archive for libwebrtc. The source code archive is made from the output of gclient; it's ready to build as-is without downstream packagers needing to mess with gclient (which downloads 9 GB of junk that mostly isn't needed for libwebrtc). I'll publish that source code as a release artifact on my fork so we don't have to wait for Livekit to review that to update the Nix package. I was already planning to do that eventually to make it easier to package Zed in other package managers (packaging policies generally forbid using prebuilt binaries as Livekit's webrtc-sys crate does). Since that is now blocking this PR, I'll prioritize it.

@Be-ing Be-ing force-pushed the libwebrtc_desktop_capture branch 3 times, most recently from 91eb2ce to 81523d1 Compare December 4, 2025 07:00
@xianshijing-lk
Copy link

Hi @Be-ing ,In case you're blocked by the LiveKit PR review process or any other tasks awaiting input / work from the LiveKit team, please feel free to tag me as a reviewer or send me an email (shijing.xian@livekit.io). I'd be happy to help expedite the process.

NOTtheMessiah and others added 2 commits December 9, 2025 08:09
in buildInputs
This adds support for screen sharing on Wayland (fixes zed-industries#28754).

libwebrtc replaces scap, which aims to be cross platform but was only
used on Windows and X11. The X11 support relied on an out-of-tree branch
on which the original author closed their own pull request
(CapSoftware/scap#124). This also replaces Zed's
platform-specific code on macOS. Switching to a single cross platform
library simplifies the code by removing the need for Zed to have its own
traits for cross platform abstraction.
@Be-ing Be-ing force-pushed the libwebrtc_desktop_capture branch from 81523d1 to 71ca6c4 Compare December 9, 2025 14:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cla-signed The user has signed the Contributor License Agreement community champion

Projects

Status: Community Champion PRs

Development

Successfully merging this pull request may close these issues.

Can't screenshare on Wayland (Linux)

7 participants