emersion / xdg-desktop-portal-wlr

xdg-desktop-portal backend for wlroots
MIT License
592 stars 56 forks source link

ScreenCast Portal Implementation not used | Screen share not working #145

Closed codingHahn closed 3 years ago

codingHahn commented 3 years ago

First, I don't know if this is a bug in xdg-desktop-portal{,-wlr,-gtk} or Void Linux. I am sorry if this is the wrong place.

With the default configuration, the wrong implementation for the ScreenCast portal gets chosen.

Distro: Void Linux Arch: x86_64 xdg-desktop-portal 1.8.1 xdg-desktop-portal-wlr 0.4.0 xdg-desktop-portal-gtk 1.8.0

The value of the XDG_CURRENT_DESKTOP env var is sway

When having both xdg-desktop-portal-wlr and xdg-desktop-portal-gtk installed and running sway, the ScreenCast implementation from gtk gets used. Here is the output of xdg-desktop-portal:

$ /usr/libexec/xdg-desktop-portal -r --verbose
XDP: load portals from /usr/share/xdg-desktop-portal/portals
XDP: loading /usr/share/xdg-desktop-portal/portals/gnome-keyring.portal
XDP: portal implementation for gnome
XDP: portal implementation supports org.freedesktop.impl.portal.Secret
XDP: loading /usr/share/xdg-desktop-portal/portals/gtk.portal
XDP: portal implementation for gnome
XDP: portal implementation supports org.freedesktop.impl.portal.FileChooser
XDP: portal implementation supports org.freedesktop.impl.portal.AppChooser
XDP: portal implementation supports org.freedesktop.impl.portal.Print
XDP: portal implementation supports org.freedesktop.impl.portal.Screenshot
XDP: portal implementation supports org.freedesktop.impl.portal.Notification
XDP: portal implementation supports org.freedesktop.impl.portal.Inhibit
XDP: portal implementation supports org.freedesktop.impl.portal.Access
XDP: portal implementation supports org.freedesktop.impl.portal.Account
XDP: portal implementation supports org.freedesktop.impl.portal.Email
XDP: portal implementation supports org.freedesktop.impl.portal.ScreenCast
XDP: portal implementation supports org.freedesktop.impl.portal.RemoteDesktop
XDP: portal implementation supports org.freedesktop.impl.portal.Lockdown
XDP: portal implementation supports org.freedesktop.impl.portal.Background
XDP: portal implementation supports org.freedesktop.impl.portal.Settings
XDP: portal implementation supports org.freedesktop.impl.portal.Wallpaper
XDP: loading /usr/share/xdg-desktop-portal/portals/wlr.portal
XDP: portal implementation for sway, Wayfire, river
XDP: portal implementation supports org.freedesktop.impl.portal.Screenshot
XDP: portal implementation supports org.freedesktop.impl.portal.ScreenCast
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Lockdown
XDP: providing portal org.freedesktop.portal.MemoryMonitor
XDP: providing portal org.freedesktop.portal.NetworkMonitor
XDP: providing portal org.freedesktop.portal.ProxyResolver
XDP: providing portal org.freedesktop.portal.Trash
XDP: providing portal org.freedesktop.portal.GameMode
XDP: Using gtk.portal for org.freedesktop.impl.portal.Settings
XDP: providing portal org.freedesktop.portal.Settings
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.FileChooser
XDP: providing portal org.freedesktop.portal.FileChooser
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.AppChooser
XDP: providing portal org.freedesktop.portal.OpenURI
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Print
XDP: providing portal org.freedesktop.portal.Print
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Screenshot
XDP: providing portal org.freedesktop.portal.Screenshot
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Notification
XDP: providing portal org.freedesktop.portal.Notification
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Inhibit
XDP: providing portal org.freedesktop.portal.Inhibit
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Access
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Background
XDP: providing portal org.freedesktop.portal.Device
XDP: providing portal org.freedesktop.portal.Location
XDP: providing portal org.freedesktop.portal.Camera
XDP: Starting background app monitor
XDP: providing portal org.freedesktop.portal.Background
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Wallpaper
XDP: providing portal org.freedesktop.portal.Wallpaper
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Account
XDP: using org.freedesktop.impl.portal.Account at org.freedesktop.impl.portal.desktop.gtk

XDP: providing portal org.freedesktop.portal.Account
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Email
XDP: providing portal org.freedesktop.portal.Email
XDP: Falling back to gnome-keyring.portal for org.freedesktop.impl.portal.Secret
XDP: providing portal org.freedesktop.portal.Secret
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.ScreenCast
XDP: providing portal org.freedesktop.portal.ScreenCast
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.RemoteDesktop
XDP: providing portal org.freedesktop.portal.RemoteDesktop
XDP: org.freedesktop.portal.Desktop acquired

And here is the output of xdg-desktop-portal-wlr

$ /usr/libexec/xdg-desktop-portal-wlr -l DEBUG
2021/06/12 00:57:34 [ERROR] - config: no config file found
2021/06/12 00:57:34 [DEBUG] - config: outputname:  (null)
2021/06/12 00:57:34 [DEBUG] - config: max_fps:  0.000000
2021/06/12 00:57:34 [DEBUG] - config: exec_before:  (null)
2021/06/12 00:57:34 [DEBUG] - config: exec_after:  (null)
2021/06/12 00:57:34 [DEBUG] - config: chooser_cmd: (null)
2021/06/12 00:57:34 [DEBUG] - config: chooser_type: default
2021/06/12 00:57:34 [DEBUG] - dbus: connected
2021/06/12 00:57:34 [DEBUG] - wlroots: wl_display connected
2021/06/12 00:57:34 [DEBUG] - pipewire: pw_loop created
2021/06/12 00:57:34 [DEBUG] - pipewire: establishing connection to core
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register wl_shm  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: |-- registered to interface wl_shm (Version 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register wl_drm  (Version: 2)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwp_linux_dmabuf_v1  (Version: 3)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register wl_compositor  (Version: 4)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register wl_subcompositor  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register wl_data_device_manager  (Version: 3)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwlr_gamma_control_manager_v1  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register gtk_primary_selection_device_manager  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zxdg_output_manager_v1  (Version: 3)
2021/06/12 00:57:34 [DEBUG] - wlroots: |-- registered to interface zxdg_output_manager_v1 (Version 3)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register org_kde_kwin_idle  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwp_idle_inhibit_manager_v1  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwlr_layer_shell_v1  (Version: 4)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register xdg_wm_base  (Version: 2)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwp_tablet_manager_v2  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register org_kde_kwin_server_decoration_manager  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zxdg_decoration_manager_v1  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwp_relative_pointer_manager_v1  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwp_pointer_constraints_v1  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register wp_presentation  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwlr_output_manager_v1  (Version: 2)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwlr_output_power_manager_v1  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwp_input_method_manager_v2  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwp_text_input_manager_v3  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwlr_foreign_toplevel_manager_v1  (Version: 3)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwlr_export_dmabuf_manager_v1  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwlr_screencopy_manager_v1  (Version: 3)
2021/06/12 00:57:34 [DEBUG] - wlroots: |-- registered to interface zwlr_screencopy_manager_v1 (Version 3)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwlr_data_control_manager_v1  (Version: 2)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwp_primary_selection_device_manager_v1  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register wp_viewporter  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zxdg_exporter_v1  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zxdg_importer_v1  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zxdg_exporter_v2  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zxdg_importer_v2  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwp_virtual_keyboard_manager_v1  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwlr_virtual_pointer_manager_v1  (Version: 2)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwlr_input_inhibit_manager_v1  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwp_keyboard_shortcuts_inhibit_manager_v1  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register wl_seat  (Version: 7)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register zwp_pointer_gestures_v1  (Version: 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register wl_output  (Version: 3)
2021/06/12 00:57:34 [DEBUG] - wlroots: |-- registered to interface wl_output (Version 1)
2021/06/12 00:57:34 [DEBUG] - wlroots: interface to register wl_output  (Version: 3)
2021/06/12 00:57:34 [DEBUG] - wlroots: |-- registered to interface wl_output (Version 1)
2021/06/12 00:57:34 [DEBUG] - wayland: registry listeners run
2021/06/12 00:57:34 [DEBUG] - wayland: xdg output listeners run

When I then edit the file at /usr/share/xdg-desktop-portal/portals/gtk.portal to remove the ScreenShare implementation and restart xdg-desktop-portal, the output is the following:

$ /usr/libexec/xdg-desktop-portal -r --verbose
XDP: load portals from /usr/share/xdg-desktop-portal/portals
XDP: loading /usr/share/xdg-desktop-portal/portals/gnome-keyring.portal
XDP: portal implementation for gnome
XDP: portal implementation supports org.freedesktop.impl.portal.Secret
XDP: loading /usr/share/xdg-desktop-portal/portals/gtk.portal
XDP: portal implementation for gnome
XDP: portal implementation supports org.freedesktop.impl.portal.FileChooser
XDP: portal implementation supports org.freedesktop.impl.portal.AppChooser
XDP: portal implementation supports org.freedesktop.impl.portal.Print
XDP: portal implementation supports org.freedesktop.impl.portal.Screenshot
XDP: portal implementation supports org.freedesktop.impl.portal.Notification
XDP: portal implementation supports org.freedesktop.impl.portal.Inhibit
XDP: portal implementation supports org.freedesktop.impl.portal.Access
XDP: portal implementation supports org.freedesktop.impl.portal.Account
XDP: portal implementation supports org.freedesktop.impl.portal.Email
XDP: portal implementation supports org.freedesktop.impl.portal.RemoteDesktop
XDP: portal implementation supports org.freedesktop.impl.portal.Lockdown
XDP: portal implementation supports org.freedesktop.impl.portal.Background
XDP: portal implementation supports org.freedesktop.impl.portal.Settings
XDP: portal implementation supports org.freedesktop.impl.portal.Wallpaper
XDP: loading /usr/share/xdg-desktop-portal/portals/wlr.portal
XDP: portal implementation for wlroots, sway, Wayfire, river
XDP: portal implementation supports org.freedesktop.impl.portal.Screenshot
XDP: portal implementation supports org.freedesktop.impl.portal.ScreenCast
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Lockdown
XDP: providing portal org.freedesktop.portal.MemoryMonitor
XDP: providing portal org.freedesktop.portal.NetworkMonitor
XDP: providing portal org.freedesktop.portal.ProxyResolver
XDP: providing portal org.freedesktop.portal.Trash
XDP: providing portal org.freedesktop.portal.GameMode
XDP: Using gtk.portal for org.freedesktop.impl.portal.Settings
XDP: providing portal org.freedesktop.portal.Settings
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.FileChooser
XDP: providing portal org.freedesktop.portal.FileChooser
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.AppChooser
XDP: providing portal org.freedesktop.portal.OpenURI
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Print
XDP: providing portal org.freedesktop.portal.Print
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Screenshot
XDP: providing portal org.freedesktop.portal.Screenshot
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Notification
XDP: providing portal org.freedesktop.portal.Notification
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Inhibit
XDP: providing portal org.freedesktop.portal.Inhibit
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Access
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Background
XDP: providing portal org.freedesktop.portal.Device
XDP: providing portal org.freedesktop.portal.Location
XDP: providing portal org.freedesktop.portal.Camera
XDP: Starting background app monitor
XDP: providing portal org.freedesktop.portal.Background
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Wallpaper
XDP: providing portal org.freedesktop.portal.Wallpaper
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Account
XDP: using org.freedesktop.impl.portal.Account at org.freedesktop.impl.portal.desktop.gtk

XDP: providing portal org.freedesktop.portal.Account
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.Email
XDP: providing portal org.freedesktop.portal.Email
XDP: Falling back to gnome-keyring.portal for org.freedesktop.impl.portal.Secret
XDP: providing portal org.freedesktop.portal.Secret
XDP: Falling back to wlr.portal for org.freedesktop.impl.portal.ScreenCast
XDP: providing portal org.freedesktop.portal.ScreenCast
XDP: Falling back to gtk.portal for org.freedesktop.impl.portal.RemoteDesktop
XDP: providing portal org.freedesktop.portal.RemoteDesktop
XDP: org.freedesktop.portal.Desktop acquired

It automatically chooses the wrong implementation, thus rendering screenshare impossible.

danshick commented 3 years ago

Strong likelihood that even though the XDG_CURRENT_DESKTOP env var is set where you can see it, it is not set in such a way that dbus can see it.

Can you paste the output of:

< "/proc/$(pidof xdg-desktop-portal)/environ" tr '\0' '\n' | grep '^XDG_CURRENT_DESKTOP='

In general, you may find the troubleshooting guide in the wiki helpful. Some suggestions are written assuming systemd, but you may find it points you in the right direction.

codingHahn commented 3 years ago

Yeah sure:

$ sudo < "/proc/$(pidof xdg-desktop-portal)/environ" tr '\0' '\n' | grep '^XDG_CURRENT_DESKTOP='
XDG_CURRENT_DESKTOP=sway
danshick commented 3 years ago

Whelp, that was the easy fix. Lemme reread these logs and think about this one. I'm betting it has something to do with you being systemd-less, but I don't have much experience with dbus activation.

danshick commented 3 years ago

I hate to say it, but I'm stumped. If xdg sees XDG_CURRENT_DESKTOP=sway than its decision logic is pretty straight forward, and I don't understand why it claims to fall back to gtk. And your edit to the portal definition proves it knows about the wlr implementation of screencast.

I would suggest raising an issue for the folks at xdg-desktop-portal referencing this one. Leave this open and I'll follow both in case I can help or I think of anything else to try.

You might consider directly invoking xdp from a shell like this:

XDG_CURRENT_DESKTOP=sway /path/to/xdg-desktop-portal -vr

See if that still falls back or correctly chooses the wlr portal. If it falls back, definitely an xdp bug. If not, I'm guessing a really subtle config typo somewhere, or a strange d-bus activation environment variable sync race condition.

codingHahn commented 3 years ago

It was after all an env problem. Because voidlinux is not using systemd and sway does not automatically propagate env vars to dbus, I needed to do that myself. Putting this at the top of the sway config fixed it:

exec dbus-update-activation-environment DISPLAY XAUTHORITY SWAYSOCK I3SOCK WAYLAND_DISPLAY