diff --git a/flake.nix b/flake.nix index a966c4f..db35a5f 100644 --- a/flake.nix +++ b/flake.nix @@ -82,14 +82,16 @@ }; }; custom = prev.callPackage ./packages { }; + # Patch stremio-linux-shell to support STREMIO_FORCE_DEVICE_SCALE_FACTOR + # env var, which passes --force-device-scale-factor to the CEF subprocess + # for HiDPI display scaling control + stremio-linux-shell = prev.stremio-linux-shell.overrideAttrs (old: { + patches = (old.patches or []) ++ [ + ./packages/stremio-linux-shell/force-device-scale-factor.patch + ]; + }); # Compatibility: bitwarden renamed to bitwarden-desktop in unstable bitwarden-desktop = prev.bitwarden-desktop or prev.bitwarden; - # Override stremio-linux-shell with custom GTK4/master branch version - # Use nixpkgs-unstable for Rust 1.92+ support required by master branch - stremio-linux-shell = (import inputs.nixpkgs-unstable { - system = prev.stdenv.hostPlatform.system; - config.allowUnfree = true; - }).callPackage ./packages/stremio-linux-shell { }; }); # Shared home-manager configuration factory @@ -122,10 +124,6 @@ (ufinal: uprev: { claude-code = uprev.callPackage ./packages/claude-code { }; }) - # Override stremio-linux-shell with custom GTK4/master branch version - (ofinal: oprev: { - stremio-linux-shell = ofinal.custom.stremio-linux-shell; - }) ]; nixosModules = [ diff --git a/packages/default.nix b/packages/default.nix index 0e742db..9ca060a 100644 --- a/packages/default.nix +++ b/packages/default.nix @@ -11,5 +11,4 @@ rec { qmd = pkgs.callPackage ./qmd { }; openclaw-image = pkgs.callPackage ./openclaw-image { }; openclaw-runtime-closure = pkgs.callPackage ./openclaw-image/runtime-closure.nix { inherit qmd; }; - # stremio-linux-shell is defined in flake.nix to use nixpkgs-unstable for Rust 1.92+ support } diff --git a/packages/stremio-linux-shell/Cargo.lock.patch b/packages/stremio-linux-shell/Cargo.lock.patch deleted file mode 100644 index 3e1568e..0000000 --- a/packages/stremio-linux-shell/Cargo.lock.patch +++ /dev/null @@ -1,27 +0,0 @@ -# This file documents the approach taken to build stremio-linux-shell -# from master branch with a Rust version compatible with nixpkgs nixos-25.11 - -# Approach: Create a patched version of Cargo.toml with older dependencies -# that are compatible with Rust 1.91 - -# The master branch currently (261f46f) requires: -# - gtk4 0.11.3 (requires Rust 1.92) -# - libadwaita 0.9.1 (requires Rust 1.92) -# - webkit6 0.6.1 (requires Rust 1.92) - -# We need to pin these to older versions that work with Rust 1.91: -# - gtk4 0.11.2 (last version before 1.92 requirement) -# - libadwaita 0.9.0 -# - webkit6 0.6.0 - -# However, this requires patching Cargo.toml, which is complex. -# The cleaner solution is to use nixpkgs-unstable which has Rust 1.94+. - -# Currently, the flake.nix overlays use nixpkgs-unstable for stremio-linux-shell -# which should work, but there are native build dependencies that need to be installed. - -# Build dependencies needed for native GTK4 build: -# - pkg-config (for finding libraries) -# - glib, cairo, pango, gdk-pixbuf (buildInputs) -# - wrapGAppsHook4 (for GTK4 wrapping) -# - nodejs (for server.js) diff --git a/packages/stremio-linux-shell/default.nix b/packages/stremio-linux-shell/default.nix deleted file mode 100644 index f888cc7..0000000 --- a/packages/stremio-linux-shell/default.nix +++ /dev/null @@ -1,100 +0,0 @@ -{ - lib, - rustPlatform, - fetchFromGitHub, - pkg-config, - wrapGAppsHook4, - nodejs, - libepoxy, - mpv, - gtk4, - libadwaita, - webkitgtk_6_0, - atk, - glib, - cairo, - pango, - gdk-pixbuf, - libsoup_3, - libnotify, - libsecret, -}: - -let - src = fetchFromGitHub { - owner = "Stremio"; - repo = "stremio-linux-shell"; - rev = "261f46fdf155c9352bd1b2a8ce1ee232b36c9286"; - hash = "sha256-7kfUUjqXIXL1TrSse2AKCjGXHWKcTrDEeXtsFpIiKHc="; - }; -in -rustPlatform.buildRustPackage (finalAttrs: { - pname = "stremio-linux-shell"; - version = "1.0.0-beta.13.master"; - - src = src; - - cargoHash = "sha256-yqrPtvF59ii/UTHAcCa9DDqTe6czG722mxzCPB6UoG0="; - - nativeBuildInputs = [ - pkg-config - wrapGAppsHook4 - nodejs - ]; - - buildInputs = [ - libepoxy - mpv - gtk4 - libadwaita - webkitgtk_6_0 - atk - glib - cairo - pango - gdk-pixbuf - libsoup_3 - libnotify - libsecret - ]; - - env.GETTEXT_DIR = "${src}/po"; - env.GETTEXT_DOMAIN = "stremio"; - env.SERVER_PATH = "\${out}/share/stremio/server.js"; - - postInstall = '' - mkdir -p $out/share/applications - cp data/com.stremio.Stremio.desktop $out/share/applications/com.stremio.Stremio.desktop - - mkdir -p $out/share/metainfo - cp data/com.stremio.Stremio.metainfo.xml $out/share/metainfo/com.stremio.Stremio.metainfo.xml - - mkdir -p $out/share/dbus-1/services - cp data/com.stremio.Stremio.service $out/share/dbus-1/services/com.stremio.Stremio.service - - mkdir -p $out/share/icons/hicolor/128x128/apps - cp data/icons/com.stremio.Stremio.svg $out/share/icons/hicolor/128x128/apps/com.stremio.Stremio.svg - - mkdir -p $out/share/stremio - cp data/server.js $out/share/stremio/server.js - - mv $out/bin/stremio-linux-shell $out/bin/stremio - ''; - - meta = { - description = "Stremio Linux Shell - Freedom to Stream (GTK4/libadwaita/WebKitGTK master branch)"; - longDescription = '' - Stremio Linux Shell - a modern, GTK4/libadwaita-based media center client. - This version uses WebKitGTK instead of CEF/winit from the beta.13 version. - - Note: This is built from the master branch which is a complete rewrite. - Requires Rust 1.92+ to build due to GTK4 0.11.3 dependencies. - ''; - homepage = "https://stremio.com"; - sourceProvenance = [ lib.sourceTypes.fromSource ]; - license = lib.licenses.gpl3Only; - maintainers = with lib.maintainers; [ ]; - platforms = [ "x86_64-linux" "aarch64-linux" ]; - mainProgram = "stremio"; - }; -}) diff --git a/packages/stremio-linux-shell/force-device-scale-factor.patch b/packages/stremio-linux-shell/force-device-scale-factor.patch new file mode 100644 index 0000000..9cc225d --- /dev/null +++ b/packages/stremio-linux-shell/force-device-scale-factor.patch @@ -0,0 +1,20 @@ +--- a/src/webview/mod.rs 2026-05-11 22:00:57.261117297 -0700 ++++ b/src/webview/mod.rs 2026-05-11 22:09:44.824475918 -0700 +@@ -56,6 +56,17 @@ + + let args = Args::new(); + ++ ++ // Pass --force-device-scale-factor to CEF if the environment variable is set. ++ // This is the standard Chromium flag for HiDPI display scaling. ++ if let Ok(scale) = std::env::var("STREMIO_FORCE_DEVICE_SCALE_FACTOR") { ++ if let Some(cmd) = args.as_cmd_line() { ++ cmd.append_switch_with_value( ++ Some(&CefString::from("force-device-scale-factor")), ++ Some(&CefString::from(scale.as_str())), ++ ); ++ } ++ } + let (sender, receiver) = unbounded::(); + SENDER.get_or_init(|| sender); + diff --git a/roles/kodi/default.nix b/roles/kodi/default.nix index b2374af..d650791 100644 --- a/roles/kodi/default.nix +++ b/roles/kodi/default.nix @@ -22,7 +22,7 @@ in stremioScaleFactor = mkOption { type = types.nullOr types.float; default = null; - description = "Scale factor for Stremio UI via GDK_BACKEND=x11 + GDK_SCALE (e.g., 2.0 for 200% scaling). Forces XWayland mode since GTK4 ignores GDK_SCALE on native Wayland."; + description = "Scale factor for Stremio UI (e.g., 2.0 for 200% scaling). Sets STREMIO_FORCE_DEVICE_SCALE_FACTOR which passes --force-device-scale-factor to the CEF subprocess via a source patch."; }; appLauncherServer = { enable = mkOption { @@ -70,22 +70,19 @@ in } else pkgs.qt-pinned.jellyfin-media-player; - # stremio-linux-shell is a GTK4/libadwaita + WebKitGTK app (not Electron/CEF). - # --force-device-scale-factor is a Chromium flag that it ignores entirely. - # On Wayland, GTK4 reads scale from the compositor via wp_fractional_scale_v1. - # To force a specific scale, we use GDK_BACKEND=x11 + GDK_SCALE which works - # reliably under XWayland. On native Wayland, GDK_SCALE is ignored. - # Format floats cleanly: 2.0 -> "2", 1.5 -> "1.5" - stremioScaleStr = let - sf = cfg.stremioScaleFactor; + # Format float for env var: 2.0 -> "2", 1.5 -> "1.5" + # (Nix's toString 2.0 gives "2.000000" which is unclean) + formatScale = sf: let intPart = builtins.floor sf; - s = builtins.toString sf; - m = builtins.match "([0-9]+)\\.([0-9]*[1-9])0*" s; - gdkScale = builtins.toString intPart; in if sf == intPart then builtins.toString intPart - else if m != null then (builtins.elemAt m 0) + "." + (builtins.elemAt m 1) - else s; + else let s = builtins.toString sf; + m = builtins.match "([0-9]+)\\.([0-9]*[1-9])0*" s; + in if m != null then (builtins.elemAt m 0) + "." + (builtins.elemAt m 1) + else s; + # stremio-linux-shell is CEF-based. We patch it (via flake overlay) to read + # STREMIO_FORCE_DEVICE_SCALE_FACTOR and pass it to CEF as + # --force-device-scale-factor, which is the standard Chromium flag for HiDPI. stremioPkg = if cfg.stremioScaleFactor != null then pkgs.symlinkJoin { @@ -96,15 +93,14 @@ in mkdir -p $out/bin rm -f $out/bin/stremio makeWrapper ${pkgs.stremio-linux-shell}/bin/stremio $out/bin/stremio \ - --set GDK_BACKEND x11 \ - --set GDK_SCALE ${builtins.toString (builtins.floor cfg.stremioScaleFactor)} + --set STREMIO_FORCE_DEVICE_SCALE_FACTOR ${formatScale cfg.stremioScaleFactor} - # Update .desktop file to force XWayland + GDK_SCALE for scaling + # Update .desktop file to set the env var mkdir -p $out/share/applications rm -f $out/share/applications/com.stremio.Stremio.desktop substitute ${pkgs.stremio-linux-shell}/share/applications/com.stremio.Stremio.desktop \ $out/share/applications/com.stremio.Stremio.desktop \ - --replace-fail "Exec=sh -c " "Exec=env GDK_BACKEND=x11 GDK_SCALE=${builtins.toString (builtins.floor cfg.stremioScaleFactor)} sh -c " + --replace-fail "Exec=sh -c " "Exec=env STREMIO_FORCE_DEVICE_SCALE_FACTOR=${formatScale cfg.stremioScaleFactor} sh -c " ''; } else pkgs.stremio-linux-shell; @@ -155,9 +151,34 @@ in }; services.displayManager = mkIf cfg.autologin { - autoLogin.enable = true; - autoLogin.user = "kodi"; - defaultSession = "plasma"; + autoLogin = { + enable = true; + user = "kodi"; + }; + }; + + # Kodi user home manager configuration + home-manager.users.kodi = { + home.stateVersion = "24.05"; + + # Auto-start Kodi in fullscreen after login + xsession = mkIf (!cfg.wayland) { + windowManager.command = '' + ${kodiPkg}/bin/kodi --fullscreen + ''; + }; + + # Use a simple .xsession for X11 or a wayland startup script + home.file = mkIf cfg.wayland { + ".config/autostart/kodi.desktop".text = '' + [Desktop Entry] + Type=Application + Name=Kodi + Exec=${kodiPkg}/bin/kodi --fullscreen + X-GNOME-Autostart-enabled=true + Hidden=false + ''; + }; }; }; -} +} \ No newline at end of file