{ config, lib, pkgs, user, home-manager, ... }: let cfg = config.modules.desktop.gnome; inherit (builtins) attrNames map; inherit (lib.attrsets) mapAttrs' nameValuePair; generate_custom_keybindings = binds: { "org/gnome/settings-daemon/plugins/media-keys" = { custom-keybindings = map (name: "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/${name}/") (attrNames binds); }; } // mapAttrs' (name: nameValuePair "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/${name}") binds; in { options.modules.desktop.gnome.enable = lib.mkEnableOption "gnome"; config = lib.mkIf cfg.enable { environment.systemPackages = with pkgs; [ dconf-editor # Graphical tool for editing settings stored in the dconf database of GNOME gnome-tweaks # Utility for customizing various aspects of the GNOME desktop environment evolution # Personal information management application that provides email, calendar, and contact management features gnomeExtensions.custom-hot-corners-extended # GNOME Shell extension for changing window focus behavior gnomeExtensions.alphabetical-app-grid # Alphabetically order the app grid and folders gnome-set-panel-monitor # Set monitor for panel to appear on stacks-in-gnome # TBD gnome-randr # Xrandr-like CLI for configuring displays on GNOME/Wayland ftw # Build custom ftl wallpapers in a complicated way for no reason ]; environment.gnome.excludePackages = with pkgs; [ baobab # Disk usage analyzer for the GNOME desktop environment cheese # Webcam application for taking photos and videos epiphany # Web browser for the GNOME desktop environment gedit # Text editor for the GNOME desktop environment simple-scan # Simple scanning utility for scanning documents and images totem # Movie player for the GNOME desktop environment yelp # Help viewer application for the GNOME desktop environment evince # Document viewer for the GNOME desktop environment geary # Email client for the GNOME desktop environment seahorse # GNOME application for managing encryption keys and passwords gnome-tour # Guided tour application for introducing users to GNOME desktop environment features snapshot # Utility for taking and managing system snapshots in the GNOME desktop environment gnome-connections # GNOME application for accessing remote machines and services gnome-font-viewer # Utility for previewing and managing fonts in the GNOME desktop environment gnome-logs # Log viewer application for GNOME gnome-maps # Map application for the GNOME desktop environment gnome-music # Music player and management application for GNOME gnome-shell-extensions # Extensions for enhancing functionality and customization in the GNOME ]; services.xserver = { enable = true; displayManager.gdm = { enable = true; wayland = true; }; desktopManager.gnome.enable = true; }; # Enable sound and handle conflict (https://github.com/Jovian-Experiments/Jovian-NixOS/issues/99) services.pulseaudio.enable = lib.mkForce false; xdg.mime = { enable = true; defaultApplications = { "text/plain" = "org.gnome.TextEditor.desktop"; "image/bmp" = "org.gnome.Loupe.desktop"; "image/gif" = "org.gnome.Loupe.desktop"; "image/jpg" = "org.gnome.Loupe.desktop"; "image/pjpeg" = "org.gnome.Loupe.desktop"; "image/png" = "org.gnome.Loupe.desktop"; "image/tiff" = "org.gnome.Loupe.desktop"; "image/webp" = "org.gnome.Loupe.desktop"; "image/x-bmp" = "org.gnome.Loupe.desktop"; "image/x-gray" = "org.gnome.Loupe.desktop"; "image/x-icb" = "org.gnome.Loupe.desktop"; "image/x-ico" = "org.gnome.Loupe.desktop"; "image/x-png" = "org.gnome.Loupe.desktop"; "image/x-portable-anymap" = "org.gnome.Loupe.desktop"; "image/x-portable-bitmap" = "org.gnome.Loupe.desktop"; "image/x-portable-graymap" = "org.gnome.Loupe.desktop"; "image/x-portable-pixmap" = "org.gnome.Loupe.desktop"; "image/x-xbitmap" = "org.gnome.Loupe.desktop"; "image/x-xpixmap" = "org.gnome.Loupe.desktop"; "image/x-pcx" = "org.gnome.Loupe.desktop"; "image/svg+xml" = "org.gnome.Loupe.desktop"; "image/svg+xml-compressed" = "org.gnome.Loupe.desktop"; "image/vnd.wap.wbmp" = "org.gnome.Loupe.desktop"; "image/x-icns" = "org.gnome.Loupe.desktop"; }; }; home-manager.users.${user} = { # Remove unwanted desktop entries xdg.desktopEntries.cups = { name = ""; exec = null; settings.Hidden = "true"; }; xdg.desktopEntries.writer = { name = ""; exec = null; settings.Hidden = "true"; }; xdg.desktopEntries.math = { name = ""; exec = null; settings.Hidden = "true"; }; xdg.desktopEntries.calc = { name = ""; exec = null; settings.Hidden = "true"; }; xdg.desktopEntries.draw = { name = ""; exec = null; settings.Hidden = "true"; }; xdg.desktopEntries.impress = { name = ""; exec = null; settings.Hidden = "true"; }; xdg.desktopEntries.base = { name = ""; exec = null; settings.Hidden = "true"; }; xdg.desktopEntries.xterm = { name = ""; exec = null; settings.Hidden = "true"; }; # GNOME settings through home dconf.settings = { "org/gnome/desktop/interface" = { color-scheme = "prefer-dark"; enable-animations = false; }; "org/gnome/desktop/background" = { picture-options = "zoom"; }; "org/gnome/shell" = { favorite-apps = [ "google-chrome.desktop" "kitty.desktop" "org.gnome.Nautilus.desktop" "steam.desktop" "vesktop.desktop" ]; disable-user-extensions = false; enabled-extensions = [ "focus-changer@heartmire" "gnome-set-panel-monitor@tstarr.us" "custom-hot-corners-extended@G-dH.github.com" "AlphabeticalAppGrid@stuarthayhurst" "stacks-in-gnome@tstarr.us" ]; }; "org/gnome/shell/app-switcher" = { current-workspace-only = true; }; "org/gnome/mutter" = { overlay-key = "Super"; center-new-windows = true; focus-change-on-pointer-rest = false; workspaces-only-on-primary = true; dynamic-workspaces = false; }; "org/gnome/desktop/wm/preferences" = { num-workspaces = 10; }; "org/gnome/shell/keybindings" = { switch-to-application-1 = []; switch-to-application-2 = []; switch-to-application-3 = []; switch-to-application-4 = []; switch-to-application-5 = []; switch-to-application-6 = []; switch-to-application-7 = []; switch-to-application-8 = []; switch-to-application-9 = []; toggle-quick-settings = []; }; "org/gnome/settings-daemon/plugins/media-keys" = { screensaver = []; }; "org/gnome/settings-daemon/plugins/power" = { sleep-inactive-ac-type = "blank"; sleep-inactive-battery-type = "suspend"; sleep-inactive-ac-timeout = 2700; sleep-inactive-battery-timeout = 2700; }; "org/gnome/desktop/wm/keybindings" = { switch-to-workspace-1 = ["1"]; switch-to-workspace-2 = ["2"]; switch-to-workspace-3 = ["3"]; switch-to-workspace-4 = ["4"]; switch-to-workspace-5 = ["5"]; switch-to-workspace-6 = ["6"]; switch-to-workspace-7 = ["7"]; switch-to-workspace-8 = ["8"]; switch-to-workspace-9 = ["9"]; switch-to-workspace-0 = ["0"]; move-to-workspace-1 = ["1"]; move-to-workspace-2 = ["2"]; move-to-workspace-3 = ["3"]; move-to-workspace-4 = ["4"]; move-to-workspace-5 = ["5"]; move-to-workspace-6 = ["6"]; move-to-workspace-7 = ["7"]; move-to-workspace-8 = ["8"]; move-to-workspace-9 = ["9"]; move-to-workspace-0 = ["0"]; move-to-monitor-left = ["h"]; move-to-monitor-right = ["l"]; close = ["d"]; toggle-fullscreen = ["f"]; toggle-maximized = ["t"]; cycle-windows = ["Tab"]; cycle-windows-backward = ["Tab"]; panel-run-dialog = ["r"]; switch-applications = []; switch-applications-backward = []; minimize = []; }; # custom-hot-corners-extended configs "org/gnome/shell/extensions/custom-hot-corners-extended/misc" = { panel-menu-enable = false; }; "org/gnome/shell/extensions/custom-hot-corners-extended/monitor-0-top-left-1" = { action = "toggle-overview"; }; "org/gnome/shell/extensions/custom-hot-corners-extended/monitor-0-top-left-4" = { action = "next-workspace"; }; "org/gnome/shell/extensions/custom-hot-corners-extended/monitor-0-top-left-5" = { action = "prev-workspace"; }; } // generate_custom_keybindings { "terminal" = { binding = "Return"; command = "kitty"; name = "Open Terminal"; }; "browser" = { binding = "b"; command = "google-chrome-stable"; name = "Open Browser"; }; "steam" = { binding = "s"; command = "steam"; name = "Open Steam"; }; "vesktop" = { binding = "d"; command = "vesktop"; name = "Open Vesktop"; }; "nautilus" = { binding = "f"; command = "nautilus"; name = "Open File Manager"; }; }; }; }; }