diff --git a/home/desktop/default.nix b/home/desktop/default.nix index 2ab18e9..ccadf13 100644 --- a/home/desktop/default.nix +++ b/home/desktop/default.nix @@ -11,6 +11,7 @@ with lib; { }; imports = [ + ./niri/default.nix ./hyprland.nix ./theme.nix ./tools.nix diff --git a/home/desktop/hyprland.nix b/home/desktop/hyprland.nix index 6a2dc6a..cc1fc85 100644 --- a/home/desktop/hyprland.nix +++ b/home/desktop/hyprland.nix @@ -17,7 +17,7 @@ let in { options.modules.desktop.hyprland = { enable = mkOption { - default = cfg.enable; + default = false; example = true; description = "Whether to enable Hyprland configuration."; type = types.bool; diff --git a/home/desktop/niri/config.kdl b/home/desktop/niri/config.kdl new file mode 100644 index 0000000..c05608c --- /dev/null +++ b/home/desktop/niri/config.kdl @@ -0,0 +1,8 @@ +spawn-at-startup "cosmic-ext-alternative-startup" + +binds { + Super+T { spawn "ghostty"; } + Super+Space { spawn "cosmic-launcher"; } + Super+Shift+Space { spawn "cosmic-app-library"; } + Super+Alt+L { spawn "cosmic-greeter"; } +} diff --git a/home/desktop/niri/default.nix b/home/desktop/niri/default.nix new file mode 100644 index 0000000..87845a4 --- /dev/null +++ b/home/desktop/niri/default.nix @@ -0,0 +1,19 @@ +{ lib, config, pkgs, ... }: + +with lib; +let + cfg = config.modules.desktop; +in { + options.modules.desktop.niri = { + enable = mkOption { + default = cfg.enable; + example = true; + description = "Whether to enable Niri configuration."; + type = types.bool; + }; + }; + + config = mkIf cfg.niri.enable { + xdg.configFile."niri/config.kdl".text = (builtins.readFile ./config.kdl); + }; +} diff --git a/home/desktop/theme.nix b/home/desktop/theme.nix index 6581417..13c2978 100644 --- a/home/desktop/theme.nix +++ b/home/desktop/theme.nix @@ -7,7 +7,7 @@ let in { options.modules.desktop.theme = { enable = mkOption { - default = cfg.enable; + default = false; example = true; description = "Whether to enable theming configuration."; type = types.bool; diff --git a/home/desktop/tools.nix b/home/desktop/tools.nix index 4e4e786..ec8bd0a 100644 --- a/home/desktop/tools.nix +++ b/home/desktop/tools.nix @@ -6,7 +6,7 @@ let in { options.modules.desktop.tools = { enable = mkOption { - default = cfg.enable; + default = false; example = true; description = "Whether to enable basic desktop tools."; type = types.bool; diff --git a/machines/pepper/configuration.nix b/machines/pepper/configuration.nix index 04aaa08..9e11f25 100755 --- a/machines/pepper/configuration.nix +++ b/machines/pepper/configuration.nix @@ -14,16 +14,6 @@ modules = { desktop = { enable = true; - hyprland = { - input = { - sensitivity = -0.5; - kb_layout = "us"; - }; - monitor = [ - "desc:Samsung Electric Company Odyssey G60SD HNAX300205, 2560x1440@360, 0x0, 1, vrr, 1, bitdepth, 10" - "desc:LG Electronics 27GL850 005NTPC4Q200, preferred, auto, 1, transform, 1, vrr, 1" - ]; - }; }; server = { enable = true; diff --git a/modules/desktop/audio.nix b/modules/desktop/audio.nix index 2fcdde2..ca9d41c 100644 --- a/modules/desktop/audio.nix +++ b/modules/desktop/audio.nix @@ -36,6 +36,8 @@ in { }; config = mkIf cfg.audio.enable { + xdg.sounds.enable = true; + security.rtkit.enable = true; services = { diff --git a/modules/desktop/default.nix b/modules/desktop/default.nix index b279139..26c2306 100644 --- a/modules/desktop/default.nix +++ b/modules/desktop/default.nix @@ -18,16 +18,11 @@ in { }; } // helpers.linuxAttrs { imports = [ - ./session.nix ./affinity.nix ./fonts.nix ./rawaccel.nix ./audio.nix ./networking.nix - ./hyprland.nix + ./niri-cosmic.nix ]; - - config = mkIf cfg.enable { - users.users."${user}".extraGroups = [ "video" ]; - }; } diff --git a/modules/desktop/hyprland.nix b/modules/desktop/hyprland.nix deleted file mode 100644 index 495feda..0000000 --- a/modules/desktop/hyprland.nix +++ /dev/null @@ -1,127 +0,0 @@ -{ lib, pkgs, config, ... }: - -with lib; -let - cfg = config.modules.desktop; - - mkConfig = input: monitor: pkgs.writeText "hyprland.conf" '' - debug { - error_position=1 - } - - general { - allow_tearing=true - } - - input { - touchpad { - clickfinger_behavior=true - scroll_factor=0.180000 - tap-and-drag=false - tap-to-click=false - } - kb_options=ctrl:nocaps,lv3:ralt_switch - kb_layout=${cfg.hyprland.input.kb_layout} - kb_model=${cfg.hyprland.input.kb_model} - kb_variant=${cfg.hyprland.input.kb_variant} - sensitivity=${toString cfg.hyprland.input.sensitivity} - accel_profile = "flat" - } - - misc { - disable_hyprland_logo=true - disable_splash_rendering=true - vrr=1 - } - - render { - direct_scanout=1 - expand_undersized_textures=false - cm_fs_passthrough=1 - cm_enabled=true - } - - experimental { - xx_color_management_v4=true - } - - cursor { - sync_gsettings_theme=false - } - - ecosystem { - no_update_news = true - no_donation_nag = true - } - - ${concatMapStringsSep "\n" (x: "monitor=${x}") cfg.hyprland.monitor} - monitor=, preferred, auto, 1 - ''; -in { - options.modules.desktop.hyprland = { - enable = mkOption { - default = cfg.enable; - example = true; - description = "Whether to enable Hyprland"; - type = types.bool; - }; - - input = mkOption { - default = { }; - type = types.submodule { - options = { - sensitivity = mkOption { - default = 0.0; - type = types.float; - }; - kb_model = mkOption { - default = "apple"; - type = types.str; - }; - kb_variant = mkOption { - default = "mac"; - type = types.str; - }; - kb_layout = mkOption { - default = "gb"; - type = types.str; - }; - }; - }; - }; - - monitor = mkOption { - description = "Monitor configuration"; - default = [ ]; - type = lib.types.listOf lib.types.str; - }; - - configFile = mkOption { - default = mkConfig cfg.hyprland.input cfg.hyprland.monitor; - }; - }; - - config = mkIf cfg.hyprland.enable { - programs = { - hyprlock.enable = true; - hyprland = { - enable = true; - withUWSM = true; - xwayland.enable = true; - }; - }; - - security.pam.services.hyprlock = {}; - - xdg.portal = { - enable = true; - xdgOpenUsePortal = true; - extraPortals = with pkgs; [ - xdg-desktop-portal-hyprland - xdg-desktop-portal-gtk - ]; - }; - - environment.etc."hypr/hyprland.conf".source = cfg.hyprland.configFile; - }; -} diff --git a/modules/desktop/niri-cosmic.nix b/modules/desktop/niri-cosmic.nix new file mode 100644 index 0000000..f6ba1f4 --- /dev/null +++ b/modules/desktop/niri-cosmic.nix @@ -0,0 +1,273 @@ +{ lib, pkgs, config, ... }: + +with lib; +let + cfg = config.modules.desktop; + + corePackages = with pkgs; [ + niri + config.services.displayManager.cosmic-greeter.package + cosmic-applets + cosmic-applibrary + cosmic-bg + cosmic-comp + cosmic-files + cosmic-idle + cosmic-initial-setup + cosmic-launcher + cosmic-notifications + cosmic-osd + cosmic-panel + cosmic-session + cosmic-settings + cosmic-settings-daemon + cosmic-workspaces-epoch + ]; + + supportPackages = with pkgs; [ + adwaita-icon-theme + alsa-utils + glib + hicolor-icon-theme + playerctl + pop-icon-theme + pop-launcher + pulseaudio + xdg-user-dirs + ]; + + optionalPackages = with pkgs; [ + xwayland-satellite + cosmic-icons + cosmic-screenshot + cosmic-wallpapers + ]; + + cosmic-base-config = let + configs = { + "com.system76.CosmicComp/v1/workspaces" = '' + ( + workspace_mode: OutputBound, + workspace_layout: Horizontal, + ) + ''; + "com.system76.CosmicComp/v1/autotile_behavior" = '' + PerWorkspace + ''; + }; + fileDrvs = + attrsets.mapAttrsToList + (name: text: pkgs.writeTextDir "share/cosmic/${name}" text) + configs; + in pkgs.buildEnv { + name = "cosmic-base-config"; + paths = fileDrvs; + pathsToLink = [ "/share/cosmic" ]; + }; + + cosmic-ext-niri-desktop = let + startCosmicExtNiri = pkgs.writeShellApplication { + name = "start-cosmic-ext-niri"; + runtimeInputs = with pkgs; [ systemd coreutils ]; + text = with pkgs; /*sh*/'' + set -e + + if systemctl --user -q is-active cosmic-niri-session.service; then + exit 1 + fi + + for unit in $(systemctl --user --no-legend --state=failed --plain list-units | cut -f1 -d' '); do + partof="$(systemctl --user show -p PartOf --value "$unit")" + for target in cosmic-session.target graphical-session.target; do + if [ "$partof" = "$target" ]; then + systemctl --user reset-failed "$unit" + break + fi + done + done + + export XDG_CURRENT_DESKTOP="''${XDG_CURRENT_DESKTOP:=niri}" + export XDG_SESSION_TYPE="''${XDG_SESSION_TYPE:=wayland}" + export DCONF_PROFILE=cosmic + + systemctl --user import-environment XDG_SESSION_TYPE XDG_CURRENT_DESKTOP DCONF_PROFILE + systemctl --user --wait start cosmic-niri-session.service + + systemctl --user start --job-mode=replace-irreversibly niri-shutdown.target + systemctl --user unset-environment WAYLAND_DISPLAY DISPLAY XDG_SESSION_TYPE XDG_CURRENT_DESKTOP NIRI_SOCKET + ''; + }; + in (pkgs.writeTextFile { + name = "cosmic-on-niri"; + destination = "/share/wayland-sessions/COSMIC-on-niri.desktop"; + text = '' + [Desktop Entry] + Name=COSMIC-on-niri + Comment=This session logs you into the COSMIC desktop on niri + Type=Application + DesktopNames=niri + Exec=${getExe startCosmicExtNiri} + ''; + }).overrideAttrs (old: { + passthru.providedSessions = [ "COSMIC-on-niri" ]; + }); + + cosmic-ext-alternative-startup = pkgs.rustPlatform.buildRustPackage rec { + pname = "cosmic-ext-alternative-startup"; + version = "unstable-2024-11-24"; + src = pkgs.fetchFromGitHub { + owner = "drakulix"; + repo = pname; + rev = "8ceda00197c7ec0905cf1dccdc2d67d738e45417"; + hash = "sha256-0kqn3hZ58uQMl39XXF94yQS1EWmGIK45/JFTAigg/3M="; + }; + cargoHash = "sha256-DeMkAG2iINGden0Up013M9mWDN4QHrF+FXoNqpGB+mg="; + meta.mainProgram = pname; + }; +in { + options.modules.desktop.niri-cosmic = { + enable = mkOption { + default = cfg.enable; + example = true; + description = "Whether to enable COSMIC on Niri"; + type = types.bool; + }; + }; + + config = mkIf cfg.niri-cosmic.enable { + boot = { + plymouth.enable = true; + initrd.verbose = mkDefault false; + consoleLogLevel = 0; + }; + + programs = { + dconf = { + enable = true; + packages = [ pkgs.cosmic-session ]; + }; + }; + + environment = { + pathsToLink = [ + "/share/backgrounds" + "/share/cosmic" + "/share/cosmic-layouts" + "/share/cosmic-themes" + ]; + systemPackages = corePackages ++ supportPackages ++ optionalPackages ++ [ + cosmic-base-config + cosmic-ext-alternative-startup + ]; + sessionVariables = { + X11_BASE_RULES_XML = "${config.services.xserver.xkb.dir}/rules/base.xml"; + X11_EXTRA_RULES_XML = "${config.services.xserver.xkb.dir}/rules/base.extras.xml"; + + GSK_RENDERER = mkDefault "ngl"; + QT_QPA_PLATFORM = mkDefault "wayland;xcb"; + GDK_BACKEND = mkDefault "wayland,x11,*"; + SDL_VIDEODRIVER = mkDefault "wayland,x11"; + NIXOS_OZONE_WL = mkDefault 1; + COSMIC_DATA_CONTROL_ENABLED = mkDefault 1; + }; + }; + + hardware.system76.power-daemon.enable = mkDefault true; + + services = { + graphical-desktop.enable = true; + displayManager = { + cosmic-greeter.enable = true; + sessionPackages = [ cosmic-ext-niri-desktop ]; + }; + + dbus = { + enable = true; + implementation = mkDefault "broker"; + }; + + accounts-daemon.enable = true; + libinput.enable = true; + upower.enable = true; + + acpid.enable = mkDefault true; + gnome.gnome-keyring.enable = mkDefault true; + gvfs.enable = mkDefault true; + + logind.settings.Login = { + powerKey = "suspend"; + powerKeyLongPress = "poweroff"; + lidSwitch = "suspend"; + }; + + geoclue2 = { + enable = true; + enableDemoAgent = false; + whitelistedAgents = [ "geoclue-demo-agent" ]; + }; + }; + + security = { + polkit.enable = true; + rtkit.enable = true; + pam.services.cosmic-greeter = { }; + }; + + systemd = { + packages = with pkgs; [ cosmic-session niri ]; + user.services = { + cosmic-niri-session = let + set-environment = config.system.build.setEnvironment; + run-session = pkgs.writeShellScriptBin "run-cosmic-niri-session" /*sh*/'' + source ${set-environment} + ${getBin pkgs.dbus}/bin/dbus-update-activation-environment --systemd --all + exec ${getBin pkgs.cosmic-session}/bin/cosmic-session ${getBin pkgs.niri}/bin/niri --session + ''; + in { + bindsTo = [ "graphical-session.target" ]; + serviceConfig = { + Environment = [ + "RUST_BACKTRACE=1" + "RUST_LOG=info" + ]; + Type = "notify"; + NotifyAccess = "all"; + Slice = "session.slice"; + Restart = "on-failure"; + ExecStart = getExe run-session; + }; + }; + }; + }; + + xdg = { + sounds.enable = true; + icons.fallbackCursorThemes = mkDefault [ "Cosmic" ]; + portal = { + enable = true; + xdgOpenUsePortal = true; + configPackages = mkDefault [ pkgs.xdg-desktop-portal-cosmic ]; + extraPortals = with pkgs; [ + xdg-desktop-portal-gnome + xdg-desktop-portal-cosmic + xdg-desktop-portal-gtk + ]; + config.niri = { + default = [ "gnome" "cosmic" "gtk" ]; + "org.freedesktop.impl.portal.Access" = "gtk"; + "org.freedesktop.impl.portal.Notification" = "gtk"; + "org.freedesktop.impl.portal.Secret" = "gnome-keyring"; + "org.freedesktop.impl.portal.FileChooser" = "gtk"; + "org.freedesktop.impl.portal.ScreenCast" = "gnome"; + "org.freedesktop.impl.portal.Screenshot" = "gnome"; + }; + }; + }; + + fonts.packages = with pkgs; [ + fira + noto-fonts + open-sans + ]; + }; +} diff --git a/modules/desktop/session.nix b/modules/desktop/session.nix deleted file mode 100644 index 28828fa..0000000 --- a/modules/desktop/session.nix +++ /dev/null @@ -1,78 +0,0 @@ -{ lib, config, pkgs, user, ... } @ inputs: - -with lib; -let - inherit (import ../../lib/theme.nix inputs) cursorTheme defaultFont iconTheme gtkTheme kvantumTheme; - cfg = config.modules.desktop; -in { - options.modules.desktop.session = { - enable = mkOption { - default = cfg.enable; - example = true; - description = "Whether to enable session and desktop environment."; - type = types.bool; - }; - }; - - config = mkIf cfg.session.enable { - users.users."${user}".extraGroups = [ "video" ]; - - boot = { - plymouth.enable = true; - initrd.verbose = mkDefault false; - consoleLogLevel = 0; - }; - - environment.sessionVariables = { - GSK_RENDERER = mkDefault "ngl"; - QT_QPA_PLATFORM = mkDefault "wayland;xcb"; - GDK_BACKEND = mkDefault "wayland,x11,*"; - SDL_VIDEODRIVER = mkDefault "wayland,x11"; - NIXOS_OZONE_WL = mkDefault "1"; - }; - - services = { - greetd = { - enable = true; - settings = { - terminal.vt = 1; - default_session.command = let - hyprConfig = pkgs.writeTextFile { - name = "hyprland-greeter.conf"; - text = '' - source=${toString cfg.hyprland.configFile} - exec-once = ${getExe config.programs.regreet.package}; hyprctl dispatch exit - animations { - enabled = false - } - ''; - }; - in escapeShellArgs [ - "${pkgs.dbus}/bin/dbus-run-session" - "${getExe pkgs.hyprland}" - "-c" (toString hyprConfig) - ]; - }; - }; - upower.enable = true; - gvfs.enable = true; - logind.settings.Login = { - powerKey = "suspend"; - powerKeyLongPress = "poweroff"; - lidSwitch = "suspend"; - }; - }; - - programs = { - regreet = { - enable = true; - inherit cursorTheme iconTheme; - font = defaultFont; - theme = gtkTheme; - settings.GTK.application_prefer_dark_theme = true; - }; - }; - - security.polkit.enable = true; - }; -} -- 2.51.2 From 1b405c9d2ba78c0b42eff7b204b5dcb1d7691768 Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Fri, 2 Jan 2026 18:38:17 +0000 Subject: [PATCH 02/14] Clean up unused hypr/shell components --- flake.lock | 69 -------- flake.nix | 9 - home/desktop/default.nix | 3 - home/desktop/hyprland.nix | 351 -------------------------------------- home/desktop/theme.nix | 80 --------- home/desktop/tools.nix | 32 ---- lib/theme.nix | 36 ---- 7 files changed, 580 deletions(-) delete mode 100644 home/desktop/hyprland.nix delete mode 100644 home/desktop/theme.nix delete mode 100644 home/desktop/tools.nix delete mode 100644 lib/theme.nix diff --git a/flake.lock b/flake.lock index 4f187e5..5b0af87 100644 --- a/flake.lock +++ b/flake.lock @@ -43,28 +43,6 @@ "type": "github" } }, - "ags": { - "inputs": { - "astal": "astal", - "nixpkgs": [ - "system-shell", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1744557573, - "narHash": "sha256-XAyj0iDuI51BytJ1PwN53uLpzTDdznPDQFG4RwihlTQ=", - "owner": "aylur", - "repo": "ags", - "rev": "3ed9737bdbc8fc7a7c7ceef2165c9109f336bff6", - "type": "github" - }, - "original": { - "owner": "aylur", - "repo": "ags", - "type": "github" - } - }, "android-sdk": { "inputs": { "devshell": "devshell", @@ -111,28 +89,6 @@ "type": "github" } }, - "astal": { - "inputs": { - "nixpkgs": [ - "system-shell", - "ags", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1742571008, - "narHash": "sha256-5WgfJAeBpxiKbTR/gJvxrGYfqQRge5aUDcGKmU1YZ1Q=", - "owner": "aylur", - "repo": "astal", - "rev": "dc0e5d37abe9424c53dcbd2506a4886ffee6296e", - "type": "github" - }, - "original": { - "owner": "aylur", - "repo": "astal", - "type": "github" - } - }, "autocomplete-nvim": { "flake": false, "locked": { @@ -901,7 +857,6 @@ "nixos-hardware": "nixos-hardware", "nixpkgs": "nixpkgs", "nvim-plugins": "nvim-plugins", - "system-shell": "system-shell", "tangled": "tangled", "yeetmouse": "yeetmouse", "zen-browser": "zen-browser" @@ -941,30 +896,6 @@ "url": "https://sqlite.org/2024/sqlite-amalgamation-3450100.zip" } }, - "system-shell": { - "inputs": { - "ags": "ags", - "flake-utils": [ - "flake-utils" - ], - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1747901587, - "narHash": "sha256-woibJpFc92skmZdLRC1NtLOq/g15fe3HzHTWlx15K1c=", - "owner": "kitten", - "repo": "system-shell", - "rev": "dcf54ab46c3bb697f9c36e210a51f34f47985d6c", - "type": "github" - }, - "original": { - "owner": "kitten", - "repo": "system-shell", - "type": "github" - } - }, "systems": { "locked": { "lastModified": 1681028828, diff --git a/flake.nix b/flake.nix index 3c63275..2e3a50d 100644 --- a/flake.nix +++ b/flake.nix @@ -46,14 +46,6 @@ }; }; - system-shell = { - url = "github:kitten/system-shell"; - inputs = { - nixpkgs.follows = "nixpkgs"; - flake-utils.follows = "flake-utils"; - }; - }; - nvim-plugins = { url = "github:kitten/system-nvim-plugins.nix"; inputs = { @@ -99,7 +91,6 @@ inputs.nvim-plugins.overlays.default inputs.android-sdk.overlays.default inputs.language-servers.overlays.default - inputs.system-shell.overlays.default (self: super: { zen-browser = inputs.zen-browser.packages.${self.system}.beta; }) diff --git a/home/desktop/default.nix b/home/desktop/default.nix index ccadf13..bf33846 100644 --- a/home/desktop/default.nix +++ b/home/desktop/default.nix @@ -12,8 +12,5 @@ with lib; { imports = [ ./niri/default.nix - ./hyprland.nix - ./theme.nix - ./tools.nix ]; } diff --git a/home/desktop/hyprland.nix b/home/desktop/hyprland.nix deleted file mode 100644 index cc1fc85..0000000 --- a/home/desktop/hyprland.nix +++ /dev/null @@ -1,351 +0,0 @@ -{ lib, config, pkgs, ... }: - -with lib; -let - cfg = config.modules.desktop; - - system-shell = "${getExe pkgs.system-shell}"; - wpctl = "${pkgs.wireplumber}/bin/wpctl"; - brightnessctl = "${pkgs.brightnessctl}/bin/brightnessctl"; - - hyprshot = getExe (pkgs.hyprshot.overrideAttrs (oldAttrs: { - postInstall = (oldAttrs.postInstall or "") + '' - wrapProgram $out/bin/hyprshot \ - --set HYPRSHOT_DIR "${config.xdg.userDirs.pictures}/Screenshots" - ''; - })); -in { - options.modules.desktop.hyprland = { - enable = mkOption { - default = false; - example = true; - description = "Whether to enable Hyprland configuration."; - type = types.bool; - }; - }; - - config = mkIf cfg.hyprland.enable { - wayland.windowManager.hyprland = { - enable = true; - - package = null; - portalPackage = null; - systemd.enable = false; - xwayland.enable = false; - plugins = with pkgs.hyprlandPlugins; [ hyprspace ]; - - settings = { - source = [ "/etc/hypr/hyprland.conf" ]; - - general = { - gaps_out = 9; - gaps_in = 4; - allow_tearing = true; - resize_on_border = true; - hover_icon_on_border = false; - no_border_on_floating = true; - extend_border_grab_area = 10; - border_size = 1; - "col.active_border" = "0xB35A5A5A"; - "col.inactive_border" = "0x8C3A3A3A"; - }; - - decoration = { - rounding = 9; - dim_inactive = true; - dim_strength = 0.12; - - blur = { - enabled = true; - size = 6; - passes = 4; - contrast = 0.74; - brightness = 0.45; - vibrancy = 0.15; - vibrancy_darkness = 0.1; - ignore_opacity = false; - popups_ignorealpha = 0.1; - input_methods_ignorealpha = 0.1; - noise = 0.012; - }; - - shadow = { - color = "0x81000000"; - range = 40; - render_power = 2; - offset = "5, 5"; - }; - }; - - gestures = { - workspace_swipe = true; - workspace_swipe_invert = false; - workspace_swipe_cancel_ratio = 0.2; - workspace_swipe_distance = 560; - }; - - misc = { - middle_click_paste = false; - focus_on_activate = true; - key_press_enables_dpms = true; - disable_hyprland_logo = true; - disable_splash_rendering = true; - vrr = 1; - }; - - debug.error_position = 1; - - plugin.overview = { - autoDrag = true; - hideOverlayLayers = false; - exitOnSwitch = true; - reverseSwipe = true; - dragAlpha = 0.85; - workspaceMargin = 16; - panelHeight = 150; - reservedArea = 38; - }; - - bindm = [ - "SUPER, mouse:272, movewindow" - "SUPERSHIFT, mouse:272, resizewindow" - ]; - - bindel = [ - ", XF86AudioRaiseVolume, exec, ${wpctl} set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 3%+" - ", XF86AudioLowerVolume, exec, ${wpctl} set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 3%-" - ", XF86MonBrightnessDown, exec, ${brightnessctl} set 3%-" - ", XF86MonBrightnessUp, exec, ${brightnessctl} set +3%" - ]; - - bindl = [ - ", XF86AudioMute, exec, ${wpctl} set-mute @DEFAULT_AUDIO_SINK@ toggle" - ", XF86AudioMicMute, exec, ${wpctl} set-mute @DEFAULT_AUDIO_SOURCE@ toggle" - ", XF86AudioPlay, exec, ${system-shell} play_pause" - ", XF86AudioPause, exec, ${system-shell} play_pause" - ", XF86AudioNext, exec, ${system-shell} play_next" - ", XF86AudioPrev, exec, ${system-shell} play_previous" - ]; - - bindp = [ - ", F11, fullscreen, 0" - "SUPER, W, killactive" - - "SUPER, H, movefocus, l" - "SUPER, J, movefocus, d" - "SUPER, K, movefocus, u" - "SUPER, L, movefocus, r" - "SUPER_SHIFT, H, movewindow, l" - "SUPER_SHIFT, J, movewindow, d" - "SUPER_SHIFT, K, movewindow, u" - "SUPER_SHIFT, L, movewindow, r" - - "SUPER_CONTROL, K, overview:toggle, all" - "SUPER_CONTROL, H, workspace, m-1" - "SUPER_CONTROL, L, workspace, m+1" - "SUPER_CONTROL_SHIFT, H, movetoworkspace, -1" - "SUPER_CONTROL_SHIFT, L, movetoworkspace, +1" - - "SUPER, up, overview:toggle, all" - "SUPER, left, workspace, m-1" - "SUPER, right, workspace, m+1" - "SUPER_SHIFT, left, movetoworkspace, m-1" - "SUPER_SHIFT, right, movetoworkspace, m+1" - - "SUPER_CONTROL, left, focusmonitor, -1" - "SUPER_CONTROL, right, focusmonitor, +1" - "SUPER_CONTROL_SHIFT, left, movecurrentworkspacetomonitor, -1" - "SUPER_CONTROL_SHIFT, right, movecurrentworkspacetomonitor, +1" - ]; - - bind = [ - "SUPER, SUPER_L, exec, ${system-shell} launcher" - - "SUPER, T, exec, uwsm-app ghostty" - "SUPER, B, exec, uwsm-app zen-beta" - - "SUPER_SHIFT, F, fullscreen, 1" - - "SUPER, 1, workspace, 1" - "SUPER, 2, workspace, 2" - "SUPER, 3, workspace, 3" - "SUPER, 4, workspace, 4" - "SUPER, 5, workspace, 5" - "SUPER, 6, workspace, 6" - "SUPER, 7, workspace, 7" - "SUPER, 8, workspace, 8" - "SUPER, 9, workspace, 9" - "SUPER, 0, workspace, 10" - - "SUPER_SHIFT, 2, exec, ${hyprshot} -z -m window -m active" - "SUPER_SHIFT, 3, exec, ${hyprshot} -z -m output -m active" - "SUPER_SHIFT, 4, exec, ${hyprshot} -z -m region" - ", Print, exec, ${hyprshot} -z -m window -m active" - "SUPER, Print, exec, ${hyprshot} -z -m output -m active" - "SUPER_SHIFT, Print, exec, ${hyprshot} -z -m region" - ]; - - windowrule = [ - "suppressevent maximize, class:.*" - - "nofocus, class:^$, title:^$, xwayland:1, floating:1, fullscreen:0, pinned:0" - "tag +games, initialClass:^(.*)[.]exe$, fullscreenstate:* 2" - - "immediate, fullscreenstate:2" - "immediate, fullscreenstate:3" - "syncfullscreen, fullscreen:1" - "idleinhibit, fullscreen:1" - - "content game, tag:games" - "tag +games, content:game" - - "opaque, tag:games" - "immediate, tag:games" - "idleinhibit fullscreen, tag:games" - "fullscreenstate:3 3, tag:games, fullscreen:1" - "float, tag:games, fullscreen:1" - - "float, class:zen-beta,initialTitle:^(Picture-in-Picture)$" - "pin, class:zen-beta,initialTitle:^(Picture-in-Picture)$" - "idleinhibit fullscreen,class:zen-beta" - - "float,title:^(Open)$" - "float,title:^(Choose Files)$" - "float,title:^(Save As)$" - "float,title:^(Confirm to replace files)$" - "float,title:^(File Operation Progress)$" - ]; - - layerrule = [ - "blur, system-shell" - "ignorezero, system-shell" - "animation slide, system-shell" - "abovelock, system-shell" - - "blur, system-bar" - "xray on, system-bar" - "ignorezero, system-bar" - "animation slide, system-bar" - ]; - }; - }; - - home.packages = with pkgs; [ nautilus ]; - - xdg.configFile."uwsm/env".source = let - inherit (config.home) sessionVariables; - export = k: v: "export ${builtins.toString k}=${builtins.toString v}"; - env = strings.concatLines (attrsets.mapAttrsToList export sessionVariables); - in pkgs.writeText "env" env; - - services = { - hyprpolkitagent.enable = true; - hypridle = { - enable = true; - settings = { - general = { - lock_cmd = "pidof hyprlock || hyprlock"; - before_sleep_cmd = "loginctl lock-session"; - after_sleep_cmd = "hyprctl dispatch dpms on"; - }; - listener = [ - { - timeout = 300; - on-timeout = "loginctl lock-session"; - } - { - timeout = 330; - on-timeout = "hyprctl dispatch dpms off"; - on-resume = "hyprctl dispatch dpms on"; - } - { - timeout = 600; - on-timeout = "systemctl suspend"; - } - ]; - }; - }; - wpaperd = { - enable = true; - package = pkgs.wpaperd.overrideAttrs (old: { - cargoBuildFlags = [ "--no-default-features" ]; - }); - settings.default = { - path = "${config.xdg.userDirs.pictures}/Wallpapers"; - mode = "center"; - duration = "8h"; - sorting = "random"; - }; - }; - }; - - programs.hyprlock = { - enable = true; - package = null; - settings = { - general = { - disable_loading_bar = true; - grace = 10; - hide_cursor = true; - no_fade_in = false; - }; - background = [ - { - path = ""; - blur_passes = 3; - blur_size = 8; - } - ]; - input-field = [ - { - size = "200, 50"; - position = "0, -80"; - dots_center = true; - fade_on_empty = false; - font_color = "rgb(202, 211, 245)"; - inner_color = "rgb(91, 96, 120)"; - outer_color = "rgb(24, 25, 38)"; - outline_thickness = 5; - shadow_passes = 2; - } - ]; - }; - }; - - systemd.user.services = { - hyprpolkitagent.Service.Slice = "session.slice"; - hypridle.Service.Slice = "session.slice"; - wpaperd.Service.Slice = "session.slice"; - - system-shell-notifd = { - Install.WantedBy = [ "system-shell.service" ]; - Service = { - ExecStart = "${pkgs.astal.notifd}/bin/astal-notifd -d"; - Restart = "on-failure"; - RestartSec = 5; - Slice = "background.slice"; - }; - Unit = { - After = [ config.wayland.systemd.target ]; - PartOf = [ config.wayland.systemd.target ]; - }; - }; - - system-shell = { - Install.WantedBy = [ "graphical-session.target" ]; - Service = { - ExecStart = "${system-shell}"; - Restart = "on-failure"; - RestartSec = 10; - Environment = [ "GSK_RENDERER=ngl" ]; - Slice = "session.slice"; - }; - Unit = { - After = [ config.wayland.systemd.target ]; - ConditionEnvironment = "WAYLAND_DISPLAY"; - PartOf = [ config.wayland.systemd.target ]; - }; - }; - }; - }; -} diff --git a/home/desktop/theme.nix b/home/desktop/theme.nix deleted file mode 100644 index 13c2978..0000000 --- a/home/desktop/theme.nix +++ /dev/null @@ -1,80 +0,0 @@ -{ lib, config, pkgs, ... } @ inputs: - -with lib; -let - inherit (import ../../lib/theme.nix inputs) cursorTheme defaultFont iconTheme gtkTheme kvantumTheme; - cfg = config.modules.desktop; -in { - options.modules.desktop.theme = { - enable = mkOption { - default = false; - example = true; - description = "Whether to enable theming configuration."; - type = types.bool; - }; - }; - - config = mkIf cfg.theme.enable { - home.pointerCursor = { - inherit (cursorTheme) package name; - gtk.enable = true; - hyprcursor.enable = true; - x11.enable = true; - size = 24; - }; - - home.packages = with pkgs; [ - libsForQt5.qtstyleplugin-kvantum - libsForQt5.qt5ct - ]; - - qt = { - enable = true; - platformTheme.name = "gtk"; - style.name = "kvantum"; - }; - - xdg.configFile = { - "Kvantum/${kvantumTheme.name}".source = "${kvantumTheme.package}/share/Kvantum/${kvantumTheme.name}"; - "Kvantum/kvantum.kvconfig".text = '' - [General] - theme=${kvantumTheme.name} - ''; - "qt5ct/qt5ct.conf".text = '' - [Appearance] - icon_theme=${iconTheme.name} - ''; - "qt6ct/qt6ct.conf".text = '' - [Appearance] - icon_theme=${iconTheme.name} - ''; - }; - - gtk = { - enable = true; - inherit iconTheme; - theme = gtkTheme; - font = defaultFont; - gtk2.configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc"; - gtk3.extraConfig.gtk-application-prefer-dark-theme = 1; - gtk4.extraConfig.gtk-application-prefer-dark-theme = 1; - }; - - dconf = { - enable = true; - settings = { - "org/gnome/desktop/interface".color-scheme = "prefer-dark"; - }; - }; - - fonts.fontconfig = { - enable = true; - defaultFonts = { - serif = [ "New York" "Noto Serif" "Noto Color Emoji" ]; - sansSerif = [ "SF Pro Display" "Inter" "Noto Color Emoji" ]; - monospace = [ "Dank Mono" "SF Mono" "Noto Color Emoji" ]; - emoji = [ "Noto Color Emoji" ]; - }; - }; - }; -} diff --git a/home/desktop/tools.nix b/home/desktop/tools.nix deleted file mode 100644 index ec8bd0a..0000000 --- a/home/desktop/tools.nix +++ /dev/null @@ -1,32 +0,0 @@ -{ lib, config, pkgs, ... }: - -with lib; -let - cfg = config.modules.desktop; -in { - options.modules.desktop.tools = { - enable = mkOption { - default = false; - example = true; - description = "Whether to enable basic desktop tools."; - type = types.bool; - }; - }; - - config = mkIf cfg.tools.enable { - home.packages = with pkgs; let - switchboard = (pkgs.pantheon.switchboard-with-plugs.override { - useDefaultPlugs = false; - plugs = with pkgs.pantheon; [ - switchboard-plug-sound - switchboard-plug-network - switchboard-plug-bluetooth - ]; - }); - in [ - pwvucontrol - mission-center - switchboard - ]; - }; -} diff --git a/lib/theme.nix b/lib/theme.nix deleted file mode 100644 index 3388547..0000000 --- a/lib/theme.nix +++ /dev/null @@ -1,36 +0,0 @@ -{ pkgs, ... }: - -{ - cursorTheme = { - name = "macOS"; - package = pkgs.apple-cursor; - }; - defaultFont = { - name = "SF Pro Display"; - package = pkgs.sf-pro; - size = 11; - }; - iconTheme = { - name = "WhiteSur"; - package = pkgs.whitesur-icon-theme.override { - boldPanelIcons = true; - alternativeIcons = true; - }; - }; - gtkTheme = { - name = "WhiteSur-Dark-solid"; - package = pkgs.whitesur-gtk-theme; - }; - kvantumTheme = rec { - name = "WhiteSur-opaqueDark"; - package = pkgs.stdenv.mkDerivation { - pname = "whitesur-kde"; - version = pkgs.whitesur-kde.version; - src = pkgs.whitesur-kde.src; - installPhase = /*sh*/'' - mkdir -p "$out/share/Kvantum/${name}" - cp -R Kvantum/**/* "$out/share/Kvantum/${name}" - ''; - }; - }; -} -- 2.51.2 From e03e67501c6dbc38d598551bef45cb46e66b57cc Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Fri, 2 Jan 2026 18:42:11 +0000 Subject: [PATCH 03/14] Remove default dock entry --- modules/desktop/niri-cosmic.nix | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/desktop/niri-cosmic.nix b/modules/desktop/niri-cosmic.nix index f6ba1f4..c6f38c8 100644 --- a/modules/desktop/niri-cosmic.nix +++ b/modules/desktop/niri-cosmic.nix @@ -54,6 +54,11 @@ let "com.system76.CosmicComp/v1/autotile_behavior" = '' PerWorkspace ''; + "com.system76.CosmicPanel/v1/entries" = '' + [ + "Panel", + ] + ''; }; fileDrvs = attrsets.mapAttrsToList -- 2.51.2 From 068477649265c005045b81d144be7bceede8977c Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Fri, 2 Jan 2026 19:03:38 +0000 Subject: [PATCH 04/14] Force-override cosmic configs with global defaults --- modules/desktop/niri-cosmic.nix | 66 ++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/modules/desktop/niri-cosmic.nix b/modules/desktop/niri-cosmic.nix index c6f38c8..c576671 100644 --- a/modules/desktop/niri-cosmic.nix +++ b/modules/desktop/niri-cosmic.nix @@ -43,27 +43,48 @@ let cosmic-wallpapers ]; + cosmic-configs = { + "com.system76.CosmicComp/v1/workspaces" = '' + ( + workspace_mode: OutputBound, + workspace_layout: Horizontal, + ) + ''; + "com.system76.CosmicComp/v1/autotile_behavior" = '' + PerWorkspace + ''; + "com.system76.CosmicPanel/v1/entries" = '' + [ + "Panel", + ] + ''; + "com.system76.CosmicTk/v1/interface_font" = let + defaultFont = head config.fonts.fontconfig.defaultFonts.sansSerif; + in '' + ( + family: "${defaultFont}", + weight: Normal, + stretch: Normal, + style: Normal, + ) + ''; + "com.system76.CosmicTk/v1/monospace_font" = let + defaultFont = head config.fonts.fontconfig.defaultFonts.monospace; + in '' + ( + family: "${defaultFont}", + weight: Normal, + stretch: Normal, + style: Normal, + ) + ''; + }; + cosmic-base-config = let - configs = { - "com.system76.CosmicComp/v1/workspaces" = '' - ( - workspace_mode: OutputBound, - workspace_layout: Horizontal, - ) - ''; - "com.system76.CosmicComp/v1/autotile_behavior" = '' - PerWorkspace - ''; - "com.system76.CosmicPanel/v1/entries" = '' - [ - "Panel", - ] - ''; - }; fileDrvs = attrsets.mapAttrsToList (name: text: pkgs.writeTextDir "share/cosmic/${name}" text) - configs; + cosmic-configs; in pkgs.buildEnv { name = "cosmic-base-config"; paths = fileDrvs; @@ -74,7 +95,12 @@ let startCosmicExtNiri = pkgs.writeShellApplication { name = "start-cosmic-ext-niri"; runtimeInputs = with pkgs; [ systemd coreutils ]; - text = with pkgs; /*sh*/'' + text = with pkgs; let + cleanupCosmicConfigs = + concatMapAttrsStringSep "\n" + (name: _value: ''rm -f "$XDG_CONFIG_HOME/cosmic/${name}"'') + cosmic-configs; + in /*sh*/'' set -e if systemctl --user -q is-active cosmic-niri-session.service; then @@ -91,6 +117,10 @@ let done done + XDG_CONFIG_HOME="''${XDG_CONFIG_HOME:-$HOME/.config}" + touch "$XDG_CONFIG_HOME/cosmic-initial-setup-done" + ${cleanupCosmicConfigs} + export XDG_CURRENT_DESKTOP="''${XDG_CURRENT_DESKTOP:=niri}" export XDG_SESSION_TYPE="''${XDG_SESSION_TYPE:=wayland}" export DCONF_PROFILE=cosmic -- 2.51.2 From 52176c82e62c27ebbcc973e4458e6132f7711e8a Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Fri, 2 Jan 2026 21:30:04 +0000 Subject: [PATCH 05/14] Add pre-start init script for niri --- home/desktop/niri/config.kdl | 2 -- modules/desktop/niri-cosmic.nix | 17 ++++++++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/home/desktop/niri/config.kdl b/home/desktop/niri/config.kdl index c05608c..38d11df 100644 --- a/home/desktop/niri/config.kdl +++ b/home/desktop/niri/config.kdl @@ -1,5 +1,3 @@ -spawn-at-startup "cosmic-ext-alternative-startup" - binds { Super+T { spawn "ghostty"; } Super+Space { spawn "cosmic-launcher"; } diff --git a/modules/desktop/niri-cosmic.nix b/modules/desktop/niri-cosmic.nix index c576671..7f13598 100644 --- a/modules/desktop/niri-cosmic.nix +++ b/modules/desktop/niri-cosmic.nix @@ -192,7 +192,6 @@ in { ]; systemPackages = corePackages ++ supportPackages ++ optionalPackages ++ [ cosmic-base-config - cosmic-ext-alternative-startup ]; sessionVariables = { X11_BASE_RULES_XML = "${config.services.xserver.xkb.dir}/rules/base.xml"; @@ -253,22 +252,30 @@ in { user.services = { cosmic-niri-session = let set-environment = config.system.build.setEnvironment; + init-session = pkgs.writeShellScriptBin "init-cosmic-niri-session" /*sh*/ '' + XDG_CONFIG_HOME="''${XDG_CONFIG_HOME:-$HOME/.config}" + NIRI_CONFIG="''${NIRI_CONFIG:-$XDG_CONFIG_HOME/niri/config.kdl}" + printf "%s\n" \ + "spawn-at-startup \"${getExe cosmic-ext-alternative-startup}\"" \ + "include \"$NIRI_CONFIG\"" \ + > "$RUNTIME_DIRECTORY/.niri-config.kdl" + ''; run-session = pkgs.writeShellScriptBin "run-cosmic-niri-session" /*sh*/'' source ${set-environment} ${getBin pkgs.dbus}/bin/dbus-update-activation-environment --systemd --all + export NIRI_CONFIG="$RUNTIME_DIRECTORY/.niri-config.kdl" exec ${getBin pkgs.cosmic-session}/bin/cosmic-session ${getBin pkgs.niri}/bin/niri --session ''; in { bindsTo = [ "graphical-session.target" ]; serviceConfig = { - Environment = [ - "RUST_BACKTRACE=1" - "RUST_LOG=info" - ]; + RuntimeDirectory = "cosmic-niri-session"; + RuntimeDirectoryMode = "0700"; Type = "notify"; NotifyAccess = "all"; Slice = "session.slice"; Restart = "on-failure"; + ExecStartPre = getExe init-session; ExecStart = getExe run-session; }; }; -- 2.51.2 From 0dde1685968d96ad1869dcdadbee61e0575f52b4 Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Fri, 2 Jan 2026 21:40:43 +0000 Subject: [PATCH 06/14] Remove xdg-desktop-portal-cosmic for now --- modules/desktop/niri-cosmic.nix | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/desktop/niri-cosmic.nix b/modules/desktop/niri-cosmic.nix index 7f13598..bdfe10a 100644 --- a/modules/desktop/niri-cosmic.nix +++ b/modules/desktop/niri-cosmic.nix @@ -288,14 +288,12 @@ in { portal = { enable = true; xdgOpenUsePortal = true; - configPackages = mkDefault [ pkgs.xdg-desktop-portal-cosmic ]; extraPortals = with pkgs; [ xdg-desktop-portal-gnome - xdg-desktop-portal-cosmic xdg-desktop-portal-gtk ]; config.niri = { - default = [ "gnome" "cosmic" "gtk" ]; + default = [ "gnome" "gtk" ]; "org.freedesktop.impl.portal.Access" = "gtk"; "org.freedesktop.impl.portal.Notification" = "gtk"; "org.freedesktop.impl.portal.Secret" = "gnome-keyring"; -- 2.51.2 From 2e5982d88c294a6c07017f73caae14e17965816c Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Fri, 2 Jan 2026 22:03:23 +0000 Subject: [PATCH 07/14] Remove redundant support packages --- modules/desktop/niri-cosmic.nix | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/modules/desktop/niri-cosmic.nix b/modules/desktop/niri-cosmic.nix index bdfe10a..ce60651 100644 --- a/modules/desktop/niri-cosmic.nix +++ b/modules/desktop/niri-cosmic.nix @@ -24,20 +24,9 @@ let cosmic-workspaces-epoch ]; - supportPackages = with pkgs; [ - adwaita-icon-theme - alsa-utils - glib - hicolor-icon-theme - playerctl - pop-icon-theme - pop-launcher - pulseaudio - xdg-user-dirs - ]; - optionalPackages = with pkgs; [ xwayland-satellite + xdg-user-dirs cosmic-icons cosmic-screenshot cosmic-wallpapers @@ -190,7 +179,7 @@ in { "/share/cosmic-layouts" "/share/cosmic-themes" ]; - systemPackages = corePackages ++ supportPackages ++ optionalPackages ++ [ + systemPackages = corePackages ++ optionalPackages ++ [ cosmic-base-config ]; sessionVariables = { -- 2.51.2 From 38d34717b7cfe169b01ce4a5bf96148cd1034105 Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Fri, 2 Jan 2026 22:05:23 +0000 Subject: [PATCH 08/14] Update pinentry program --- home/base/gpg.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home/base/gpg.nix b/home/base/gpg.nix index 07dab3c..46291dd 100644 --- a/home/base/gpg.nix +++ b/home/base/gpg.nix @@ -43,7 +43,7 @@ in { program = "pinentry-touchid"; }) (helpers.mkIfLinux { - package = pkgs.pinentry-all; + package = pkgs.pinentry-gnome3; program = "pinentry"; }) ]; -- 2.51.2 From 3cc47f51c8684d6907a34e7cd6071abd56a1f8a6 Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Fri, 2 Jan 2026 22:13:18 +0000 Subject: [PATCH 09/14] Add missing launcher deps --- modules/desktop/niri-cosmic.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/desktop/niri-cosmic.nix b/modules/desktop/niri-cosmic.nix index ce60651..f6e7e32 100644 --- a/modules/desktop/niri-cosmic.nix +++ b/modules/desktop/niri-cosmic.nix @@ -22,6 +22,8 @@ let cosmic-settings cosmic-settings-daemon cosmic-workspaces-epoch + pop-icon-theme + pop-launcher ]; optionalPackages = with pkgs; [ -- 2.51.2 From 3d05745e20ec78109ec8d8a10537fcb5f10929e6 Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Fri, 2 Jan 2026 22:15:32 +0000 Subject: [PATCH 10/14] Restore desktop tools --- home/desktop/default.nix | 1 + home/desktop/tools.nix | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 home/desktop/tools.nix diff --git a/home/desktop/default.nix b/home/desktop/default.nix index bf33846..a523c15 100644 --- a/home/desktop/default.nix +++ b/home/desktop/default.nix @@ -12,5 +12,6 @@ with lib; { imports = [ ./niri/default.nix + ./tools.nix ]; } diff --git a/home/desktop/tools.nix b/home/desktop/tools.nix new file mode 100644 index 0000000..1ee085b --- /dev/null +++ b/home/desktop/tools.nix @@ -0,0 +1,22 @@ +{ lib, config, pkgs, ... }: + +with lib; +let + cfg = config.modules.desktop; +in { + options.modules.desktop.tools = { + enable = mkOption { + default = cfg.enable; + example = true; + description = "Whether to enable basic desktop tools."; + type = types.bool; + }; + }; + + config = mkIf cfg.tools.enable { + home.packages = with pkgs; [ + pwvucontrol + mission-center + ]; + }; +} -- 2.51.2 From ec0871d333214b825c83e3df06f31ad77eb0665b Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Fri, 2 Jan 2026 22:28:44 +0000 Subject: [PATCH 11/14] Adjust default options --- modules/desktop/niri-cosmic.nix | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/modules/desktop/niri-cosmic.nix b/modules/desktop/niri-cosmic.nix index f6e7e32..2067fb0 100644 --- a/modules/desktop/niri-cosmic.nix +++ b/modules/desktop/niri-cosmic.nix @@ -216,13 +216,16 @@ in { upower.enable = true; acpid.enable = mkDefault true; - gnome.gnome-keyring.enable = mkDefault true; gvfs.enable = mkDefault true; + gnome = { + gnome-keyring.enable = mkDefault true; + gcr-ssh-agent.enable = mkDefault false; + }; logind.settings.Login = { - powerKey = "suspend"; - powerKeyLongPress = "poweroff"; - lidSwitch = "suspend"; + powerKey = mkDefault "suspend"; + powerKeyLongPress = mkDefault "poweroff"; + lidSwitch = mkDefault "suspend"; }; geoclue2 = { -- 2.51.2 From d7317d849ea74c5cfc1dababf90c5da3bac6e788 Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Sat, 3 Jan 2026 00:06:31 +0000 Subject: [PATCH 12/14] Add missing env vars --- home/desktop/niri/default.nix | 6 ++++++ modules/desktop/niri-cosmic.nix | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/home/desktop/niri/default.nix b/home/desktop/niri/default.nix index 87845a4..72ce207 100644 --- a/home/desktop/niri/default.nix +++ b/home/desktop/niri/default.nix @@ -15,5 +15,11 @@ in { config = mkIf cfg.niri.enable { xdg.configFile."niri/config.kdl".text = (builtins.readFile ./config.kdl); + + systemd.user.sessionVariables = { + XCURSOR_THEME = "Cosmic"; + GTK_THEME = "Adwaita:dark"; + QT_STYLE_OVERRIDE = "adwaita-dark"; + }; }; } diff --git a/modules/desktop/niri-cosmic.nix b/modules/desktop/niri-cosmic.nix index 2067fb0..0c3e99a 100644 --- a/modules/desktop/niri-cosmic.nix +++ b/modules/desktop/niri-cosmic.nix @@ -188,11 +188,14 @@ in { X11_BASE_RULES_XML = "${config.services.xserver.xkb.dir}/rules/base.xml"; X11_EXTRA_RULES_XML = "${config.services.xserver.xkb.dir}/rules/base.extras.xml"; - GSK_RENDERER = mkDefault "ngl"; + _JAVA_AWT_WM_NONREPARENTING = mkDefault 1; + QT_AUTO_SCREEN_SCALE_FACTOR = mkDefault 1; + QT_ENABLE_HIGHDPI_SCALING = mkDefault 1; QT_QPA_PLATFORM = mkDefault "wayland;xcb"; GDK_BACKEND = mkDefault "wayland,x11,*"; SDL_VIDEODRIVER = mkDefault "wayland,x11"; NIXOS_OZONE_WL = mkDefault 1; + MOZ_ENABLE_WAYLAND = mkDefault 1; COSMIC_DATA_CONTROL_ENABLED = mkDefault 1; }; }; -- 2.51.2 From c5973833a94e2cfb89a2d7c2760df6687982c2df Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Sat, 3 Jan 2026 00:35:59 +0000 Subject: [PATCH 13/14] Restore bindings and add sensible default settings --- home/apps/ghostty.nix | 1 - home/desktop/niri/config.kdl | 120 ++++++++++++++++++++++++++++++-- modules/desktop/niri-cosmic.nix | 2 + 3 files changed, 118 insertions(+), 5 deletions(-) diff --git a/home/apps/ghostty.nix b/home/apps/ghostty.nix index 119c3ee..bc1546e 100644 --- a/home/apps/ghostty.nix +++ b/home/apps/ghostty.nix @@ -108,7 +108,6 @@ in { mouse-hide-while-typing = true mouse-shift-capture = true - mouse-scroll-multiplier = 0.7 clipboard-read = allow clipboard-paste-protection = false diff --git a/home/desktop/niri/config.kdl b/home/desktop/niri/config.kdl index 38d11df..3ea7d38 100644 --- a/home/desktop/niri/config.kdl +++ b/home/desktop/niri/config.kdl @@ -1,6 +1,118 @@ +prefer-no-csd + binds { - Super+T { spawn "ghostty"; } - Super+Space { spawn "cosmic-launcher"; } - Super+Shift+Space { spawn "cosmic-app-library"; } - Super+Alt+L { spawn "cosmic-greeter"; } + Mod+T { spawn "ghostty"; } + Mod+Space { spawn "cosmic-launcher"; } + Mod+Shift+Space { spawn "cosmic-app-library"; } + + Mod+Escape repeat=false { toggle-keyboard-shortcuts-inhibit; } + + Mod+O repeat=false { toggle-overview; } + Mod+W repeat=false { close-window; } + + Mod+F { maximize-column; } + Mod+Shift+F { fullscreen-window; } + Mod+Z { center-column; } + + Mod+Minus { set-column-width "-10%"; } + Mod+Equal { set-column-width "+10%"; } + + Mod+Left { focus-column-left; } + Mod+Down { focus-window-down; } + Mod+Up { focus-window-up; } + Mod+Right { focus-column-right; } + Mod+H { focus-column-left; } + Mod+J { focus-window-or-workspace-down; } + Mod+K { focus-window-or-workspace-up; } + Mod+L { focus-column-right; } + + Mod+Ctrl+Left { move-column-left; } + Mod+Ctrl+Down { move-window-down; } + Mod+Ctrl+Up { move-window-up; } + Mod+Ctrl+Right { move-column-right; } + Mod+Ctrl+H { move-column-left; } + Mod+Ctrl+J { move-window-down-or-to-workspace-down; } + Mod+Ctrl+K { move-window-up-or-to-workspace-up; } + Mod+Ctrl+L { move-column-right; } + + Mod+Shift+Left { focus-monitor-left; } + Mod+Shift+Down { focus-monitor-down; } + Mod+Shift+Up { focus-monitor-up; } + Mod+Shift+Right { focus-monitor-right; } + Mod+Shift+H { focus-monitor-left; } + Mod+Shift+J { focus-monitor-down; } + Mod+Shift+K { focus-monitor-up; } + Mod+Shift+L { focus-monitor-right; } + + Mod+Shift+Ctrl+Left { move-column-to-monitor-left; } + Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } + Mod+Shift+Ctrl+Up { move-column-to-monitor-up; } + Mod+Shift+Ctrl+Right { move-column-to-monitor-right; } + Mod+Shift+Ctrl+H { move-column-to-monitor-left; } + Mod+Shift+Ctrl+J { move-column-to-monitor-down; } + Mod+Shift+Ctrl+K { move-column-to-monitor-up; } + Mod+Shift+Ctrl+L { move-column-to-monitor-right; } + + Mod+Page_Down { focus-workspace-down; } + Mod+Page_Up { focus-workspace-up; } + Mod+U { focus-workspace-down; } + Mod+I { focus-workspace-up; } + Mod+Ctrl+Page_Down { move-column-to-workspace-down; } + Mod+Ctrl+Page_Up { move-column-to-workspace-up; } + Mod+Ctrl+U { move-column-to-workspace-down; } + Mod+Ctrl+I { move-column-to-workspace-up; } + + Mod+Shift+Page_Down { move-workspace-down; } + Mod+Shift+Page_Up { move-workspace-up; } + Mod+Shift+U { move-workspace-down; } + Mod+Shift+I { move-workspace-up; } + + Mod+WheelScrollDown { focus-column-right; } + Mod+WheelScrollUp { focus-column-left; } + + Mod+BracketLeft { consume-or-expel-window-left; } + Mod+BracketRight { consume-or-expel-window-right; } + Mod+Comma { consume-window-into-column; } + Mod+Period { expel-window-from-column; } + + Print { screenshot; } + Ctrl+Print { screenshot-screen; } + Alt+Print { screenshot-window; } +} + +input { + warp-mouse-to-focus +} + +layout { + gaps 16 + center-focused-column "never" + + focus-ring { + width 2 + } +} + +cursor { + hide-after-inactive-ms 2000 +} + +hotkey-overlay { + hide-not-bound +} + +window-rule { + match title="^Picture-in-Picture$" + open-floating true +} + +window-rule { + match is-urgent=true + match is-floating=true + open-focused true +} + +window-rule { + geometry-corner-radius 9 + clip-to-geometry true } diff --git a/modules/desktop/niri-cosmic.nix b/modules/desktop/niri-cosmic.nix index 0c3e99a..0e054eb 100644 --- a/modules/desktop/niri-cosmic.nix +++ b/modules/desktop/niri-cosmic.nix @@ -18,6 +18,7 @@ let cosmic-notifications cosmic-osd cosmic-panel + cosmic-randr cosmic-session cosmic-settings cosmic-settings-daemon @@ -30,6 +31,7 @@ let xwayland-satellite xdg-user-dirs cosmic-icons + cosmic-player cosmic-screenshot cosmic-wallpapers ]; -- 2.51.2 From 50b54ea5b65f194e5b56627963a907a68aea1772 Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Sat, 3 Jan 2026 12:34:04 +0000 Subject: [PATCH 14/14] Update flakes --- flake.lock | 36 ++++++++++++++++++------------------ home/apps/discord.nix | 23 ++++++++++++++++++++++- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/flake.lock b/flake.lock index 5b0af87..2006279 100644 --- a/flake.lock +++ b/flake.lock @@ -54,11 +54,11 @@ ] }, "locked": { - "lastModified": 1767212595, - "narHash": "sha256-KzKh609ORROs7Ff9WPDy4a4wbV2cj7emWCmK+hRGHYU=", + "lastModified": 1767385394, + "narHash": "sha256-OmairXulwDK1u54QEqdsQeFmowb3LRibo5lW3oBN0UQ=", "owner": "tadfisher", "repo": "android-nixpkgs", - "rev": "9e19c7f874c25d21a6ee57a8a730d4a1544a9699", + "rev": "9eacd1f5d0dd71004032487861d7e9676729b4d4", "type": "github" }, "original": { @@ -76,11 +76,11 @@ ] }, "locked": { - "lastModified": 1766064315, - "narHash": "sha256-aMoYLYIj+yYGhDKuSromj+VZYnMyN3lRRAZ+dk1IOiE=", + "lastModified": 1767441081, + "narHash": "sha256-Y4T5OR+R4QBFvRnMsZK7Bol4yk4TLuBo8l7KhrXoGjQ=", "owner": "nix-community", "repo": "nixos-apple-silicon", - "rev": "f94f4496775f9ca6e8a9e9e83f5aa4e4210fbb5d", + "rev": "612258d7a123a727b908fb9cdbbe49182ca9a2fe", "type": "github" }, "original": { @@ -180,11 +180,11 @@ }, "flake-compat": { "locked": { - "lastModified": 1746162366, - "narHash": "sha256-5SSSZ/oQkwfcAz/o/6TlejlVGqeK08wyREBQ5qFFPhM=", + "lastModified": 1761640442, + "narHash": "sha256-AtrEP6Jmdvrqiv4x2xa5mrtaIp3OEe8uBYCDZDS+hu8=", "owner": "nix-community", "repo": "flake-compat", - "rev": "0f158086a2ecdbb138cd0429410e44994f1b7e4b", + "rev": "4a56054d8ffc173222d09dad23adf4ba946c8884", "type": "github" }, "original": { @@ -343,11 +343,11 @@ ] }, "locked": { - "lastModified": 1767104570, - "narHash": "sha256-GKgwu5//R+cLdKysZjGqvUEEOGXXLdt93sNXeb2M/Lk=", + "lastModified": 1767437240, + "narHash": "sha256-OA0dBHhccdupFXp+/eaFfb8K1dQxk61in4aF5ITGVX8=", "owner": "nix-community", "repo": "home-manager", - "rev": "e4e78a2cbeaddd07ab7238971b16468cc1d14daf", + "rev": "1cfa305fba94468f665de1bd1b62dddf2e0cb012", "type": "github" }, "original": { @@ -548,11 +548,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1767242400, - "narHash": "sha256-knFaYjeg7swqG1dljj1hOxfg39zrIy8pfGuicjm9s+o=", + "lastModified": 1767364772, + "narHash": "sha256-fFUnEYMla8b7UKjijLnMe+oVFOz6HjijGGNS1l7dYaQ=", "owner": "nixos", "repo": "nixpkgs", - "rev": "c04833a1e584401bb63c1a63ddc51a71e6aa457a", + "rev": "16c7794d0a28b5a37904d55bcca36003b9109aaa", "type": "github" }, "original": { @@ -1117,11 +1117,11 @@ ] }, "locked": { - "lastModified": 1767239595, - "narHash": "sha256-QUfbe5AJP2f190ugNNb4y12ZzOWTnCi66yuM3iYRBzE=", + "lastModified": 1767428887, + "narHash": "sha256-lAUdnQiHP6bywCsCnPdT3BYYsivclrnmgGFX2wUif0g=", "owner": "0xc000022070", "repo": "zen-browser-flake", - "rev": "5776ae08801a16562b5626a64dedc57032f9a430", + "rev": "c1bd63771a866f29fdc33e0fa80e7fb8536ba5f0", "type": "github" }, "original": { diff --git a/home/apps/discord.nix b/home/apps/discord.nix index 2c9dcdf..82dfc84 100644 --- a/home/apps/discord.nix +++ b/home/apps/discord.nix @@ -14,7 +14,28 @@ in { config = mkIf (cfg.enable && cfg.discord.enable) (mkMerge [ { - home.packages = with pkgs; [ vesktop ]; + home.packages = with pkgs; let + pkg = vesktop.overrideAttrs (old: { + # electron builds must be writable + preBuild = optionalString stdenv.hostPlatform.isDarwin '' + cp -r ${electron.dist}/Electron.app . + chmod -R u+w Electron.app + '' + optionalString stdenv.hostPlatform.isLinux '' + cp -r ${electron.dist} electron-dist + chmod -R u+w electron-dist + ''; + buildPhase = '' + runHook preBuild + pnpm build + pnpm exec electron-builder \ + --dir \ + -c.asarUnpack="**/*.node" \ + -c.electronDist=${if stdenv.hostPlatform.isDarwin then "." else "electron-dist"} \ + -c.electronVersion=${electron.version} + runHook postBuild + ''; + }); + in [ pkg ]; } (helpers.mkIfLinux {