{ lib, newScope, makeDesktopItem, writeShellScriptBin, }: lib.makeScope newScope (self: { # Scope-level configuration for adapters useSessionUnits = true; # use --user units, instead of system units vmUnitPrefix = "uvm@"; vmSshPrefix = if self.useSessionUnits then "uuvm/" else "uvm/"; vmUser = "user"; waylandProxyUnit = "wayland-proxy.service"; # could be sommelier oomScoreAdjust = -200; # Helper scripts mkRunInVM = vmName: lib.getExe (self.mkRunInVMPkg vmName); mkRunInVMPkg = vmName: writeShellScriptBin "run-in-${vmName}" '' localArgs=( ${lib.optionalString self.useSessionUnits "--user"} --property=Requires=${self.vmUnitPrefix}${vmName}.service --property=After=${self.vmUnitPrefix}${vmName}.service --property=SyslogIdentifier="$1 (${vmName})" ) remoteArgs=( systemd-run --user --property=StandardError="journal+console" --property=StandardOutput="journal+console" --property=OOMScoreAdjust=${toString self.oomScoreAdjust} ${lib.optionalString (self.waylandProxyUnit != null) '' --property=Requires=${self.waylandProxyUnit} --property=After=${self.waylandProxyUnit} ''} ) systemd-run \ "''${localArgs[@]}" \ ssh ${self.vmUser}@${self.vmSshPrefix}${vmName} \ "''${remoteArgs[@]}" $@ ''; # Actual .desktop item adapters toVM = vmName: attrs: attrs // { exec = "${self.mkRunInVM vmName} ${attrs.exec}"; }; toBrowser = attrs: attrs // { categories = attrs.categories or [ ] ++ [ "WebBrowser" "Network" ]; mimeTypes = attrs.mimeTypes or [ ] ++ [ "x-scheme-handler/http" "x-scheme-handler/https" ]; }; })