diff --git a/nixos/doc/manual/release-notes/rl-2511.section.md b/nixos/doc/manual/release-notes/rl-2511.section.md index e0f097d5a0a6..0357e6fa5b66 100644 --- a/nixos/doc/manual/release-notes/rl-2511.section.md +++ b/nixos/doc/manual/release-notes/rl-2511.section.md @@ -142,6 +142,8 @@ - [nvme-rs](https://github.com/liberodark/nvme-rs), NVMe monitoring [services.nvme-rs](#opt-services.nvme-rs.enable). +- [ringboard](https://github.com/SUPERCILEX/clipboard-history), a fast, efficient, and composable clipboard manager for Linux. Available for x11 as [services.ringboard](#opt-services.ringboard.x11.enable) and for wayland as [services.ringboard](#opt-services.ringboard.wayland.enable). + ## Backward Incompatibilities {#sec-release-25.11-incompatibilities} diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 3171684a30e6..c9ac96aa6706 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -915,6 +915,7 @@ ./services/misc/redlib.nix ./services/misc/redmine.nix ./services/misc/renovate.nix + ./services/misc/ringboard.nix ./services/misc/rkvm.nix ./services/misc/rmfakecloud.nix ./services/misc/rshim.nix diff --git a/nixos/modules/services/misc/ringboard.nix b/nixos/modules/services/misc/ringboard.nix new file mode 100644 index 000000000000..2e2847da853e --- /dev/null +++ b/nixos/modules/services/misc/ringboard.nix @@ -0,0 +1,78 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.services.ringboard; +in +{ + options.services.ringboard = { + x11.enable = lib.mkEnableOption "X11 support for Ringboard"; + wayland.enable = lib.mkEnableOption "Wayland support for Ringboard"; + x11.package = lib.mkPackageOption pkgs "ringboard" { }; + wayland.package = lib.mkPackageOption pkgs "ringboard-wayland" { }; + }; + + config = lib.mkIf (cfg.x11.enable || cfg.wayland.enable) { + systemd.user.services.ringboard-server = { + description = "Ringboard server"; + documentation = [ "https://github.com/SUPERCILEX/clipboard-history" ]; + after = [ "multi-user.target" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "notify"; + Environment = "RUST_LOG=trace"; + ExecStart = "${ + if cfg.x11.enable then cfg.x11.package else cfg.wayland.package + }/bin/ringboard-server"; + Restart = "on-failure"; + Slice = "session-ringboard.slice"; + }; + }; + + systemd.user.services.ringboard-listener = { + description = "Ringboard clipboard listener"; + documentation = [ "https://github.com/SUPERCILEX/clipboard-history" ]; + requires = [ "ringboard-server.service" ]; + after = [ + "ringboard-server.service" + "graphical-session.target" + ]; + bindsTo = [ "graphical-session.target" ]; + wantedBy = [ "graphical-session.target" ]; + script = + if cfg.x11.enable && cfg.wayland.enable then + '' + if [ "$XDG_SESSION_TYPE" = "wayland" ]; then + exec '${cfg.wayland.package}'/bin/ringboard-wayland + else + exec '${cfg.x11.package}'/bin/ringboard-x11 + fi + '' + else if cfg.wayland.enable then + '' + exec '${cfg.wayland.package}'/bin/ringboard-wayland + '' + else + '' + exec '${cfg.x11.package}'/bin/ringboard-x11 + ''; + serviceConfig = { + Type = "exec"; + Restart = "on-failure"; + Slice = "session-ringboard.slice"; + }; + environment.RUST_LOG = "trace"; + }; + + systemd.user.slices.session-ringboard = { + description = "Ringboard clipboard services"; + }; + + environment.systemPackages = + lib.optionals cfg.x11.enable [ cfg.x11.package ] + ++ lib.optionals cfg.wayland.enable [ cfg.wayland.package ]; + }; +}