因为经常要开会,所以腾讯会议 (wemeet) 的屏幕共享问题对我来说是一个重大的阻碍,不能让我完全放弃 Windows 转 GNU/Linux。虽然可能在 kde 或者 gnome 桌面下问题不大,但是我还是比较想用 niri,所以一直在折腾。终于在尝试各种各样的方案以后,在AI 的帮助下,实现了 niri 下的腾讯会议屏幕共享,包括两个:
- 自己可以正常共享
- 能看到别人的共享
这应该算是社区里大家都经常遇到的两个问题,所以分享出来供大家参考
因为不是特别专业,所以就简单按自己的理解总结一下要注意的点。
我的系统是NixOS,niri是25.11版本,wemeet是3.26.10.401版本,显卡是NVIDIA。如果佬们的版本和硬件和我的不同可能不完全适用。
先说说如果完全不配置可能出现的情况是什么,就是wemeet可以正常打开,点击屏幕共享没有调出屏幕选择,然后也看不到别人共享的屏幕(黑屏)。
下面是具体配置步骤:
- 第一步,给niri打一个补丁, Support shm sharing by wrvsrx · Pull Request #1791 · niri-wm/niri · GitHub 。据说是解决了shm的问题(虽然我不太了解这是啥),但是提这个pr的佬说他的wemeet在打了这个补丁之后正常工作,我之后的配置也是在这个基础上的,没有试过去掉这个补丁之后是否还能用(

- 第二步,将和屏幕相关的 portal 请求,交给 hyprland backend 处理。具体来说是 “org.freedesktop.impl.portal.ScreenCast” = [ “hyprland” ];“org.freedesktop.impl.portal.RemoteDesktop” = [ “hyprland” ];
这里是参考的这位佬的帖子 niri如何正确运行腾讯会议
安装portal:
xdg.portal.extraPortals = with pkgs; [
xdg-desktop-portal-gnome
xdg-desktop-portal-gtk
xdg-desktop-portal-hyprland
xdg-desktop-portal-wlr
];
配置portal:
niri = {
default = lib.mkForce [
"gtk"
"gnome"
];
"org.freedesktop.impl.portal.Access" = [ "gtk" ];
"org.freedesktop.impl.portal.Notification" = [ "gtk" ];
"org.freedesktop.impl.portal.Secret" = [ "gnome-keyring" ];
"org.freedesktop.impl.portal.ScreenCast" = [ "hyprland" ];
"org.freedesktop.impl.portal.RemoteDesktop" = [ "hyprland" ];
};
同时可能需要同步一下境变量,在niri的配置文件spawn-sh-at-startup.kdl中加上:
spawn-sh-at-startup "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=niri"
到这一步,如果环境加载没问题,那么就已经可以共享自己的屏幕了。具体来说会出现一个选择共享屏幕的窗口,点击就能共享了,(同时还有可能出现一系列的绿色窗口,应该是某种奇怪的bug,但是不影响屏幕共享。)
只有这个没用

点击开始共享后出现了这个窗口才算成功(不过现在只能共享整个屏幕,不能选窗口),之后应该就能正常共享自己的屏幕了

不过,到此为止还没有解决无法看到别人共享的问题,可能要么是黑屏,要么是闪退。
所以需要第三步
第二步更新,见
更新一下,现在我发现在第二步,将和屏幕相关的 portal 请求,可以不走hyprland后端,直接用gnome后端即可,实测可用且可以选择窗口共享
[image]
[image]
配置如下
config = {
common = {
# Use GNOME first with GTK as the global fallback backend.
…
- 第三步,让wemeet本体走 XWayland,同时保持上面配置好的 portal。前者解决无法看到别人共享的屏幕的问题,后者解决自己共享屏幕的问题。这里主要是 AI 帮我配的,nixos 里面直接这样写
{ pkgs, ... }@args:
let
# Use the stable package-set build for Wemeet itself so the app keeps the
# older 1.4.x PipeWire-era screenshare hook path, while preserving the
# current repo-local wrapper strategy around it.
wemeetBase = args."pkgs-stable".wemeet;
# Keep upstream Wemeet resources and desktop entry, but replace the default
# launcher with the hybrid route validated under niri:
# XWayland startup + Mesa EGL + Wayland portal/PipeWire screenshare backend.
wemeet = pkgs.symlinkJoin {
name = "wemeet";
paths = [ wemeetBase ];
nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = ''
rm -f $out/bin/wemeet
displayProbe='if [ -z "''${DISPLAY-}" ]; then
for x_sock in /tmp/.X11-unix/X*; do
if [ -S "$x_sock" ]; then
export DISPLAY=":''${x_sock##*/X}"
break
fi
done
fi'
makeWrapper ${wemeetBase}/bin/wemeet-xwayland $out/bin/wemeet \
--run "$displayProbe" \
--set __EGL_VENDOR_LIBRARY_FILENAMES ${pkgs.mesa}/share/glvnd/egl_vendor.d/50_mesa.json
'';
};
in
{
home.packages = [
wemeet
];
}
里面还配置了优先用 Mesa 的 EGL(应该和 NVIDIA 显卡的渲染问题有关),我的设备不这样配会导致 wemeet 崩溃。
总之最后能看到别人共享的屏幕了,自己也能共享,而且之前的绿色窗口也消失了,算是意外之喜 ^-^

这套方案我用了几天算是比较稳了,逃离Windows指日可待 ^-^