From e52cfab63347cd0f7b1ddf68d1f0a9321e0066f1 Mon Sep 17 00:00:00 2001 From: Jan Grulich Date: Fri, 9 Apr 2021 15:53:57 +0200 Subject: [PATCH] PipeWire capturer: request mouse cursor to be part of the stream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We need to specify that the cursor should be included in the stream as by default xdg-desktop-portal defaults to hidden cursor. Bug: chromium:1202526 Change-Id: Ic4742da2e51f7ed28cb9d7b6b0c069c1fa7d0cee Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/214782 Reviewed-by: Tommi Reviewed-by: Erik Språng Commit-Queue: Tommi Cr-Commit-Position: refs/heads/master@{#34137} --- .../linux/base_capturer_pipewire.cc | 17 +++++++++++++++++ .../linux/base_capturer_pipewire.h | 6 ++++++ 2 files changed, 23 insertions(+) diff --git a/modules/desktop_capture/linux/base_capturer_pipewire.cc b/modules/desktop_capture/linux/base_capturer_pipewire.cc index 919415e81e..e5d001e476 100644 --- a/modules/desktop_capture/linux/base_capturer_pipewire.cc +++ b/modules/desktop_capture/linux/base_capturer_pipewire.cc @@ -1026,6 +1026,23 @@ void BaseCapturerPipeWire::SourcesRequest() { // We don't want to allow selection of multiple sources. g_variant_builder_add(&builder, "{sv}", "multiple", g_variant_new_boolean(false)); + + Scoped variant( + g_dbus_proxy_get_cached_property(proxy_, "AvailableCursorModes")); + if (variant.get()) { + uint32_t modes = 0; + g_variant_get(variant.get(), "u", &modes); + // Request mouse cursor to be embedded as part of the stream, otherwise it + // is hidden by default. Make request only if this mode is advertised by + // the portal implementation. + if (modes & + static_cast(BaseCapturerPipeWire::CursorMode::kEmbedded)) { + g_variant_builder_add(&builder, "{sv}", "cursor_mode", + g_variant_new_uint32(static_cast( + BaseCapturerPipeWire::CursorMode::kEmbedded))); + } + } + variant_string = g_strdup_printf("webrtc%d", g_random_int_range(0, G_MAXINT)); g_variant_builder_add(&builder, "{sv}", "handle_token", g_variant_new_string(variant_string.get())); diff --git a/modules/desktop_capture/linux/base_capturer_pipewire.h b/modules/desktop_capture/linux/base_capturer_pipewire.h index 75d20dbf1d..52264188a7 100644 --- a/modules/desktop_capture/linux/base_capturer_pipewire.h +++ b/modules/desktop_capture/linux/base_capturer_pipewire.h @@ -47,6 +47,12 @@ class BaseCapturerPipeWire : public DesktopCapturer { kAny = 0b11 }; + enum class CursorMode : uint32_t { + kHidden = 0b01, + kEmbedded = 0b10, + kMetadata = 0b100 + }; + explicit BaseCapturerPipeWire(CaptureSourceType source_type); ~BaseCapturerPipeWire() override;