From 9dfc3f9613df4ddb639a23c75feb3f3399b01aed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Fri, 15 Dec 2023 12:53:53 +0100 Subject: [PATCH] add wayland-proxy-virtwl module --- checks/flake-module.nix | 1 + checks/wayland-proxy-virtwl/default.nix | 29 +++++++++++++ nixosModules/clanCore/default.nix | 1 + .../clanCore/wayland-proxy-virtwl.nix | 43 +++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 checks/wayland-proxy-virtwl/default.nix create mode 100644 nixosModules/clanCore/wayland-proxy-virtwl.nix diff --git a/checks/flake-module.nix b/checks/flake-module.nix index 3096fefa..4b11ce1b 100644 --- a/checks/flake-module.nix +++ b/checks/flake-module.nix @@ -19,6 +19,7 @@ meshnamed = import ./meshnamed nixosTestArgs; borgbackup = import ./borgbackup nixosTestArgs; syncthing = import ./syncthing nixosTestArgs; + wayland-proxy-virtwl = import ./wayland-proxy-virtwl nixosTestArgs; }; schemaTests = pkgs.callPackages ./schemas.nix { inherit self; diff --git a/checks/wayland-proxy-virtwl/default.nix b/checks/wayland-proxy-virtwl/default.nix new file mode 100644 index 00000000..1b0c6cd0 --- /dev/null +++ b/checks/wayland-proxy-virtwl/default.nix @@ -0,0 +1,29 @@ +import ../lib/test-base.nix ({ config, pkgs, lib, ... }: { + name = "wayland-proxy-virtwl"; + + nodes.machine = { self, ... }: { + imports = [ + self.nixosModules.clanCore + { + clanCore.machineName = "machine"; + clanCore.clanDir = ./.; + } + ]; + services.wayland-proxy-virtwl.enable = true; + + virtualisation.qemu.options = [ + "-vga none -device virtio-gpu-rutabaga,cross-domain=on,hostmem=4G,wsi=headless" + ]; + virtualisation.qemu.package = lib.mkForce self.packages.${pkgs.hostPlatform.system}.qemu-wayland; + }; + # FIXME: currently we still see this error in the build sandbox, + # but it gives us some smoke test + # vm-test-run-wayland-proxy-virtwl> machine # qemu-kvm: The errno is ENOENT: No such file or directory + # vm-test-run-wayland-proxy-virtwl> machine # qemu-kvm: CHECK failed in rutabaga_cmd_submit_3d() ../hw/display/virtio-gpu-rutabaga.c:341 + # vm-test-run-wayland-proxy-virtwl> machine # qemu-kvm: virtio_gpu_rutabaga_process_cmd: ctrl 0x207, error 0x1200 + testScript = '' + start_all() + # use machinectl + machine.succeed("machinectl shell .host ${config.nodes.machine.systemd.package}/bin/systemctl --user start wayland-proxy-virtwl >&2") + ''; +}) diff --git a/nixosModules/clanCore/default.nix b/nixosModules/clanCore/default.nix index 220fad60..725ae9da 100644 --- a/nixosModules/clanCore/default.nix +++ b/nixosModules/clanCore/default.nix @@ -12,6 +12,7 @@ ./schema.nix ./secrets ./vm.nix + ./wayland-proxy-virtwl.nix ./zerotier ]; } diff --git a/nixosModules/clanCore/wayland-proxy-virtwl.nix b/nixosModules/clanCore/wayland-proxy-virtwl.nix new file mode 100644 index 00000000..ca79ed27 --- /dev/null +++ b/nixosModules/clanCore/wayland-proxy-virtwl.nix @@ -0,0 +1,43 @@ +{ pkgs, config, lib, ... }: +{ + options = { + # maybe upstream this? + services.wayland-proxy-virtwl = { + enable = lib.mkEnableOption "wayland-proxy-virtwl"; + package = lib.mkPackageOption pkgs "wayland-proxy-virtwl" { }; + }; + }; + config = lib.mkIf config.services.wayland-proxy-virtwl.enable { + programs.xwayland.enable = lib.mkDefault true; + environment.etc."X11/xkb".source = config.services.xserver.xkb.dir; + + environment.sessionVariables = { + WAYLAND_DISPLAY = "wayland-1"; + DISPLAY = ":0"; + QT_QPA_PLATFORM = "wayland"; # Qt Applications + GDK_BACKEND = "wayland"; # GTK Applications + XDG_SESSION_TYPE = "wayland"; # Electron Applications + SDL_VIDEODRIVER = "wayland"; + CLUTTER_BACKEND = "wayland"; + }; + + # Is there a better way to do this? + programs.bash.loginShellInit = '' + if [ "$(tty)" = "/dev/ttyS0" ]; then + systemctl --user start graphical-session.target + fi + ''; + + systemd.user.services.wayland-proxy-virtwl = { + description = "Wayland proxy for virtwl"; + before = [ "graphical-session.target" ]; + wantedBy = [ "graphical-session.target" ]; + serviceConfig = { + Type = "simple"; + ExecStart = "${config.services.wayland-proxy-virtwl.package}/bin/wayland-proxy-virtwl --virtio-gpu --x-display=0 --xwayland-binary=${pkgs.xwayland}/bin/Xwayland"; + Restart = "always"; + RestartSec = 5; + }; + }; + }; +}