{ config, lib, pkgs, ... }: with lib; let cfg = config.services.xserver.desktopManager.surf-display; surfDisplayConf = '' # Surf Kiosk Display: Wrap around surf browser and turn your # system into a browser screen in KIOSK-mode. # default download URI for all display screens if not configured individually DEFAULT_WWW_URI="${cfg.defaultWwwUri}" # Enforce fixed resolution for all displays (default: not set): #DEFAULT_RESOLUTION="1920x1080" # HTTP proxy URL, if needed (default: not set). #HTTP_PROXY_URL="http://webcache:3128" # Setting for internal inactivity timer to restart surf-display # if the user goes inactive/idle. INACTIVITY_INTERVAL="${builtins.toString cfg.inactivityInterval}" # log to syslog instead of .xsession-errors LOG_TO_SYSLOG="yes" # Launch pulseaudio daemon if not already running. WITH_PULSEAUDIO="yes" # screensaver settings, see "man 1 xset" for possible options SCREENSAVER_SETTINGS="${cfg.screensaverSettings}" # disable right and middle pointer device click in browser sessions while keeping # scrolling wheels' functionality intact... (consider "pointer" subcommand on # xmodmap man page for details). POINTER_BUTTON_MAP="${cfg.pointerButtonMap}" # Hide idle mouse pointer. HIDE_IDLE_POINTER="${cfg.hideIdlePointer}" ${cfg.extraConfig} ''; in { options = { services.xserver.desktopManager.surf-display = { enable = mkEnableOption "surf-display as a kiosk browser session"; defaultWwwUri = mkOption { type = types.str; default = "${pkgs.surf-display}/share/surf-display/empty-page.html"; defaultText = literalExpression ''"''${pkgs.surf-display}/share/surf-display/empty-page.html"''; example = "https://www.example.com/"; description = lib.mdDoc "Default URI to display."; }; inactivityInterval = mkOption { type = types.int; default = 300; example = 0; description = lib.mdDoc '' Setting for internal inactivity timer to restart surf-display if the user goes inactive/idle to get a fresh session for the next user of the kiosk. If this value is set to zero, the whole feature of restarting due to inactivity is disabled. ''; }; screensaverSettings = mkOption { type = types.separatedString " "; default = ""; description = lib.mdDoc '' Screensaver settings, see `man 1 xset` for possible options. ''; }; pointerButtonMap = mkOption { type = types.str; default = "1 0 0 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; description = lib.mdDoc '' Disable right and middle pointer device click in browser sessions while keeping scrolling wheels' functionality intact. See pointer subcommand on `man xmodmap` for details. ''; }; hideIdlePointer = mkOption { type = types.str; default = "yes"; example = "no"; description = lib.mdDoc "Hide idle mouse pointer."; }; extraConfig = mkOption { type = types.lines; default = ""; example = '' # Enforce fixed resolution for all displays (default: not set): DEFAULT_RESOLUTION="1920x1080" # HTTP proxy URL, if needed (default: not set). HTTP_PROXY_URL="http://webcache:3128" # Configure individual display screens with host specific parameters: DISPLAYS['display-host-0']="www_uri=https://www.displayserver.comany.net/display-1/index.html" DISPLAYS['display-host-1']="www_uri=https://www.displayserver.comany.net/display-2/index.html" DISPLAYS['display-host-2']="www_uri=https://www.displayserver.comany.net/display-3/index.html|res=1920x1280" DISPLAYS['display-host-3']="www_uri=https://www.displayserver.comany.net/display-4/index.html"|res=1280x1024" DISPLAYS['display-host-local-file']="www_uri=file:///usr/share/doc/surf-display/empty-page.html" ''; description = lib.mdDoc '' Extra configuration options to append to `/etc/default/surf-display`. ''; }; }; }; config = mkIf cfg.enable { services.xserver.displayManager.sessionPackages = [ pkgs.surf-display ]; environment.etc."default/surf-display".text = surfDisplayConf; }; }