{ config, lib, pkgs, ... }: with lib; let cfg = config.home.roles.desktop; isLinux = pkgs.stdenv.isLinux; in { options.home.roles.desktop = { enable = mkEnableOption "Enable desktop GUI applications and utilities"; }; config = mkIf cfg.enable { home.packages = with pkgs; [ # Cross-platform desktop applications bitwarden-desktop keepassxc xdg-utils # XDG utilities for opening files/URLs with default applications ] ++ optionals isLinux [ # Linux-only desktop applications dunst unstable.ghostty # Linux-only desktop utilities feh # Image viewer and wallpaper setter for X11 rofi # Application launcher for X11 solaar # Logitech management software waybar wofi # Application launcher for Wayland # Linux-only system utilities with GUI components (snapcast.override { pulseaudioSupport = true; }) # KDE tiling window management (Linux-only) kdePackages.krohnkite # Dynamic tiling extension for KWin 6 # KDE PIM applications for email, calendar, and contacts (Linux-only) kdePackages.kmail kdePackages.kmail-account-wizard kdePackages.kmailtransport kdePackages.korganizer kdePackages.kaddressbook kdePackages.kontact # KDE System components needed for proper integration (Linux-only) kdePackages.kded kdePackages.systemsettings kdePackages.kmenuedit # Desktop menu support (Linux-only) kdePackages.plasma-desktop # Contains applications.menu # KDE Online Accounts support (Linux-only) kdePackages.kaccounts-integration kdePackages.kaccounts-providers kdePackages.signond # KDE Mapping (Linux-only) kdePackages.marble # Virtual globe and world atlas # KDE Productivity (Linux-only) kdePackages.kate # Advanced text editor with syntax highlighting kdePackages.okular # Universal document viewer (PDF, ePub, etc.) kdePackages.spectacle # Screenshot capture utility kdePackages.filelight # Visual disk usage analyzer # KDE Multimedia (Linux-only) kdePackages.gwenview # Image viewer and basic editor kdePackages.elisa # Music player # KDE System Utilities (Linux-only) kdePackages.ark # Archive manager (zip, tar, 7z, etc.) kdePackages.yakuake # Drop-down terminal emulator ]; programs.firefox = { enable = true; }; programs.spotify-player.enable = true; # Linux-only: GNOME keyring service services.gnome-keyring = mkIf isLinux { enable = true; }; # Linux-only: systemd user services for rbw vault unlock systemd.user.services = mkIf isLinux { # rbw vault unlock on login rbw-unlock-on-login = { Unit = { Description = "Unlock rbw vault at login"; After = [ "graphical-session.target" ]; }; Service = { Type = "oneshot"; ExecStart = "${pkgs.rbw}/bin/rbw unlock"; Environment = "RBW_AGENT=${pkgs.rbw}/bin/rbw-agent"; # KillMode = "process" prevents systemd from killing the rbw-agent daemon # when this oneshot service completes. The agent is spawned by rbw unlock # and needs to persist after the service exits. KillMode = "process"; }; Install = { WantedBy = [ "graphical-session.target" ]; }; }; # rbw vault unlock on resume from suspend rbw-unlock-on-resume = { Unit = { Description = "Unlock rbw vault after resume from suspend"; After = [ "suspend.target" ]; }; Service = { Type = "oneshot"; ExecStart = "${pkgs.rbw}/bin/rbw unlock"; Environment = "RBW_AGENT=${pkgs.rbw}/bin/rbw-agent"; # KillMode = "process" prevents systemd from killing the rbw-agent daemon # when this oneshot service completes. The agent is spawned by rbw unlock # and needs to persist after the service exits. KillMode = "process"; }; Install = { WantedBy = [ "suspend.target" ]; }; }; }; # Linux-only: KDE environment variables for proper integration home.sessionVariables = mkIf isLinux { QT_QPA_PLATFORMTHEME = "kde"; KDE_SESSION_VERSION = "6"; }; xdg = { enable = true; # Ensure desktop files are made available for discovery desktopEntries = {}; # This creates the desktop files directory structure mimeApps = { enable = true; associations.added = { # Ensure associations are properly registered "text/html" = "firefox.desktop"; "x-scheme-handler/http" = "firefox.desktop"; "x-scheme-handler/https" = "firefox.desktop"; }; defaultApplications = { # Web browsers (cross-platform) "text/html" = "firefox.desktop"; "x-scheme-handler/http" = "firefox.desktop"; "x-scheme-handler/https" = "firefox.desktop"; "x-scheme-handler/about" = "firefox.desktop"; "x-scheme-handler/unknown" = "firefox.desktop"; } // optionalAttrs isLinux { # Linux-only: KDE application associations # Documents "application/pdf" = "okular.desktop"; "text/plain" = "kate.desktop"; "text/x-tex" = "kate.desktop"; "text/x-c" = "kate.desktop"; "text/x-python" = "kate.desktop"; "application/x-shellscript" = "kate.desktop"; # Images "image/png" = "gwenview.desktop"; "image/jpeg" = "gwenview.desktop"; "image/jpg" = "gwenview.desktop"; "image/gif" = "gwenview.desktop"; "image/bmp" = "gwenview.desktop"; "image/tiff" = "gwenview.desktop"; "image/webp" = "gwenview.desktop"; # Archives "application/zip" = "ark.desktop"; "application/x-tar" = "ark.desktop"; "application/x-compressed-tar" = "ark.desktop"; "application/x-7z-compressed" = "ark.desktop"; "application/x-rar" = "ark.desktop"; # Audio "audio/mpeg" = "elisa.desktop"; "audio/mp4" = "elisa.desktop"; "audio/flac" = "elisa.desktop"; "audio/ogg" = "elisa.desktop"; "audio/wav" = "elisa.desktop"; # Email "message/rfc822" = "kmail.desktop"; "x-scheme-handler/mailto" = "kmail.desktop"; # Calendar "text/calendar" = "korganizer.desktop"; "application/x-vnd.akonadi.calendar.event" = "korganizer.desktop"; }; }; }; # Linux-only: Fix for KDE applications.menu file issue on Plasma 6 # KDE still looks for applications.menu but Plasma 6 renamed it to plasma-applications.menu xdg.configFile."menus/applications.menu" = mkIf isLinux { source = "${pkgs.kdePackages.plasma-workspace}/etc/xdg/menus/plasma-applications.menu"; }; # Note: modules must be imported at top-level home config }; }