summarylogtreecommitdiffstats
path: root/linux-capture_pipewire.patch
diff options
context:
space:
mode:
Diffstat (limited to 'linux-capture_pipewire.patch')
-rw-r--r--linux-capture_pipewire.patch53
1 files changed, 53 insertions, 0 deletions
diff --git a/linux-capture_pipewire.patch b/linux-capture_pipewire.patch
new file mode 100644
index 000000000000..6ead6ced7fb1
--- /dev/null
+++ b/linux-capture_pipewire.patch
@@ -0,0 +1,53 @@
+From ef0540c0d7df64b6cb148c80d566281a4ff3ba5c Mon Sep 17 00:00:00 2001
+From: Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
+Date: Fri, 17 Sep 2021 11:59:53 -0300
+Subject: [PATCH] linux-capture: Lookup session handle without typechecks
+
+g_variant_lookup() obligatorily receives the type of the variant to
+lookup. This function is used when retrieving the session handle
+from the portal's response, and the variant type passed is "s" (a
+string).
+
+However, xdg-desktop-portal had a bug: the documentation explicitly
+mentions that the session handle is an object path (of variant type
+"o"), but it passed a string (of variant type "s"). This mismatch
+was fixed in the xdg-desktop-portal release 1.10 [1], but that broke
+the PipeWire capture code, which was passing specifically the "s"
+value to the variant lookup.
+
+Fix this by not checking the variant type at all. Object paths ("o")
+are simply strings with a few extra checks, and we don't actually need
+to perform these checks.
+
+This change probably broke other apps, and that makes me extremely sad :(
+
+[1] https://github.com/flatpak/xdg-desktop-portal/pull/609
+---
+ plugins/linux-capture/pipewire.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/plugins/linux-capture/pipewire.c b/plugins/linux-capture/pipewire.c
+index 848b0fbca13..655e5183dba 100644
+--- a/plugins/linux-capture/pipewire.c
++++ b/plugins/linux-capture/pipewire.c
+@@ -958,6 +958,7 @@ static void on_create_session_response_received_cb(
+ UNUSED_PARAMETER(interface_name);
+ UNUSED_PARAMETER(signal_name);
+
++ g_autoptr(GVariant) session_handle_variant = NULL;
+ g_autoptr(GVariant) result = NULL;
+ struct dbus_call_data *call = user_data;
+ obs_pipewire_data *obs_pw = call->obs_pw;
+@@ -975,8 +976,10 @@ static void on_create_session_response_received_cb(
+
+ blog(LOG_INFO, "[pipewire] screencast session created");
+
+- g_variant_lookup(result, "session_handle", "s",
+- &obs_pw->session_handle);
++ session_handle_variant =
++ g_variant_lookup_value(result, "session_handle", NULL);
++ obs_pw->session_handle =
++ g_variant_dup_string(session_handle_variant, NULL);
+
+ select_source(obs_pw);
+ }