diff --git a/flake.lock b/flake.lock index f43ab9c..835d561 100644 --- a/flake.lock +++ b/flake.lock @@ -122,11 +122,11 @@ "nixpkgs-stable": "nixpkgs-stable" }, "locked": { - "lastModified": 1738228472, - "narHash": "sha256-8HVtDJLGO6/tx17iFL3yz6s65/y0eMtdp/w/l9FjH0g=", + "lastModified": 1738548382, + "narHash": "sha256-yV7FmfZr1WKJyh7wMbwjIqIFYAQMSucXWyqJWCclNc0=", "owner": "nix-community", "repo": "emacs-overlay", - "rev": "bf817bb80b020ffdeee5769867b8862026bd5312", + "rev": "501c905c37fbfaef6ae9b64cd2ff9d90f1383212", "type": "github" }, "original": { @@ -305,11 +305,11 @@ "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1736143030, - "narHash": "sha256-+hu54pAoLDEZT9pjHlqL9DNzWz0NbUn8NEAHP7PQPzU=", + "lastModified": 1738453229, + "narHash": "sha256-7H9XgNiGLKN1G1CgRh0vUL4AheZSYzPm+zmZ7vxbJdo=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "b905f6fc23a9051a6e1b741e1438dbfc0634c6de", + "rev": "32ea77a06711b758da0ad9bd6a844c5740a87abd", "type": "github" }, "original": { @@ -466,11 +466,11 @@ ] }, "locked": { - "lastModified": 1738228963, - "narHash": "sha256-Ee5hVHM7AWxaq7XJN6xiZztTZX8csdXernjqaTW5r9I=", + "lastModified": 1738448366, + "narHash": "sha256-4ATtQqBlgsGqkHTemta0ydY6f7JBRXz4Hf574NHQpkg=", "owner": "nix-community", "repo": "home-manager", - "rev": "d963ed335b890a70ed53eecf14cdb21528eda9b8", + "rev": "18fa9f323d8adbb0b7b8b98a8488db308210ed93", "type": "github" }, "original": { @@ -543,11 +543,11 @@ "lix": { "flake": false, "locked": { - "lastModified": 1738174211, - "narHash": "sha256-eYmp1mKM4kULV1W+EBtCPk6LmKWl2REivaYfGRl+AWo=", + "lastModified": 1738446528, + "narHash": "sha256-NYL/r7EXSyYP7nXuYGvGYMI9QtztGjVaKKofBt/pCv8=", "ref": "refs/heads/main", - "rev": "64e33a7e09a0d1faacf2fd3f6ebd647fe4d8346a", - "revCount": 17329, + "rev": "a51380645f61b33d37a536b596d16c481f7b84a6", + "revCount": 17342, "type": "git", "url": "https://git@git.lix.systems/lix-project/lix" }, @@ -698,11 +698,11 @@ "nixpkgs": "nixpkgs_6" }, "locked": { - "lastModified": 1738033138, - "narHash": "sha256-qlIM8A3bdL9c6PexhpS+QyZLO9y/8a3V75HVyJgDE5Q=", + "lastModified": 1738277753, + "narHash": "sha256-iyFcCOk0mmDiv4ut9mBEuMxMZIym3++0qN1rQBg8FW0=", "owner": "LnL7", "repo": "nix-darwin", - "rev": "349a74c66c596ef97ee97b4d80a3ca61227b6120", + "rev": "49b807fa7c37568d7fbe2aeaafb9255c185412f9", "type": "github" }, "original": { @@ -734,11 +734,11 @@ }, "nixosHardware": { "locked": { - "lastModified": 1737751639, - "narHash": "sha256-ZEbOJ9iT72iwqXsiEMbEa8wWjyFvRA9Ugx8utmYbpz4=", + "lastModified": 1738471961, + "narHash": "sha256-cgXDFrplNGs7bCVzXhRofjD8oJYqqXGcmUzXjHmip6Y=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "dfad538f751a5aa5d4436d9781ab27a6128ec9d4", + "rev": "537286c3c59b40311e5418a180b38034661d2536", "type": "github" }, "original": { @@ -797,14 +797,14 @@ }, "nixpkgs-lib": { "locked": { - "lastModified": 1735774519, - "narHash": "sha256-CewEm1o2eVAnoqb6Ml+Qi9Gg/EfNAxbRx1lANGVyoLI=", + "lastModified": 1738452942, + "narHash": "sha256-vJzFZGaCpnmo7I6i416HaBLpC+hvcURh/BQwROcGIp8=", "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/e9b51731911566bbf7e4895475a87fe06961de0b.tar.gz" + "url": "https://github.com/NixOS/nixpkgs/archive/072a6db25e947df2f31aab9eccd0ab75d5b2da11.tar.gz" }, "original": { "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/e9b51731911566bbf7e4895475a87fe06961de0b.tar.gz" + "url": "https://github.com/NixOS/nixpkgs/archive/072a6db25e947df2f31aab9eccd0ab75d5b2da11.tar.gz" } }, "nixpkgs-lib_2": { @@ -827,11 +827,11 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1738023785, - "narHash": "sha256-BPHmb3fUwdHkonHyHi1+x89eXB3kA1jffIpwPVJIVys=", + "lastModified": 1738435198, + "narHash": "sha256-5+Hmo4nbqw8FrW85FlNm4IIrRnZ7bn0cmXlScNsNRLo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "2b4230bf03deb33103947e2528cac2ed516c5c89", + "rev": "f6687779bf4c396250831aa5a32cbfeb85bb07a3", "type": "github" }, "original": { @@ -905,11 +905,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1738142207, - "narHash": "sha256-NGqpVVxNAHwIicXpgaVqJEJWeyqzoQJ9oc8lnK9+WC4=", + "lastModified": 1738410390, + "narHash": "sha256-xvTo0Aw0+veek7hvEVLzErmJyQkEcRk6PSR4zsRQFEc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9d3ae807ebd2981d593cddd0080856873139aa40", + "rev": "3a228057f5b619feb3186e986dbe76278d707b6e", "type": "github" }, "original": { @@ -984,11 +984,11 @@ }, "nixpkgs_9": { "locked": { - "lastModified": 1738142207, - "narHash": "sha256-NGqpVVxNAHwIicXpgaVqJEJWeyqzoQJ9oc8lnK9+WC4=", + "lastModified": 1738410390, + "narHash": "sha256-xvTo0Aw0+veek7hvEVLzErmJyQkEcRk6PSR4zsRQFEc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9d3ae807ebd2981d593cddd0080856873139aa40", + "rev": "3a228057f5b619feb3186e986dbe76278d707b6e", "type": "github" }, "original": { diff --git a/hmModules/ib-tws/default.nix b/hmModules/ib-tws/default.nix new file mode 100644 index 0000000..b08f930 --- /dev/null +++ b/hmModules/ib-tws/default.nix @@ -0,0 +1,4 @@ +{ fleetFlake, pkgs, ... }: +{ + home.packages = [ fleetFlake.packages.${pkgs.system}.ib-tws ]; +} diff --git a/hmModules/niri/config.kdl b/hmModules/niri/config.kdl index 92e01b1..c0045cd 100644 --- a/hmModules/niri/config.kdl +++ b/hmModules/niri/config.kdl @@ -68,6 +68,9 @@ environment { DISPLAY ":0" } +hotkey-overlay { + skip-at-startup +} // You can configure outputs by their name, which you can find // by running `niri msg outputs` while inside a niri instance. diff --git a/hmModules/niri/default.nix b/hmModules/niri/default.nix index c59f988..9210926 100644 --- a/hmModules/niri/default.nix +++ b/hmModules/niri/default.nix @@ -33,6 +33,11 @@ fi ''; + home.sessionVariables = { + DISPLAY = ":0"; + QT_QPA_PLATFORM = "wayland"; + }; + programs.rofi = { enable = true; package = pkgs.rofi-wayland; diff --git a/hosts/picard/default.nix b/hosts/picard/default.nix index 40168a5..eea6cd0 100644 --- a/hosts/picard/default.nix +++ b/hosts/picard/default.nix @@ -93,6 +93,7 @@ "chirp" "sdrangel" "discord" + "ib-tws" ]; extraGroups = [ "plugdev" ]; backupPaths = [ ]; diff --git a/packages/ib-tws/default.nix b/packages/ib-tws/default.nix new file mode 100644 index 0000000..b51675c --- /dev/null +++ b/packages/ib-tws/default.nix @@ -0,0 +1,194 @@ +{ + stdenv, + lib, + fetchurl, + makeDesktopItem, + copyDesktopItems, + libXxf86vm, + libX11, + libXext, + libXtst, + libXi, + libXrender, + glib, + libxml2, + ffmpeg, + libGL, + freetype, + fontconfig, + gtk3, + pango, + cairo, + alsa-lib, + atk, + gdk-pixbuf, + gtk2, + ... +}: + +let + rSubPaths = [ + "lib/amd64/jli" + "lib/amd64/server" + "lib/amd64" + ]; + +in + +stdenv.mkDerivation rec { + pname = "ib-tws"; + version = "10.33.1f"; + etagHash = "f3ac044774c83917855f484a968c6ad2"; + + src = fetchurl { + url = "https://download2.interactivebrokers.com/installers/tws/latest-standalone/tws-latest-standalone-linux-x64.sh"; + hash = "sha256-Iq4Bd5LTOajfK3IaomeAZL182lEXkCn7JjEO6UWgdFE="; + }; + + phases = [ + "unpackPhase" + "installPhase" + "fixupPhase" + ]; + + nativeBuildInputs = [ copyDesktopItems ]; + + desktopItems = [ + (makeDesktopItem { + name = pname; + desktopName = "IB Trader Workstation"; + exec = pname; + icon = pname; + categories = [ + "Office" + "Finance" + ]; + startupWMClass = "jclient-LoginFrame"; + }) + (makeDesktopItem { + name = "ib-gw"; + desktopName = "IB Gateway"; + exec = "ib-gw"; + icon = pname; + categories = [ + "Office" + "Finance" + ]; + startupWMClass = "ibgateway-GWClient"; + }) + ]; + + unpackPhase = '' + echo "Unpacking I4J sfx sh to $PWD..." + INSTALL4J_TEMP="$PWD" sh "$src" __i4j_extract_and_exit + + # JRE + jrePath="$out/share/${pname}/jre" + echo "Unpacking JRE to $jrePath..." + mkdir -p "$jrePath" + tar -xf "$PWD/"*.dir/jre.tar.gz -C "$jrePath/" + + echo "Patching JRE executables..." + patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \ + "$jrePath/bin/java" "$jrePath/bin/unpack200" + + echo "Unpacking JRE pack files..." + for f in "$jrePath/lib/"*.jar.pack "$jrePath/lib/ext/"*.jar.pack; do + jar_file=`echo "$f" | awk '{ print substr($0,1,length($0)-5) }'` + "$jrePath/bin/unpack200" -r "$f" "$jar_file" + [ $? -ne 0 ] && echo "Error unpacking $f" && exit 1 + done + + echo "Unpacking TWS payload..." + INSTALL4J_JAVA_HOME_OVERRIDE="$jrePath" sh "$src" -q -dir "$PWD/" + ''; + + installPhase = '' + runHook preInstall + + # create main startup script + mkdir -p "$out/bin" + cat< "$out/bin/${pname}" + #!$SHELL + + # get script name + PROG=\$(basename "\$0") + + # Load system-wide settings and per-user overrides + IB_CONFIG_DIR="\$HOME/.\$PROG" + JAVA_GC="-Xmx4G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=20 -XX:ConcGCThreads=5 -XX:InitiatingHeapOccupancyPercent=70" + JAVA_UI_FLAGS="-Dswing.aatext=TRUE -Dawt.useSystemAAFontSettings=on -Dsun.awt.nopixfmt=true -Dsun.java2d.noddraw=true -Dswing.boldMetal=false -Dsun.locale.formatasdefault=true" + JAVA_LOCALE_FLAGS="-Dsun.locale.formatasdefault=true" + JAVA_FLAGS="\$JAVA_GC \$JAVA_UI_FLAGS \$JAVA_LOCALE_FLAGS \$JAVA_EXTRA_FLAGS" + [ -f "\$HOME/.config/\$PROG.conf" ] && . "\$HOME/.config/\$PROG.conf" + + CLASS="jclient.LoginFrame" + [ "\$PROG" = "ib-gw" ] && CLASS="ibgateway.GWClient" + + cd "$out/share/${pname}/jars" + "$out/share/${pname}/jre/bin/java" -cp \* \$JAVA_FLAGS \$CLASS \$IB_CONFIG_DIR + EOF + chmod u+x $out/bin/${pname} + + # create symlink for the gateway + ln -s "${pname}" "$out/bin/ib-gw" + + # copy files + mkdir -p $out/share/${pname} + cp -R jars $out/share/${pname} + install -Dm644 .install4j/tws.png $out/share/pixmaps/${pname}.png + + runHook postInstall + ''; + + dontPatchELF = true; + dontStrip = true; + + postFixup = '' + rpath+="''${rpath:+:}${lib.concatStringsSep ":" (map (a: "$jrePath/${a}") rSubPaths)}" + + # set all the dynamic linkers + find $out -type f -perm -0100 \ + -exec patchelf --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \ + --set-rpath "$rpath" {} \; + + find $out -name "*.so" -exec patchelf --set-rpath "$rpath" {} \; + ''; + + rpath = lib.strings.makeLibraryPath libraries; + + libraries = [ + stdenv.cc + stdenv.cc.libc + glib + libxml2 + ffmpeg + libGL + libXxf86vm + alsa-lib + fontconfig + freetype + pango + gtk3 + cairo + gdk-pixbuf + atk + libX11 + libXext + libXtst + libXi + libXrender + gtk2 + ]; + # possibly missing libgdk-x11-2.0.so.0, from gtk2? never caused any trouble though + + passthru.updateScript = ./update.sh; + + meta = with lib; { + description = "Trader Work Station of Interactive Brokers"; + homepage = "https://www.interactivebrokers.com"; + # license = licenses.unfree; + maintainers = lib.optionals (maintainers ? k3a) [ maintainers.k3a ]; + platforms = [ "x86_64-linux" ]; + }; +}