I’ve been trying to get screen sharing working with swaywm.
It’s still not working.
Can you share, if successful, your config?
- xdg portals
- environment variables
- dbus?
- what in HM vs NixOS
I’ve tested with:
- jitsi-meet
- firefox: gUM Test Page
I’ve been trying to get screen sharing working with swaywm.
It’s still not working.
Can you share, if successful, your config?
I’ve tested with:
Can you share your configuration? We can help better if we see what you’re doing.
I use this configuration:
{
programs.sway = {
enable = true;
wrapperFeatures.gtk = true;
};
xdg.portal = {
enable = true;
wlr = {
enable = true;
settings.screencast.max_fps = 30;
};
};
}
I believe you also need pkgs.sway-contrib.grimshot, but it’s been a while.
You will also need a wayland-native browser. Many electron-based “apps” don’t support this yet, so make sure you’re testing this in a fully featured browser.
I think that’s if you want to pick slurp as your chooser. In my configuration, I opt to use fuzzel:
xdg.portal = {
enable = true;
wlr = {
enable = true;
settings = {
screencast = {
max_fps = 30;
chooser_type = "dmenu";
chooser_cmd = "${pkgs.fuzzel}/bin/fuzzel --dmenu --prompt \"share> \"";
exec_before = "${pkgs.swaynotificationcenter}/bin/swaync-client -dnd-on";
exec_after = "${pkgs.swaynotificationcenter}/bin/swaync-client -dnd-off";
};
};
};
};
I tried the above, but it didn’t work.
{
config,
lib,
pkgs,
...
}:
let
cfg = config.ncfg.sway;
wayrecorder = import ./wayrecorder.nix { inherit pkgs; };
color-picker = pkgs.writeShellScriptBin "color-picker" ''
color=$(${pkgs.grim}/bin/grim -t png -g "$(${pkgs.slurp}/bin/slurp -p)" - | ${pkgs.imagemagick}/bin/convert png:- -unique-colors txt:- | grep -o '#[A-F0-9]\+')
${notify-send} "Color:" "<span color='$color' font='26px'><i><b>$color</b></i></span>"
${swaymsg} exec -- "echo -n '$color' | ${pkgs.wl-clipboard}/bin/wl-copy --foreground"
'';
# change output scales incrementally w/ kb shortcuts
outputScale = pkgs.writeShellScript "scale-wlr-outputs.sh" ''
set -xeuo pipefail
delta=''${1}
scale="$(${swaymsg} -t get_outputs | ${pkgs.jq}/bin/jq '.[] | select(.focused == true) | .scale')"
printf -v scale "%.1f" "''${scale}"
scale="$(echo "''${scale} ''${delta}" | ${pkgs.bc}/bin/bc)"
swaymsg output "-" scale "''${scale}"
'';
brightnessctl = "${pkgs.brightnessctl}/bin/brightnessctl";
grimshot = "${pkgs.sway-contrib.grimshot}/bin/grimshot";
swaylock-with-wallpaper = "${pkgs.lun.swaylock-with-wallpaper}/bin/swaylock-with-wallpaper";
notify-send = "${pkgs.libnotify}/bin/notify-send";
pamixer = "${pkgs.pamixer}/bin/pamixer";
sed = "${pkgs.gnused}/bin/sed";
swaymsg = "${pkgs.sway}/bin/swaymsg";
rofi = "${pkgs.rofi}/bin/rofi";
xdg-user-dir = "${pkgs.xdg-user-dirs}/bin/xdg-user-dir";
in
{
imports = [
./waybar
./gammastep.nix
./greeter.nix
./swayidle.nix
./swaync.nix
./ydotool.nix # xdotool or autokey or autohotkey for wayland
../../sound.nix
../../theme
../../xdg.nix
];
options.ncfg.sway = {
transform = lib.mkOption {
type = lib.types.nullOr (
lib.types.enum [
"normal"
"90"
"180"
"270"
"flipped"
"flipped-90"
"flipped-180"
"flipped-270"
]
);
default = null;
example = "90";
description = ''
Sets the output transform, content rotates clock-wise.
'';
};
background = lib.mkOption { default = "#000000 solid_color"; };
startup = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
};
extraConfig = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ "" ];
};
extraKeybindings = lib.mkOption {
type = lib.types.attrs;
default = { };
description = "additional sway keybindings";
};
unsupported-gpu = lib.mkOption { default = false; };
hideCursor = lib.mkEnableOption "Hide the cursor after a timeout";
};
config = lib.mkIf (config.ncfg.graphical == "sway") {
ncfg = {
sound.enable = lib.mkDefault true;
wayland.swaync.enable = lib.mkDefault true;
wayland.waybar.enable = lib.mkDefault true;
programs.terminal.enable = lib.mkDefault true;
programs.wshowkeys.enable = lib.mkDefault true;
};
programs.sway = {
enable = true;
wrapperFeatures.gtk = true;
extraOptions = lib.optionals cfg.unsupported-gpu [ "--unsupported-gpu" ];
extraPackages = [ ];
};
xdg.portal = {
enable = true;
wlr = {
enable = true;
settings.screencast = {
max_fps = 30;
chooser_type = "dmenu";
chooser_cmd = "${pkgs.fuzzel}/bin/fuzzel --dmenu --prompt \"share> \"";
exec_before = "${pkgs.swaynotificationcenter}/bin/swaync-client -dnd-on";
exec_after = "${pkgs.swaynotificationcenter}/bin/swaync-client -dnd-off";
};
};
};
services.pipewire = {
enable = true;
alsa.enable = true;
pulse.enable = true;
};
# Enables Gnome Keyring to store secrets for applications.
services.gnome.gnome-keyring.enable = true;
# # In order to unlock the keyring through logins from greeters and screen locking utilities you will need to enable them through PAM.
# security.pam.services = {
# greetd.enableGnomeKeyring = true;
# swaylock.enableGnomeKeyring = true;
# # If using a display manager such as GDM
# #gdm.enableGnomeKeyring = true;
# };
# # security.pam.services.swaylock = { }; # Necessary for swaylock to actually unlock.
# # Enabling realtime may improve latency and reduce stuttering, specially in high load scenarios.
# # Enabling this option allows any program run by the "users" group to request real-time priority.
# security.pam.loginLimits = [
# {
# domain = "@users";
# item = "rtprio";
# type = "-";
# value = 1;
# }
# ];
services.systemd-lock-handler.enable = true;
systemd.services.audio-off = {
description = "Mute audio before suspend";
wantedBy = [ "sleep.target" ];
serviceConfig = {
Type = "oneshot";
Environment = "XDG_RUNTIME_DIR=/run/user/1000";
User = "${config.ncfg.primaryUserName}";
RemainAfterExit = "yes";
ExecStart = "${pamixer} --mute";
};
};
services.systembus-notify.enable = true;
environment.systemPackages = [
pkgs.lun.swaylock-with-wallpaper
pkgs.libnotify # Show notifications (notify-send)
pkgs.wl-clipboard # Clipboard utility (wl-copy)
pkgs.wl-mirror # (wl-mirror ; wl-present)
pkgs.rofi
pkgs.bemenu # better dmenu
pkgs.slurp
pkgs.sway-contrib.grimshot
];
users.users.${config.ncfg.primaryUserName}.extraGroups = [
"input"
"video"
];
home-manager.users.${config.ncfg.primaryUserName} =
{ pkgs, ... }:
{
home.pointerCursor = {
name = "${config.ncfg.theme.cursor.name}";
package = pkgs.adwaita-icon-theme;
size = config.ncfg.theme.cursor.size;
x11 = {
enable = true;
defaultCursor = "${config.ncfg.theme.cursor.name}";
};
sway.enable = true;
};
home.keyboard = null;
home.packages = with pkgs; [
color-picker # Script
wayrecorder # Script
pkgs.glib
pkgs.app2unit
pkgs.xdg-terminal-exec
pkgs.rofi
wf-recorder
sway-contrib.grimshot # Screenshots
grim # Screenshot utility
slurp # Select an area
wl-clipboard # Clipboard utility (wl-copy)
wl-mirror
lm_sensors
gnome-calculator
pavucontrol # PulseAudio Volume Control
xcape # Configure modifier keys to act as other keys when pressed and released on their own
wdisplays # graphical output manager
qt5.qtwayland
waypipe # forward application over ssh / remote ssh gui application
clipman # clipboard manager for Wayland ; https://github.com/yory8/clipman/
];
xdg.userDirs.setSessionVariables = false; # 20260531 ; evaluation warning: The default value of `xdg.userDirs.setSessionVariables` has changed from `true` to `false`. You are currently using the legacy default (`true`) because `home.stateVersion` is less than "26.05". To silence this warning and keep legacy behavior, set: xdg.userDirs.setSessionVariables = true; To adopt the new default behavior, set: xdg.userDirs.setSessionVariables = false;
xdg.configFile."swaynag/config".text =
let
# adding it to the header doesn’t work since the defaults overwrite it
commonConfig =
# ini
''
background=fdf6e3
border-bottom=eee8d5
border=eee8d5
button-background=fdf6e3
button-text=657b83
'';
in
# ini
''
font=Monospace 12
[warning]
text=b58900
${commonConfig}
[error]
text=dc322f
${commonConfig}
'';
wayland.windowManager.sway = {
enable = true;
package = null;
# # NixOS also has a file in `/etc/sway/config.d` that performs the
# # equivalent of what enabling this `home-manager` option does.
# systemdIntegration = true;
extraConfig = lib.concatStringsSep "\n" ([ "default_border pixel 1" ] ++ cfg.extraConfig);
config = rec {
modifier = "Mod4"; # CapsLock during colemak
left = if config.ncfg.colemak then "j" else "h";
down = if config.ncfg.colemak then "k" else "j";
up = if config.ncfg.colemak then "h" else "k";
right = if config.ncfg.colemak then "l" else "l";
terminal = config.ncfg.programs.terminal.default;
menu = "${rofi} -terminal ${terminal} -show combi -combi-modes 'window,drun,run,ssh' -modes combi -show-icons -icon-theme Paper";
modes = { }; # Unset default "resize" mode
defaultWorkspace = "workspace number 1";
assigns = {
"1" = [ { app_id = "w.one"; } ];
"2" = [ { app_id = "w.two"; } ];
"3" = [ { app_id = "w.three"; } ];
"4" = [ { app_id = "w.four"; } ];
"5" = [ { app_id = "w.five"; } ];
"6" = [ { app_id = "w.six"; } ];
"7" = [ { app_id = "w.seven"; } ];
"8" = [ { app_id = "w.eight"; } ];
"9" = [ { app_id = "w.nine"; } ];
};
floating = {
border = 4;
titlebar = true;
criteria = [
{ "title" = "LibreWolf - Sharing Indicator"; }
{ "title" = "LibreWolf - Choose User Profile"; }
{ "title" = "Firefox - Sharing Indicator"; }
{ "title" = "Firefox - Choose User Profile"; }
{
"app_id" = "firefox";
"title" = "^About Mozilla Firefox$";
}
{
"app_id" = "firefox";
"title" = "Picture-in-Picture";
}
{
"app_id" = "firefox";
"title" = "Password Required";
}
{
"app_id" = "thunderbird";
"title" = "Password Required";
}
{
"app_id" = "librewolf";
"title" = "Extension:.*";
}
{ "class" = "qemu"; }
{ "app_id" = "xdg-desktop-portal-gtk"; }
{ "app_id" = "org.keepassxc.KeePassXC"; }
{ "app_id" = "pavucontrol"; }
{ "app_id" = "nm-connection-editor"; }
{ "app_id" = ".blueman-manager-wrapped"; }
{ "app_id" = "eog"; }
{ "app_id" = "imv"; }
{ "class" = "feh"; }
{ "class" = "Nsxiv"; }
];
};
fonts = {
names = [ "${config.ncfg.theme.fontmono.name}" ];
size = 9.0;
style = "Normal";
};
bars = if (!config.ncfg.wayland.waybar.enable) then [ ] else [ { command = "waybar"; } ];
output = {
"*" = {
bg = "${cfg.background}";
}
// lib.optionalAttrs (cfg.transform != null) { inherit (cfg) transform; };
};
startup = [
{
always = true;
command = "${pkgs.systemd}/bin/systemd-notify --ready || true";
}
{
always = true;
command = "touch $SWAYSOCK.wob && tail -n0 -f $SWAYSOCK.wob | ${pkgs.wob}/bin/wob";
}
]
++ lib.optionals (cfg.startup != null) [
{
always = true;
command = "${cfg.startup}";
}
];
window = {
border = 1;
titlebar = true;
commands = [
{
criteria.app_id = "chrome-localhost__tv_countdown-Default";
command = "border none";
}
{
criteria.app_id = "chrome-localhost__tv_scale-Default";
command = "border none";
}
{
criteria.app_id = "helix";
command = "border pixel 2, opacity 0.90";
}
{
criteria.app_id = "yazi";
command = "border pixel 2, opacity 0.90";
}
{
criteria.app_id = "foot";
command = "border pixel 2, opacity 0.90";
}
{
criteria.app_id = "kitty";
command = "border pixel 2, opacity 0.90";
}
{
criteria.app_id = "alacritty";
command = "border pixel 2, opacity 0.90";
}
{
criteria.app_id = "ghostty";
command = "border pixel 2, opacity 0.90";
}
{
criteria.window_role = "popup";
command = "border pixel 2px";
}
{
criteria.instance = "pinentry";
command = "sticky enable";
}
];
};
input = {
"*" = {
xkb_numlock = "enable";
};
"type:keyboard" = {
xkb_layout = "us";
repeat_delay = "300";
repeat_rate = "35";
}
// lib.optionalAttrs config.ncfg.colemak {
xkb_options = "eurosign:5,shift:both_capslock,altwin:alt_win,caps:super";
xkb_variant = "colemak";
};
};
seat = {
"*" = lib.optionalAttrs cfg.hideCursor { hide_cursor = "8000"; };
};
keybindings = {
### Audio Volume Controls (Sink - Output)
"XF86AudioMute" =
''exec ${pamixer} --toggle-mute && ( [ "$(${pamixer} --get-mute)" = "true" ] && echo 0 > $SWAYSOCK.wob ) || ${pamixer} --get-volume > $SWAYSOCK.wob''; # fn+F1 c:121 XF86AudioMute
"XF86AudioLowerVolume" =
"exec ${pamixer} --allow-boost --unmute --decrease 2 && ${pamixer} --get-volume > $SWAYSOCK.wob"; # fn+F2 c:122 XF86AudioLowerVolume
"XF86AudioRaiseVolume" =
"exec ${pamixer} --allow-boost --unmute --increase 2 && ${pamixer} --get-volume > $SWAYSOCK.wob"; # fn+F3 c:123 XF86AudioRaiseVolume
### Microphone Volume Control (Source - Input)
"Shift+XF86AudioLowerVolume" =
"exec ${pamixer} --default-source --allow-boost --unmute --decrease 2 && ${pamixer} --default-source --get-volume > $SWAYSOCK.wob"; # fn+F2 c:122 XF86AudioLowerVolume
"Shift+XF86AudioRaiseVolume" =
"exec ${pamixer} --default-source --allow-boost --unmute --increase 2 && ${pamixer} --default-source --get-volume > $SWAYSOCK.wob"; # fn+F3 c:123 XF86AudioRaiseVolume
"XF86AudioMicMute" =
''exec ${pamixer} --default-source --toggle-mute && ( [ "$(${pamixer} --default-source --get-mute)" = "true" ] && echo 0 > $SWAYSOCK.wob ) || ${pamixer} --default-source --get-volume > $SWAYSOCK.wob''; # fn+F4 c:198 XF86AudioMicMute
### Brightness Controls
"XF86MonBrightnessDown" =
''exec ${brightnessctl} set 5%- | ${sed} -En 's/.*\(([0-9]+)%\).*/\1/p' > $SWAYSOCK.wob''; # fn+F5 c:232 XF86MonBrightnessDown
"XF86MonBrightnessUp" =
''exec ${brightnessctl} set +5% | ${sed} -En 's/.*\(([0-9]+)%\).*/\1/p' > $SWAYSOCK.wob''; # fn+F6 c:233 XF86MonBrightnessUp
"XF86Display" = "exec ${lib.getExe' pkgs.wl-mirror "wl-present"} mirror"; # fn+F7 c:235 XF86Display
## fn+F8 c:246 XF86WLAN
"XF86Favorites" = "exec ${lib.getExe' pkgs.wl-mirror "wl-present"} set-region"; # fn+F12 c:164 XF86Favorites
"XF86Calculator" = "exec gnome-calculator";
"XF86HomePage" = "exec firefox";
## Screenshot
"Print" =
"exec ${grimshot} --notify save screen $(${xdg-user-dir} PICTURES)/screenshot_$(hostname)_$(TZ=utc date +'%Y-%m-%d-%H%M%S.%3N.png')"; # All visible outputs
"Shift+Print" =
"exec ${grimshot} --notify save area $(${xdg-user-dir} PICTURES)/screenshot_$(hostname)_$(TZ=utc date +'%Y-%m-%d-%H%M%S.%3N.png')"; # Manually select a region
"Alt+Print" =
"exec ${grimshot} --notify save active $(${xdg-user-dir} PICTURES)/screenshot_$(hostname)_$(TZ=utc date +'%Y-%m-%d-%H%M%S.%3N.png')"; # Currently active window
"Shift+Alt+Print" =
"exec ${grimshot} --notify save window $(${xdg-user-dir} PICTURES)/screenshot_$(hostname)_$(TZ=utc date +'%Y-%m-%d-%H%M%S.%3N.png')"; # Manually select a window
"Ctrl+Print" = "exec ${grimshot} --notify copy screen";
"Ctrl+Shift+Print" = "exec ${grimshot} --notify copy area";
"Ctrl+Alt+Print" = "exec ${grimshot} --notify copy active";
"Ctrl+Shift+Alt+Print" = "exec ${grimshot} --notify copy window";
## Screen recording
"${modifier}+Print" = "exec wayrecorder --notify screen";
"${modifier}+Shift+Print" = "exec wayrecorder --notify --input area";
"${modifier}+Alt+Print" = "exec wayrecorder --notify --input active";
"${modifier}+Shift+Alt+Print" = "exec wayrecorder --notify --input window";
"${modifier}+Ctrl+Print" = "exec wayrecorder --notify --clipboard --input screen";
"${modifier}+Ctrl+Shift+Print" = "exec wayrecorder --notify --clipboard --input area";
"${modifier}+Ctrl+Alt+Print" = "exec wayrecorder --notify --clipboard --input active";
"${modifier}+Ctrl+Shift+Alt+Print" = "exec wayrecorder --notify --clipboard --input window";
"${modifier}+Escape" = "exec ${swaylock-with-wallpaper}";
"${modifier}+Shift+Escape" = "exec ${swaylock-with-wallpaper}";
# Exit sway (logs you out of your Wayland session)
"${modifier}+Shift+F1" =
"exec ${pkgs.sway}/bin/swaynag -t warning -f 'Myosevka Proportional' -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' '${swaymsg} exit'";
# reload waybar
"${modifier}+Shift+F2" = "reload";
"${modifier}+Shift+minus" = "exec ${outputScale} -.1";
"${modifier}+Shift+equal" = "exec ${outputScale} +.1";
"${modifier}+Shift+Ctrl+minus" = "move scratchpad";
"${modifier}+Shift+Ctrl+equal" = "scratchpad show";
"${modifier}+Space" = "exec ${terminal}";
"${modifier}+Shift+Space" = "exec alacritty";
"${modifier}+Ctrl+Space" = "exec kitty";
"${modifier}+Shift+Ctrl+Space" = "exec ghostty";
"${modifier}+y" = "exec ghostty -e 'yazi'";
"${modifier}+n" = "exec swaync-client --toggle-panel --skip-wait"; # SwayNotificationCenter
"${modifier}+Shift+n" = "exec swaync-client --close-all --skip-wait"; # SwayNotificationCenter
"${modifier}+Shift+q" = "kill";
"${modifier}+Shift+Return" = "floating toggle";
"${modifier}+Return" = "focus mode_toggle";
"${modifier}+${left}" = "focus left";
"${modifier}+${down}" = "focus down";
"${modifier}+${up}" = "focus up";
"${modifier}+${right}" = "focus right";
"${modifier}+Left" = "focus left";
"${modifier}+Down" = "focus down";
"${modifier}+Up" = "focus up";
"${modifier}+Right" = "focus right";
"${modifier}+Shift+${left}" = "move left";
"${modifier}+Shift+${down}" = "move down";
"${modifier}+Shift+${up}" = "move up";
"${modifier}+Shift+${right}" = "move right";
"${modifier}+Shift+Left" = "move left";
"${modifier}+Shift+Down" = "move down";
"${modifier}+Shift+Up" = "move up";
"${modifier}+Shift+Right" = "move right";
"${modifier}+a" = "workspace back_and_forth";
"${modifier}+Prior" = "workspace prev"; # PgUp
"${modifier}+Next" = "workspace next"; # PgDown
"${modifier}+Alt+${left}" = "workspace prev";
"${modifier}+Alt+${right}" = "workspace next";
"${modifier}+Alt+Left" = "workspace prev";
"${modifier}+Alt+Right" = "workspace next";
# Move whole workspace to other output
"${modifier}+Ctrl+${left}" = "move workspace to output left";
"${modifier}+Ctrl+${down}" = "move workspace to output down";
"${modifier}+Ctrl+${up}" = "move workspace to output up";
"${modifier}+Ctrl+${right}" = "move workspace to output right";
"${modifier}+Ctrl+Left" = "move workspace to output left";
"${modifier}+Ctrl+Down" = "move workspace to output down";
"${modifier}+Ctrl+Up" = "move workspace to output up";
"${modifier}+Ctrl+Right" = "move workspace to output right";
"${modifier}+1" = "workspace number 1";
"${modifier}+2" = "workspace number 2";
"${modifier}+3" = "workspace number 3";
"${modifier}+4" = "workspace number 4";
"${modifier}+5" = "workspace number 5";
"${modifier}+6" = "workspace number 6";
"${modifier}+7" = "workspace number 7";
"${modifier}+8" = "workspace number 8";
"${modifier}+9" = "workspace number 9";
"${modifier}+0" = "workspace number 10";
"${modifier}+Shift+1" = "move container to workspace number 1";
"${modifier}+Shift+2" = "move container to workspace number 2";
"${modifier}+Shift+3" = "move container to workspace number 3";
"${modifier}+Shift+4" = "move container to workspace number 4";
"${modifier}+Shift+5" = "move container to workspace number 5";
"${modifier}+Shift+6" = "move container to workspace number 6";
"${modifier}+Shift+7" = "move container to workspace number 7";
"${modifier}+Shift+8" = "move container to workspace number 8";
"${modifier}+Shift+9" = "move container to workspace number 9";
"${modifier}+Shift+0" = "move container to workspace number 10";
}
// cfg.extraKeybindings
// lib.optionalAttrs config.ncfg.colemak {
"${modifier}+r" = "mode resize"; # ??? or resize mode
"${modifier}+u" = "focus parent";
"${modifier}+t" = "fullscreen toggle";
"${modifier}+d" = "splith";
"${modifier}+v" = "splitv";
"${modifier}+w" = "layout toggle split";
"${modifier}+f" = "layout stacking";
"${modifier}+p" = "layout tabbed";
"${modifier}+o" = "inhibit_idle open; border normal; mark --add inhibiting_idle";
"${modifier}+Shift+o" = "inhibit_idle none; border pixel; unmark inhibiting_idle";
"${modifier}+s" = "exec ${menu}";
}
// lib.optionalAttrs (!config.ncfg.colemak) {
"${modifier}+s" = "mode resize"; # ??? or resize mode
"${modifier}+i" = "focus parent";
"${modifier}+f" = "fullscreen toggle";
"${modifier}+g" = "splith";
"${modifier}+v" = "splitv";
"${modifier}+w" = "layout toggle split";
"${modifier}+e" = "layout stacking";
"${modifier}+r" = "layout tabbed";
"${modifier}+;" = "inhibit_idle open; border normal; mark --add inhibiting_idle";
"${modifier}+Shift+;" = "inhibit_idle none; border pixel; unmark inhibiting_idle";
"${modifier}+u" = "workspace prev";
"${modifier}+o" = "workspace next";
"${modifier}+d" = "exec ${menu}";
};
};
};
};
};
}
Phew, holy mother of LLM generation.
Anyway, if you open up a terminal and run journalctl --user -f, and then attempt to screenshare, do you get anything useful in your logs?
It’s not generated by an LLM. It’s been years of searching other peoples configs.
The mozilla testpage didn’t add any lines.
jitsi-meet did.
❯ journalctl --user -f
Jul 11 08:51:42 myhost sway[39124]: warning(glib): WARNING: Gtk: GtkGizmo 0x62480b54edf0 (slider) reported min width -2, but sizes must be >= 0
Jul 11 08:51:42 myhost sway[39124]: warning(glib): WARNING: Gtk: GtkGizmo 0x62480b54d3d0 (slider) reported min height -2, but sizes must be >= 0
Jul 11 08:51:42 myhost sway[39124]: info(opengl): loaded OpenGL 4.6
Jul 11 08:51:42 myhost sway[39124]: info(io_exec): found Ghostty resources dir: /nix/store/gyz4afkwpk121my9fp8lqb54hahw8k6w-ghostty-1.3.2-dev+c41c6b8-nix/share/ghostty
Jul 11 08:51:42 myhost sway[39124]: info(io_exec): shell integration automatically injected shell=.zsh
Jul 11 08:51:42 myhost sway[39124]: warning(gtk_ghostty_application): unimplemented action=.cell_size
Jul 11 08:51:42 myhost systemd[5710]: Started app-ghostty-surface-transient-258226.scope.
Jul 11 08:51:42 myhost sway[39124]: info(io_exec): started subcommand path=/bin/sh pid=258226
Jul 11 08:51:44 myhost sway[39124]: info(io_exec): pty fd closed, read thread exiting
Jul 11 08:51:44 myhost sway[39124]: info(surface): surface closed addr=62480b968340
Jul 11 08:53:10 myhost rofi[259019]: Failed to load image: |w.nine| 20 20 Failed to open file “w.nine”: No such file or directory ((nil))
Jul 11 08:53:10 myhost rofi[259019]: Failed to load image: |w.nine| 20 20 Failed to open file “w.nine”: No such file or directory ((nil))
Jul 11 08:53:10 myhost rofi[259019]: Failed to load image: |w.seven| 20 20 Failed to open file “w.seven”: No such file or directory ((nil))
Jul 11 08:53:10 myhost rofi[259019]: Failed to load image: |w.seven| 20 20 Failed to open file “w.seven”: No such file or directory ((nil))
Jul 11 08:53:10 myhost rofi[259019]: Failed to load image: |autojump_argparse.py| 20 20 Failed to open file “autojump_argparse.py”: No such file or directory ((nil))
Jul 11 08:53:12 myhost sway[259062]: 08:53:12.147 › APPIMAGE env is not defined, current application is not an AppImage
Jul 11 08:53:12 myhost sway[259062]: (electron) 'session.getAllExtensions' is deprecated and will be removed. Please use 'session.extensions.getAllExtensions' instead.
Jul 11 08:53:12 myhost sway[259062]: 08:53:12.223 › checkForUpdatesAndNotify called, downloadPromise is null
Jul 11 08:53:12 myhost systemd[5710]: Started app-jitsi-meet-259062.scope.
Jul 11 08:53:54 myhost sway[259062]: 2026-07-11T06:53:54.056Z [PIP] <new PictureInPictureMainHook>: PiP main process hook initialized
Jul 11 08:53:54 myhost pipewire-pulse[6941]: mod.protocol-pulse: setsockopt(SO_PRIORITY) failed: Bad file descriptor
Jul 11 08:53:54 myhost pipewire-pulse[6941]: mod.protocol-pulse: client 0x634829b93b10: no peercred: Bad file descriptor
Jul 11 08:53:54 myhost pipewire-pulse[6941]: mod.protocol-pulse: setsockopt(SO_PRIORITY) failed: Bad file descriptor
Jul 11 08:53:54 myhost pipewire-pulse[6941]: mod.protocol-pulse: client 0x634829ba8580: no peercred: Bad file descriptor
Jul 11 08:53:55 myhost pipewire-pulse[6941]: mod.protocol-pulse: setsockopt(SO_PRIORITY) failed: Bad file descriptor
Jul 11 08:53:55 myhost pipewire-pulse[6941]: mod.protocol-pulse: client 0x634829d39920: no peercred: Bad file descriptor
Jul 11 08:53:55 myhost pipewire-pulse[6941]: mod.protocol-pulse: setsockopt(SO_PRIORITY) failed: Bad file descriptor
Jul 11 08:53:55 myhost pipewire-pulse[6941]: mod.protocol-pulse: client 0x63482a32d0e0: no peercred: Bad file descriptor
Jul 11 08:53:55 myhost pipewire-pulse[6941]: mod.protocol-pulse: setsockopt(SO_PRIORITY) failed: Bad file descriptor
Jul 11 08:53:55 myhost pipewire-pulse[6941]: mod.protocol-pulse: client 0x63482ae2bbe0: no peercred: Bad file descriptor
Jul 11 08:54:00 myhost sway[259062]: 2026-07-11T06:54:00.958Z [PIP] <PictureInPictureMainHook._handlePipRequest>: Received PiP request from renderer, frameName: jitsiConferenceFrame0
Jul 11 08:54:00 myhost sway[259062]: 2026-07-11T06:54:00.958Z [PIP] <PictureInPictureMainHook._handlePipRequest>: Executing requestPictureInPicture script in iframe with userGesture: true
Jul 11 08:54:00 myhost sway[259062]: 2026-07-11T06:54:00.986Z [PIP] < at log (/nix/store/riv9cxblwamb9c9n70z4ar7w5nykryxd-jitsi-meet-electron-2026.5.0/share/jitsi-meet-electron/resources/app.asar/node_modules/>: PiP script executed successfully in iframe
Jul 11 08:54:04 myhost sway[259062]: [259062:0711/085404.695394:ERROR:third_party/webrtc/modules/desktop_capture/linux/wayland/screen_capture_portal_interface.cc:54] Failed to request session: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such interface “org.freedesktop.portal.ScreenCast” on object at path /org/freedesktop/portal/desktop
Jul 11 08:54:04 myhost sway[259062]: [259062:0711/085404.695446:ERROR:third_party/webrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc:96] ScreenCastPortal failed: 3
Jul 11 08:54:04 myhost sway[259062]: (node:259062) UnhandledPromiseRejectionWarning: Failed to get sources.
Jul 11 08:54:04 myhost sway[259062]: (Use `electron --trace-warnings ...` to show where the warning was created)
Jul 11 08:54:04 myhost sway[259062]: (node:259062) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
Jul 11 08:54:07 myhost sway[259062]: 2026-07-11T06:54:07.262Z [PIP] <PictureInPictureMainHook._handlePipRequest>: Received PiP request from renderer, frameName: jitsiConferenceFrame0
Jul 11 08:54:07 myhost sway[259062]: 2026-07-11T06:54:07.263Z [PIP] <PictureInPictureMainHook._handlePipRequest>: Executing requestPictureInPicture script in iframe with userGesture: true
Jul 11 08:54:07 myhost sway[259062]: 2026-07-11T06:54:07.265Z [PIP] < at log (/nix/store/riv9cxblwamb9c9n70z4ar7w5nykryxd-jitsi-meet-electron-2026.5.0/share/jitsi-meet-electron/resources/app.asar/node_modules/>: PiP script executed successfully in iframe
Jul 11 08:54:09 myhost sway[259062]: 2026-07-11T06:54:09.608Z [PIP] <PictureInPictureMainHook._handlePipRequest>: Received PiP request from renderer, frameName: jitsiConferenceFrame0
Jul 11 08:54:09 myhost sway[259062]: 2026-07-11T06:54:09.608Z [PIP] <PictureInPictureMainHook._handlePipRequest>: Executing requestPictureInPicture script in iframe with userGesture: true
Jul 11 08:54:09 myhost sway[259062]: 2026-07-11T06:54:09.610Z [PIP] < at log (/nix/store/riv9cxblwamb9c9n70z4ar7w5nykryxd-jitsi-meet-electron-2026.5.0/share/jitsi-meet-electron/resources/app.asar/node_modules/>: PiP script executed successfully in iframe
Jul 11 08:54:17 myhost sway[259062]: 2026-07-11T06:54:17.437Z [PIP] <PictureInPictureMainHook._handlePipRequest>: Received PiP request from renderer, frameName: jitsiConferenceFrame0
Jul 11 08:54:17 myhost sway[259062]: 2026-07-11T06:54:17.437Z [PIP] <PictureInPictureMainHook._handlePipRequest>: Executing requestPictureInPicture script in iframe with userGesture: true
Jul 11 08:54:17 myhost sway[259062]: 2026-07-11T06:54:17.440Z [PIP] < at log (/nix/store/riv9cxblwamb9c9n70z4ar7w5nykryxd-jitsi-meet-electron-2026.5.0/share/jitsi-meet-electron/resources/app.asar/node_modules/>: PiP script executed successfully in iframe
Fair enough, that kind of binary factoring is the hallmark of LLM code in the nix sphere. But then, I guess that’s because many people do that.
Hm, can you confirm that the wlr portal systemd unit is actually running?
If it is, I’d use busctl to explore the interface by hand and see if it’s set up correctly.