about summary refs log tree commit diff
path: root/nixpkgs/pkgs/applications/networking/remote/vmware-horizon-client/default.nix
blob: 7d5b965e60fef35555c53ce1eaa6286c8d1484f8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
{ lib, stdenv, buildFHSUserEnv, fetchurl, makeWrapper, makeDesktopItem, libxslt, atk
, fontconfig, freetype, gdk-pixbuf, glib, gtk2, libudev0-shim, libxml2
, pango, pixman, libX11, libXext, libXinerama, libXrandr , libXrender
, libXtst, libXcursor, libXi, libxkbfile , libXScrnSaver, zlib, liberation_ttf
, libtiff, dbus, at-spi2-atk, harfbuzz, gtk3-x11, libuuid, pcsclite
}:

let
  version = "2006";

  sysArch =
    if stdenv.hostPlatform.system == "x86_64-linux" then "x64"
    else throw "Unsupported system: ${stdenv.hostPlatform.system}";
    # The downloaded archive also contains i386 and ARM binaries, but these have not been tested.

  vmwareHorizonClientFiles = stdenv.mkDerivation {
    name = "vmwareHorizonClientFiles";
    inherit version;
    src = fetchurl {
      url = https://download3.vmware.com/software/view/viewclients/CART21FQ2/vmware-view-client-linux-2006-8.0.0-16522670.tar.gz;
      sha256 = "8c46d49fea42f8c1f7cf32a5f038f5a47d2b304743b1e4f4c68c658621b0e79c";
    };
    buildInputs = [ makeWrapper ];
    installPhase = ''
      mkdir ext $out
      find ${sysArch} -type f -print0 | xargs -0n1 tar -Cext --strip-components=1 -xf
      mv ext/bin ext/lib ext/share "$out"/

      # Horizon includes a copy of libstdc++ which is loaded via $LD_LIBRARY_PATH
      # when it cannot detect a new enough version already present on the system.
      # The checks are distribution-specific and do not function correctly on NixOS.
      # Deleting the bundled library is the simplest way to force it to use our version.
      rm -f "$out/lib/vmware/gcc/libstdc++.so.6"

      # Force the default GTK theme (Adwaita) because Horizon is prone to
      # UI usability issues when using non-default themes, such as Adwaita-dark.
      makeWrapper "$out/bin/vmware-view" "$out/bin/vmware-view_wrapper" \
          --set GTK_THEME Adwaita \
          --suffix LD_LIBRARY_PATH : "$out/lib/vmware/view/crtbora:$out/lib/vmware"
    '';
  };

  vmwareFHSUserEnv = buildFHSUserEnv {
    name = "vmware-view";

    runScript = "${vmwareHorizonClientFiles}/bin/vmware-view_wrapper";

    targetPkgs = pkgs: [
      pcsclite dbus vmwareHorizonClientFiles atk fontconfig freetype gdk-pixbuf glib gtk2
      libudev0-shim libxml2 pango pixman liberation_ttf libX11 libXext libXinerama
      libXrandr libXrender libXtst libXcursor libXi libxkbfile at-spi2-atk libXScrnSaver
      zlib libtiff harfbuzz gtk3-x11 libuuid
    ];
  };

  desktopItem = makeDesktopItem {
    name = "vmware-view";
    desktopName = "VMware Horizon Client";
    icon = "${vmwareHorizonClientFiles}/share/icons/vmware-view.png";
    exec = "${vmwareFHSUserEnv}/bin/vmware-view %u";
    mimeType = "x-scheme-handler/vmware-view";
  };

in stdenv.mkDerivation {
  name = "vmware-view";
  dontUnpack = true;
  installPhase = ''
    mkdir -p $out/bin $out/share/applications
    cp "${desktopItem}"/share/applications/* $out/share/applications/
    ln -s "${vmwareFHSUserEnv}/bin/vmware-view" "$out/bin/"
  '';

  meta = with lib; {
    description = "Allows you to connect to your VMware Horizon virtual desktop";
    homepage = "https://www.vmware.com/go/viewclients";
    license = licenses.unfree;
    platforms = platforms.linux;
    maintainers = with maintainers; [ buckley310 ];
  };
}