Merge pull request #273 from ryan4yin/feat/noctalia-v5

feat(noctalia): upgrade to the native v5 shell
This commit is contained in:
ryan4yin | 二花 authored and GitHub committed 2026-09-19 15:12:24 +08:00
commit 34f2ef05f1
19 files changed
+157 -843

No files matched your search

+2 -2
View File
@@ -58,7 +58,7 @@ You don't have to go through the pain I've experienced again! Check out my
| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| **Window Manager** | [Niri][Niri] |
| **Terminal Emulator** | [Zellij][Zellij] + [foot][foot]/[Kitty][Kitty]/[Alacritty][Alacritty]/[Ghostty][Ghostty] |
| **Status Bar** / **Notifier** / **Launcher** / **lockscreens** | [noctalia-shell][noctalia-shell] |
| **Status Bar** / **Notifier** / **Launcher** / **lockscreens** | [noctalia][noctalia] |
| **Display Manager** | [tuigreet][tuigreet] |
| **Color Scheme** | [catppuccin-nix][catppuccin-nix] |
| **network management tool** | [NetworkManager][NetworkManager] |
@@ -209,4 +209,4 @@ Other dotfiles that inspired me:
[Btrfs]: https://btrfs.readthedocs.io
[LUKS]: https://wiki.archlinux.org/title/Dm-crypt/Encrypting_an_entire_system
[lanzaboote]: https://github.com/nix-community/lanzaboote
[noctalia-shell]: https://github.com/noctalia-dev/noctalia-shell
[noctalia]: https://github.com/noctalia-dev/noctalia
+3
View File
@@ -24,6 +24,9 @@ in
xdg.configFile."niri/niri-hardware.kdl".source =
mkSymlink "${config.home.homeDirectory}/nix-config/hosts/12kingdoms-shoukei/niri-hardware.kdl";
# Host-specific Noctalia config; merges after the shared config.toml.
xdg.configFile."noctalia/host-shoukei.toml".source = ./12kingdoms-shoukei/noctalia.toml;
# The built-in laptop speakers are quiet, so boost above the -23 dB default.
services.easyeffects.extraPresets."loudness-normalization".output."autogain#0".target = -12.0;
}
@@ -0,0 +1,8 @@
# shoukei (laptop) specific Noctalia config.
# Installed as ~/.config/noctalia/host-shoukei.toml, which sorts after
# config.toml in Noctalia's alphabetical merge, so it can override the shared
# baseline.
[brightness.monitor.eDP-1]
backend = "backlight"
backlight_device = "apple-panel-bl"
+6 -6
View File
@@ -13,8 +13,8 @@ Manager.
### Base Desktop Environment
- **base**: Common desktop configurations shared across all environments, including:
- **Noctalia Shell**: All-in-one Wayland desktop shell (replaces gammastep, swaylock, anyrun,
mako, waybar, wallpaper-switcher, wlogout, and other desktop tools)
- **Noctalia**: native (v5) all-in-one Wayland desktop shell (replaces gammastep, swaylock,
anyrun, mako, waybar, wallpaper-switcher, wlogout, grim/slurp/satty, and other desktop tools)
- Creative tools and media applications
- Development tools
- Fcitx5 input method framework
@@ -34,10 +34,10 @@ Manager.
1. **Configuration Location**: Desktop environment configuration files are located in `~/.config`,
which can be easily managed by Home Manager.
2. **User-specific Services**: User-specific systemd services (noctalia-shell, fcitx5, hypridle,
etc.) can be easily managed by Home Manager. If desktop environments were configured via NixOS
Module, these user-level services might fail to start automatically. With Home Manager modules,
we can control systemd service dependency order more effectively.
2. **User-specific Services**: User-specific systemd services (noctalia, fcitx5, hypridle, etc.) can
be easily managed by Home Manager. If desktop environments were configured via NixOS Module,
these user-level services might fail to start automatically. With Home Manager modules, we can
control systemd service dependency order more effectively.
3. **System Benefits**: By minimizing package installation through NixOS Module:
- Makes the NixOS system more secure and stable
+40 -25
View File
@@ -12,40 +12,54 @@ The configuration is organized into modular components that can be selectively e
- **Development Tools**: IDEs and development utilities
- **System Integration**: Input methods, theming, XDG specifications, GPU settings
## Noctalia Shell
## Noctalia
**Noctalia Shell** is an all-in-one Wayland desktop shell that replaces multiple separate tools with
a single, unified solution. It provides:
**Noctalia** (v5) is a native C++/Wayland all-in-one desktop shell that replaces multiple separate
tools with a single, unified solution. It is installed and configured through the upstream
[`programs.noctalia`](https://docs.noctalia.dev/noctalia/getting-started/nixos/) Home Manager
module, which validates the TOML at build time.
- **Unified Configuration**: All components configured in a single `settings.json` file
- **Consistent Experience**: Cohesive visual design and interaction patterns
- **Reduced Complexity**: No need to maintain multiple separate config files
### Configuration
Noctalia merges **every `*.toml` in the config directory** (`~/.config/noctalia/`), sorted
alphabetically, and then layers the Settings UI's own overrides on top:
| Layer | Location | Notes |
| -------------------- | ----------------------------------------------------------------- | ----------------------------------------------- |
| Declarative baseline | `~/.config/noctalia/*.toml` (repo: `noctalia/config/config.toml`) | Merged alphabetically; `[include]` supported |
| GUI overrides | `~/.local/state/noctalia/settings.toml` | Written by the Settings UI; loads last and wins |
`noctalia config export merged` prints the effective user config and `noctalia config validate`
checks a file. Application theming stays with `catppuccin/nix`, so Noctalia's theme templates are
disabled.
### Component Replacement
Noctalia Shell consolidates functionality that previously required multiple tools:
Noctalia consolidates functionality that previously required multiple tools:
| Traditional Component | Purpose | Noctalia Replacement |
| ---------------------- | -------------------- | ------------------------------ |
| **gammastep** | Blue light filter | `nightLight` configuration |
| **swaylock** | Screen locker | Built-in lock screen |
| **anyrun** | Application launcher | `appLauncher` |
| **mako** | Notification daemon | `notifications` |
| **waybar** | Status bar | `bar` (with widgets) |
| **wallpaper-switcher** | Wallpaper management | `wallpaper` (with transitions) |
| **wlogout** | Session menu | `sessionMenu` |
| **wl-clipboard** | Clipboard management | Built-in clipboard manager |
| Traditional Component | Purpose | Noctalia counterpart |
| ---------------------- | ------------------------ | ------------------------------------------------- |
| **gammastep** | Blue light filter | `[nightlight]` |
| **swaylock** | Screen locker | built-in lock screen (`[lockscreen]`) |
| **anyrun** | Application launcher | launcher panel (`[shell.launcher]`) |
| **mako** | Notification daemon | `[notification]` |
| **waybar** | Status bar | `[bar]` + `[widget.*]` |
| **wallpaper-switcher** | Wallpaper management | `[wallpaper]` |
| **wlogout** | Session menu | `[shell.session]` |
| **wl-clipboard** | Clipboard management | built-in clipboard (encrypted history) |
| **grim/slurp/satty** | Screenshots + annotation | built-in `[shell.screenshot]` + annotation editor |
## Configuration Modules
### Desktop Shell
- **[`noctalia/default.nix`](./noctalia/default.nix)**: Package installation and systemd service
- **[`noctalia/settings.json`](./noctalia/settings.json)**: Main configuration with all settings
- **[`noctalia/default.nix`](./noctalia/default.nix)**: enables the upstream `programs.noctalia`
module
- **[`noctalia/config/config.toml`](./noctalia/config/config.toml)**: declarative baseline (v5 TOML)
Key features: bar, control center, night light, wallpaper, session menu, system monitor,
audio/volume, brightness, screen recorder, calendar, color schemes, dock, notifications, OSD, and
more.
Key features: bar and widgets, control center, desktop widgets, night light, wallpaper, session
panel, screenshots with annotation, system monitor, audio/volume, brightness, calendar/weather,
color schemes, dock, notifications, OSD, clipboard, and more.
- **[`hypridle/`](./hypridle/)**: Idle management
@@ -61,7 +75,8 @@ Noctalia Shell consolidates functionality that previously required multiple tool
### Applications
- **[`desktop-tools.nix`](./desktop-tools.nix)**: Daily GUI apps (foliate, remmina, messaging)
- **[`desktop-tools.nix`](./desktop-tools.nix)**: Wayland session tools (clipboard, color picker,
brightness, audio, screen recording, auto-mount, `wlogout` emergency fallback)
- **[`browsers.nix`](./browsers.nix)**: Web browsers
- **[`editors.nix`](./editors.nix)**: Desktop text editors
- **[`media.nix`](./media.nix)**: Media players
@@ -75,10 +90,10 @@ Noctalia Shell consolidates functionality that previously required multiple tool
### System Utilities
- **[`misc.nix`](./misc.nix)**: Wayland tools (screenshots, screen recording, color picker, audio)
- **[`misc.nix`](./misc.nix)**: Misc GUI apps (e-book reader, remote desktop, hardened IM clients)
- **[`immutable-file.nix`](./immutable-file.nix)**: Immutable file handling
## Related Documentation
- Noctalia Shell: https://docs.noctalia.dev/docs
- Noctalia Shell: https://docs.noctalia.dev/noctalia/
- Parent: [`../README.md`](../README.md)
+2 -9
View File
@@ -16,26 +16,19 @@
};
home.packages = with pkgs; [
swaybg # the wallpaper
wl-clipboard # copying and pasting
hyprpicker # color picker
brightnessctl
# audio
alsa-utils # provides amixer/alsamixer/...
networkmanagerapplet # provide GUI app: nm-connection-editor
# screenshot/screencast
flameshot
hyprshot # screen shot
# screen recording
wf-recorder # screen recording
virt-viewer # vnc connect to VM, used by kubevirt
];
# screen locker
programs.swaylock.enable = true;
catppuccin.swaylock.enable = false;
# Logout Menu
# Emergency session-menu fallback; the normal flow uses Noctalia's session panel.
programs.wlogout.enable = true;
# auto mount usb drives
+3 -3
View File
@@ -30,8 +30,8 @@ in
settings = {
general = {
lock_cmd = "noctalia-shell ipc call lockScreen lock";
before_sleep_cmd = "noctalia-shell ipc call lockScreen lock";
lock_cmd = "noctalia msg session lock";
before_sleep_cmd = "noctalia msg session lock";
# niri already owns org.freedesktop.ScreenSaver and feeds its
# inhibitors into the compositor idle notifier, so hypridle must not
# try to claim the interface (it would log "already providing...").
@@ -63,7 +63,7 @@ in
# Skip while media is playing, same as screen-off above.
condition_cmd = "! playerctl -a status 2>/dev/null | grep -q '^Playing$'";
condition_retry = 30;
on-timeout = "noctalia-shell ipc call lockScreen lock";
on-timeout = "noctalia msg session lock";
}
];
};
@@ -1,2 +0,0 @@
# auto-generated from wallpaper
colors.json
@@ -0,0 +1,54 @@
# Noctalia v5 — minimal declarative baseline.
# Everything else is tuned in the Settings UI: those changes go to
# ~/.local/state/noctalia/settings.toml (persisted) and take precedence.
[accessibility]
# Content scale for panels and other non-bar shell UI.
ui_scale = 1.1
[shell]
font_family = "Maple Mono NF CN"
avatar_path = "~/nix-config/_img/myself.jpg"
# Declarative deployment: state (~/.local/state/noctalia) is not persisted, so do
# not auto-open the first-run wizard every boot.
setup_wizard_enabled = false
[shell.screenshot]
# Capture a region, then open the built-in annotation editor (replaces grim/slurp/satty).
annotate = true
directory = "~/Pictures/Screenshots"
[theme]
source = "builtin"
builtin = "Catppuccin"
# Application theming is managed by catppuccin/nix, so Noctalia templates stay off.
[theme.templates]
enable_builtin_templates = false
enable_community_templates = false
[wallpaper]
directory = "/home/ryan/Pictures/Wallpapers"
[wallpaper.automation]
enabled = true
interval_seconds = 600
[wallpaper.default]
path = "/home/ryan/Pictures/Wallpapers/rolling-girls_lalala.png"
[location]
address = "Changsha"
[weather]
enabled = true
# Eye protection: hold the warm night temperature all the time.
[nightlight]
enabled = true
force = true
[bar.main]
background_opacity = 0.2
# Text-only bump; `scale` would enlarge glyphs and spacing too.
font_scale = 1.1
@@ -1,11 +0,0 @@
{
"sources": [
{
"enabled": true,
"name": "Noctalia Plugins",
"url": "https://github.com/noctalia-dev/noctalia-plugins"
}
],
"states": {},
"version": 2
}
@@ -1,695 +0,0 @@
{
"appLauncher": {
"autoPasteClipboard": false,
"clipboardWatchImageCommand": "wl-paste --type image --watch cliphist store",
"clipboardWatchTextCommand": "wl-paste --type text --watch cliphist store",
"clipboardWrapText": true,
"customLaunchPrefix": "",
"customLaunchPrefixEnabled": false,
"density": "default",
"enableClipPreview": true,
"enableClipboardChips": true,
"enableClipboardHistory": true,
"enableClipboardSmartIcons": true,
"enableSessionSearch": true,
"enableSettingsSearch": true,
"enableWindowsSearch": true,
"iconMode": "native",
"ignoreMouseInput": false,
"overviewLayer": false,
"pinnedApps": [],
"position": "center",
"screenshotAnnotationTool": "",
"showCategories": true,
"showIconBackground": true,
"sortByMostUsed": true,
"terminalCommand": "xterm -e",
"viewMode": "list"
},
"audio": {
"mprisBlacklist": [],
"preferredPlayer": "",
"spectrumFrameRate": 30,
"spectrumMirrored": true,
"visualizerType": "linear",
"volumeFeedback": false,
"volumeFeedbackSoundFile": "",
"volumeOverdrive": false,
"volumeStep": 1
},
"bar": {
"autoHideDelay": 500,
"autoShowDelay": 150,
"backgroundOpacity": 0.2,
"barType": "simple",
"capsuleColorKey": "none",
"capsuleOpacity": 1,
"contentPadding": 2,
"density": "comfortable",
"displayMode": "always_visible",
"enableExclusionZoneInset": true,
"fontScale": 1,
"frameRadius": 12,
"frameThickness": 8,
"hideOnOverview": true,
"marginHorizontal": 5,
"marginVertical": 5,
"middleClickAction": "none",
"middleClickCommand": "",
"middleClickFollowMouse": false,
"monitors": [],
"mouseWheelAction": "none",
"mouseWheelWrap": true,
"outerCorners": true,
"position": "top",
"reverseScroll": false,
"rightClickAction": "controlCenter",
"rightClickCommand": "",
"rightClickFollowMouse": true,
"screenOverrides": [],
"showCapsule": true,
"showOnWorkspaceSwitch": true,
"showOutline": false,
"useSeparateOpacity": true,
"widgetSpacing": 6,
"widgets": {
"center": [
{
"characterCount": 2,
"colorizeIcons": false,
"emptyColor": "secondary",
"enableScrollWheel": true,
"focusedColor": "primary",
"followFocusedScreen": false,
"fontWeight": "bold",
"groupedBorderOpacity": 1,
"hideUnoccupied": false,
"iconScale": 0.8,
"id": "Workspace",
"labelMode": "index",
"occupiedColor": "secondary",
"pillSize": 0.6,
"showApplications": false,
"showApplicationsHover": false,
"showBadge": true,
"showLabelsOnlyWhenOccupied": true,
"unfocusedIconsOpacity": 1
}
],
"left": [
{
"colorizeSystemIcon": "none",
"colorizeSystemText": "none",
"customIconPath": "",
"enableColorization": false,
"icon": "rocket",
"iconColor": "none",
"id": "Launcher",
"useDistroLogo": false
},
{
"clockColor": "none",
"customFont": "",
"formatHorizontal": "HH:mm ddd, MMM dd",
"formatVertical": "HH mm - dd MM",
"id": "Clock",
"tooltipFormat": "HH:mm ddd, MMM dd",
"useCustomFont": false
},
{
"compactMode": false,
"diskPath": "/persistent",
"iconColor": "none",
"id": "SystemMonitor",
"showCpuCores": false,
"showCpuFreq": false,
"showCpuTemp": false,
"showCpuUsage": true,
"showDiskAvailable": false,
"showDiskUsage": true,
"showDiskUsageAsPercent": false,
"showGpuTemp": false,
"showLoadAverage": true,
"showMemoryAsPercent": true,
"showMemoryUsage": true,
"showNetworkStats": true,
"showSwapUsage": false,
"textColor": "none",
"useMonospaceFont": true,
"usePadding": false
},
{
"colorizeIcons": false,
"hideMode": "hidden",
"id": "ActiveWindow",
"maxWidth": 145,
"scrollingMode": "hover",
"showIcon": true,
"showText": true,
"textColor": "none",
"useFixedWidth": false
},
{
"compactMode": false,
"hideMode": "hidden",
"hideWhenIdle": false,
"id": "MediaMini",
"maxWidth": 145,
"panelShowAlbumArt": true,
"scrollingMode": "hover",
"showAlbumArt": false,
"showArtistFirst": true,
"showProgressRing": true,
"showVisualizer": false,
"textColor": "none",
"useFixedWidth": false,
"visualizerType": "linear"
}
],
"right": [
{
"hideWhenZero": false,
"hideWhenZeroUnread": false,
"iconColor": "none",
"id": "NotificationHistory",
"showUnreadBadge": true,
"unreadBadgeColor": "primary"
},
{
"deviceNativePath": "__default__",
"displayMode": "icon-always",
"hideIfIdle": false,
"hideIfNotDetected": true,
"id": "Battery",
"showNoctaliaPerformance": true,
"showPowerProfiles": true
},
{
"displayMode": "alwaysShow",
"iconColor": "none",
"id": "Volume",
"middleClickCommand": "pwvucontrol || pavucontrol",
"textColor": "none"
},
{
"applyToAllMonitors": false,
"displayMode": "alwaysShow",
"iconColor": "none",
"id": "Brightness",
"textColor": "none"
},
{
"blacklist": [],
"chevronColor": "none",
"colorizeIcons": false,
"drawerEnabled": true,
"hidePassive": false,
"id": "Tray",
"pinned": []
},
{
"colorizeDistroLogo": false,
"colorizeSystemIcon": "none",
"colorizeSystemText": "none",
"customIconPath": "",
"enableColorization": false,
"icon": "noctalia",
"id": "ControlCenter",
"useDistroLogo": true
}
]
}
},
"brightness": {
"backlightDeviceMappings": [
{
"device": "/sys/class/backlight/apple-panel-bl",
"output": "eDP-1"
}
],
"brightnessStep": 3,
"enableDdcSupport": false,
"enforceMinimum": true
},
"calendar": {
"cards": [
{
"enabled": true,
"id": "calendar-header-card"
},
{
"enabled": true,
"id": "calendar-month-card"
},
{
"enabled": true,
"id": "weather-card"
}
]
},
"colorSchemes": {
"darkMode": true,
"generationMethod": "tonal-spot",
"manualSunrise": "06:30",
"manualSunset": "18:30",
"monitorForColors": "",
"predefinedScheme": "Noctalia (default)",
"schedulingMode": "off",
"syncGsettings": true,
"useWallpaperColors": true
},
"controlCenter": {
"cards": [
{
"enabled": true,
"id": "profile-card"
},
{
"enabled": true,
"id": "shortcuts-card"
},
{
"enabled": true,
"id": "audio-card"
},
{
"enabled": true,
"id": "brightness-card"
},
{
"enabled": true,
"id": "weather-card"
},
{
"enabled": true,
"id": "media-sysmon-card"
}
],
"diskPath": "/persistent",
"position": "close_to_bar_button",
"shortcuts": {
"left": [
{
"id": "WiFi"
},
{
"id": "Bluetooth"
},
{
"id": "WallpaperSelector"
}
],
"right": [
{
"id": "Notifications"
},
{
"id": "PowerProfile"
},
{
"id": "KeepAwake"
},
{
"id": "NightLight"
}
]
}
},
"desktopWidgets": {
"enabled": true,
"gridSnap": true,
"gridSnapScale": false,
"monitorWidgets": [
{
"name": "eDP-1",
"widgets": [
{
"clockStyle": "digital",
"customFont": "",
"format": "HH:mm\\nd MMMM yyyy",
"id": "Clock",
"roundedCorners": true,
"scale": 0.7378548922663623,
"showBackground": true,
"useCustomFont": false,
"usePrimaryColor": false,
"x": 92,
"y": 161
},
{
"hideMode": "visible",
"id": "MediaPlayer",
"roundedCorners": true,
"scale": 1.1501312913284876,
"showAlbumArt": true,
"showBackground": true,
"showButtons": true,
"showVisualizer": true,
"visualizerType": "linear",
"x": 92,
"y": 299
},
{
"id": "Weather",
"scale": 1.339282355295889,
"showBackground": true,
"x": 230,
"y": 161
}
]
}
],
"overviewEnabled": true
},
"dock": {
"animationSpeed": 1,
"backgroundOpacity": 1,
"colorizeIcons": false,
"deadOpacity": 0.6,
"displayMode": "auto_hide",
"dockType": "floating",
"enabled": false,
"floatingRatio": 1,
"groupApps": false,
"groupClickAction": "cycle",
"groupContextMenuMode": "extended",
"groupIndicatorStyle": "dots",
"inactiveIndicators": false,
"indicatorColor": "primary",
"indicatorOpacity": 0.6,
"indicatorThickness": 3,
"launcherIcon": "",
"launcherIconColor": "none",
"launcherPosition": "end",
"launcherUseDistroLogo": false,
"monitors": [],
"onlySameOutput": true,
"pinnedApps": [],
"pinnedStatic": false,
"position": "bottom",
"showDockIndicator": false,
"showLauncherIcon": false,
"sitOnFrame": false,
"size": 1
},
"general": {
"allowPanelsOnScreenWithoutBar": true,
"allowPasswordWithFprintd": false,
"animationDisabled": false,
"animationSpeed": 1,
"autoStartAuth": false,
"avatarImage": "~/nix-config/_img/myself.jpg",
"boxRadiusRatio": 1,
"clockFormat": "hh\\nmm",
"clockStyle": "custom",
"compactLockScreen": false,
"dimmerOpacity": 0.2,
"enableBlurBehind": true,
"enableLockScreenCountdown": true,
"enableLockScreenMediaControls": false,
"enableShadows": true,
"forceBlackScreenCorners": false,
"iRadiusRatio": 1,
"keybinds": {
"keyDown": ["Down"],
"keyEnter": ["Return", "Enter"],
"keyEscape": ["Esc"],
"keyLeft": ["Left"],
"keyRemove": ["Del"],
"keyRight": ["Right"],
"keyUp": ["Up"]
},
"language": "",
"lockOnSuspend": true,
"lockScreenAnimations": false,
"lockScreenBlur": 0,
"lockScreenCountdownDuration": 10000,
"lockScreenMonitors": [],
"lockScreenTint": 0,
"passwordChars": false,
"radiusRatio": 1,
"reverseScroll": false,
"scaleRatio": 1,
"screenRadiusRatio": 1,
"shadowDirection": "bottom_right",
"shadowOffsetX": 2,
"shadowOffsetY": 3,
"showChangelogOnStartup": true,
"showHibernateOnLockScreen": false,
"showScreenCorners": false,
"showSessionButtonsOnLockScreen": true,
"smoothScrollEnabled": true,
"telemetryEnabled": false
},
"hooks": {
"colorGeneration": "",
"darkModeChange": "",
"enabled": false,
"performanceModeDisabled": "",
"performanceModeEnabled": "",
"screenLock": "",
"screenUnlock": "",
"session": "",
"startup": "",
"wallpaperChange": ""
},
"idle": {
"customCommands": "[]",
"enabled": false,
"fadeDuration": 5,
"lockCommand": "",
"lockTimeout": 660,
"resumeLockCommand": "",
"resumeScreenOffCommand": "",
"resumeSuspendCommand": "",
"screenOffCommand": "",
"screenOffTimeout": 600,
"suspendCommand": "",
"suspendTimeout": 1800
},
"location": {
"analogClockInCalendar": false,
"autoLocate": false,
"firstDayOfWeek": 1,
"hideWeatherCityName": false,
"hideWeatherTimezone": false,
"name": "Changsha",
"showCalendarEvents": true,
"showCalendarWeather": true,
"showWeekNumberInCalendar": false,
"use12hourFormat": false,
"useFahrenheit": false,
"weatherEnabled": true,
"weatherShowEffects": true,
"weatherTaliaMascotAlways": false
},
"network": {
"bluetoothAutoConnect": true,
"bluetoothDetailsViewMode": "grid",
"bluetoothHideUnnamedDevices": false,
"bluetoothRssiPollIntervalMs": 10000,
"bluetoothRssiPollingEnabled": false,
"disableDiscoverability": false,
"networkPanelView": "wifi",
"wifiDetailsViewMode": "grid"
},
"nightLight": {
"autoSchedule": true,
"dayTemp": "6500",
"enabled": true,
"forced": true,
"manualSunrise": "06:30",
"manualSunset": "18:30",
"nightTemp": "4000"
},
"noctaliaPerformance": {
"disableDesktopWidgets": true,
"disableWallpaper": true
},
"notifications": {
"backgroundOpacity": 1,
"clearDismissed": true,
"criticalUrgencyDuration": 15,
"density": "default",
"enableBatteryToast": true,
"enableKeyboardLayoutToast": true,
"enableMarkdown": false,
"enableMediaToast": false,
"enabled": true,
"location": "top_right",
"lowUrgencyDuration": 3,
"monitors": [],
"normalUrgencyDuration": 8,
"overlayLayer": true,
"respectExpireTimeout": false,
"saveToHistory": {
"critical": true,
"low": true,
"normal": true
},
"sounds": {
"criticalSoundFile": "",
"enabled": false,
"excludedApps": "discord,firefox,chrome,chromium,edge",
"lowSoundFile": "",
"normalSoundFile": "",
"separateSounds": false,
"volume": 0.5
}
},
"osd": {
"autoHideMs": 2000,
"backgroundOpacity": 1,
"enabled": true,
"enabledTypes": [0, 1, 4, 3],
"location": "top_right",
"monitors": [],
"overlayLayer": true
},
"plugins": {
"autoUpdate": false,
"notifyUpdates": true
},
"sessionMenu": {
"countdownDuration": 10000,
"enableCountdown": true,
"largeButtonsLayout": "grid",
"largeButtonsStyle": true,
"position": "center",
"powerOptions": [
{
"action": "lock",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "1"
},
{
"action": "suspend",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "2"
},
{
"action": "hibernate",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "3"
},
{
"action": "reboot",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "4"
},
{
"action": "logout",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "5"
},
{
"action": "shutdown",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "6"
},
{
"action": "rebootToUefi",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": ""
}
],
"showHeader": true,
"showKeybinds": true
},
"settingsVersion": 59,
"systemMonitor": {
"batteryCriticalThreshold": 5,
"batteryWarningThreshold": 20,
"cpuCriticalThreshold": 95,
"cpuWarningThreshold": 80,
"criticalColor": "",
"diskAvailCriticalThreshold": 10,
"diskAvailWarningThreshold": 20,
"diskCriticalThreshold": 90,
"diskWarningThreshold": 80,
"enableDgpuMonitoring": false,
"externalMonitor": "resources || missioncenter || jdsystemmonitor || corestats || system-monitoring-center || gnome-system-monitor || plasma-systemmonitor || mate-system-monitor || ukui-system-monitor || deepin-system-monitor || pantheon-system-monitor",
"gpuCriticalThreshold": 90,
"gpuWarningThreshold": 80,
"memCriticalThreshold": 90,
"memWarningThreshold": 80,
"swapCriticalThreshold": 90,
"swapWarningThreshold": 80,
"tempCriticalThreshold": 90,
"tempWarningThreshold": 80,
"useCustomColors": false,
"warningColor": ""
},
"templates": {
"activeTemplates": [],
"enableUserTheming": false
},
"ui": {
"boxBorderEnabled": false,
"fontDefault": "Maple Mono NF CN",
"fontDefaultScale": 1,
"fontFixed": "Maple Mono NF CN",
"fontFixedScale": 1,
"panelBackgroundOpacity": 0.85,
"panelsAttachedToBar": true,
"scrollbarAlwaysVisible": true,
"settingsPanelMode": "attached",
"settingsPanelSideBarCardStyle": false,
"tooltipsEnabled": true,
"translucentWidgets": false
},
"wallpaper": {
"automationEnabled": true,
"directory": "/home/ryan/Pictures/Wallpapers",
"enableMultiMonitorDirectories": false,
"enabled": true,
"favorites": [],
"fillColor": "#000000",
"fillMode": "crop",
"hideWallpaperFilenames": false,
"linkLightAndDarkWallpapers": true,
"monitorDirectories": [],
"overviewBlur": 0.4,
"overviewEnabled": true,
"overviewTint": 0.6,
"panelPosition": "follow_bar",
"randomIntervalSec": 600,
"setWallpaperOnAllMonitors": true,
"showHiddenFiles": false,
"skipStartupTransition": false,
"solidColor": "#1a1a2e",
"sortOrder": "name",
"transitionDuration": 1500,
"transitionEdgeSmoothness": 0.05,
"transitionType": ["fade", "disc", "stripes", "wipe", "pixelate", "honeycomb"],
"useOriginalImages": false,
"useSolidColor": false,
"useWallhaven": false,
"viewMode": "recursive",
"wallhavenApiKey": "",
"wallhavenCategories": "111",
"wallhavenOrder": "desc",
"wallhavenPurity": "100",
"wallhavenQuery": "",
"wallhavenRatios": "",
"wallhavenResolutionHeight": "",
"wallhavenResolutionMode": "atleast",
"wallhavenResolutionWidth": "",
"wallhavenSorting": "relevance",
"wallpaperChangeMode": "random"
}
}
+11 -24
View File
@@ -1,26 +1,25 @@
{
lib,
config,
pkgs,
wallpapers,
...
}:
let
package = pkgs.noctalia-shell;
in
{
# Qt for noctalia-shell (replaces former systemd user service Environment=)
home.sessionVariables = {
# Qt6: wayland primary, xcb fallback (QT_QPA_PLATFORM).
"QT_QPA_PLATFORM" = "wayland;xcb";
"QT_QPA_PLATFORMTHEME" = "qt6ct";
"QT_AUTO_SCREEN_SCALE_FACTOR" = "1";
# Use the upstream Home Manager module (shipped by home-manager itself): it
# installs pkgs.noctalia, validates the TOML at build time via `checkConfig`,
# and handles custom palettes. Runtime changes made in the Settings UI keep
# working: they go to ~/.local/state/noctalia/settings.toml, which loads after
# this file and wins.
# https://docs.noctalia.dev/noctalia/getting-started/nixos/#home-manager
programs.noctalia = {
enable = true;
settings = ./config/config.toml;
};
# Noctalia v5 is started by niri's spawn-at-startup (see the niri conf), so
# app2unit is still used to launch desktop entries as systemd user units.
home.packages = [
package
pkgs.qt6Packages.qt6ct # for icon theme
pkgs.app2unit # Launch Desktop Entries (or arbitrary commands) as Systemd user units
]
++ (lib.optionals pkgs.stdenv.hostPlatform.isx86_64 [
@@ -28,16 +27,4 @@ in
]);
home.file."Pictures/Wallpapers".source = wallpapers;
xdg.configFile =
let
mkSymlink = config.lib.file.mkOutOfStoreSymlink;
confPath = "${config.home.homeDirectory}/nix-config/home/linux/gui/base/noctalia";
in
{
# NOTE: use config dir as noctalia config because config is not only settings.json
# https://github.com/noctalia-dev/noctalia-shell/blob/main/nix/home-module.nix#L211-L220
"noctalia".source = mkSymlink "${confPath}/config";
"qt6ct/qt6ct.conf".source = mkSymlink "${confPath}/qt6ct.conf";
};
}
-31
View File
@@ -1,31 +0,0 @@
[Appearance]
custom_palette=false
icon_theme=Papirus
standard_dialogs=default
style=Fusion
[Fonts]
fixed="Maple Mono NF CN,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular"
general="Maple Mono NF CN,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular"
[Interface]
activate_item_on_single_click=1
buttonbox_layout=0
cursor_flash_time=1000
dialog_buttons_have_icons=1
double_click_interval=400
gui_effects=@Invalid()
keyboard_scheme=2
menus_have_icons=true
show_shortcuts_in_context_menus=true
stylesheets=@Invalid()
toolbutton_style=4
underline_shortcut=1
wheel_scroll_lines=3
[SettingsWindow]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x3H\0\0\x3\xf5\0\0\0\0\0\0\0\0\0\0\x3H\0\0\x3\xf5\0\0\0\0\0\0\0\0\x6\xab\0\0\0\0\0\0\0\0\0\0\x3H\0\0\x3\xf5)
[Troubleshooting]
force_raster_widgets=1
ignored_applications=@Invalid()
+22 -22
View File
@@ -18,12 +18,12 @@ binds {
Mod+Shift+Return { spawn "alacritty"; }
// Launcher
Mod+D { spawn "noctalia-shell" "ipc" "call" "launcher" "toggle"; }
Mod+Space { spawn "noctalia-shell" "ipc" "call" "launcher" "toggle"; }
XF86Search { spawn "noctalia-shell" "ipc" "call" "launcher" "toggle"; }
Mod+D { spawn "noctalia" "msg" "panel-toggle" "launcher"; }
Mod+Space { spawn "noctalia" "msg" "panel-toggle" "launcher"; }
XF86Search { spawn "noctalia" "msg" "panel-toggle" "launcher"; }
// Locker
CTRL+Alt+L { spawn "noctalia-shell" "ipc" "call" "lockScreen" "lock"; }
CTRL+Alt+L { spawn "noctalia" "msg" "session" "lock"; }
// Use spawn-sh to run a shell command. Do this if you need pipes, multiple commands, etc.
// Note: the entire command goes as a single argument. It's passed verbatim to `sh -c`.
@@ -38,10 +38,10 @@ binds {
// XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.01-"; }
// XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; }
// XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; }
XF86AudioRaiseVolume allow-when-locked=true { spawn "noctalia-shell" "ipc" "call" "volume" "increase"; }
XF86AudioLowerVolume allow-when-locked=true { spawn "noctalia-shell" "ipc" "call" "volume" "decrease"; }
XF86AudioMute allow-when-locked=true { spawn "noctalia-shell" "ipc" "call" "volume" "muteOutput"; }
XF86AudioMicMute allow-when-locked=true { spawn "noctalia-shell" "ipc" "call" "volume" "muteInput"; }
XF86AudioRaiseVolume allow-when-locked=true { spawn "noctalia" "msg" "volume-up"; }
XF86AudioLowerVolume allow-when-locked=true { spawn "noctalia" "msg" "volume-down"; }
XF86AudioMute allow-when-locked=true { spawn "noctalia" "msg" "volume-mute"; }
XF86AudioMicMute allow-when-locked=true { spawn "noctalia" "msg" "mic-mute"; }
// Example media keys mapping using playerctl.
@@ -50,18 +50,18 @@ binds {
// XF86AudioStop allow-when-locked=true { spawn-sh "playerctl stop"; }
// XF86AudioPrev allow-when-locked=true { spawn-sh "playerctl previous"; }
// XF86AudioNext allow-when-locked=true { spawn-sh "playerctl next"; }
XF86AudioPlay allow-when-locked=true { spawn-sh "noctalia-shell ipc call media playPause"; }
XF86AudioStop allow-when-locked=true { spawn-sh "noctalia-shell ipc call media pause"; }
XF86AudioPrev allow-when-locked=true { spawn-sh "octalia-shell ipc call media previous"; }
XF86AudioNext allow-when-locked=true { spawn-sh "noctalia-shell ipc call media next"; }
XF86AudioPlay allow-when-locked=true { spawn "noctalia" "msg" "media" "toggle"; }
XF86AudioStop allow-when-locked=true { spawn "noctalia" "msg" "media" "pause"; }
XF86AudioPrev allow-when-locked=true { spawn "noctalia" "msg" "media" "previous"; }
XF86AudioNext allow-when-locked=true { spawn "noctalia" "msg" "media" "next"; }
// Example brightness key mappings for brightnessctl.
// You can use regular spawn with multiple arguments too (to avoid going through "sh"),
// but you need to manually put each argument in separate "" quotes.
// XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "1%+"; }
// XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "1%-"; }
XF86MonBrightnessUp allow-when-locked=true { spawn "noctalia-shell" "ipc" "call" "brightness" "increase"; }
XF86MonBrightnessDown allow-when-locked=true { spawn "noctalia-shell" "ipc" "call" "brightness" "decrease"; }
XF86MonBrightnessUp allow-when-locked=true { spawn "noctalia" "msg" "brightness-up"; }
XF86MonBrightnessDown allow-when-locked=true { spawn "noctalia" "msg" "brightness-down"; }
// keyboard backlight
XF86KbdBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--device=kbd_backlight" "set" "10%+"; }
@@ -224,10 +224,10 @@ binds {
// Mod+Space { switch-layout "next"; }
// Mod+Shift+Space { switch-layout "prev"; }
// Screenshot Annotation via satty
Print { spawn-sh "set -e; grim -t ppm -g \"$(slurp -o -d -F monospace)\" - | satty --filename - --copy-command=wl-copy --annotation-size-factor 2.0 --output-filename=\"$(xdg-user-dir PICTURES)/Screenshots/Screenshot from %Y-%m-%d %H:%M:%S.png\" --actions-on-enter=\"save-to-clipboard,exit\" --brush-smooth-history-size=5 --disable-notifications"; }
Ctrl+Print { screenshot-screen; }
Alt+Print { screenshot-window; }
// Native Noctalia screenshots; output/annotation policy lives in the noctalia config.
Print { spawn "noctalia" "msg" "screenshot-region"; }
Ctrl+Print { spawn "noctalia" "msg" "screenshot-fullscreen"; }
Alt+Print { spawn "noctalia" "msg" "screenshot-fullscreen" "pick"; }
// Applications such as remote-desktop clients and software KVM switches may
// request that niri stops processing the keyboard shortcuts defined here
@@ -248,9 +248,9 @@ binds {
Mod+Shift+P { power-off-monitors; }
// Utility shortcuts
Mod+Shift+V { spawn "noctalia-shell" "ipc" "call" "launcher" "clipboard"; }
Mod+C { spawn "noctalia-shell" "ipc" "call" "launcher" "calculator"; }
Mod+Shift+V { spawn "noctalia" "msg" "panel-toggle" "clipboard"; }
Mod+C { spawn "noctalia" "msg" "panel-toggle" "launcher" "/calc"; }
Mod+S { spawn "noctalia-shell" "ipc" "call" "controlCenter" "toggle"; }
Mod+E { spawn "noctalia-shell" "ipc" "call" "sessionMenu" "toggle"; }
Mod+S { spawn "noctalia" "msg" "panel-toggle" "control-center"; }
Mod+E { spawn "noctalia" "msg" "panel-toggle" "session"; }
}
+3 -3
View File
@@ -1,4 +1,4 @@
// https://docs.noctalia.dev/getting-started/compositor-settings/niri/
// https://docs.noctalia.dev/noctalia/compositor-settings/niri/
window-rule {
// Rounded corners for a modern look.
@@ -13,8 +13,8 @@ debug {
honor-xdg-activation-with-invalid-serial
}
// Set the overview wallpaper on the backdrop.
// Set the overview wallpaper on the backdrop (v5 namespace).
layer-rule {
match namespace="^noctalia-overview*"
match namespace="^noctalia-backdrop"
place-within-backdrop true
}
@@ -1,3 +1,3 @@
// Noctalia: use niri spawn-at-startup (systemd user service is deprecated upstream).
// https://docs.noctalia.dev/getting-started/compositor-settings/niri/
spawn-at-startup "noctalia-shell"
// https://docs.noctalia.dev/noctalia/compositor-settings/niri/
spawn-at-startup "noctalia"
-5
View File
@@ -24,11 +24,6 @@ in
home.packages = with pkgs; [
# Niri v25.08 will create X11 sockets on disk, export $DISPLAY, and spawn `xwayland-satellite` on-demand when an X11 client connects
xwayland-satellite
# for Screenshot Annotation
slurp
grim
satty
];
xdg.configFile =
-2
View File
@@ -46,8 +46,6 @@ in
};
};
# fix https://github.com/ryan4yin/nix-config/issues/10
security.pam.services.swaylock = { };
})
];
}
@@ -16,7 +16,7 @@ lib.genAttrs hosts (
listeners = hm.services.hypridle.settings.listener;
findByAction = action: lib.findFirst (l: (l."on-timeout" or "") == action) { } listeners;
screenOff = findByAction "niri msg action power-off-monitors";
lock = findByAction "noctalia-shell ipc call lockScreen lock";
lock = findByAction "noctalia msg session lock";
in
{
homeDirectory = hm.home.homeDirectory;