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