diff --git a/packages/fluxer/default.nix b/packages/fluxer/default.nix index f3931d7..de7d834 100644 --- a/packages/fluxer/default.nix +++ b/packages/fluxer/default.nix @@ -28,19 +28,49 @@ lib, libGL, writeText, + electron_40, + fetchPnpmDeps, + pnpmConfigHook, + pnpm, + nodejs, + python3, + esbuild, + fetchFromGitHub, ... }: -stdenv.mkDerivation { +stdenv.mkDerivation rec { pname = "fluxer"; - version = "0.0.8"; + version = "1.0.0-canary"; - src = builtins.fetchurl { - url = "https://api.fluxer.app/dl/desktop/stable/linux/x64/fluxer-stable-0.0.8-x64.tar.gz"; - }; + src = "${ + fetchFromGitHub { + owner = "fluxerapp"; + repo = "fluxer"; + rev = "canary"; + sha256 = "sha256-7en5pENPCP9g4Bm+WXEKcIVb1kf28H1KlPmeHkX9LNM="; + } + }/fluxer_app"; + + patches = [ ../../patches/screencast.patch ]; nativeBuildInputs = [ autoPatchelfHook makeWrapper + pnpmConfigHook + pnpm + nodejs + python3 + esbuild + ]; + + pnpmDeps = fetchPnpmDeps { + inherit pname version src; + fetcherVersion = 3; + hash = "sha256-zJTjNfNWMhQtEwY1lik2H9xMf4lJ6GLg6PShva7IDjs="; + }; + + pnpmInstallFlags = [ + "--frozen-lockfile" ]; buildInputs = [ @@ -70,19 +100,23 @@ stdenv.mkDerivation { ]; installPhase = '' - mkdir -p $out/runtime + export BUILD_CHANNEL="canary" + pnpm run electron:compile + + pnpm exec electron-builder --config electron-builder.config.cjs --linux \ + --dir \ + -c.electronDist=${electron_40}/libexec/electron \ + -c.electronVersion=${electron_40.version} \ + -c.npmRebuild=false + + mkdir -p $out/share/fluxer mkdir -p $out/bin - cp -r ./* $out/runtime - ls -la $out/runtime - ln -sf $out/runtime/fluxer $out/bin/fluxer + cp -r ./dist-electron/linux-unpacked/resources/* $out/share/fluxer - wrapProgram $out/bin/fluxer \ - --prefix LD_LIBRARY_PATH : ${ - lib.makeLibraryPath [ - libGL - ] - } + makeWrapper ${electron_40}/bin/electron $out/bin/fluxer \ + --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ libGL ]}" \ + --add-flags "$out/share/fluxer/app.asar" mkdir -p $out/share/applications/ substitute ${writeText "fluxer.desktop" '' @@ -97,9 +131,7 @@ stdenv.mkDerivation { StartupWMClass=fluxer ''} $out/share/applications/fluxer.desktop --subst-var out - - mkdir -p $out/share/icons/hicolor/512x512/ - cp $out/runtime/resources/512x512.png $out/share/icons/hicolor/512x512/fluxer.png + cp $out/share/fluxer/512x512.png $out/share/icons/hicolor/512x512/fluxer.png ''; } diff --git a/patches/screencast.patch b/patches/screencast.patch new file mode 100644 index 0000000..d4cb860 --- /dev/null +++ b/patches/screencast.patch @@ -0,0 +1,38 @@ +diff --git a/src-electron/main/window.ts b/src-electron/main/window.ts +index 284db57..9b0bc5f 100644 +--- a/src-electron/main/window.ts ++++ b/src-electron/main/window.ts +@@ -102,6 +102,28 @@ let displayMediaRequestCounter = 0; + + function setupDisplayMediaHandler(session: Electron.Session, webContents: Electron.WebContents): void { + session.setDisplayMediaRequestHandler((request, callback) => { ++ const isWayland = process.platform === 'linux' && ++ (process.env.WAYLAND_DISPLAY || process.env.XDG_SESSION_TYPE === 'wayland'); ++ ++ if (isWayland) { ++ try { ++ desktopCapturer.getSources({ types: ['screen', 'window'] }).then((sources) => { ++ const selected_source = sources[0]; ++ if (selected_source) { ++ log.info('[DisplayMedia] Wayland native portal source selected'); ++ callback({ video: selected_source } as unknown as Electron.Streams); ++ } else { ++ log.info('[DisplayMedia] Wayland native portal cancelled by user'); ++ callback(null as unknown as Electron.Streams); ++ } ++ }) ++ } catch (e){ ++ log.error('[DisplayMedia] Wayland source capture failed:', e); ++ callback(null as unknown as Electron.Streams); ++ } ++ return; ++ } ++ + const requestId = `display-media-${++displayMediaRequestCounter}`; + const requestCallback = (streams: Electron.Streams | null) => callback(streams as Electron.Streams); + pendingDisplayMediaRequests.set(requestId, {callback: requestCallback}); +@@ -608,3 +630,4 @@ export function hideWindow(): void { + export function setQuitting(quitting: boolean): void { + isQuitting = quitting; + } ++