From 4125f23bd1bed07d20271775f26afa19e468925c Mon Sep 17 00:00:00 2001 From: Henro Veijer Date: Tue, 24 Feb 2026 15:40:40 +0100 Subject: [PATCH] Redid hyprscrolling.nix --- henrovnix_ok/README.org | 92 ++++++++++++--------- henrovnix_ok/home/desktop/hyprscrolling.nix | 92 ++++++++++++--------- 2 files changed, 104 insertions(+), 80 deletions(-) diff --git a/henrovnix_ok/README.org b/henrovnix_ok/README.org index 2211ca7b0..b4356bea3 100755 --- a/henrovnix_ok/README.org +++ b/henrovnix_ok/README.org @@ -1768,18 +1768,12 @@ This Nix module integrates the hyprscrolling plugin into a Home-Manager managed { config, lib, pkgs, ... }: let cfg = config.programs.hyprscrolling; + # Render plugin settings into: # plugin:hyprscrolling { # key = value # } - # - # Values: - # - strings become "..." - # - bools become true/false - # - ints/floats stay numeric - # - lists become [ a b c ] (Hyprland-style arrays) - renderValue = - v: + renderValue = v: if lib.isString v then "\"${v}\"" else if lib.isBool v then (if v then "true" else "false") else if lib.isInt v || lib.isFloat v then toString v @@ -1788,8 +1782,7 @@ let else throw "programs.hyprscrolling.settings: unsupported value type: ${builtins.typeOf v}"; - renderSettings = - settings: + renderSettings = settings: let lines = lib.mapAttrsToList (k: v: " ${k} = ${renderValue v}") settings; in @@ -1800,15 +1793,31 @@ let } ''; - defaultPluginPkg = - # In nixpkgs this is typically available as pkgs.hyprlandPlugins.hyprscrolling - # (names may vary by channel; override via programs.hyprscrolling.pluginPackage if needed). - (pkgs.hyprlandPlugins.hyprscrolling or null); + defaultPluginPkg = (pkgs.hyprlandPlugins.hyprscrolling or null); + # Stable paths (avoid pinning /nix/store/... in your hyprland.conf) + stableSoPath = "/etc/hypr/plugins/libhyprscrolling.so"; + dropInConfPath = "/etc/hypr/conf.d/90-hyprscrolling.conf"; + + dropInConf = '' + # Managed by Nix: programs.hyprscrolling + # Load plugin shared object (.so) + plugin = ${stableSoPath} + + ${lib.optionalString cfg.setAsDefaultLayout '' + general { + layout = scrolling + } + ''} + + ${renderSettings cfg.settings} + + ${cfg.extraConfig} + ''; in { options.programs.hyprscrolling = { - enable = lib.mkEnableOption "Hyprland hyprscrolling (scrolling layout) plugin"; + enable = lib.mkEnableOption "Hyprland hyprscrolling (scrolling layout) plugin (NixOS-friendly)"; pluginPackage = lib.mkOption { type = lib.types.nullOr lib.types.package; @@ -1822,56 +1831,59 @@ in setAsDefaultLayout = lib.mkOption { type = lib.types.bool; default = true; - description = "Whether to set `general:layout = scrolling` in Hyprland."; + description = "Whether to set `general { layout = scrolling }` in the generated drop-in config."; }; + settings = lib.mkOption { type = lib.types.attrs; default = { }; - example = { - # Example keys (actual keys depend on plugin version) - # See hyprscrolling README for supported options. - # swipe_fingers = 3; - # natural_scroll = true; - }; description = '' - Attribute set rendered into a `plugin:hyprscrolling { ... }` block. - Keys/values must match hyprscrolling config options. + Attribute set rendered into a `plugin:hyprscrolling { ... }` block + in the generated drop-in config. ''; }; extraConfig = lib.mkOption { type = lib.types.lines; default = ""; - description = "Extra Hyprland config appended after the generated plugin config."; + description = "Extra Hyprland config appended to the generated drop-in config."; + }; + + # Where we install the generated config snippet (so you can `source = ...` it) + dropInPath = lib.mkOption { + type = lib.types.str; + default = dropInConfPath; + description = "Path to the generated Hyprland drop-in config file (needs to be sourced by your hyprland.conf)."; + }; + + # Where we install a stable symlink to the plugin .so + stablePluginSoPath = lib.mkOption { + type = lib.types.str; + default = stableSoPath; + description = "Stable path for the plugin shared object (symlinked to the Nix store)."; }; }; config = lib.mkIf cfg.enable { assertions = [ - { - assertion = config.wayland.windowManager.hyprland.enable or false; - message = "programs.hyprscrolling.enable requires wayland.windowManager.hyprland.enable = true;"; - } { assertion = cfg.pluginPackage != null; message = '' - Could not find a default hyprscrolling plugin package in this nixpkgs. - Set programs.hyprscrolling.pluginPackage explicitly (either from pkgs or a flake input). + Could not find hyprscrolling plugin package in this nixpkgs. + Set programs.hyprscrolling.pluginPackage explicitly (e.g. pkgs.hyprlandPlugins.hyprscrolling). ''; } ]; - wayland.windowManager.hyprland = { - plugins = [ cfg.pluginPackage ]; + # Ensure the plugin is built and available. + environment.systemPackages = [ cfg.pluginPackage ]; - extraConfig = lib.mkAfter '' - ${lib.optionalString cfg.setAsDefaultLayout "general { layout = scrolling }"} + # Provide a stable .so path under /etc (no /nix/store hardcoding in hyprland.conf) + environment.etc."hypr/plugins/libhyprscrolling.so".source = + "${cfg.pluginPackage}/lib/libhyprscrolling.so"; - ${renderSettings cfg.settings} - - ${cfg.extraConfig} - ''; - }; + # Provide a drop-in config file under /etc. + environment.etc."hypr/conf.d/90-hyprscrolling.conf".text = dropInConf; }; } #+end_src diff --git a/henrovnix_ok/home/desktop/hyprscrolling.nix b/henrovnix_ok/home/desktop/hyprscrolling.nix index 305c7c880..fa9fd8af8 100644 --- a/henrovnix_ok/home/desktop/hyprscrolling.nix +++ b/henrovnix_ok/home/desktop/hyprscrolling.nix @@ -1,18 +1,12 @@ { config, lib, pkgs, ... }: let cfg = config.programs.hyprscrolling; + # Render plugin settings into: # plugin:hyprscrolling { # key = value # } - # - # Values: - # - strings become "..." - # - bools become true/false - # - ints/floats stay numeric - # - lists become [ a b c ] (Hyprland-style arrays) - renderValue = - v: + renderValue = v: if lib.isString v then "\"${v}\"" else if lib.isBool v then (if v then "true" else "false") else if lib.isInt v || lib.isFloat v then toString v @@ -21,8 +15,7 @@ let else throw "programs.hyprscrolling.settings: unsupported value type: ${builtins.typeOf v}"; - renderSettings = - settings: + renderSettings = settings: let lines = lib.mapAttrsToList (k: v: " ${k} = ${renderValue v}") settings; in @@ -33,15 +26,31 @@ let } ''; - defaultPluginPkg = - # In nixpkgs this is typically available as pkgs.hyprlandPlugins.hyprscrolling - # (names may vary by channel; override via programs.hyprscrolling.pluginPackage if needed). - (pkgs.hyprlandPlugins.hyprscrolling or null); + defaultPluginPkg = (pkgs.hyprlandPlugins.hyprscrolling or null); + # Stable paths (avoid pinning /nix/store/... in your hyprland.conf) + stableSoPath = "/etc/hypr/plugins/libhyprscrolling.so"; + dropInConfPath = "/etc/hypr/conf.d/90-hyprscrolling.conf"; + + dropInConf = '' + # Managed by Nix: programs.hyprscrolling + # Load plugin shared object (.so) + plugin = ${stableSoPath} + + ${lib.optionalString cfg.setAsDefaultLayout '' + general { + layout = scrolling + } + ''} + + ${renderSettings cfg.settings} + + ${cfg.extraConfig} + ''; in { options.programs.hyprscrolling = { - enable = lib.mkEnableOption "Hyprland hyprscrolling (scrolling layout) plugin"; + enable = lib.mkEnableOption "Hyprland hyprscrolling (scrolling layout) plugin (NixOS-friendly)"; pluginPackage = lib.mkOption { type = lib.types.nullOr lib.types.package; @@ -55,55 +64,58 @@ in setAsDefaultLayout = lib.mkOption { type = lib.types.bool; default = true; - description = "Whether to set `general:layout = scrolling` in Hyprland."; + description = "Whether to set `general { layout = scrolling }` in the generated drop-in config."; }; + settings = lib.mkOption { type = lib.types.attrs; default = { }; - example = { - # Example keys (actual keys depend on plugin version) - # See hyprscrolling README for supported options. - # swipe_fingers = 3; - # natural_scroll = true; - }; description = '' - Attribute set rendered into a `plugin:hyprscrolling { ... }` block. - Keys/values must match hyprscrolling config options. + Attribute set rendered into a `plugin:hyprscrolling { ... }` block + in the generated drop-in config. ''; }; extraConfig = lib.mkOption { type = lib.types.lines; default = ""; - description = "Extra Hyprland config appended after the generated plugin config."; + description = "Extra Hyprland config appended to the generated drop-in config."; + }; + + # Where we install the generated config snippet (so you can `source = ...` it) + dropInPath = lib.mkOption { + type = lib.types.str; + default = dropInConfPath; + description = "Path to the generated Hyprland drop-in config file (needs to be sourced by your hyprland.conf)."; + }; + + # Where we install a stable symlink to the plugin .so + stablePluginSoPath = lib.mkOption { + type = lib.types.str; + default = stableSoPath; + description = "Stable path for the plugin shared object (symlinked to the Nix store)."; }; }; config = lib.mkIf cfg.enable { assertions = [ - { - assertion = config.wayland.windowManager.hyprland.enable or false; - message = "programs.hyprscrolling.enable requires wayland.windowManager.hyprland.enable = true;"; - } { assertion = cfg.pluginPackage != null; message = '' - Could not find a default hyprscrolling plugin package in this nixpkgs. - Set programs.hyprscrolling.pluginPackage explicitly (either from pkgs or a flake input). + Could not find hyprscrolling plugin package in this nixpkgs. + Set programs.hyprscrolling.pluginPackage explicitly (e.g. pkgs.hyprlandPlugins.hyprscrolling). ''; } ]; - wayland.windowManager.hyprland = { - plugins = [ cfg.pluginPackage ]; + # Ensure the plugin is built and available. + environment.systemPackages = [ cfg.pluginPackage ]; - extraConfig = lib.mkAfter '' - ${lib.optionalString cfg.setAsDefaultLayout "general { layout = scrolling }"} + # Provide a stable .so path under /etc (no /nix/store hardcoding in hyprland.conf) + environment.etc."hypr/plugins/libhyprscrolling.so".source = + "${cfg.pluginPackage}/lib/libhyprscrolling.so"; - ${renderSettings cfg.settings} - - ${cfg.extraConfig} - ''; - }; + # Provide a drop-in config file under /etc. + environment.etc."hypr/conf.d/90-hyprscrolling.conf".text = dropInConf; }; }