anvil-editor: init at 0.4
[NixPkgs.git] / pkgs / applications / office / libreoffice / wrapper.nix
blobaeab3da08dd7a4c58cd13a206ad71910fed8ee14
1 { lib
2 , stdenv
3 # The unwrapped libreoffice derivation
4 , unwrapped
5 , makeWrapper
6 , xorg # for lndir
7 , runCommand
8 # For Emulating wrapGAppsHook3
9 , gsettings-desktop-schemas
10 , hicolor-icon-theme
11 , dconf
12 , librsvg
13 , gdk-pixbuf
14 # some scripts need these when used in conjuction with firejail
15 , coreutils
16 , gnugrep
17 # Configuration options for the wrapper
18 , extraMakeWrapperArgs ? []
19 , dbusVerify ? stdenv.hostPlatform.isLinux
20 , dbus
23 let
24   inherit (unwrapped) version;
25   major = lib.versions.major version;
26   minor = lib.versions.minor version;
28   makeWrapperArgs = builtins.concatStringsSep " " ([
29     "--set" "GDK_PIXBUF_MODULE_FILE" "${librsvg}/${gdk-pixbuf.moduleDir}.cache"
30     "--prefix" "GIO_EXTRA_MODULES" ":" "${lib.getLib dconf}/lib/gio/modules"
31     "--prefix" "XDG_DATA_DIRS" ":" "${unwrapped.gtk3}/share/gsettings-schemas/${unwrapped.gtk3.name}"
32     "--prefix" "XDG_DATA_DIRS" ":" "$out/share"
33     "--prefix" "XDG_DATA_DIRS" ":" "${gsettings-desktop-schemas}/share/gsettings-schemas/${gsettings-desktop-schemas.name}"
34     "--prefix" "XDG_DATA_DIRS" ":" "${hicolor-icon-theme}/share"
35     "--prefix" "GST_PLUGIN_SYSTEM_PATH_1_0" ":"
36       "${lib.makeSearchPath "lib/girepository-1.0" unwrapped.gst_packages}"
37     "--suffix" "PATH" ":" "${lib.makeBinPath [ coreutils gnugrep ]}"
38   ] ++ lib.optionals unwrapped.kdeIntegration [
39     "--prefix" "QT_PLUGIN_PATH" ":" "${
40       lib.makeSearchPath
41       unwrapped.qtbase.qtPluginPrefix
42       (builtins.map lib.getBin unwrapped.qtPackages)
43     }"
44     "--prefix" "QML2_IMPORT_PATH" ":" "${
45       lib.makeSearchPath unwrapped.qtbase.qtQmlPrefix
46       (builtins.map lib.getBin unwrapped.qmlPackages)
47     }"
48   ] ++ [
49     # Add dictionaries from all NIX_PROFILES
50     "--run" (lib.escapeShellArg ''
51       for PROFILE in $NIX_PROFILES; do
52           HU_DIR="$PROFILE/share/hunspell"
53           HY_DIR="$PROFILE/share/hyphen"
54           if [ -d "$HU_DIR" ]; then
55               export DICPATH=$DICPATH''${DICPATH:+:}$HU_DIR
56           fi
57           if [ -d "$HY_DIR" ]; then
58               export DICPATH=$DICPATH''${DICPATH:+:}$HY_DIR
59           fi
60       done
61     '')
62   ] ++ lib.optionals dbusVerify [
63     # If no dbus is running, start a dedicated dbus daemon
64     "--run" (lib.escapeShellArg ''
65       if ! ( test -n "$DBUS_SESSION_BUS_ADDRESS" ); then
66           dbus_tmp_dir="/run/user/$(id -u)/libreoffice-dbus"
67           if ! test -d "$dbus_tmp_dir" && test -d "/run"; then
68                   mkdir -p "$dbus_tmp_dir"
69           fi
70           if ! test -d "$dbus_tmp_dir"; then
71                   dbus_tmp_dir="/tmp/libreoffice-$(id -u)/libreoffice-dbus"
72                   mkdir -p "$dbus_tmp_dir"
73           fi
74           dbus_socket_dir="$(mktemp -d -p "$dbus_tmp_dir")"
75           "${dbus}"/bin/dbus-daemon \
76             --nopidfile \
77             --nofork \
78             --config-file "${dbus}"/share/dbus-1/session.conf \
79             --address "unix:path=$dbus_socket_dir/session"  &> /dev/null &
80           dbus_pid=$!
81           export DBUS_SESSION_BUS_ADDRESS="unix:path=$dbus_socket_dir/session"
82       fi
83     '')
84   ] ++ [
85     "--inherit-argv0"
86   ] ++ extraMakeWrapperArgs
87   );
88 in runCommand "${unwrapped.name}-wrapped" {
89   inherit (unwrapped) meta;
90   paths = [ unwrapped ];
91   nativeBuildInputs = [ makeWrapper xorg.lndir ];
92   passthru = {
93     inherit unwrapped;
94     # For backwards compatibility:
95     libreoffice = lib.warn "libreoffice: Use the unwrapped attributed, using libreoffice.libreoffice is deprecated." unwrapped;
96     inherit (unwrapped) kdeIntegration;
97   };
98 } (''
99   mkdir -p $out/share
100   for dir in ${unwrapped}/share/*; do
101     dirname="''${dir##*/}"
102     if [[ $dirname == "applications" ]]; then
103       cp -r $dir/ $out/share/
104     else
105       ln -s $dir $out/share/
106     fi
107   done
108   for f in $out/share/applications/*.desktop; do
109     substituteInPlace "$f" \
110       --replace "Exec=libreoffice${major}.${minor}" "Exec=soffice"
111   done
113   mkdir -p $out/bin
114   mkdir -p $out/lib/libreoffice/program
115   lndir -silent ${unwrapped}/lib/libreoffice/program $out/lib/libreoffice/program
116   for i in sbase scalc sdraw smath swriter simpress soffice unopkg; do
117     # Delete the symlink created by lndir, and replace it by our wrapper
118     rm $out/lib/libreoffice/program/$i
119     makeWrapper \
120       ${unwrapped}/lib/libreoffice/program/$i \
121       $out/lib/libreoffice/program/$i \
122       ${makeWrapperArgs}
123 '' + lib.optionalString dbusVerify ''
124     # Delete the dbus socket directory after libreoffice quits
125     sed -i 's/^exec -a "$0" //g' $out/lib/libreoffice/program/$i
126     echo 'code="$?"' >> $out/lib/libreoffice/program/$i
127     echo 'test -n "$dbus_socket_dir" && { rm -rf "$dbus_socket_dir"; kill $dbus_pid; }' >> $out/lib/libreoffice/program/$i
128     echo 'exit "$code"' >> $out/lib/libreoffice/program/$i
129 '' + ''
130     ln -s $out/lib/libreoffice/program/$i $out/bin/$i
131   done
132   # A symlink many users rely upon
133   ln -s $out/bin/soffice $out/bin/libreoffice