Skip to content

Conversation

@Be-ing
Copy link
Contributor

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

This branch builds on Linux but I have not yet tested it because I need someone to try it in a call with. 😃 I am not able to test on Windows and macOS, so I will need help testing those.

This adds support for screen sharing on Wayland (fixes #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.

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)

@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
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.
@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).

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

None yet

Development

Successfully merging this pull request may close these issues.

Can't screenshare on Wayland (Linux)

5 participants