config/patches/base/ungoogled-chromium/Improve-screen-sharing-with-PipeWire-on-Linux-Wayland-session.patch
2022-02-05 20:47:50 +01:00

126 lines
5.5 KiB
Diff

From 870df28bda2ae8022ce2df17886bc253c2a92cb1 Mon Sep 17 00:00:00 2001
From: Jan Grulich <grulja@gmail.com>
Date: Mon, 14 Dec 2020 22:36:48 +0000
Subject: [PATCH] Improve screen sharing with PipeWire on Linux Wayland session
Current scenario when PipeWire desktop capturer is used:
Chromium picker dialog is created with screen and window capturer. Each
capturer makes an xdg-desktop-portal call, showing another picker
dialog. Once user confirms both pickers on xdg-desktop-portal side, yet
another picker is shown as a new capturer is created for the web page
itself.
With this change:
Chromium picker dialog is created, but only screen capturer will be
created as with xdg-desktop-portal the picker will handle both screens
and windows. Also in the chromium picker, the "window" tab creating
window capturer expects a list of windows and doesn't show previews,
but we need actually to behave exactly like the "screen" tab and show
preview of selected window. Then again, yet another picker from
xdg-desktop-portal is shown as a new capturer is created for the web
page itself.
Bug: chromium:1157006
Change-Id: I39eafc72eb46da7868d1114b5c106030c22787a4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2578840
Commit-Queue: mark a. foltz <mfoltz@chromium.org>
Reviewed-by: mark a. foltz <mfoltz@chromium.org>
Reviewed-by: Wez <wez@chromium.org>
Reviewed-by: Guido Urdaneta <guidou@chromium.org>
Reviewed-by: Avi Drissman <avi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#836814}
---
AUTHORS | 1 +
.../api/desktop_capture/desktop_capture_base.cc | 8 ++++++++
.../browser/media/webrtc/display_media_access_handler.cc | 8 ++++++++
content/public/browser/desktop_capture.cc | 9 +++++++++
content/public/browser/desktop_capture.h | 6 ++++++
5 files changed, 32 insertions(+)
diff --git a/AUTHORS b/AUTHORS
index c0b2771655df5..a4f042fa7bc32 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -441,6 +441,7 @@ James Stanley <james@apphaus.co.uk>
James Vega <vega.james@gmail.com>
James Wei <james.wei@intel.com>
James Willcox <jwillcox@litl.com>
+Jan Grulich <grulja@gmail.com>
Jan Rucka <ruckajan10@gmail.com>
Jan Sauer <jan@jansauer.de>
Janusz Majnert <jmajnert@gmail.com>
diff --git a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
index fa790782b3ee0..a9708300d2c32 100644
--- a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
+++ b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
@@ -120,6 +120,14 @@ DesktopCaptureChooseDesktopMediaFunctionBase::Execute(
}
}
+ // Avoid offering window-capture as a separate source, since PipeWire's
+ // content-picker will offer both screen and window sources.
+ // See crbug.com/1157006.
+ if (content::desktop_capture::CanUsePipeWire() &&
+ base::Contains(media_types, content::DesktopMediaID::TYPE_SCREEN)) {
+ base::Erase(media_types, content::DesktopMediaID::TYPE_WINDOW);
+ }
+
DesktopMediaPickerController::DoneCallback callback = base::BindOnce(
&DesktopCaptureChooseDesktopMediaFunctionBase::OnPickerDialogResults,
this, origin, web_contents);
diff --git a/chrome/browser/media/webrtc/display_media_access_handler.cc b/chrome/browser/media/webrtc/display_media_access_handler.cc
index 3026674525bf5..e837e5ca1ed06 100644
--- a/chrome/browser/media/webrtc/display_media_access_handler.cc
+++ b/chrome/browser/media/webrtc/display_media_access_handler.cc
@@ -216,6 +216,14 @@ void DisplayMediaAccessHandler::ProcessQueuedAccessRequest(
content::DesktopMediaID::TYPE_SCREEN,
content::DesktopMediaID::TYPE_WINDOW,
content::DesktopMediaID::TYPE_WEB_CONTENTS};
+
+ // Avoid offering window-capture as a separate source, since PipeWire's
+ // content-picker will offer both screen and window sources.
+ // See crbug.com/1157006.
+ if (content::desktop_capture::CanUsePipeWire()) {
+ base::Erase(media_types, content::DesktopMediaID::TYPE_WINDOW);
+ }
+
auto source_lists = picker_factory_->CreateMediaList(media_types);
DesktopMediaPicker::DoneCallback done_callback =
diff --git a/content/public/browser/desktop_capture.cc b/content/public/browser/desktop_capture.cc
index 60065d125ff5d..c3b8f474cfb77 100644
--- a/content/public/browser/desktop_capture.cc
+++ b/content/public/browser/desktop_capture.cc
@@ -65,5 +65,14 @@ std::unique_ptr<webrtc::DesktopCapturer> CreateWindowCapturer() {
#endif
}
+bool CanUsePipeWire() {
+#if defined(WEBRTC_USE_PIPEWIRE)
+ return webrtc::DesktopCapturer::IsRunningUnderWayland() &&
+ base::FeatureList::IsEnabled(features::kWebRtcPipeWireCapturer);
+#else
+ return false;
+#endif
+}
+
} // namespace desktop_capture
} // namespace content
diff --git a/content/public/browser/desktop_capture.h b/content/public/browser/desktop_capture.h
index c90997a8762a5..700d5c46aed5c 100644
--- a/content/public/browser/desktop_capture.h
+++ b/content/public/browser/desktop_capture.h
@@ -19,6 +19,12 @@ CONTENT_EXPORT webrtc::DesktopCaptureOptions CreateDesktopCaptureOptions();
CONTENT_EXPORT std::unique_ptr<webrtc::DesktopCapturer> CreateScreenCapturer();
CONTENT_EXPORT std::unique_ptr<webrtc::DesktopCapturer> CreateWindowCapturer();
+// Returns whether we can use PipeWire capturer based on:
+// 1) We run Linux Wayland session
+// 2) WebRTC is built with PipeWire enabled
+// 3) Chromium has features::kWebRtcPipeWireCapturer enabled
+CONTENT_EXPORT bool CanUsePipeWire();
+
} // namespace desktop_capture
} // namespace content