203 lines
		
	
	
	
		
			6.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
	
		
			6.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| {
 | |
|   lib,
 | |
|   config,
 | |
|   pkgs,
 | |
|   ...
 | |
| }: let
 | |
|   enabledExtensions =
 | |
|     []
 | |
|     ++ lib.optional config.gnome.extensions.dash-to-dock.enable pkgs.gnomeExtensions.dash-to-dock
 | |
|     ++ lib.optional config.gnome.extensions.dash-to-panel.enable pkgs.gnomeExtensions.dash-to-panel;
 | |
| 
 | |
|   extensions = config.gnome.extraExtensions ++ enabledExtensions;
 | |
| in {
 | |
|   options.gnome = {
 | |
|     extraWindowControls = lib.mkEnableOption "Should we add back in the minimize and maximize window controls?";
 | |
|     clockFormat = lib.mkOption {
 | |
|       type = lib.types.enum [
 | |
|         "12h"
 | |
|         "24h"
 | |
|       ];
 | |
|       default = "24h";
 | |
|     };
 | |
|     colorScheme = lib.mkOption {
 | |
|       type = lib.types.enum [
 | |
|         "default"
 | |
|         "prefer-dark"
 | |
|         "prefer-light"
 | |
|       ];
 | |
|       default = "default";
 | |
|     };
 | |
|     accentColor = lib.mkOption {
 | |
|       type = lib.types.enum [
 | |
|         "blue"
 | |
|         "teal"
 | |
|         "green"
 | |
|         "yellow"
 | |
|         "orange"
 | |
|         "red"
 | |
|         "pink"
 | |
|         "purple"
 | |
|         "slate"
 | |
|       ];
 | |
|       default = "blue";
 | |
|     };
 | |
|     extraExtensions = lib.mkOption {
 | |
|       type = lib.types.listOf lib.types.package;
 | |
|       default = [];
 | |
|       description = "The set of extensions to install and enable in the user environment.";
 | |
|     };
 | |
|     hotkeys = lib.mkOption {
 | |
|       type = lib.types.attrsOf (lib.types.submodule ({name, ...}: {
 | |
|         options = {
 | |
|           key = lib.mkOption {
 | |
|             type = lib.types.strMatching "[a-zA-Z0-9-]+";
 | |
|             default = builtins.replaceStrings [" " "/" "_"] ["-" "-" "-"] name;
 | |
|           };
 | |
|           name = lib.mkOption {
 | |
|             type = lib.types.str;
 | |
|             default = name;
 | |
|           };
 | |
|           binding = lib.mkOption {
 | |
|             type = lib.types.str;
 | |
|           };
 | |
|           command = lib.mkOption {
 | |
|             type = lib.types.str;
 | |
|           };
 | |
|         };
 | |
|       }));
 | |
|       default = {};
 | |
|     };
 | |
|     displayScaling = lib.mkOption {
 | |
|       type = lib.types.nullOr (lib.types.enum [100 125 150 175 200]);
 | |
|       default = null;
 | |
|       description = "Display scaling percentage for GNOME";
 | |
|     };
 | |
|     experimentalFeatures = lib.mkOption {
 | |
|       type = lib.types.submodule {
 | |
|         options = {
 | |
|           scaleMonitorFramebuffer = lib.mkEnableOption "scale-monitor-framebuffer experimental feature";
 | |
|         };
 | |
|       };
 | |
|       default = {};
 | |
|       description = "GNOME experimental features to enable";
 | |
|     };
 | |
| 
 | |
|     nightLight = lib.mkOption {
 | |
|       type = lib.types.submodule {
 | |
|         options = {
 | |
|           enable = lib.mkEnableOption "night light (blue light filter)";
 | |
|           automatic = lib.mkOption {
 | |
|             type = lib.types.bool;
 | |
|             default = true;
 | |
|             description = "Whether to automatically schedule night light based on sunset/sunrise";
 | |
|           };
 | |
|           fromTime = lib.mkOption {
 | |
|             type = lib.types.float;
 | |
|             default = 20.0;
 | |
|             description = "Start time for night light in 24-hour format (e.g., 20.0 for 8:00 PM)";
 | |
|           };
 | |
|           toTime = lib.mkOption {
 | |
|             type = lib.types.float;
 | |
|             default = 6.0;
 | |
|             description = "End time for night light in 24-hour format (e.g., 6.0 for 6:00 AM)";
 | |
|           };
 | |
|           temperature = lib.mkOption {
 | |
|             type = lib.types.int;
 | |
|             default = 4000;
 | |
|             description = "Color temperature for night light (1000-10000K, lower is warmer)";
 | |
|           };
 | |
|         };
 | |
|       };
 | |
|       default = {};
 | |
|       description = "Night light configuration";
 | |
|     };
 | |
| 
 | |
|     extensions = {
 | |
|       dash-to-dock = {
 | |
|         enable = lib.mkEnableOption "Dash to Dock extension";
 | |
|         options = lib.mkOption {
 | |
|           type = lib.types.nullOr lib.types.attrs;
 | |
|           default = null;
 | |
|           description = "Dash to Dock configuration options. If null, no custom configuration will be applied.";
 | |
|         };
 | |
|       };
 | |
| 
 | |
|       dash-to-panel = {
 | |
|         enable = lib.mkEnableOption "Dash to Panel extension";
 | |
|         options = lib.mkOption {
 | |
|           type = lib.types.nullOr lib.types.attrs;
 | |
|           default = null;
 | |
|           description = "Dash to Panel configuration options. If null, no custom configuration will be applied.";
 | |
|         };
 | |
|       };
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   config = {
 | |
|     home.packages = extensions;
 | |
|     dconf = {
 | |
|       settings = lib.mkMerge [
 | |
|         {
 | |
|           "org/gnome/shell" = {
 | |
|             disable-user-extensions = false; # enables user extensions
 | |
|             enabled-extensions = builtins.map (extension: extension.extensionUuid) extensions;
 | |
|           };
 | |
| 
 | |
|           "org/gnome/desktop/wm/preferences".button-layout = lib.mkIf config.gnome.extraWindowControls ":minimize,maximize,close";
 | |
| 
 | |
|           "org/gnome/desktop/interface".color-scheme = config.gnome.colorScheme;
 | |
|           "org/gnome/desktop/interface".accent-color = config.gnome.accentColor;
 | |
|           "org/gnome/desktop/interface".clock-format = config.gnome.clockFormat;
 | |
|           "org/gnome/desktop/interface".text-scaling-factor = lib.mkIf (config.gnome.displayScaling != null) (config.gnome.displayScaling / 100.0);
 | |
| 
 | |
|           "org/gnome/mutter".experimental-features = lib.mkIf (builtins.any (x: x) (builtins.attrValues config.gnome.experimentalFeatures)) (
 | |
|             lib.optional config.gnome.experimentalFeatures.scaleMonitorFramebuffer "scale-monitor-framebuffer"
 | |
|           );
 | |
|         }
 | |
| 
 | |
|         # Night light configuration
 | |
|         (lib.mkIf config.gnome.nightLight.enable {
 | |
|           "org/gnome/settings-daemon/plugins/color" = {
 | |
|             night-light-enabled = true;
 | |
|             night-light-schedule-automatic = config.gnome.nightLight.automatic;
 | |
|             night-light-schedule-from = lib.mkIf (!config.gnome.nightLight.automatic) config.gnome.nightLight.fromTime;
 | |
|             night-light-schedule-to = lib.mkIf (!config.gnome.nightLight.automatic) config.gnome.nightLight.toTime;
 | |
|             night-light-temperature = config.gnome.nightLight.temperature;
 | |
|           };
 | |
|         })
 | |
|         (
 | |
|           lib.mkMerge (
 | |
|             builtins.map (value: let
 | |
|               entry = "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/${value.key}";
 | |
|             in {
 | |
|               ${entry} = {
 | |
|                 binding = value.binding;
 | |
|                 command = value.command;
 | |
|                 name = value.name;
 | |
|               };
 | |
| 
 | |
|               "org/gnome/settings-daemon/plugins/media-keys" = {
 | |
|                 custom-keybindings = [
 | |
|                   "/${entry}/"
 | |
|                 ];
 | |
|               };
 | |
|             })
 | |
|             (
 | |
|               lib.attrsets.mapAttrsToList (_: value: value) config.gnome.hotkeys
 | |
|             )
 | |
|           )
 | |
|         )
 | |
| 
 | |
|         # Extension configurations
 | |
|         (lib.mkIf (config.gnome.extensions.dash-to-dock.enable && config.gnome.extensions.dash-to-dock.options != null) {
 | |
|           "org/gnome/shell/extensions/dash-to-dock" = config.gnome.extensions.dash-to-dock.options;
 | |
|         })
 | |
| 
 | |
|         (lib.mkIf (config.gnome.extensions.dash-to-panel.enable && config.gnome.extensions.dash-to-panel.options != null) {
 | |
|           "org/gnome/shell/extensions/dash-to-panel" = config.gnome.extensions.dash-to-panel.options;
 | |
|         })
 | |
|       ];
 | |
|     };
 | |
|   };
 | |
| }
 |