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}