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}