at 23.11-pre 1.9 kB view raw
1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 7 enabled = elem "displaylink" config.services.xserver.videoDrivers; 8 9 evdi = config.boot.kernelPackages.evdi; 10 11 displaylink = pkgs.displaylink.override { 12 inherit evdi; 13 }; 14 15in 16 17{ 18 19 config = mkIf enabled { 20 21 boot.extraModulePackages = [ evdi ]; 22 boot.kernelModules = [ "evdi" ]; 23 24 environment.etc."X11/xorg.conf.d/40-displaylink.conf".text = '' 25 Section "OutputClass" 26 Identifier "DisplayLink" 27 MatchDriver "evdi" 28 Driver "modesetting" 29 Option "AccelMethod" "none" 30 EndSection 31 ''; 32 33 # make the device available 34 services.xserver.displayManager.sessionCommands = '' 35 ${lib.getBin pkgs.xorg.xrandr}/bin/xrandr --setprovideroutputsource 1 0 36 ''; 37 38 # Those are taken from displaylink-installer.sh and from Arch Linux AUR package. 39 40 services.udev.packages = [ displaylink ]; 41 42 powerManagement.powerDownCommands = '' 43 #flush any bytes in pipe 44 while read -n 1 -t 1 SUSPEND_RESULT < /tmp/PmMessagesPort_out; do : ; done; 45 46 #suspend DisplayLinkManager 47 echo "S" > /tmp/PmMessagesPort_in 48 49 #wait until suspend of DisplayLinkManager finish 50 if [ -f /tmp/PmMessagesPort_out ]; then 51 #wait until suspend of DisplayLinkManager finish 52 read -n 1 -t 10 SUSPEND_RESULT < /tmp/PmMessagesPort_out 53 fi 54 ''; 55 56 powerManagement.resumeCommands = '' 57 #resume DisplayLinkManager 58 echo "R" > /tmp/PmMessagesPort_in 59 ''; 60 61 systemd.services.dlm = { 62 description = "DisplayLink Manager Service"; 63 after = [ "display-manager.service" ]; 64 conflicts = [ "getty@tty7.service" ]; 65 66 serviceConfig = { 67 ExecStart = "${displaylink}/bin/DisplayLinkManager"; 68 Restart = "always"; 69 RestartSec = 5; 70 LogsDirectory = "displaylink"; 71 }; 72 }; 73 74 }; 75 76}