{ lib, config, pkgs, flake, ... }: let psCfg = config.pub-solar; inherit (lib) mkIf mkOption types; in { options.pub-solar.graphical = { v4l2loopback.enable = mkOption { type = types.bool; default = false; description = "WebCam streaming tool"; }; }; config = { boot = mkIf psCfg.graphical.v4l2loopback.enable { extraModulePackages = with config.boot.kernelPackages; [ v4l2loopback ]; kernelModules = [ "v4l2loopback" ]; extraModprobeConfig = '' options v4l2loopback exclusive_caps=1 devices=3 ''; }; environment.systemPackages = mkIf psCfg.graphical.v4l2loopback.enable [ pkgs.linuxPackages.v4l2loopback ]; programs.sway.enable = true; xdg.portal = { enable = true; config.sway = { # https://alex.dandrea.io/2024/07/20/fixing-idle-inhibitor-behaviour-in-firefox-with-wayland/ # Use xdg-desktop-portal-gtk for every portal interface... default = "gtk"; # ... except for the ScreenCast, Screenshot and Secret "org.freedesktop.impl.portal.ScreenCast" = "wlr"; "org.freedesktop.impl.portal.Screenshot" = "wlr"; # ignore inhibit bc gtk portal always returns as success, # despite sway/the wlr portal not having an implementation, # stopping firefox from using wayland idle-inhibit "org.freedesktop.impl.portal.Inhibit" = "none"; }; wlr = { enable = true; settings = { screencast = { max_fps = 30; chooser_type = "simple"; chooser_cmd = "${pkgs.slurp}/bin/slurp -f %o -or"; }; }; }; extraPortals = with pkgs; [ xdg-desktop-portal-gtk ]; }; services.pipewire.enable = true; users.users."${psCfg.user.name}".packages = with pkgs; [ sway grim kanshi slurp swaybg swayidle swaynotificationcenter xwayland libappindicator-gtk3 wl-clipboard wl-mirror wf-recorder brightnessctl gammastep geoclue2 xsettingsd ydotool sway-launcher record-screen import-gtk-settings # Unused on teutat3s hosts, see custom-keybindings.conf #toggle-kbd-layout s wcwd ]; home-manager.users."${psCfg.user.name}" = { imports = [ flake.self.inputs.wayland-pipewire-idle-inhibit.homeModules.default ]; services.wayland-pipewire-idle-inhibit = { enable = true; package = pkgs.wayland-pipewire-idle-inhibit; systemdTarget = "sway-session.target"; settings = { verbosity = "INFO"; media_minimum_duration = 10; idle_inhibitor = "wayland"; sink_whitelist = [ { name = "Starship/Matisse HD Audio Controller Analog Stereo"; } { name = "Built-in Audio Analog Stereo"; } { name = "MAJOR III BLUETOOTH"; } ]; node_blacklist = [ { name = "spotify"; } { app_name = "Music Player Daemon"; } ]; }; }; programs.waybar.enable = true; #programs.waybar.systemd.enable = true; systemd.user.services.swaynotificationcenter = import ./swaynotificationcenter.service.nix pkgs; systemd.user.services.sway = import ./sway.service.nix { inherit pkgs psCfg; }; systemd.user.services.swayidle = import ./swayidle.service.nix { inherit pkgs psCfg; }; systemd.user.services.xsettingsd = import ./xsettingsd.service.nix { inherit pkgs psCfg; }; systemd.user.services.waybar = import ./waybar.service.nix { inherit pkgs psCfg; }; systemd.user.targets.sway-session = import ./sway-session.target.nix { inherit pkgs psCfg; }; xdg.configFile."sway/config".text = import ./config/config.nix { inherit config pkgs; }; xdg.configFile."sway/config.d/colorscheme.conf".source = ./config/config.d/colorscheme.conf; xdg.configFile."sway/config.d/theme.conf".source = ./config/config.d/theme.conf; xdg.configFile."sway/config.d/gaps.conf".source = ./config/config.d/gaps.conf; xdg.configFile."sway/config.d/custom-keybindings.conf".source = ./config/config.d/custom-keybindings.conf; xdg.configFile."sway/config.d/mode_system.conf".text = import ./config/config.d/mode_system.conf.nix { inherit pkgs psCfg; }; xdg.configFile."sway/config.d/applications.conf".source = ./config/config.d/applications.conf; xdg.configFile."sway/config.d/systemd.conf".source = ./config/config.d/systemd.conf; }; }; }