From 2caf4b0a50806c6ab3f336573a255fefaaa67cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christina=20S=C3=B8rensen?= Date: Wed, 8 Apr 2026 16:30:27 +0200 Subject: [PATCH] davinci-resolve: add auxiliary apps, udev rules, and desktop entries - Copy Blackmagic's official udev rules (99-BlackmagicDevices.rules, 99-ResolveKeyboardHID.rules) from the installer into $out/lib/udev/rules.d/ so NixOS picks them up automatically via services.udev.packages - Generate 99-DavinciPanel.rules with catch-all rules for Blackmagic vendor ID 096e covering both usb and hidraw subsystems, fixing hardware panels, Speed Editor jog wheel, and Editor Keyboard - Add desktop entries and FHS wrapper scripts for the five bundled tools: Blackmagic RAW Player, Blackmagic RAW Speed Test, DaVinci Control Panels Setup, DaVinci Remote Monitor, and Fairlight Studio Utility - Install icons and MIME type definitions (.drp, .braw, .sidecar) - Add missing FHS deps for bundled Qt6: libdrm, libxkbfile, krb5, nss, libxcb-cursor Fixes: #167389 #420744 #366384 #364646 --- pkgs/by-name/da/davinci-resolve/package.nix | 142 +++++++++++++++++++- 1 file changed, 135 insertions(+), 7 deletions(-) diff --git a/pkgs/by-name/da/davinci-resolve/package.nix b/pkgs/by-name/da/davinci-resolve/package.nix index 758c95a3ee25..34d4946bf860 100644 --- a/pkgs/by-name/da/davinci-resolve/package.nix +++ b/pkgs/by-name/da/davinci-resolve/package.nix @@ -34,6 +34,7 @@ buildFHSEnv, bash, writeText, + writeShellScript, ocl-icd, xkeyboard_config, glib, @@ -171,6 +172,23 @@ let appimage-exec.sh -x $out ${lib.escapeShellArg appimageName} mkdir -p $out/{"Apple Immersive/Calibration",configs,DolbyVision,easyDCP,Extras,Fairlight,GPUCache,logs,Media,"Resolve Disk Database",.crashreport,.license,.LUT} + + # Install udev rules for Blackmagic hardware (color panels, Speed Editor, Editor Keyboard) + mkdir -p $out/lib/udev/rules.d + cp $out/share/etc/udev/rules.d/99-BlackmagicDevices.rules $out/lib/udev/rules.d/ + cp $out/share/etc/udev/rules.d/99-ResolveKeyboardHID.rules $out/lib/udev/rules.d/ + # Generate catch-all rules for Blackmagic Design vendor ID (096e) + # USB device access (color panels, general hardware) + echo 'SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="096e", MODE="0666"' \ + > $out/lib/udev/rules.d/99-DavinciPanel.rules + # hidraw access (Speed Editor jog wheel, Editor Keyboard, future HID devices) + echo 'KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="096e", MODE="0666"' \ + >> $out/lib/udev/rules.d/99-DavinciPanel.rules + + # Verify all three rules files are present + test -f $out/lib/udev/rules.d/99-BlackmagicDevices.rules + test -f $out/lib/udev/rules.d/99-ResolveKeyboardHID.rules + test -f $out/lib/udev/rules.d/99-DavinciPanel.rules runHook postInstall ''; @@ -208,7 +226,59 @@ let ]; startupWMClass = "resolve"; }) - ]; + (makeDesktopItem { + name = "blackmagicraw-player"; + desktopName = "Blackmagic RAW Player"; + exec = "blackmagicraw-player %f"; + icon = "blackmagicraw-player"; + mimeTypes = [ + "application/x-braw-clip" + "application/x-braw-sidecar" + ]; + categories = [ + "Video" + "AudioVideo" + ]; + }) + (makeDesktopItem { + name = "blackmagicraw-speedtest"; + desktopName = "Blackmagic RAW Speed Test"; + exec = "blackmagicraw-speedtest"; + icon = "blackmagicraw-speedtest"; + categories = [ + "Video" + "AudioVideo" + ]; + }) + (makeDesktopItem { + name = "davinci-control-panels-setup"; + desktopName = "DaVinci Control Panels Setup"; + exec = "davinci-control-panels-setup"; + icon = "davinci-control-panels-setup"; + categories = [ "Settings" ]; + }) + (makeDesktopItem { + name = "davinci-fairlight-studio-utility"; + desktopName = "Fairlight Studio Utility"; + exec = "davinci-fairlight-studio-utility"; + icon = "davinci-resolve${lib.optionalString studioVariant "-studio"}"; + categories = [ + "AudioVideo" + "Audio" + ]; + }) + ] + ++ lib.optional studioVariant (makeDesktopItem { + name = "davinci-remote-monitor"; + desktopName = "DaVinci Remote Monitor"; + exec = "davinci-remote-monitor"; + icon = "davinci-remote-monitor"; + comment = "DaVinci Remote Monitor"; + categories = [ + "AudioVideo" + "Video" + ]; + }); } ); in @@ -240,6 +310,11 @@ buildFHSEnv { opencl-headers python3 python3.pkgs.numpy + libdrm # libdrm.so.2 needed by bundled Qt6 WebEngine (Control Panels Setup) + libxkbfile # libxkbfile.so.1 needed by bundled Qt6 WebEngine (Control Panels Setup) + krb5 # libgssapi_krb5.so.2 needed by bundled Qt6 (Control Panels Setup, Fairlight Studio Utility) + nss # libsmime3.so needed by bundled Qt6 (Control Panels Setup) + libxcb-cursor # libxcb-cursor.so needed by Qt6 xcb platform plugin (Fairlight Studio Utility) udev xdg-utils # xdg-open needed to open URLs libice @@ -281,14 +356,67 @@ buildFHSEnv { export QT_XKB_CONFIG_ROOT="${xkeyboard_config}/share/X11/xkb" export QT_PLUGIN_PATH="${davinci}/libs/plugins:$QT_PLUGIN_PATH" export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/usr/lib32:${davinci}/libs - ${davinci}/bin/resolve + if [ $# -gt 0 ]; then + exec "$@" + else + exec ${davinci}/bin/resolve + fi ''}"; - extraInstallCommands = '' - mkdir -p $out/share/applications $out/share/icons/hicolor/128x128/apps - ln -s ${davinci}/share/applications/*.desktop $out/share/applications/ - ln -s ${davinci}/graphics/DV_Resolve.png $out/share/icons/hicolor/128x128/apps/davinci-resolve${lib.optionalString studioVariant "-studio"}.png - ''; + extraInstallCommands = + let + execName = "davinci-resolve${lib.optionalString studioVariant "-studio"}"; + # Each wrapper re-enters the FHS environment and execs a different binary + mkWrapper = + name: bin: + writeShellScript name '' + exec "$(dirname "$0")/${execName}" ${bin} "$@" + ''; + wrappers = { + "blackmagicraw-player" = "${davinci}/BlackmagicRAWPlayer/BlackmagicRAWPlayer"; + "blackmagicraw-speedtest" = "${davinci}/BlackmagicRAWSpeedTest/BlackmagicRAWSpeedTest"; + "davinci-control-panels-setup" = + ''"${davinci}/DaVinci Control Panels Setup/DaVinci Control Panels Setup"''; + "davinci-fairlight-studio-utility" = + ''"${davinci}/Fairlight Studio Utility/Fairlight Studio Utility"''; + } + // lib.optionalAttrs studioVariant { + "davinci-remote-monitor" = ''"${davinci}/bin/DaVinci Remote Monitor"''; + }; + in + '' + # Desktop files + mkdir -p $out/share/applications + ln -s ${davinci}/share/applications/*.desktop $out/share/applications/ + + # Icons + mkdir -p $out/share/icons/hicolor/{128x128,256x256}/apps + ln -s ${davinci}/graphics/DV_Resolve.png $out/share/icons/hicolor/128x128/apps/davinci-resolve${lib.optionalString studioVariant "-studio"}.png + ln -s ${davinci}/graphics/DV_Panels.png $out/share/icons/hicolor/128x128/apps/davinci-control-panels-setup.png + ${lib.optionalString studioVariant '' + ln -s ${davinci}/graphics/Remote_Monitoring.png $out/share/icons/hicolor/128x128/apps/davinci-remote-monitor.png + ''} + ln -s ${davinci}/graphics/blackmagicraw-player_256x256_apps.png $out/share/icons/hicolor/256x256/apps/blackmagicraw-player.png + ln -s ${davinci}/graphics/blackmagicraw-speedtest_256x256_apps.png $out/share/icons/hicolor/256x256/apps/blackmagicraw-speedtest.png + + # Wrapper scripts for additional programs + ${lib.concatStringsSep "\n" ( + lib.mapAttrsToList (name: bin: '' + ln -s ${mkWrapper name bin} $out/bin/${name} + '') wrappers + )} + + # MIME type definitions for .drp, .braw, etc. + mkdir -p $out/share/mime/packages + ln -s ${davinci}/share/resolve.xml $out/share/mime/packages/ + ln -s ${davinci}/share/blackmagicraw.xml $out/share/mime/packages/ + + # Expose udev rules so NixOS can aggregate them from environment.systemPackages + mkdir -p $out/lib/udev/rules.d + ln -s ${davinci}/lib/udev/rules.d/99-BlackmagicDevices.rules $out/lib/udev/rules.d/ + ln -s ${davinci}/lib/udev/rules.d/99-ResolveKeyboardHID.rules $out/lib/udev/rules.d/ + ln -s ${davinci}/lib/udev/rules.d/99-DavinciPanel.rules $out/lib/udev/rules.d/ + ''; passthru = { inherit davinci;