{ pkgs, lib, ... }: # ChameleonUltraGUI requires flutter sdk >3.0.0 pkgs.flutter324.buildFlutterApplication (self: { pname = "ChameleonUltraGUI"; version = "1.1.2"; src = pkgs.fetchFromGitHub { owner = "GameTec-live"; repo = "ChameleonUltraGUI"; sha256 = "1mb6wkqk6vaamrhflfhsgp5gvqiw2qkvmy7j65abcx7sn5990i27"; rev = "11424abaccb4a010fcbeab9799ae8f675d8afe99"; }; desktopItems = [ (pkgs.makeDesktopItem { name = self.pname; desktopName = "Chameleon Ultra GUI"; icon = self.pname; comment = self.meta.description; exec = "chameleonultragui"; terminal = false; categories = [ "Utility" ]; }) ]; # path to application within fetched sources sourceRoot = "source/chameleonultragui"; buildInputs = [ pkgs.imagemagick # creating mipmaps for share/icons pkgs.yj # converting pubspec.lock yaml->json ]; buildArguments = ["--release"]; # source files compile with Flutter >3.29.0 but this # derivation uses 3.24.0 (so we patch for compatability) postPatch = let argbPatch = '' --- general.dart.old 2025-05-11 15:59:51.812132078 +1000 +++ general.dart 2025-05-11 15:58:14.755856407 +1000 @@ -211,7 +211,7 @@ } String colorToHex(Color color) { - return '#\''${color.toARGB32().toRadixString(16).padLeft(8, '0').substring(2)}'; + return '#\''${color.value.toRadixString(16).padLeft(8, '0').substring(2)}'; } Color hexToColor(String hex) { ''; in '' # patch source files using Color.toARGB32 method (not defined in Flutter 3.24) argbPatch="${argbPatch}" patch lib/helpers/general.dart <(echo "$argbPatch") ''; # installPhase = '' # runHook preInstall # # create mipmaps of desktop logo # logoOriginal="assets/logo-color-desktop.png" # for i in 16 32 64 128 256 512; do # res="$i"x"$i" # logoOut="$out"/share/icons/hicolor/"$res"/apps # mkdir -p $logoOut # ${pkgs.imagemagick}/bin/magick $logoOriginal -resize $res $logoOut/${pname}.png # done # runHook postInstall # ''; # Nix doesn't natively have a fromYAML function (so I made this instead) pubspecLock = let appRoot = "${self.src}/chameleonultragui"; # when generating patch files use -u flag and then # make sure to escape all " characters for Nix string pubspecLockPatch = '' --- pubspec.lock.bak2025-05-10 15:42:44.287730979 +1000 +++ pubspec.lock2025-05-10 15:41:23.778480048 +1000 @@ -5,18 +5,23 @@ dependency: transitive description: name: _fe_analyzer_shared - sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 + sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 url: \"https://pub.dev\" source: hosted - version: \"80.0.0\" + version: \"72.0.0\" + _macros: + dependency: transitive + description: dart + source: sdk + version: \"0.3.2\" analyzer: dependency: transitive description: name: analyzer - sha256: \"192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e\" + sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 url: \"https://pub.dev\" source: hosted - version: \"7.3.0\" + version: \"6.7.0\" archive: dependency: \"direct main\" description: @@ -37,26 +42,26 @@ dependency: \"direct main\" description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: \"947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c\" url: \"https://pub.dev\" source: hosted - version: \"2.12.0\" + version: \"2.11.0\" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: \"8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea\" + sha256: \"6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66\" url: \"https://pub.dev\" source: hosted - version: \"2.1.2\" + version: \"2.1.1\" characters: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: \"04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605\" url: \"https://pub.dev\" source: hosted - version: \"1.4.0\" + version: \"1.3.0\" checked_yaml: dependency: transitive description: @@ -77,18 +82,18 @@ dependency: transitive description: name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf url: \"https://pub.dev\" source: hosted - version: \"1.1.2\" + version: \"1.1.1\" collection: dependency: \"direct main\" description: name: collection - sha256: \"2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76\" + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: \"https://pub.dev\" source: hosted - version: \"1.19.1\" + version: \"1.18.0\" convert: dependency: \"direct main\" description: @@ -157,10 +162,10 @@ dependency: transitive description: name: fake_async - sha256: \"6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc\" + sha256: \"511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78\" url: \"https://pub.dev\" source: hosted - version: \"1.3.2\" + version: \"1.3.1\" ffi: dependency: \"direct main\" description: @@ -196,11 +201,10 @@ file_saver: dependency: \"direct main\" description: - path: \".\" - ref: fix-windows - resolved-ref: \"3038d74d5560dcca528423fffd745abf31eb88ae\" - url: \"https://github.com/Foxushka/file_saver.git\" - source: git + name: file_saver + sha256: \"017a127de686af2d2fbbd64afea97052d95f2a0f87d19d25b87e097407bf9c1e\" + url: \"https://pub.dev\" + source: hosted version: \"0.2.14\" fixnum: dependency: transitive @@ -234,11 +238,10 @@ flutter_libserialport: dependency: \"direct main\" description: - path: \".\" - ref: main - resolved-ref: \"6740aae075505a220a98492910b090824efc7910\" - url: \"https://github.com/NeariX67/flutter_libserialport.git\" - source: git + name: flutter_libserialport + sha256: d193b5ac819db6540d20cc8d20d9f5ec9e3396edb4d2c4a23c97863fa9132336 + url: \"https://pub.dev\" + source: hosted version: \"0.5.0\" flutter_lints: dependency: \"direct dev\" @@ -347,18 +350,18 @@ dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: \"3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05\" url: \"https://pub.dev\" source: hosted - version: \"10.0.8\" + version: \"10.0.5\" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: \"932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806\" url: \"https://pub.dev\" source: hosted - version: \"3.0.9\" + version: \"3.0.5\" leak_tracker_testing: dependency: transitive description: @@ -399,14 +402,22 @@ url: \"https://pub.dev\" source: hosted version: \"1.3.0\" + macros: + dependency: transitive + description: + name: macros + sha256: \"0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536\" + url: \"https://pub.dev\" + source: hosted + version: \"0.1.2-main.4\" matcher: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: \"https://pub.dev\" source: hosted - version: \"0.12.17\" + version: \"0.12.16+1\" material_color_utilities: dependency: transitive description: @@ -419,10 +430,10 @@ dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: \"https://pub.dev\" source: hosted - version: \"1.16.0\" + version: \"1.15.0\" mobile_scanner: dependency: \"direct main\" description: @@ -467,10 +478,10 @@ dependency: \"direct main\" description: name: path - sha256: \"75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5\" + sha256: \"087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af\" url: \"https://pub.dev\" source: hosted - version: \"1.9.1\" + version: \"1.9.0\" path_provider: dependency: transitive description: @@ -723,15 +734,15 @@ dependency: transitive description: flutter source: sdk - version: \"0.0.0\" + version: \"0.0.99\" source_span: dependency: transitive description: name: source_span - sha256: \"254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c\" + sha256: \"53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c\" url: \"https://pub.dev\" source: hosted - version: \"1.10.1\" + version: \"1.10.0\" sprintf: dependency: transitive description: @@ -744,42 +755,42 @@ dependency: transitive description: name: stack_trace - sha256: \"8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1\" + sha256: \"73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b\" url: \"https://pub.dev\" source: hosted - version: \"1.12.1\" + version: \"1.11.1\" stream_channel: dependency: transitive description: name: stream_channel - sha256: \"969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d\" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: \"https://pub.dev\" source: hosted - version: \"2.1.4\" + version: \"2.1.2\" string_scanner: dependency: transitive description: name: string_scanner - sha256: \"921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43\" + sha256: \"556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde\" url: \"https://pub.dev\" source: hosted - version: \"1.4.1\" + version: \"1.2.0\" term_glyph: dependency: transitive description: name: term_glyph - sha256: \"7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e\" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 url: \"https://pub.dev\" source: hosted - version: \"1.2.2\" + version: \"1.2.1\" test_api: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: \"5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb\" url: \"https://pub.dev\" source: hosted - version: \"0.7.4\" + version: \"0.7.2\" typed_data: dependency: transitive description: @@ -855,12 +866,11 @@ usb_serial: dependency: \"direct main\" description: - path: \".\" - ref: fix-usbserial - resolved-ref: \"9fcbacc92bec19ea02d33a40d9f39e45d19cf637\" - url: \"https://github.com/Foxushka/usbserial.git\" - source: git - version: \"0.5.1\" + name: usb_serial + sha256: a605a600e34e7f28d4e80851ca3999ef747e42e406138887b8a88b8c382a8b07 + url: \"https://pub.dev\" + source: hosted + version: \"0.5.2\" uuid: dependency: \"direct main\" description: @@ -881,10 +891,10 @@ dependency: transitive description: name: vm_service - sha256: \"0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14\" + sha256: \"5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d\" url: \"https://pub.dev\" source: hosted - version: \"14.3.1\" + version: \"14.2.5\" wakelock_plus: dependency: \"direct main\" description: @@ -958,5 +968,5 @@ source: hosted version: \"2.2.1\" sdks: - dart: \">=3.7.0-0 <4.0.0\" + dart: \">=3.5.0 <4.0.0\" flutter: \">=3.24.0\" ''; in builtins.fromJSON ( builtins.readFile (pkgs.runCommand "${self.pname}-buildenv" { inputs = [ # DEBUG (both lines commented) #pkgs.flutter324 # ChameleonUltraGUI requires sdk >3.0.0 #pkgs.yj ]; } '' # copy source files to a temporary path to rebuild the lockfile buildPath=$(mktemp -d) cp -r "${appRoot}/." "$buildPath/" outPubspecLock="$buildPath/pubspec.lock" # MUST define variables to use multiline Nix string in bash scripting pubspecLockPatch="${pubspecLockPatch}" # apply the pubspec.yaml patch and regenerate lock file # (create a temporary home directory for flutter to play in) #(cd $buildPath && chmod -R +w . \ # && patch ./pubspec.yaml <(echo "$pubspecYamlPatch") \ # && export HOME=$(mktemp -d) \ # && flutter --disable-analytics \ # && flutter config --no-cli-animations \ # && ${pkgs.flutter}/bin/flutter pub get) # patch the lockfile chmod +w $outPubspecLock patch $outPubspecLock <(echo "$pubspecLockPatch") # convert new lockfile to json and return ${pkgs.yj}/bin/yj < "$buildPath/pubspec.lock" > $out '') ); # TODO: try this instead of patching # gitHashes = { # dartssh2 = "sha256-2pypKwurziwGLZYuGaxlS2lzN3UvJp3bRTvvYYxEqRI="; # hotkey_manager_linux = "sha256-aO0h94YZvgV/ggVupNw8GjyZsnXrq3qTHRDtuhNv3oI="; # system_info2 = "sha256-fly7E2vG+bQ/+QGzXk+DYba73RZccltdW2LpZGDKX60="; # tray_menu = "sha256-riiAiBEms+9ARog8i+MR1fto1Yqx+gwbBWyNbNq6VTM="; # window_size = "sha256-71PqQzf+qY23hTJvcm0Oye8tng3Asr42E2vfF1nBmVA="; # xterm = "sha256-h8vIonTPUVnNqZPk/A4ZV7EYCMyM0rrErL9ZOMe4ZBE="; # }; meta = with lib; { description = "A GUI for the Chameleon Ultra written in Flutter for crossplatform"; homepage = "https://github.com/GameTec-live/ChameleonUltraGUI"; license = licenses.gpl3; maintainers = [maintainers.emileclarkb]; platforms = platforms.linux; }; }) .overrideAttrs ( previousAttrs: { installPhase = previousAttrs.installPhase + '' # create mipmaps of desktop logo logoOriginal="assets/logo-color-desktop.png" for i in 16 32 64 128 256 512; do res="$i"x"$i" logoOut="$out"/share/icons/hicolor/"$res"/apps mkdir -p $logoOut ${pkgs.imagemagick}/bin/magick $logoOriginal -resize $res $logoOut/${previousAttrs.pname}.png done ''; } )