{ config, pkgs, lib, ... }: let cfg = config.gnome.extensions; in { options.gnome.extensions = with lib.types; { paperwm = { enable = lib.mkEnableOption { }; package = lib.mkOption { type = package; default = pkgs.gnomeExtensions.paperwm; }; cycle-height-steps = lib.mkOption { type = listOf numbers.nonnegative; default = [ 0.33 0.5 0.67 1.0 ]; }; cycle-width-steps = lib.mkOption { type = listOf numbers.nonnegative; default = [ 0.33 0.5 0.67 1.0 ]; }; horizontal-margin = lib.mkOption { type = ints.unsigned; default = 5; }; vertical-margin = lib.mkOption { type = ints.unsigned; default = 5; }; window-gap = lib.mkOption { type = ints.unsigned; default = 5; }; winprops = lib.mkOption { type = listOf (submodule { options = { wm_class = lib.mkOption { type = str; default = ""; }; title = lib.mkOption { type = str; default = ""; }; scratch_layer = lib.mkEnableOption { }; preferredWidth = lib.mkOption { type = nullOr str; default = null; }; }; }); default = [ ]; }; keybindings = lib.mkOption { type = attrsOf (listOf str); default = { }; }; }; }; config = lib.mkIf cfg.paperwm.enable { home.packages = [ cfg.paperwm.package ]; dconf.settings = { "org/gnome/shell".enabled-extensions = lib.mkIf cfg.paperwm.enable [ cfg.paperwm.package.extensionUuid ]; "org/gnome/shell/extensions/paperwm" = with cfg.paperwm; lib.mkIf cfg.paperwm.enable { inherit cycle-height-steps cycle-width-steps horizontal-margin vertical-margin window-gap; winprops = map (props: builtins.toJSON props) winprops; }; "org/gnome/shell/extensions/paperwm/keybindings" = lib.mkIf cfg.paperwm.enable cfg.paperwm.keybindings; }; }; }