1{
2 stdenv,
3 lib,
4 procps,
5 fetchurl,
6 dpkg,
7 writeShellScript,
8 buildFHSEnv,
9 nspr,
10 kmod,
11 systemdMinimal,
12 glib,
13 pulseaudio,
14 libXext,
15 libX11,
16 libXrandr,
17 glibc,
18 cairo,
19 libva,
20 libdrm,
21 coreutils,
22 libXi,
23 libGL,
24 bash,
25 libXcomposite,
26 libXdamage,
27 libXfixes,
28 libXtst,
29 nss,
30 libXxf86vm,
31 gtk3,
32 gdk-pixbuf,
33 pango,
34 libz,
35 libayatana-appindicator,
36}:
37
38let
39 version = "4.7.2.0";
40 todesk-unwrapped = stdenv.mkDerivation (finalAttrs: {
41 pname = "todesk-unwrapped";
42 version = version;
43 src = fetchurl {
44 url = "https://web.archive.org/web/20250302114501if_/https://newdl.todesk.com/linux/todesk-v4.7.2.0-amd64.deb";
45 hash = "sha256-v7VpXXFVaKI99RpzUWfAc6eE7NHGJeFrNeUTbVuX+yg=";
46 };
47 nativeBuildInputs = [ dpkg ];
48
49 unpackPhase = ''
50 runHook preUnpack
51 dpkg -x $src ./todesk-src
52 runHook postUnpack
53 '';
54
55 installPhase = ''
56 runHook preInstall
57 mkdir -p "$out/lib"
58 cp -r todesk-src/* "$out"
59 cp "${libayatana-appindicator}/lib/libayatana-appindicator3.so.1" "$out/opt/todesk/bin/libappindicator3.so.1"
60 mv "$out/opt/todesk/bin" "$out/bin"
61 cp "$out/bin/libmfx.so.1" "$out/lib"
62 cp "$out/bin/libglut.so.3" "$out/lib"
63 mkdir "$out/opt/todesk/config"
64 mkdir "$out/opt/todesk/bin"
65 mkdir -p "$out/share/applications"
66 mkdir "$out/share/icons"
67 runHook postInstall
68 '';
69
70 });
71
72in
73buildFHSEnv {
74 inherit version;
75 pname = "todesk";
76 targetPkgs = pkgs: [
77 todesk-unwrapped
78 pulseaudio
79 nspr
80 kmod
81 libXi
82 systemdMinimal
83 glib
84 libz
85 bash
86 coreutils
87 libX11
88 libXext
89 libXrandr
90 glibc
91 libdrm
92 libGL
93 procps
94 cairo
95 libXcomposite
96 libXdamage
97 libXfixes
98 libXtst
99 nss
100 libXxf86vm
101 gtk3
102 gdk-pixbuf
103 pango
104 libva
105 ];
106 extraBwrapArgs = [
107 "--tmpfs /opt/todesk"
108 "--bind /var/lib/todesk /opt/todesk/config" # create the folder before bind to avoid permission denided.
109 "--bind ${todesk-unwrapped}/bin /opt/todesk/bin"
110 "--bind /var/lib/todesk /etc/todesk" # service write uuid here. Such a pain!
111 ]; # soft link doesn't work so that we should bind ourselves
112 runScript = writeShellScript "ToDesk.sh" ''
113 export LIBVA_DRIVER_NAME=iHD
114 export LIBVA_DRIVERS_PATH=${todesk-unwrapped}/bin
115 if [ "''${1}" = 'service' ]
116 then
117 /opt/todesk/bin/ToDesk_Service
118 else
119 /opt/todesk/bin/ToDesk
120 fi
121 ''; # a small script to choose what to exec
122 extraInstallCommands = ''
123 mkdir -p "$out/share/applications"
124 mkdir -p "$out/share/icons"
125 cp ${todesk-unwrapped}/usr/share/applications/todesk.desktop $out/share/applications
126 cp -rf ${todesk-unwrapped}/usr/share/icons/* $out/share/icons
127 substituteInPlace "$out/share/applications/todesk.desktop" \
128 --replace-fail '/opt/todesk/bin/ToDesk' "$out/bin/todesk desktop"
129 substituteInPlace "$out/share/applications/todesk.desktop" \
130 --replace-fail '/opt/todesk/bin' "${todesk-unwrapped}/lib"
131 '';
132 meta = {
133 description = "Remote Desktop Application";
134 homepage = "https://www.todesk.com/linux.html";
135 license = lib.licenses.unfree;
136 platforms = [ "x86_64-linux" ];
137 sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
138 maintainers = with lib.maintainers; [ bot-wxt1221 ];
139 mainProgram = "todesk";
140 };
141}