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
23 # Those are taken from displaylink-installer.sh and from Arch Linux AUR package.
24
25 services.udev.packages = [ displaylink ];
26
27 powerManagement.powerDownCommands = ''
28 #flush any bytes in pipe
29 while read -n 1 -t 1 SUSPEND_RESULT < /tmp/PmMessagesPort_out; do : ; done;
30
31 #suspend DisplayLinkManager
32 echo "S" > /tmp/PmMessagesPort_in
33
34 #wait until suspend of DisplayLinkManager finish
35 if [ -f /tmp/PmMessagesPort_out ]; then
36 #wait until suspend of DisplayLinkManager finish
37 read -n 1 -t 10 SUSPEND_RESULT < /tmp/PmMessagesPort_out
38 fi
39 '';
40
41 powerManagement.resumeCommands = ''
42 #resume DisplayLinkManager
43 echo "R" > /tmp/PmMessagesPort_in
44 '';
45
46 systemd.services.dlm = {
47 description = "DisplayLink Manager Service";
48 after = [ "display-manager.service" ];
49 conflicts = [ "getty@tty7.service" ];
50 path = [ pkgs.kmod ];
51
52 serviceConfig = {
53 ExecStart = "${displaylink}/bin/DisplayLinkManager";
54 Restart = "always";
55 RestartSec = 5;
56 };
57
58 preStart = ''
59 mkdir -p /var/log/displaylink
60 modprobe evdi
61 '';
62 };
63
64 };
65
66}