Screen sharing on Hyprland (Arch Linux)
Table of contents
- Screen sharing on Hyprland (Arch Linux)
- Introduction
- Install PipeWire and friends
- Install xdg-desktop-portal and friends
- Remove other portal implementations
- Edit the configuration file
- Restart your session
- Troubleshooting PipeWire
- Troubleshooting desktop portal
- Troubleshooting OBS
- Troubleshooting your browser
- Troubleshooting your app
- It still doesn't work!
- References
Introduction
This guide will go through the setup and troubleshooting steps required to get screen sharing working on OBS with the Hyprland compositor.
This guide will use the yay
AUR helper for AUR package installation, but the commands should be similar for other helpers such as paru
.
WARNING: This guide demands that the user has a basic understanding on installing packages (both official and AUR), using git, compiling from source, and some patience.
Install PipeWire and friends
First, we need to install pipewire
and wireplumber
. To do that, run the following command:
sudo pacman -S pipewire wireplumber
Install xdg-desktop-portal and friends
Option #1: xdg-desktop-portal-hyprland (recommended)
We will install the xdg-desktop-portal-hyprland-git
package from the AUR, which provides additional functionality such as window sharing. With an AUR helper such as yay
, you can install it this way:
yay -S xdg-desktop-portal-hyprland-git
Option #2: xdg-desktop-portal-wlr (not recommended)
This option provides less options than xdg-desktop-portal-wlr
, but it will still allow fullscreen sharing. Install it running the following command:
sudo pacman -S xdg-desktop-portal-wlr
WARNING: The rest of this guide will assume xdg-desktop-portal-hyprland
was choosed. If you picked this option, replace any -hyprland
mentions for -wlr
in the rest of this guide.
Remove other portal implementations
Make sure you don't have any other xdg-desktop-portal-*
packages installed (except possibly xdg-desktop-portal-gtk
for file dialogs), as this could cause problems later. To check if you have any, run the following command:
pacman -Q | grep xdg-desktop-portal-
then delete all of the listed packages except the -hyprland
one we just installed and the -gtk
one if you so chose.
Also make sure to install the optional dependencies grim
and slurp
:
sudo pacman -S grim slurp
Editing the configuration file
Open your Hyprland config file (usually located at ~/.config/hypr/hyprland.conf
) with a text editor, and add the following line at the end:
exec-once=dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
This will make sure that xdg-desktop-portal-hyprland
can get the required variables on startup.
Restart your session
Now log out and then log back in, or reboot your system. Once you're back into Hyprland, try sharing in OBS with the "Screen Capture (PipeWire)" option.
If it works, congratulations! You may exit this guide now. If not, follow along:
Troubleshooting PipeWire
Make sure both pipewire
and wireplumber
are running. Run the following command:
systemctl --user status pipewire wireplumber
This should return "active (running)" for both. If it doesn't, follow the Arch Wiki article for troubleshooting.
Troubleshooting desktop portal
Run the following command to check for errors in xdg-desktop-portal-hyprland
:
systemctl --user status xdg-desktop-portal-hyprland
This should return "active (running)". If it doesn't, check the errors it gives you. Here's some workarounds for common errors:
Portal service (wlroots implementation) was skipped because of a failed condition check
Make sure you added the required line to the Hyprland configuration. Check for typos.
unsupported wl_shm format 0x34324742
(after trying to share the screen on NVIDIA)
Install the modified hyprland-nvidia-git AUR package:
yay -S hyprland-nvidia-git
Alternatively, you can modify the source code manually:
We'll need to modify the wlroots
submodule source code to make it choose a viable format.
First, clone the Hyprland repo if you haven't already:
git clone --recursive https://github.com/vaxerski/Hyprland
Then, install all required dependencies for building, as specified in the wiki:
sudo pacman -S gdb ninja gcc cmake libxcb xcb-proto xcb-util xcb-util-keysyms libxfixes libx11 libxcomposite xorg-xinput libxrender pixman wayland-protocols cairo pango --needed
Open the wlroots/types/output/render.c
file, look for the wlr_output_preferred_read_format
, and replace it with the following:
uint32_t wlr_output_preferred_read_format(struct wlr_output *output) {
return DRM_FORMAT_XRGB8888;
}
Afterwards, compile and install by running sudo make install
, then restart your session.
Troubleshooting OBS
You can try the wlrobs-hg plugin.
Troubleshooting your browser
If you're trying to share your screen in your browser, first make sure that it supports Wayland and screen sharing on it, else it will not work.
Firefox
Make sure you're running on Wayland. To do this, go to about:support
, look for "Window Protocol", and make sure it is set to "wayland".
If it isn't, set the environment variable MOZ_ENABLE_WAYLAND=1
in an environment file, like /etc/environment
, /etc/profile
, ~/.bash_profile
, ~/.zshenv
, etc.
If it still doesn't work, open about:config
and make sure the media.peerconnection.enabled
flag is set to true.
Chromium
To run on Wayland, set the --ozone-platform-hint=auto
flag in the chromium flags file (~/.config/chromium-flags.conf
for the default package, ~/.config/chrome-flags.conf
for Chrome).
Also ensure the "WebRTC PipeWire support" flag is enabled by opening chrome://flags/#enable-webrtc-pipewire-capturer
and enabling it.
Troubleshooting your app
Make sure the app you're trying to share the screen with supports Wayland and sharing the screen with it.
Notable programs that still don't have full support for this are Discord and Zoom.
It still doesn't work!
Follow the official xdg-desktop-portal-wlr troubleshooting guide.
If it still doesn't work, consider opening an issue in the xdg-desktop-portal-hyprland
repo.
When I remove the other xdg-desktop-portal backends (gtk and gnome) I lose some functionality elsewhere because xdg-desktop-portal-wrl only implements the
Screencast
andScreenshot
APIs. But with them installed, xdg-desktop-portal uses gtk/gnome for screenshot and screencast. Do you know of a way to force wrl to be the default for the APIs it implements, and fallback to gtk/gnome for the rest?Edit: I ended up uninstalling
xdg-desktop-portal-gnome
, but I keptxdg-desktop-portal-gtk
(and of course havexdg-desktop-portal-wlr
installed). With that I'm able to screencast and as far as I can tell, the functionality that was missing for me has returned. (The functionality that was missing for me was not being able to click and open links into my browser from flatpak apps like slack)If for some reason things get a little wonky with screenshots / screencasts, I might end up forking
xdg-desktop-portal-gtk
and just disable the screencast stuff.I suggest adding a note in the section where you ask people to uninstall other
xdg-desktop-portal
backends to say that wrl only implements screencast and screenshot, and some functionality will be missing if there isn't another backend installed.