aboutsummaryrefslogtreecommitdiff
path: root/home/programs/desktop
diff options
context:
space:
mode:
authorFranck Cuny <franck@fcuny.net>2025-12-31 11:26:08 -0800
committerFranck Cuny <franck@fcuny.net>2025-12-31 11:26:08 -0800
commit94655522818b21970badfa1c698759bd9338005c (patch)
treefea9b0a13a83af3ef9a2feb58d993f45596d3215 /home/programs/desktop
parentcgroups is included in all nixos (diff)
downloadinfra-94655522818b21970badfa1c698759bd9338005c.tar.gz
a working niri + noctalia environment
Diffstat (limited to '')
-rw-r--r--home/programs/desktop/niri.nix329
-rw-r--r--home/programs/desktop/noctalia.nix243
2 files changed, 572 insertions, 0 deletions
diff --git a/home/programs/desktop/niri.nix b/home/programs/desktop/niri.nix
new file mode 100644
index 0000000..459980d
--- /dev/null
+++ b/home/programs/desktop/niri.nix
@@ -0,0 +1,329 @@
+{
+ config,
+ inputs,
+ pkgs,
+ ...
+}:
+let
+ xcursor_theme = config.gtk.cursorTheme.name;
+ noctalia = inputs.noctalia.packages.${pkgs.system}.default;
+ noctaliaIPC = "${noctalia}/bin/noctalia-shell ipc call";
+in
+{
+ services.swayidle = {
+ enable = true;
+ timeouts = [
+ {
+ timeout = 180;
+ command = "${pkgs.niri}/bin/niri msg action power-off-monitors";
+ }
+ ];
+ };
+
+ programs.niri.enable = true;
+
+ home.packages = with pkgs; [
+ fuzzel
+ light
+ pamixer
+ ];
+
+ programs.niri.settings = {
+ input = {
+ keyboard = {
+ xkb = {
+ layout = "us";
+ model = "pc105";
+ options = "ctrl:nocaps";
+ };
+ repeat-delay = 300;
+ repeat-rate = 20;
+ };
+ touchpad = {
+ tap = true;
+ dwt = true;
+ natural-scroll = true;
+ };
+ focus-follows-mouse.enable = true;
+ focus-follows-mouse.max-scroll-amount = "0%";
+ workspace-auto-back-and-forth = true;
+ };
+
+ spawn-at-startup = [
+ { sh = "${noctalia}/bin/noctalia-init"; }
+ ];
+
+ hotkey-overlay.skip-at-startup = true;
+
+ cursor = {
+ theme = xcursor_theme;
+ };
+
+ layout = {
+ gaps = 16;
+ center-focused-column = "never";
+ preset-column-widths = [
+ { proportion = 1.0 / 3.0; }
+ { proportion = 1.0 / 2.0; }
+ { proportion = 2.0 / 3.0; }
+ ];
+ default-column-width = {
+ proportion = 0.5;
+ };
+
+ tab-indicator = {
+ gap = 8;
+ gaps-between-tabs = 4;
+ corner-radius = 8;
+ width = 10;
+ position = "top";
+ };
+
+ focus-ring = {
+ width = 4;
+
+ active = {
+ color = "#7fc8ff";
+ };
+
+ inactive = {
+ color = "#505050";
+ };
+ };
+
+ border = {
+ enable = false;
+ };
+
+ shadow = {
+ enable = true;
+ softness = 30;
+ spread = 5;
+ offset = {
+ x = 0;
+ y = 5;
+ };
+ color = "#0007";
+ };
+
+ struts = {
+ left = 8;
+ right = 8;
+ top = 8;
+ bottom = 8;
+ };
+ };
+
+ screenshot-path = "~/.screenshots/%Y-%m-%dT%H.%M.%S.png";
+
+ window-rules = [
+ {
+ geometry-corner-radius = {
+ top-left = 12.0;
+ top-right = 12.0;
+ bottom-left = 12.0;
+ bottom-right = 12.0;
+ };
+ clip-to-geometry = true;
+ }
+
+ {
+ matches = [
+ {
+ app-id = "mpv$";
+ }
+ ];
+ open-floating = true;
+ }
+ ];
+
+ binds = {
+ "Mod+Shift+Slash".action.show-hotkey-overlay = [ ];
+ "Super+Return".action.spawn = [
+ "kitty"
+ ];
+ "Mod+D".action.spawn-sh = "${noctaliaIPC} launcher toggle";
+ "Super+Alt+L".action.spawn-sh = "${noctaliaIPC} lockScreen lock";
+ "XF86AudioRaiseVolume" = {
+ action.spawn = [
+ "wpctl"
+ "set-volume"
+ "@DEFAULT_AUDIO_SINK@"
+ "0.1+"
+ ];
+ allow-when-locked = true;
+ };
+ "XF86AudioLowerVolume" = {
+ action.spawn = [
+ "wpctl"
+ "set-volume"
+ "@DEFAULT_AUDIO_SINK@"
+ "0.1-"
+ ];
+ allow-when-locked = true;
+ };
+ "XF86AudioMute" = {
+ action.spawn = [
+ "wpctl"
+ "set-mute"
+ "@DEFAULT_AUDIO_SINK@"
+ "toggle"
+ ];
+ allow-when-locked = true;
+ };
+ "XF86AudioMicMute" = {
+ action.spawn = [
+ "wpctl"
+ "set-mute"
+ "@DEFAULT_AUDIO_SOURCE@"
+ "toggle"
+ ];
+ allow-when-locked = true;
+ };
+
+ "Mod+Tab".action.toggle-overview = [ ];
+
+ "Mod+Q".action.close-window = [ ];
+
+ "Mod+Left".action.focus-column-left = [ ];
+ "Mod+Down".action.focus-window-or-workspace-down = [ ];
+ "Mod+Up".action.focus-window-or-workspace-up = [ ];
+ "Mod+Right".action.focus-column-right = [ ];
+ "Mod+H".action.focus-column-left = [ ];
+ "Mod+J".action.focus-window-down = [ ];
+ "Mod+K".action.focus-window-up = [ ];
+ "Mod+L".action.focus-column-right = [ ];
+
+ "Mod+Ctrl+Left".action.move-column-left = [ ];
+ "Mod+Ctrl+Down".action.move-window-down = [ ];
+ "Mod+Ctrl+Up".action.move-window-up = [ ];
+ "Mod+Ctrl+Right".action.move-column-right = [ ];
+ "Mod+Ctrl+H".action.move-column-left = [ ];
+ "Mod+Ctrl+J".action.move-window-down = [ ];
+ "Mod+Ctrl+K".action.move-window-up = [ ];
+ "Mod+Ctrl+L".action.move-column-right = [ ];
+
+ "Mod+Home".action.focus-column-first = [ ];
+ "Mod+End".action.focus-column-last = [ ];
+ "Mod+Ctrl+Home".action.move-column-to-first = [ ];
+ "Mod+Ctrl+End".action.move-column-to-last = [ ];
+
+ "Mod+Shift+Left".action.focus-monitor-left = [ ];
+ "Mod+Shift+Down".action.focus-monitor-down = [ ];
+ "Mod+Shift+Up".action.focus-monitor-up = [ ];
+ "Mod+Shift+Right".action.focus-monitor-right = [ ];
+ "Mod+Shift+H".action.focus-monitor-left = [ ];
+ "Mod+Shift+J".action.focus-monitor-down = [ ];
+ "Mod+Shift+K".action.focus-monitor-up = [ ];
+ "Mod+Shift+L".action.focus-monitor-right = [ ];
+
+ "Mod+Shift+Ctrl+Left".action.move-column-to-monitor-left = [ ];
+ "Mod+Shift+Ctrl+Down".action.move-column-to-monitor-down = [ ];
+ "Mod+Shift+Ctrl+Up".action.move-column-to-monitor-up = [ ];
+ "Mod+Shift+Ctrl+Right".action.move-column-to-monitor-right = [ ];
+ "Mod+Shift+Ctrl+H".action.move-column-to-monitor-left = [ ];
+ "Mod+Shift+Ctrl+J".action.move-column-to-monitor-down = [ ];
+ "Mod+Shift+Ctrl+K".action.move-column-to-monitor-up = [ ];
+ "Mod+Shift+Ctrl+L".action.move-column-to-monitor-right = [ ];
+
+ "Mod+Page_Down".action.focus-workspace-down = [ ];
+ "Mod+Page_Up".action.focus-workspace-up = [ ];
+ "Mod+U".action.focus-workspace-down = [ ];
+ "Mod+I".action.focus-workspace-up = [ ];
+ "Mod+Ctrl+Page_Down".action.move-column-to-workspace-down = [ ];
+ "Mod+Ctrl+Page_Up".action.move-column-to-workspace-up = [ ];
+ "Mod+Ctrl+U".action.move-column-to-workspace-down = [ ];
+ "Mod+Ctrl+I".action.move-column-to-workspace-up = [ ];
+
+ "Mod+Shift+Page_Down".action.move-workspace-down = [ ];
+ "Mod+Shift+Page_Up".action.move-workspace-up = [ ];
+ "Mod+Shift+U".action.move-workspace-down = [ ];
+ "Mod+Shift+I".action.move-workspace-up = [ ];
+ "Mod+Space".action.swap-window-left = [ ];
+ "Mod+Shift+Space".action.swap-window-right = [ ];
+
+ "Mod+WheelScrollDown" = {
+ action.focus-workspace-down = [ ];
+ cooldown-ms = 150;
+ };
+ "Mod+WheelScrollUp" = {
+ action.focus-workspace-up = [ ];
+ cooldown-ms = 150;
+ };
+ "Mod+Ctrl+WheelScrollDown" = {
+ action.move-column-to-workspace-down = [ ];
+ cooldown-ms = 150;
+ };
+
+ "Mod+Ctrl+WheelScrollUp" = {
+ action.move-column-to-workspace-up = [ ];
+ cooldown-ms = 150;
+ };
+
+ MouseForward.action.toggle-overview = [ ];
+
+ "Mod+WheelScrollRight".action.focus-column-right = [ ];
+ "Mod+WheelScrollLeft".action.focus-column-left = [ ];
+ "Mod+Ctrl+WheelScrollRight".action.move-column-right = [ ];
+ "Mod+Ctrl+WheelScrollLeft".action.move-column-left = [ ];
+
+ "Mod+Shift+WheelScrollDown".action.focus-column-right = [ ];
+ "Mod+Shift+WheelScrollUp".action.focus-column-left = [ ];
+ "Mod+Ctrl+Shift+WheelScrollDown".action.move-column-right = [ ];
+ "Mod+Ctrl+Shift+WheelScrollUp".action.move-column-left = [ ];
+
+ "Mod+1".action.focus-workspace = 1;
+ "Mod+2".action.focus-workspace = 2;
+ "Mod+3".action.focus-workspace = 3;
+ "Mod+4".action.focus-workspace = 4;
+ "Mod+5".action.focus-workspace = 5;
+ "Mod+6".action.focus-workspace = 6;
+ "Mod+7".action.focus-workspace = 7;
+ "Mod+8".action.focus-workspace = 8;
+ "Mod+9".action.focus-workspace = 9;
+
+ "Mod+Ctrl+1".action.move-column-to-workspace = 1;
+ "Mod+Ctrl+2".action.move-column-to-workspace = 2;
+ "Mod+Ctrl+3".action.move-column-to-workspace = 3;
+ "Mod+Ctrl+4".action.move-column-to-workspace = 4;
+ "Mod+Ctrl+5".action.move-column-to-workspace = 5;
+ "Mod+Ctrl+6".action.move-column-to-workspace = 6;
+ "Mod+Ctrl+7".action.move-column-to-workspace = 7;
+ "Mod+Ctrl+8".action.move-column-to-workspace = 8;
+ "Mod+Ctrl+9".action.move-column-to-workspace = 9;
+
+ "Mod+BracketLeft".action.consume-or-expel-window-left = [ ];
+ "Mod+BracketRight".action.consume-or-expel-window-right = [ ];
+
+ "Mod+Comma".action.consume-window-into-column = [ ];
+ "Mod+Period".action.expel-window-from-column = [ ];
+
+ "Mod+R".action.switch-preset-column-width = [ ];
+ "Mod+Shift+R".action.switch-preset-window-height = [ ];
+ "Mod+Ctrl+R".action.reset-window-height = [ ];
+ "Mod+F".action.maximize-column = [ ];
+ "Mod+Shift+F".action.fullscreen-window = [ ];
+
+ "Mod+Ctrl+F".action.expand-column-to-available-width = [ ];
+
+ "Mod+C".action.center-column = [ ];
+
+ "Mod+W".action.toggle-column-tabbed-display = [ ];
+
+ "Print".action.screenshot = [ ];
+ "Ctrl+Print".action.screenshot-screen = [ ];
+ "Alt+Print".action.screenshot-window = [ ];
+
+ "Mod+Escape" = {
+ allow-inhibiting = false;
+ action.toggle-keyboard-shortcuts-inhibit = [ ];
+ };
+
+ "Mod+p".action.spawn-sh = "${noctaliaIPC} sessionMenu toggle";
+
+ "Ctrl+Alt+Delete".action.quit = [ ];
+
+ "Mod+Shift+P".action.power-off-monitors = [ ];
+ };
+ };
+}
diff --git a/home/programs/desktop/noctalia.nix b/home/programs/desktop/noctalia.nix
new file mode 100644
index 0000000..db8095c
--- /dev/null
+++ b/home/programs/desktop/noctalia.nix
@@ -0,0 +1,243 @@
+{
+ pkgs,
+ inputs,
+ config,
+ ...
+}:
+let
+ inherit (config.home) homeDirectory;
+ noctalia = "${inputs.noctalia.packages.${pkgs.system}.default}/bin/noctalia-shell";
+in
+{
+ home.packages = [
+ pkgs.matugen
+ ];
+
+ systemd.user.services.noctalia = {
+ Unit.Description = "Noctalia Wayland Shell";
+ Unit.PartOf = "graphical-session.target";
+ Unit.After = "graphical-session.target";
+ Unit.ConditionEnvironment = "WAYLAND_DISPLAY";
+ Install.WantedBy = [ "graphical-session.target" ];
+ Service.ExecStart = noctalia;
+ };
+
+ programs.noctalia-shell = {
+ enable = true;
+ settings = {
+ settingsVersion = 15;
+ bar = {
+ position = "top";
+ backgroundOpacity = 0.9;
+ monitors = [ ];
+ density = "comfortable";
+ showCapsule = true;
+ floating = false;
+ marginVertical = 0.25;
+ marginHorizontal = 0.25;
+ widgets = {
+ left = [
+ {
+ id = "SystemMonitor";
+ }
+ {
+ id = "ActiveWindow";
+ }
+ {
+ id = "MediaMini";
+ }
+ ];
+ center = [
+ {
+ id = "Workspace";
+ }
+ ];
+ right = [
+ {
+ id = "KeepAwake";
+ }
+ {
+ id = "ScreenRecorder";
+ }
+ {
+ id = "Tray";
+ }
+ {
+ id = "NotificationHistory";
+ }
+ {
+ id = "WiFi";
+ }
+ {
+ id = "Bluetooth";
+ }
+ {
+ id = "Battery";
+ }
+ {
+ id = "Volume";
+ }
+ {
+ id = "Brightness";
+ }
+ {
+ id = "Clock";
+ }
+ {
+ id = "ControlCenter";
+ }
+ ];
+ };
+ };
+
+ general = {
+ dimDesktop = true;
+ showScreenCorners = true;
+ forceBlackScreenCorners = false;
+ radiusRatio = 1;
+ screenRadiusRatio = 1;
+ animationSpeed = 1.1;
+ animationDisabled = false;
+ };
+
+ location = {
+ name = "Los Angeles";
+ useFahrenheit = false;
+ use12hourFormat = false;
+ showWeekNumberInCalendar = true;
+ };
+
+ screenRecorder = {
+ directory = "/home/fcuny/Videos";
+ frameRate = 60;
+ audioCodec = "opus";
+ videoCodec = "h264";
+ quality = "very_high";
+ colorRange = "limited";
+ showCursor = true;
+ audioSource = "default_output";
+ videoSource = "portal";
+ };
+
+ wallpaper = {
+ enabled = true;
+ directory = "${homeDirectory}/Sync/wallpapers";
+ enableMultiMonitorDirectories = false;
+ setWallpaperOnAllMonitors = true;
+ defaultWallpaper = "";
+ fillMode = "crop";
+ fillColor = "#000000";
+ randomEnabled = true;
+ randomIntervalSec = 300;
+ transitionDuration = 1500;
+ transitionType = "random";
+ transitionEdgeSmoothness = 0.05;
+ monitors = [ ];
+ };
+
+ appLauncher = {
+ enableClipboardHistory = true;
+ position = "center";
+ backgroundOpacity = 1;
+ pinnedExecs = [ ];
+ useApp2Unit = false;
+ sortByMostUsed = true;
+ terminalCommand = "kitty";
+ };
+
+ controlCenter = {
+ position = "close_to_bar_button";
+ };
+
+ dock = {
+ enabled = false;
+ displayMode = "always_visible";
+ backgroundOpacity = 1;
+ floatingRatio = 1;
+ onlySameOutput = true;
+ monitors = [ ];
+ pinnedApps = [ ];
+ };
+
+ network = {
+ wifiEnabled = true;
+ };
+
+ notifications = {
+ doNotDisturb = false;
+ monitors = [ ];
+ location = "top_right";
+ alwaysOnTop = true;
+ lastSeenTs = 0;
+ respectExpireTimeout = false;
+ lowUrgencyDuration = 3;
+ normalUrgencyDuration = 8;
+ criticalUrgencyDuration = 15;
+ };
+
+ osd = {
+ enabled = true;
+ location = "top_right";
+ monitors = [ ];
+ autoHideMs = 2000;
+ };
+
+ audio = {
+ volumeStep = 5;
+ volumeOverdrive = false;
+ cavaFrameRate = 60;
+ visualizerType = "linear";
+ mprisBlacklist = [ ];
+ preferredPlayer = "";
+ };
+
+ ui = {
+ fontDefault = "Roboto";
+ fontFixed = "DejaVu Sans Mono";
+ fontDefaultScale = 1;
+ fontFixedScale = 1;
+ monitorsScaling = [ ];
+ idleInhibitorEnabled = false;
+ tooltipsEnabled = true;
+ };
+
+ brightness = {
+ brightnessStep = 5;
+ };
+
+ colorSchemes = {
+ useWallpaperColors = true;
+ predefinedScheme = "Noctalia (default)";
+ darkMode = true;
+ matugenSchemeType = "scheme-expressive";
+ generateTemplatesForPredefined = true;
+ };
+
+ templates = {
+ gtk = false;
+ qt = false;
+ kitty = false;
+ ghostty = false;
+ foot = false;
+ fuzzel = false;
+ vesktop = false;
+ pywalfox = false;
+ enableUserTemplates = false;
+ };
+
+ nightLight = {
+ enabled = true;
+ forced = false;
+ autoSchedule = true;
+ nightTemp = "4000";
+ dayTemp = "6500";
+ };
+
+ hooks = {
+ enabled = false;
+ wallpaperChange = "";
+ darkModeChange = "";
+ };
+ };
+ };
+}