From a0030934c04e86646828b032a66a75e0c6d88cbb Mon Sep 17 00:00:00 2001 From: wuyang <5700876+banisherwy@user.noreply.gitee.com> Date: Mon, 27 Jul 2026 15:40:02 +0800 Subject: [PATCH] Migrate full DMS personalization on Ubuntu 24.04 --- README.md | 49 +- config/alacritty/alacritty.toml | 66 +++ config/dms/beyond-glass.json | 46 ++ config/dms/session.json | 86 ++++ config/dms/settings.json | 776 ++++++++++++++++++++++++++++++++ config/fuzzel/fuzzel.ini | 29 -- config/mako/config | 16 - config/niri/beyond-glass.kdl | 194 ++++++++ config/niri/config.kdl | 229 +--------- config/niri/dms/alttab.kdl | 10 + config/niri/dms/binds.kdl | 229 ++++++++++ config/niri/dms/colors.kdl | 39 ++ config/niri/dms/cursor.kdl | 0 config/niri/dms/layout.kdl | 23 + config/niri/dms/windowrules.kdl | 2 + config/swaylock/config | 21 - config/systemd/dms.service | 17 + config/waybar/config.jsonc | 56 --- config/waybar/style.css | 59 --- install.sh | 237 ++++++++-- scripts/niri-beyond-browser | 10 + scripts/niri-beyond-refresh | 4 + scripts/niri-beyond-wallpaper | 15 - uninstall.sh | 25 +- 24 files changed, 1769 insertions(+), 469 deletions(-) create mode 100644 config/alacritty/alacritty.toml create mode 100644 config/dms/beyond-glass.json create mode 100644 config/dms/session.json create mode 100644 config/dms/settings.json delete mode 100644 config/fuzzel/fuzzel.ini delete mode 100644 config/mako/config create mode 100644 config/niri/beyond-glass.kdl create mode 100644 config/niri/dms/alttab.kdl create mode 100644 config/niri/dms/binds.kdl create mode 100644 config/niri/dms/colors.kdl create mode 100644 config/niri/dms/cursor.kdl create mode 100644 config/niri/dms/layout.kdl create mode 100644 config/niri/dms/windowrules.kdl delete mode 100644 config/swaylock/config create mode 100644 config/systemd/dms.service delete mode 100644 config/waybar/config.jsonc delete mode 100644 config/waybar/style.css create mode 100755 scripts/niri-beyond-browser create mode 100755 scripts/niri-beyond-refresh delete mode 100755 scripts/niri-beyond-wallpaper diff --git a/README.md b/README.md index 8264cbd..8c55408 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,24 @@ # Niri Beyond Glass -面向 **Ubuntu 24.04 LTS** 的可移植 Niri 桌面配置。一条命令安装 Niri -26.04、Xwayland 支持和一套克制的半透明桌面组件,同时保留原有 GNOME 与 -GDM,可在登录界面随时切换会话。 +面向 **Ubuntu 24.04 LTS** 的可移植 Niri + DankMaterialShell 桌面配置。 +一条命令安装 Niri 26.04、Xwayland 支持、DMS 1.5.3 和 Quickshell 0.3.0, +同时保留原有 GNOME 与 GDM,可在登录界面随时切换会话。 ## 效果与范围 - Niri 滚动平铺、窗口圆角、阴影、流畅动画 - 支持 Niri 26.04 的背景模糊、`xray` 和轻微噪点效果 -- Waybar 顶栏,时间位于最右侧区域,图标风格统一 -- Fuzzel 启动器、Mako 通知、Swaylock 锁屏和自动息屏 +- DMS Morandi 顶栏:左侧启动器/工作区/窗口,中间时钟,右侧系统组件 +- 统一的启动器、控制中心、通知、音量亮度 OSD 和 DMS 锁屏 +- Inter Variable 1.2 倍界面字体、1.22 倍图标和 14pt JetBrains Mono 终端 +- 0.84/0.88 半透明组件、背景模糊、12px 圆角和 Morandi Nocturne 配色 - 中文快捷键说明 - 浏览器、视频播放器、Steam 保持完全不透明 - 自动备份已有配置,可卸载恢复 -本项目**不包含**动态壁纸、DMS、登录界面或 GRUB 主题,也不重新分发 -Wallpaper Engine 创意工坊图片。默认使用 Ubuntu 自带静态壁纸;安装时可指定 -自己的图片。 +本项目迁移桌面个性化,但**不包含或替换壁纸**:升级时读取目标机正在使用的 +壁纸并继续使用。项目也不包含动态壁纸、DMS Greeter、GRUB 主题或 Wallpaper +Engine 创意工坊图片,不修改显示器分辨率、缩放和排列。 ## 一键安装 @@ -24,8 +26,16 @@ Wallpaper Engine 创意工坊图片。默认使用 Ubuntu 自带静态壁纸; curl -fsSL https://git.k1412.top/wuyang/niri-beyond-glass/raw/branch/main/install.sh | bash ``` -首次安装需要编译 Niri,耗时取决于 CPU 和网络。脚本会调用 `sudo` 安装依赖, -但必须以普通用户运行。完成后注销,在 GDM 左下角的会话菜单选择 **Niri**。 +首次安装需要编译 Niri,并下载约 700 MB 的隔离 DMS 运行环境,最终约占用 +2.2 GB。脚本会调用 `sudo` 安装依赖,但必须以普通用户运行。完成后注销,在 +GDM 会话菜单选择 **Niri**。 + +已经运行过旧版安装器但顶栏风格不一致时,直接再次运行同一命令。脚本会跳过 +已经安装的 Niri,原地替换 Waybar/Mako 风格: + +```bash +curl -fsSL https://git.k1412.top/wuyang/niri-beyond-glass/raw/branch/main/install.sh | bash +``` 使用自己的静态壁纸: @@ -46,13 +56,14 @@ bash /tmp/install-niri.sh --config-only | 快捷键 | 功能 | |---|---| | `Super + Enter` | 终端 | -| `Super + D` | 应用启动器 | +| `Super + D` / `Super + Space` | DMS 应用启动器 | | `Super + B` | 默认浏览器 | | `Super + E` | 文件管理器 | | `Super + O` | 总览 | | `Super + Q` | 关闭窗口 | -| `Super + V` | 切换浮动 | -| `Super + L` | 锁屏 | +| `Super + V` | 剪贴板 | +| `Super + Alt + L` | DMS 锁屏 | +| `Super + A` | 控制中心 | | `Super + Shift + /` | 中文快捷键总览 | | `Super + PageUp/PageDown` | 切换工作区 | | `Super + Shift + E` | 退出 Niri | @@ -63,8 +74,9 @@ bash /tmp/install-niri.sh --config-only - 仅支持 Ubuntu 24.04,检测到其他版本会停止 - 不替换显示管理器,不修改 GDM,不移除 GNOME -- 安装前备份 `niri`、`waybar`、`fuzzel`、`mako`、`swaylock` +- 安装前备份 Niri、旧桌面组件、DMS 和 Alacritty 配置 - Niri 和 Xwayland Satellite 固定到明确版本 +- DMS、Quickshell 及 Qt 依赖位于项目专用 Nix profile,不替换 Ubuntu 系统库 - Rust 工具链隔离在 `~/.local/share/niri-beyond-glass` - 配置安装后使用 `niri validate` 校验 @@ -91,15 +103,18 @@ curl -fsSL https://git.k1412.top/wuyang/niri-beyond-glass/raw/branch/main/uninst PPA 二进制包。 - Ubuntu 24.04 自带的 `libdisplay-info` 版本不足时,脚本会在 `/usr/local` 编译安装 0.3.0。 -- 这是一套 Niri 配置,不复刻 DMS 的控制中心、登录页和动态壁纸。 +- Ubuntu 24.04 的 PPA 没有 DMS/Quickshell 软件包,因此使用 Ubuntu 自带 Nix + 作为隔离兼容层;这不把 Ubuntu 转换为 NixOS。 +- 不安装 DMS Greeter,登录界面仍由 GDM 管理;DMS 锁屏属于 Niri 会话内部。 +- 壁纸和显示器布局不会从作者机器迁移。 - NVIDIA 用户应先确保 Ubuntu 官方驱动在 GNOME Wayland 下工作正常。 ## 上游项目 - [Niri](https://github.com/niri-wm/niri) +- [DankMaterialShell](https://github.com/AvengeMedia/DankMaterialShell) +- [Quickshell](https://quickshell.org/) - [Xwayland Satellite](https://github.com/Supreeeme/xwayland-satellite) -- [Waybar](https://github.com/Alexays/Waybar) -- [Fuzzel](https://codeberg.org/dnkl/fuzzel) ## License diff --git a/config/alacritty/alacritty.toml b/config/alacritty/alacritty.toml new file mode 100644 index 0000000..b6101f8 --- /dev/null +++ b/config/alacritty/alacritty.toml @@ -0,0 +1,66 @@ +[general] +live_config_reload = true + +[window] +opacity = 0.88 +decorations = "Full" +decorations_theme_variant = "Dark" +startup_mode = "Windowed" +dynamic_padding = true +padding = { x = 16, y = 16 } + +[scrolling] +history = 12000 +multiplier = 3 + +[font] +size = 14.0 +normal = { family = "JetBrains Mono", style = "Regular" } +bold = { family = "JetBrains Mono", style = "Bold" } +italic = { family = "JetBrains Mono", style = "Italic" } +bold_italic = { family = "JetBrains Mono", style = "Bold Italic" } + +[colors.primary] +background = "#1a1a18" +foreground = "#f2f2f2" +dim_foreground = "#b1b6be" +bright_foreground = "#ffffff" + +[colors.cursor] +text = "#1a1a18" +cursor = "#afac9c" + +[colors.selection] +text = "#f2f2f2" +background = "#43423c" + +[colors.normal] +black = "#0f0f0f" +red = "#ca8685" +green = "#88a069" +yellow = "#caad83" +blue = "#689bbe" +magenta = "#af7dbd" +cyan = "#6baebf" +white = "#b1b6be" + +[colors.bright] +black = "#515457" +red = "#b17c57" +green = "#599296" +yellow = "#caad83" +blue = "#4a6da7" +magenta = "#a49fc9" +cyan = "#6baebf" +white = "#d2d2d2" + +[bell] +animation = "EaseOutExpo" +duration = 0 + +[mouse] +hide_when_typing = true + +[cursor] +style = { shape = "Beam", blinking = "On" } +blink_interval = 520 diff --git a/config/dms/beyond-glass.json b/config/dms/beyond-glass.json new file mode 100644 index 0000000..58c248b --- /dev/null +++ b/config/dms/beyond-glass.json @@ -0,0 +1,46 @@ +{ + "dark": { + "name": "Morandi Nocturne Dark", + "primary": "#AFAC9C", + "primaryText": "#1A1A18", + "primaryContainer": "#43423C", + "secondary": "#88A069", + "surface": "#1A1A18", + "surfaceText": "#F2F2F2", + "surfaceVariant": "#252520", + "surfaceVariantText": "#D2D2D2", + "surfaceTint": "#AFAC9C", + "background": "#0F0F0F", + "backgroundText": "#F2F2F2", + "outline": "#515457", + "surfaceContainer": "#20201D", + "surfaceContainerHigh": "#2B2A26", + "surfaceContainerHighest": "#34332E", + "error": "#CA8685", + "warning": "#CAAD83", + "info": "#6BAEBF", + "matugen_type": "scheme-fidelity" + }, + "light": { + "name": "Morandi Nocturne Light", + "primary": "#6E6B5D", + "primaryText": "#FFFFFF", + "primaryContainer": "#E4E0CF", + "secondary": "#65784E", + "surface": "#F4F2EA", + "surfaceText": "#23231F", + "surfaceVariant": "#E7E3D7", + "surfaceVariantText": "#4C4A43", + "surfaceTint": "#6E6B5D", + "background": "#FAF8F0", + "backgroundText": "#1A1A18", + "outline": "#7B786D", + "surfaceContainer": "#EEEADF", + "surfaceContainerHigh": "#E5E1D5", + "surfaceContainerHighest": "#DCD7CA", + "error": "#9F4D4B", + "warning": "#8A6B3E", + "info": "#4C7B86", + "matugen_type": "scheme-fidelity" + } +} diff --git a/config/dms/session.json b/config/dms/session.json new file mode 100644 index 0000000..a20b653 --- /dev/null +++ b/config/dms/session.json @@ -0,0 +1,86 @@ +{ + "isLightMode": false, + "doNotDisturb": false, + "doNotDisturbUntil": 0, + "terminalOverride": "", + "wallpaperPath": "__WALLPAPER__", + "perMonitorWallpaper": false, + "monitorWallpapers": {}, + "perModeWallpaper": false, + "wallpaperPathLight": "__WALLPAPER__", + "wallpaperPathDark": "__WALLPAPER__", + "monitorWallpapersLight": {}, + "monitorWallpapersDark": {}, + "monitorWallpaperFillModes": {}, + "wallpaperTransition": "iris bloom", + "includedTransitions": [ + "fade", + "wipe", + "disc", + "stripes", + "iris bloom", + "pixelate", + "portal" + ], + "wallpaperCyclingEnabled": false, + "wallpaperCyclingMode": "interval", + "wallpaperCyclingInterval": 300, + "wallpaperCyclingTime": "06:00", + "monitorCyclingSettings": {}, + "nightModeEnabled": false, + "nightModeTemperature": 4500, + "nightModeHighTemperature": 6500, + "nightModeAutoEnabled": false, + "nightModeAutoMode": "time", + "nightModeStartHour": 18, + "nightModeStartMinute": 0, + "nightModeEndHour": 6, + "nightModeEndMinute": 0, + "latitude": 0, + "longitude": 0, + "nightModeUseIPLocation": true, + "nightModeLocationProvider": "", + "themeModeAutoEnabled": false, + "themeModeAutoMode": "location", + "themeModeStartHour": 18, + "themeModeStartMinute": 0, + "themeModeEndHour": 6, + "themeModeEndMinute": 0, + "themeModeShareGammaSettings": false, + "weatherLocation": "", + "weatherCoordinates": "39.9057136,116.3912972", + "pinnedApps": [], + "barPinnedApps": [], + "dockLauncherPosition": 0, + "hiddenTrayIds": [], + "trayItemOrder": [], + "recentColors": [], + "showThirdPartyPlugins": false, + "pluginBrowserInstalledFirst": false, + "pluginBrowserSortMode": "default", + "launchPrefix": "", + "brightnessExponentialDevices": {}, + "selectedGpuIndex": 0, + "nvidiaGpuTempEnabled": false, + "nonNvidiaGpuTempEnabled": false, + "enabledGpuPciIds": [], + "wifiDeviceOverride": "", + "weatherHourlyDetailed": true, + "hiddenApps": [], + "appOverrides": {}, + "searchAppActions": true, + "deviceMaxVolumes": {}, + "hiddenOutputDeviceNames": [], + "hiddenInputDeviceNames": [], + "locale": "", + "timeLocale": "", + "notepadLastMode": "", + "launcherLastMode": "apps", + "launcherLastFileSearchType": "all", + "launcherLastQuery": "", + "appDrawerLastMode": "apps", + "niriOverviewLastMode": "apps", + "settingsSidebarExpandedIds": ",system,power_security,displays,applications,", + "settingsSidebarCollapsedIds": ",", + "configVersion": 3 +} diff --git a/config/dms/settings.json b/config/dms/settings.json new file mode 100644 index 0000000..ffe0638 --- /dev/null +++ b/config/dms/settings.json @@ -0,0 +1,776 @@ +{ + "currentThemeName": "custom", + "currentThemeCategory": "custom", + "customThemeFile": "__DMS_THEME_FILE__", + "registryThemeVariants": {}, + "matugenScheme": "scheme-fidelity", + "matugenContrast": -0.08, + "runUserMatugenTemplates": true, + "popupTransparency": 0.84, + "dockTransparency": 0.88, + "widgetBackgroundColor": "sch", + "widgetBackgroundCustomColor": "#6750A4", + "widgetBackgroundCustomStrength": 0.5, + "widgetColorMode": "default", + "controlCenterTileColorMode": "default", + "buttonColorMode": "primary", + "cornerRadius": 12, + "niriLayoutGapsOverride": 8, + "niriLayoutRadiusOverride": 12, + "niriLayoutBorderSize": 2, + "hyprlandLayoutGapsOverride": -1, + "hyprlandLayoutGapsOutOverride": -1, + "hyprlandLayoutRadiusOverride": -1, + "hyprlandLayoutBorderSize": -1, + "hyprlandResizeOnBorder": false, + "mangoLayoutGapsOverride": -1, + "mangoLayoutGapsOutOverride": -1, + "mangoLayoutRadiusOverride": -1, + "mangoLayoutBorderSize": -1, + "mangoTrackpadNaturalScrolling": true, + "firstDayOfWeek": -1, + "showWeekNumber": false, + "calendarBackend": "auto", + "clockFormat": "24h", + "showSeconds": true, + "padHours12Hour": false, + "useFahrenheit": false, + "windSpeedUnit": "kmh", + "nightModeEnabled": false, + "animationSpeed": 1, + "customAnimationDuration": 500, + "syncComponentAnimationSpeeds": true, + "popoutAnimationSpeed": 1, + "popoutCustomAnimationDuration": 150, + "modalAnimationSpeed": 1, + "modalCustomAnimationDuration": 150, + "enableRippleEffects": true, + "animationVariant": 0, + "motionEffect": 0, + "m3ElevationEnabled": true, + "m3ElevationIntensity": 10, + "m3ElevationOpacity": 24, + "m3ElevationColorMode": "default", + "m3ElevationLightDirection": "top", + "m3ElevationCustomColor": "#000000", + "modalElevationEnabled": true, + "popoutElevationEnabled": true, + "barElevationEnabled": true, + "blurEnabled": true, + "blurForegroundLayers": true, + "blurLayerOutlineOpacity": 0.1, + "blurBorderEnabled": true, + "blurBorderColor": "outline", + "blurBorderCustomColor": "#ffffff", + "blurBorderOpacity": 0.22, + "wallpaperFillMode": "Fill", + "blurredWallpaperLayer": false, + "blurWallpaperOnOverview": true, + "wallpaperBackgroundColorMode": "black", + "wallpaperBackgroundCustomColor": "#000000", + "showLauncherButton": true, + "showWorkspaceSwitcher": true, + "showFocusedWindow": true, + "showWeather": false, + "showMusic": true, + "showClipboard": true, + "showCpuUsage": false, + "showMemUsage": false, + "showCpuTemp": false, + "showGpuTemp": false, + "showSystemTray": false, + "systemTrayIconTintMode": "none", + "systemTrayIconTintSaturation": 50, + "systemTrayIconTintStrength": 135, + "showClock": true, + "showNotificationButton": true, + "showBattery": false, + "showBatteryPercent": true, + "showBatteryPercentOnlyOnBattery": false, + "showBatteryTime": false, + "showBatteryTimeOnlyOnBattery": false, + "batteryPillStyle": false, + "batteryPillPercentSign": false, + "showControlCenterButton": true, + "showCapsLockIndicator": true, + "controlCenterShowNetworkIcon": true, + "controlCenterShowBluetoothIcon": true, + "controlCenterShowAudioIcon": true, + "controlCenterShowAudioPercent": false, + "controlCenterShowVpnIcon": true, + "controlCenterShowBrightnessIcon": false, + "controlCenterShowBrightnessPercent": false, + "controlCenterShowMicIcon": false, + "controlCenterShowMicPercent": false, + "controlCenterShowBatteryIcon": false, + "controlCenterShowPrinterIcon": false, + "controlCenterShowScreenSharingIcon": true, + "controlCenterShowIdleInhibitorIcon": false, + "controlCenterShowDoNotDisturbIcon": false, + "showPrivacyButton": true, + "privacyShowMicIcon": false, + "privacyShowCameraIcon": false, + "privacyShowScreenShareIcon": false, + "controlCenterWidgets": [ + { + "id": "volumeSlider", + "enabled": true, + "width": 50 + }, + { + "id": "brightnessSlider", + "enabled": true, + "width": 50 + }, + { + "id": "wifi", + "enabled": true, + "width": 50 + }, + { + "id": "bluetooth", + "enabled": true, + "width": 50 + }, + { + "id": "audioOutput", + "enabled": true, + "width": 50 + }, + { + "id": "audioInput", + "enabled": true, + "width": 50 + }, + { + "id": "nightMode", + "enabled": true, + "width": 50 + }, + { + "id": "darkMode", + "enabled": true, + "width": 50 + } + ], + "showWorkspaceIndex": true, + "showWorkspaceName": false, + "showWorkspacePadding": false, + "workspaceScrolling": false, + "showWorkspaceApps": true, + "workspaceDragReorder": true, + "maxWorkspaceIcons": 3, + "workspaceAppIconSizeOffset": 0, + "groupWorkspaceApps": true, + "groupActiveWorkspaceApps": false, + "workspaceFollowFocus": false, + "showOccupiedWorkspacesOnly": false, + "reverseScrolling": false, + "dwlShowAllTags": false, + "workspaceActiveAppHighlightEnabled": true, + "workspaceColorMode": "default", + "workspaceFocusedCustomColor": "#6750A4", + "workspaceOccupiedColorMode": "none", + "workspaceOccupiedCustomColor": "#625B71", + "workspaceUnfocusedColorMode": "default", + "workspaceUnfocusedCustomColor": "#49454E", + "workspaceUrgentColorMode": "default", + "workspaceUrgentCustomColor": "#B3261E", + "workspaceFocusedBorderEnabled": true, + "workspaceFocusedBorderColor": "primary", + "workspaceFocusedBorderCustomColor": "#6750A4", + "workspaceFocusedBorderThickness": 2, + "workspaceUnfocusedMonitorSeparateAppearance": false, + "workspaceUnfocusedMonitorColorMode": "default", + "workspaceUnfocusedMonitorFocusedCustomColor": "#6750A4", + "workspaceUnfocusedMonitorOccupiedColorMode": "none", + "workspaceUnfocusedMonitorOccupiedCustomColor": "#625B71", + "workspaceUnfocusedMonitorUnfocusedColorMode": "default", + "workspaceUnfocusedMonitorUnfocusedCustomColor": "#49454E", + "workspaceUnfocusedMonitorUrgentColorMode": "default", + "workspaceUnfocusedMonitorUrgentCustomColor": "#B3261E", + "workspaceUnfocusedMonitorBorderEnabled": false, + "workspaceUnfocusedMonitorBorderColor": "primary", + "workspaceUnfocusedMonitorBorderCustomColor": "#6750A4", + "workspaceUnfocusedMonitorBorderThickness": 2, + "workspaceNameIcons": {}, + "waveProgressEnabled": true, + "scrollTitleEnabled": true, + "mediaAdaptiveWidthEnabled": true, + "audioVisualizerEnabled": true, + "mediaUseAlbumArtAccent": false, + "audioScrollMode": "volume", + "audioWheelScrollAmount": 5, + "audioDeviceScrollVolumeEnabled": false, + "mediaExcludePlayers": [], + "clockCompactMode": false, + "focusedWindowCompactMode": true, + "focusedWindowSize": 1, + "focusedWindowShowIcon": true, + "runningAppsCompactMode": true, + "barMaxVisibleApps": 0, + "barMaxVisibleRunningApps": 0, + "barShowOverflowBadge": true, + "trayAutoOverflow": true, + "trayPopupSingleLine": true, + "trayMaxVisibleItems": 0, + "appsDockHideIndicators": false, + "appsDockColorizeActive": false, + "appsDockActiveColorMode": "primary", + "appsDockEnlargeOnHover": false, + "appsDockEnlargePercentage": 125, + "appsDockIconSizePercentage": 100, + "keyboardLayoutNameCompactMode": false, + "keyboardLayoutNameShowIcon": false, + "runningAppsCurrentWorkspace": true, + "runningAppsGroupByApp": false, + "runningAppsCurrentMonitor": false, + "appIdSubstitutions": [ + { + "pattern": "Spotify", + "replacement": "spotify", + "type": "exact" + }, + { + "pattern": "beepertexts", + "replacement": "beeper", + "type": "exact" + }, + { + "pattern": "home assistant desktop", + "replacement": "homeassistant-desktop", + "type": "exact" + }, + { + "pattern": "com.transmissionbt.transmission", + "replacement": "transmission-gtk", + "type": "contains" + }, + { + "pattern": "^steam_app_(\\d+)$", + "replacement": "steam_icon_$1", + "type": "regex" + } + ], + "centeringMode": "index", + "clockDateFormat": "", + "lockDateFormat": "", + "greeterRememberLastSession": true, + "greeterRememberLastUser": true, + "greeterAutoLogin": false, + "greeterEnableFprint": false, + "greeterEnableU2f": false, + "greeterWallpaperPath": "__WALLPAPER__", + "greeterLockDateFormat": "", + "greeterFontFamily": "", + "greeterWallpaperFillMode": "Fill", + "greeterPamExternallyManaged": false, + "greeterSyncPending": false, + "greeterSyncBaseline": {}, + "mediaSize": 1, + "appLauncherViewMode": "list", + "spotlightModalViewMode": "list", + "browserPickerViewMode": "grid", + "appPickerViewMode": "grid", + "sortAppsAlphabetically": false, + "appLauncherGridColumns": 4, + "spotlightCloseNiriOverview": true, + "rememberLastQuery": false, + "rememberLastMode": true, + "spotlightSectionViewModes": {}, + "appDrawerSectionViewModes": {}, + "niriOverviewOverlayEnabled": true, + "niriOverviewLauncherStyle": "full", + "dankLauncherV2Size": "compact", + "dankLauncherV2ShowSourceBadges": false, + "dankLauncherV2BorderEnabled": true, + "dankLauncherV2BorderThickness": 2, + "dankLauncherV2BorderColor": "primary", + "dankLauncherV2ShowFooter": true, + "dankLauncherV2UnloadOnClose": false, + "dankLauncherV2IncludeFilesInAll": false, + "dankLauncherV2IncludeFoldersInAll": false, + "launcherUseOverlayLayer": false, + "launcherStyle": "full", + "spotlightBarShowModeChips": true, + "keybindsFloatingWindow": false, + "useAutoLocation": false, + "weatherEnabled": true, + "dashTabs": [ + { + "id": "overview", + "enabled": true + }, + { + "id": "media", + "enabled": true + }, + { + "id": "wallpaper", + "enabled": true + }, + { + "id": "weather", + "enabled": true + }, + { + "id": "settings", + "enabled": true + } + ], + "networkPreference": "auto", + "iconThemeDark": "Adwaita", + "iconThemeLight": "System Default", + "iconThemePerMode": false, + "lastAppliedIconTheme": "Adwaita", + "cursorSettings": { + "theme": "System Default", + "size": 24, + "niri": { + "hideWhenTyping": false, + "hideAfterInactiveMs": 0 + }, + "hyprland": { + "hideOnKeyPress": false, + "hideOnTouch": false, + "inactiveTimeout": 0 + }, + "dwl": { + "cursorHideTimeout": 0 + }, + "mango": { + "cursorHideTimeout": 0 + } + }, + "launcherLogoMode": "apps", + "launcherLogoCustomPath": "", + "launcherLogoColorOverride": "", + "launcherLogoColorInvertOnMode": false, + "launcherLogoBrightness": 0.5, + "launcherLogoContrast": 1, + "launcherLogoSizeOffset": 0, + "fontFamily": "Inter Variable", + "monoFontFamily": "JetBrains Mono", + "fontWeight": 500, + "fontScale": 1.2, + "textRenderType": 1, + "textRenderQuality": 3, + "notepadUseMonospace": true, + "notepadFontFamily": "", + "notepadFontSize": 14, + "notificationSummaryFontSize": 0, + "notificationBodyFontSize": 0, + "notepadShowLineNumbers": false, + "notepadAutoSave": false, + "notepadSlideoutSide": "right", + "notepadDefaultMode": "slideout", + "notepadTransparencyOverride": -1, + "notepadLastCustomTransparency": 0.7, + "notepadUseCompositorGap": false, + "notepadEdgeGap": 0, + "soundsEnabled": true, + "useSystemSoundTheme": false, + "soundLogin": false, + "soundNewNotification": true, + "soundVolumeChanged": true, + "soundPluggedIn": true, + "muteSoundsWhenMediaPlaying": true, + "acMonitorTimeout": 0, + "acLockTimeout": 0, + "acSuspendTimeout": 0, + "acSuspendBehavior": 0, + "acProfileName": "", + "acPostLockMonitorTimeout": 0, + "batteryMonitorTimeout": 0, + "batteryLockTimeout": 0, + "batterySuspendTimeout": 0, + "batterySuspendBehavior": 0, + "batteryProfileName": "", + "batteryPostLockMonitorTimeout": 0, + "batteryChargeLimit": 100, + "batteryNotifyChargeLimit": false, + "batteryCriticalThreshold": 10, + "batteryNotifyCritical": true, + "batteryLowThreshold": 20, + "batteryNotifyLow": false, + "batteryChargeLimitNotificationType": 0, + "batteryLowNotificationType": 0, + "batteryCriticalNotificationType": 1, + "batteryAutoPowerSaver": false, + "lockBeforeSuspend": false, + "loginctlLockIntegration": true, + "fadeToLockEnabled": true, + "fadeToLockGracePeriod": 5, + "fadeToDpmsEnabled": true, + "fadeToDpmsGracePeriod": 5, + "launchPrefix": "", + "gtkThemingEnabled": true, + "qtThemingEnabled": true, + "syncModeWithPortal": true, + "terminalsAlwaysDark": true, + "muxType": "tmux", + "muxUseCustomCommand": false, + "muxCustomCommand": "", + "muxSessionFilter": "", + "runDmsMatugenTemplates": true, + "matugenTemplateGtk": true, + "matugenTemplateNiri": true, + "matugenTemplateHyprland": true, + "matugenTemplateMangowc": true, + "matugenTemplateQt5ct": true, + "matugenTemplateQt6ct": true, + "matugenTemplateFirefox": true, + "matugenTemplatePywalfox": true, + "matugenTemplateZenBrowser": true, + "matugenTemplateVesktop": true, + "matugenTemplateVencord": true, + "matugenTemplateEquibop": true, + "matugenTemplateGhostty": true, + "matugenTemplateKitty": true, + "matugenTemplateFoot": true, + "matugenTemplateAlacritty": true, + "matugenTemplateNeovim": false, + "matugenTemplateWezterm": true, + "matugenTemplateDgop": true, + "matugenTemplateKcolorscheme": true, + "matugenTemplateVscode": true, + "matugenTemplateEmacs": true, + "matugenTemplateZed": true, + "matugenTemplateNeovimSettings": { + "dark": { + "baseTheme": "github_dark", + "harmony": 0.5 + }, + "light": { + "baseTheme": "github_light", + "harmony": 0.5 + } + }, + "matugenTemplateNeovimSetBackground": true, + "showDock": false, + "dockAutoHide": true, + "dockSmartAutoHide": true, + "dockUseOverlayLayer": false, + "dockGroupByApp": false, + "dockRestoreSpecialWorkspaceOnClick": false, + "dockOpenOnOverview": true, + "dockPosition": 1, + "dockSpacing": 8, + "dockBottomGap": 14, + "dockMargin": 16, + "dockIconSize": 42, + "dockIndicatorStyle": "circle", + "dockBorderEnabled": true, + "dockBorderColor": "primary", + "dockBorderOpacity": 0.3, + "dockBorderThickness": 1, + "dockIsolateDisplays": false, + "dockLauncherEnabled": true, + "dockLauncherLogoMode": "apps", + "dockLauncherLogoCustomPath": "", + "dockLauncherLogoColorOverride": "", + "dockLauncherLogoSizeOffset": 0, + "dockLauncherLogoBrightness": 0.5, + "dockLauncherLogoContrast": 1, + "dockMaxVisibleApps": 0, + "dockMaxVisibleRunningApps": 0, + "dockShowOverflowBadge": true, + "dockShowTrash": false, + "dockTrashFileManager": "default", + "dockTrashCustomCommand": "", + "notificationOverlayEnabled": false, + "notificationPopupShadowEnabled": true, + "notificationPopupPrivacyMode": false, + "notificationForegroundLayers": true, + "modalDarkenBackground": true, + "lockScreenShowPowerActions": true, + "lockScreenShowSystemIcons": true, + "lockScreenShowTime": true, + "lockScreenShowDate": true, + "lockScreenShowProfileImage": true, + "lockScreenShowPasswordField": true, + "lockScreenShowMediaPlayer": true, + "lockScreenPowerOffMonitorsOnLock": true, + "lockAtStartup": false, + "enableFprint": false, + "maxFprintTries": 15, + "enableU2f": false, + "u2fMode": "or", + "lockPamPath": "", + "lockPamInlineFprint": false, + "lockPamInlineU2f": false, + "lockPamExternallyManaged": false, + "lockU2fPamPath": "", + "lockScreenInactiveColor": "#000000", + "lockScreenNotificationMode": 0, + "lockScreenVideoEnabled": false, + "lockScreenVideoPath": "", + "lockScreenVideoCycling": false, + "lockScreenWallpaperPath": "__WALLPAPER__", + "lockScreenWallpaperFillMode": "Fill", + "lockScreenFontFamily": "", + "hideBrightnessSlider": false, + "notificationTimeoutLow": 5000, + "notificationTimeoutNormal": 5000, + "notificationTimeoutCritical": 0, + "notificationCompactMode": false, + "notificationShowTimeoutBar": false, + "notificationDedupeEnabled": true, + "notificationPopupPosition": 0, + "notificationAnimationSpeed": 1, + "notificationCustomAnimationDuration": 400, + "notificationHistoryEnabled": true, + "notificationHistoryMaxCount": 50, + "notificationHistoryMaxAgeDays": 7, + "notificationHistorySaveLow": true, + "notificationHistorySaveNormal": true, + "notificationHistorySaveCritical": true, + "notificationRules": [], + "notificationFocusedMonitor": false, + "osdAlwaysShowValue": false, + "osdPosition": 5, + "osdVolumeEnabled": true, + "osdMediaVolumeEnabled": true, + "osdMediaPlaybackEnabled": false, + "osdBrightnessEnabled": true, + "osdIdleInhibitorEnabled": true, + "osdMicMuteEnabled": true, + "osdCapsLockEnabled": true, + "osdPowerProfileEnabled": false, + "osdAudioOutputEnabled": true, + "powerActionConfirm": true, + "powerActionHoldDuration": 0.5, + "powerMenuActions": [ + "reboot", + "logout", + "poweroff", + "lock", + "suspend", + "restart" + ], + "powerMenuDefaultAction": "logout", + "powerMenuGridLayout": false, + "customPowerActionLock": "", + "customPowerActionLogout": "", + "customPowerActionSuspend": "", + "customPowerActionHibernate": "", + "customPowerActionReboot": "", + "customPowerActionPowerOff": "", + "updaterHideWidget": false, + "updaterCheckOnStart": true, + "updaterUseCustomCommand": false, + "updaterCustomCommand": "", + "updaterTerminalAdditionalParams": "", + "updaterIntervalSeconds": 1800, + "updaterIncludeFlatpak": true, + "updaterAllowAUR": true, + "updaterIgnoredPackages": [], + "displayNameMode": "system", + "screenPreferences": { + "wallpaper": [] + }, + "showOnLastDisplay": {}, + "displayProfileAutoSelect": false, + "displayShowDisconnected": false, + "displaySnapToEdge": true, + "connectedFrameBarStyleBackups": {}, + "barConfigs": [ + { + "id": "default", + "name": "Morandi Top Bar", + "enabled": true, + "position": 0, + "screenPreferences": [ + "all" + ], + "showOnLastDisplay": true, + "leftWidgets": [ + "launcherButton", + "workspaceSwitcher", + "focusedWindow" + ], + "centerWidgets": [ + "clock" + ], + "rightWidgets": [ + { + "id": "cpuUsage", + "enabled": true, + "minimumWidth": true + }, + { + "id": "music", + "enabled": true, + "mediaSize": 2 + }, + "clipboard", + { + "id": "controlCenterButton", + "enabled": true, + "showNetworkIcon": true, + "showBluetoothIcon": true, + "showAudioIcon": true, + "showAudioPercent": false, + "showVpnIcon": false, + "showBrightnessIcon": false, + "showBrightnessPercent": false, + "showMicIcon": false, + "showMicPercent": false, + "showBatteryIcon": false, + "showDoNotDisturbIcon": false + }, + "notificationButton", + { + "id": "powerMenuButton", + "enabled": true + } + ], + "spacing": 8, + "innerPadding": 6, + "bottomGap": 0, + "transparency": 0.88, + "widgetTransparency": 0.88, + "squareCorners": false, + "noBackground": false, + "maximizeWidgetIcons": true, + "maximizeWidgetText": false, + "removeWidgetPadding": false, + "widgetPadding": 12, + "gothCornersEnabled": false, + "gothCornerRadiusOverride": false, + "gothCornerRadiusValue": 12, + "borderEnabled": false, + "borderColor": "outline", + "borderOpacity": 0.2, + "borderThickness": 1, + "widgetOutlineEnabled": false, + "widgetOutlineColor": "primary", + "widgetOutlineOpacity": 0.5, + "widgetOutlineThickness": 1, + "fontScale": 1.2, + "iconScale": 1.22, + "autoHide": false, + "autoHideStrict": false, + "autoHideDelay": 250, + "showOnWindowsOpen": false, + "openOnOverview": true, + "visible": true, + "popupGapsAuto": true, + "popupGapsManual": 8, + "maximizeDetection": true, + "useOverlayLayer": false, + "scrollEnabled": true, + "scrollXBehavior": "column", + "scrollYBehavior": "workspace", + "shadowIntensity": 8, + "shadowOpacity": 34, + "shadowColorMode": "default", + "shadowCustomColor": "#000000", + "clickThrough": false, + "hoverPopouts": false, + "hoverPopoutDelay": 150 + } + ], + "desktopClockEnabled": false, + "desktopClockStyle": "analog", + "desktopClockTransparency": 0.8, + "desktopClockColorMode": "primary", + "desktopClockCustomColor": { + "r": 1, + "g": 1, + "b": 1, + "a": 1, + "hsvHue": -1, + "hsvSaturation": 0, + "hsvValue": 1, + "hslHue": -1, + "hslSaturation": 0, + "hslLightness": 1, + "valid": true + }, + "desktopClockShowDate": true, + "desktopClockShowAnalogNumbers": false, + "desktopClockShowAnalogSeconds": true, + "desktopClockX": -1, + "desktopClockY": -1, + "desktopClockWidth": 280, + "desktopClockHeight": 180, + "desktopClockDisplayPreferences": [ + "all" + ], + "systemMonitorEnabled": false, + "systemMonitorShowHeader": true, + "systemMonitorTransparency": 0.8, + "systemMonitorColorMode": "primary", + "systemMonitorCustomColor": { + "r": 1, + "g": 1, + "b": 1, + "a": 1, + "hsvHue": -1, + "hsvSaturation": 0, + "hsvValue": 1, + "hslHue": -1, + "hslSaturation": 0, + "hslLightness": 1, + "valid": true + }, + "systemMonitorShowCpu": true, + "systemMonitorShowCpuGraph": true, + "systemMonitorShowCpuTemp": true, + "systemMonitorShowGpuTemp": false, + "systemMonitorShowMemory": true, + "systemMonitorShowMemoryGraph": true, + "systemMonitorShowNetwork": true, + "systemMonitorShowNetworkGraph": true, + "systemMonitorShowDisk": true, + "systemMonitorShowTopProcesses": false, + "systemMonitorTopProcessCount": 3, + "systemMonitorTopProcessSortBy": "cpu", + "systemMonitorGraphInterval": 60, + "systemMonitorLayoutMode": "auto", + "systemMonitorX": -1, + "systemMonitorY": -1, + "systemMonitorWidth": 320, + "systemMonitorHeight": 480, + "systemMonitorDisplayPreferences": [ + "all" + ], + "systemMonitorVariants": [], + "desktopWidgetPositions": {}, + "desktopWidgetGridSettings": {}, + "desktopWidgetInstances": [], + "desktopWidgetGroups": [], + "builtInPluginSettings": {}, + "clipboardClickToPaste": false, + "clipboardEnterToPaste": false, + "clipboardRememberTypeFilter": false, + "clipboardTypeFilter": "all", + "clipboardVisibleEntryActions": [ + "pin", + "edit", + "delete" + ], + "launcherPluginVisibility": {}, + "launcherPluginOrder": [], + "frameEnabled": false, + "frameThickness": 16, + "frameRounding": 23, + "frameColor": "", + "frameOpacity": 1, + "frameScreenPreferences": [ + "all" + ], + "frameBarSize": 40, + "frameShowOnOverview": false, + "frameBlurEnabled": true, + "frameCloseGaps": true, + "frameLauncherEmergeSide": "bottom", + "frameLauncherArcExtender": false, + "frameLauncherEdgeHover": false, + "frameMode": "connected", + "barInsetPaddingShared": -1, + "barInsetPaddingSyncAll": false, + "frameBarInsetPadding": -1, + "configVersion": 12 +} diff --git a/config/fuzzel/fuzzel.ini b/config/fuzzel/fuzzel.ini deleted file mode 100644 index d36f87a..0000000 --- a/config/fuzzel/fuzzel.ini +++ /dev/null @@ -1,29 +0,0 @@ -[main] -font=Noto Sans CJK SC:size=13 -terminal=alacritty -prompt="搜索 " -icon-theme=Yaru -icons-enabled=yes -width=46 -lines=10 -horizontal-pad=20 -vertical-pad=14 -inner-pad=8 -image-size-ratio=0.45 -layer=overlay - -[colors] -background=181a1de8 -text=f0eee8ff -match=d4c5a5ff -selection=3b3e44ff -selection-text=ffffffff -selection-match=e7d8b8ff -border=ffffff20 - -[border] -width=1 -radius=10 - -[dmenu] -exit-immediately-if-empty=yes diff --git a/config/mako/config b/config/mako/config deleted file mode 100644 index 48c4ff6..0000000 --- a/config/mako/config +++ /dev/null @@ -1,16 +0,0 @@ -font=Noto Sans CJK SC 12 -background-color=#181a1de8 -text-color=#f0eee8 -border-color=#ffffff20 -progress-color=over #d4c5a5 -border-size=1 -border-radius=8 -padding=14 -margin=12 -width=360 -height=120 -max-visible=5 -default-timeout=5000 -icons=1 -layer=overlay -anchor=top-right diff --git a/config/niri/beyond-glass.kdl b/config/niri/beyond-glass.kdl new file mode 100644 index 0000000..04a7fe8 --- /dev/null +++ b/config/niri/beyond-glass.kdl @@ -0,0 +1,194 @@ +environment { + "XDG_CURRENT_DESKTOP" "niri" + "XDG_SESSION_DESKTOP" "niri" + "QT_QPA_PLATFORM" "wayland;xcb" + "NIXOS_OZONE_WL" "1" + "_JAVA_AWT_WM_NONREPARENTING" "1" + "PATH" "__HOME__/.local/bin:__HOME__/.local/state/niri-beyond-glass/nix-profile/bin:/usr/local/bin:/usr/bin:/bin" +} + +input { + keyboard { + numlock + } + + touchpad { + tap + natural-scroll + } + + mouse { + accel-profile "flat" + } +} + +spawn-at-startup "xwayland-satellite" +spawn-at-startup "/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1" +spawn-sh-at-startup "systemctl --user start dms.service" + +hotkey-overlay { + skip-at-startup +} + +prefer-no-csd +screenshot-path "~/Pictures/Screenshots/niri-%Y-%m-%d-%H-%M-%S.png" + +animations { + slowdown 0.85 +} + +layout { + gaps 8 + center-focused-column "never" + background-color "transparent" + + preset-column-widths { + proportion 0.33333 + proportion 0.5 + proportion 0.66667 + } + + default-column-width { + proportion 0.5 + } + + focus-ring { + width 2 + active-color "#afac9c" + inactive-color "#43423c" + urgent-color "#ca8685" + } + + border { + off + width 2 + active-color "#afac9c" + inactive-color "#43423c" + urgent-color "#ca8685" + } + + shadow { + on + softness 30 + spread -5 + offset x=0 y=8 + color "#00000070" + } + + tab-indicator { + active-color "#afac9c" + inactive-color "#43423c" + urgent-color "#ca8685" + } + + insert-hint { + color "#afac9c80" + } +} + +window-rule { + match app-id=".*" + exclude app-id=r#"^org\.kde\.krita$"# + opacity 0.80 + geometry-corner-radius 12 + clip-to-geometry true + tiled-state true + draw-border-with-background false + background-effect { + blur true + xray true + noise 0.025 + saturation 0.95 + } +} + +window-rule { + match app-id=r#"^org\.kde\.krita$"# + opacity 1.0 + background-effect { + blur false + } +} + +window-rule { + match app-id=r#"(?i)^alacritty$"# + opacity 0.88 + geometry-corner-radius 12 + clip-to-geometry true + default-column-width { + proportion 0.5 + } + background-effect { + blur true + xray true + noise 0.025 + saturation 0.95 + } +} + +window-rule { + match app-id=r#"(?i)^(firefox|org\.mozilla\.firefox|google-chrome|chromium|brave-browser|zen-browser)$"# + opacity 1.0 + default-column-width { + proportion 0.62 + } +} + +window-rule { + match app-id=r#"(?i)^(mpv|vlc|io\.github\.celluloid_player\.Celluloid|org\.gnome\.Totem)$"# + opacity 1.0 +} + +window-rule { + match app-id=r#"^org\.gnome\.(Calculator|Settings|Loupe)$"# + open-floating true + default-column-width { + proportion 0.36 + } +} + +window-rule { + match app-id=r#"^steam$"# + opacity 1.0 + default-column-width { + proportion 0.70 + } +} + +binds { + Mod+Return hotkey-overlay-title="打开终端" { + spawn "alacritty" + } + + Mod+D hotkey-overlay-title="应用启动器" { + spawn "dms" "ipc" "call" "spotlight" "toggle" + } + + Mod+Ctrl+Return hotkey-overlay-title="应用启动器" { + spawn "dms" "ipc" "call" "spotlight" "toggle" + } + + Mod+B hotkey-overlay-title="打开浏览器" { + spawn "niri-beyond-browser" + } + + Mod+E hotkey-overlay-title="文件管理器" { + spawn "nautilus" + } + + Mod+A hotkey-overlay-title="控制中心" { + spawn "dms" "ipc" "call" "control-center" "toggle" + } + + Mod+Shift+Q hotkey-overlay-title="电源菜单" { + spawn "dms" "ipc" "call" "powermenu" "toggle" + } + + Mod+Shift+B hotkey-overlay-title="刷新桌面壳" { + spawn "niri-beyond-refresh" + } + + Mod+Shift+Escape hotkey-overlay-title="显示快捷键说明" { + show-hotkey-overlay + } +} diff --git a/config/niri/config.kdl b/config/niri/config.kdl index 05aec85..71673e1 100644 --- a/config/niri/config.kdl +++ b/config/niri/config.kdl @@ -1,221 +1,10 @@ -// Niri Beyond Glass -// Portable profile for Ubuntu 24.04 and Niri 26.04. +// Beyond Glass Niri session. +// DMS owns files under dms/. Keep hand-written changes in beyond-glass.kdl. -input { - keyboard { - numlock - } - - touchpad { - tap - natural-scroll - dwt - } - - mouse { - accel-profile "flat" - } -} - -environment { - "XDG_CURRENT_DESKTOP" "niri" - "XDG_SESSION_DESKTOP" "niri" - "QT_QPA_PLATFORM" "wayland;xcb" - "NIXOS_OZONE_WL" "1" - "_JAVA_AWT_WM_NONREPARENTING" "1" -} - -spawn-at-startup "xwayland-satellite" -spawn-at-startup "sh" "-lc" "$HOME/.local/bin/niri-beyond-wallpaper" -spawn-at-startup "/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1" -spawn-at-startup "swayidle" "-w" "timeout" "600" "swaylock -f" "timeout" "660" "niri msg action power-off-monitors" "resume" "niri msg action power-on-monitors" "before-sleep" "swaylock -f" - -hotkey-overlay { - skip-at-startup -} - -prefer-no-csd -screenshot-path "~/Pictures/Screenshots/niri-%Y-%m-%d-%H-%M-%S.png" - -cursor { - xcursor-theme "Yaru" - xcursor-size 24 -} - -layer-rule { - match namespace="swaybg" - place-within-backdrop true -} - -layer-rule { - match namespace="waybar" - geometry-corner-radius 10 - background-effect { - blur true - xray true - noise 0.018 - saturation 0.94 - } -} - -animations { - slowdown 0.85 -} - -layout { - gaps 8 - center-focused-column "never" - background-color "#15171a" - - preset-column-widths { - proportion 0.33333 - proportion 0.5 - proportion 0.66667 - } - - default-column-width { - proportion 0.5 - } - - focus-ring { - width 2 - active-color "#d4c5a5" - inactive-color "#4d5056" - urgent-color "#dc7a78" - } - - border { - off - } - - shadow { - on - softness 30 - spread -5 - offset x=0 y=8 - color "#00000070" - } - - tab-indicator { - active-color "#d4c5a5" - inactive-color "#4d5056" - urgent-color "#dc7a78" - } - - insert-hint { - color "#d4c5a580" - } -} - -window-rule { - match app-id=".*" - geometry-corner-radius 12 - clip-to-geometry true - tiled-state true - draw-border-with-background false -} - -window-rule { - match app-id=r#"(?i)^alacritty$"# - opacity 0.88 - default-column-width { - proportion 0.5 - } - background-effect { - blur true - xray true - noise 0.025 - saturation 0.95 - } -} - -window-rule { - match app-id=r#"(?i)^(firefox|org\.mozilla\.firefox|google-chrome|chromium|brave-browser|zen-browser)$"# - opacity 1.0 - default-column-width { - proportion 0.62 - } -} - -window-rule { - match app-id=r#"(?i)^(mpv|vlc|io\.github\.celluloid_player\.Celluloid|org\.gnome\.Totem|steam)$"# - opacity 1.0 - default-column-width { - proportion 0.70 - } -} - -window-rule { - match app-id=r#"^org\.gnome\.(Calculator|Settings|Loupe)$"# - open-floating true - default-column-width { - proportion 0.36 - } -} - -binds { - Mod+Return hotkey-overlay-title="打开终端" { spawn "alacritty"; } - Mod+D hotkey-overlay-title="应用启动器" { spawn "fuzzel"; } - Mod+B hotkey-overlay-title="打开默认浏览器" { spawn "sh" "-lc" "xdg-open https://www.google.com"; } - Mod+E hotkey-overlay-title="文件管理器" { spawn "nautilus"; } - Mod+L hotkey-overlay-title="锁定屏幕" { spawn "swaylock" "-f"; } - Mod+Shift+Slash hotkey-overlay-title="显示快捷键说明" { show-hotkey-overlay; } - - Mod+Q hotkey-overlay-title="关闭窗口" { close-window; } - Mod+O repeat=false hotkey-overlay-title="总览" { toggle-overview; } - Mod+F hotkey-overlay-title="最大化当前列" { maximize-column; } - Mod+Shift+F hotkey-overlay-title="窗口全屏" { fullscreen-window; } - Mod+V hotkey-overlay-title="切换浮动窗口" { toggle-window-floating; } - Mod+W hotkey-overlay-title="切换标签页模式" { toggle-column-tabbed-display; } - - Mod+Left hotkey-overlay-title="焦点向左" { focus-column-left; } - Mod+Down hotkey-overlay-title="焦点向下" { focus-window-down; } - Mod+Up hotkey-overlay-title="焦点向上" { focus-window-up; } - Mod+Right hotkey-overlay-title="焦点向右" { focus-column-right; } - Mod+H { focus-column-left; } - Mod+J { focus-window-down; } - Mod+K { focus-window-up; } - Mod+Semicolon { focus-column-right; } - - Mod+Shift+Left hotkey-overlay-title="窗口向左移动" { move-column-left; } - Mod+Shift+Down hotkey-overlay-title="窗口向下移动" { move-window-down; } - Mod+Shift+Up hotkey-overlay-title="窗口向上移动" { move-window-up; } - Mod+Shift+Right hotkey-overlay-title="窗口向右移动" { move-column-right; } - - Mod+Page_Down hotkey-overlay-title="下一个工作区" { focus-workspace-down; } - Mod+Page_Up hotkey-overlay-title="上一个工作区" { focus-workspace-up; } - Mod+Shift+Page_Down hotkey-overlay-title="窗口移到下一个工作区" { move-column-to-workspace-down; } - Mod+Shift+Page_Up hotkey-overlay-title="窗口移到上一个工作区" { move-column-to-workspace-up; } - - Mod+1 { focus-workspace 1; } - Mod+2 { focus-workspace 2; } - Mod+3 { focus-workspace 3; } - Mod+4 { focus-workspace 4; } - Mod+5 { focus-workspace 5; } - Mod+Shift+1 { move-column-to-workspace 1; } - Mod+Shift+2 { move-column-to-workspace 2; } - Mod+Shift+3 { move-column-to-workspace 3; } - Mod+Shift+4 { move-column-to-workspace 4; } - Mod+Shift+5 { move-column-to-workspace 5; } - - Mod+R hotkey-overlay-title="切换列宽" { switch-preset-column-width; } - Mod+Shift+R hotkey-overlay-title="切换窗口高度" { switch-preset-window-height; } - Mod+Minus { set-column-width "-10%"; } - Mod+Equal { set-column-width "+10%"; } - - Print hotkey-overlay-title="截图" { screenshot; } - Ctrl+Print hotkey-overlay-title="截取屏幕" { screenshot-screen; } - Alt+Print hotkey-overlay-title="截取窗口" { screenshot-window; } - - XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.05+"; } - XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.05-"; } - XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; } - XF86AudioPlay allow-when-locked=true { spawn "playerctl" "play-pause"; } - XF86AudioNext allow-when-locked=true { spawn "playerctl" "next"; } - XF86AudioPrev allow-when-locked=true { spawn "playerctl" "previous"; } - XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "set" "+5%"; } - XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "set" "5%-"; } - - Mod+Shift+E hotkey-overlay-title="退出 Niri" { quit; } - Mod+Shift+P hotkey-overlay-title="关闭显示器" { power-off-monitors; } -} +include "dms/cursor.kdl" +include "dms/colors.kdl" +include "dms/layout.kdl" +include "dms/binds.kdl" +include "dms/windowrules.kdl" +include "dms/alttab.kdl" +include "beyond-glass.kdl" diff --git a/config/niri/dms/alttab.kdl b/config/niri/dms/alttab.kdl new file mode 100644 index 0000000..5f9bdcd --- /dev/null +++ b/config/niri/dms/alttab.kdl @@ -0,0 +1,10 @@ +// ! DO NOT EDIT ! +// ! AUTO-GENERATED BY DMS ! +// ! CHANGES WILL BE OVERWRITTEN ! +// ! PLACE YOUR CUSTOM CONFIGURATION ELSEWHERE ! + +recent-windows { + highlight { + corner-radius 12 + } +} diff --git a/config/niri/dms/binds.kdl b/config/niri/dms/binds.kdl new file mode 100644 index 0000000..01ab165 --- /dev/null +++ b/config/niri/dms/binds.kdl @@ -0,0 +1,229 @@ +binds { + // === System & Overview === + Mod+O hotkey-overlay-title="切换总览" repeat=false { toggle-overview; } + Mod+Tab hotkey-overlay-title="切换总览" repeat=false { toggle-overview; } + Mod+Shift+Slash hotkey-overlay-title="显示快捷键说明" { show-hotkey-overlay; } + + // === Application Launchers === + Mod+T hotkey-overlay-title="打开终端" { spawn "alacritty"; } + Mod+Space hotkey-overlay-title="应用启动器" { + spawn "dms" "ipc" "call" "spotlight" "toggle"; + } + Alt+Space hotkey-overlay-title="快速搜索栏" { + spawn "dms" "ipc" "call" "spotlight-bar" "toggle"; + } + Mod+V hotkey-overlay-title="剪贴板管理器" { + spawn "dms" "ipc" "call" "clipboard" "toggle"; + } + Mod+M hotkey-overlay-title="任务管理器" { + spawn "dms" "ipc" "call" "processlist" "focusOrToggle"; + } + + Super+X hotkey-overlay-title="电源菜单" { spawn "dms" "ipc" "call" "powermenu" "toggle"; } + Mod+Comma hotkey-overlay-title="设置" { + spawn "dms" "ipc" "call" "settings" "focusOrToggle"; + } + Mod+Y hotkey-overlay-title="浏览壁纸" { + spawn "dms" "ipc" "call" "dash" "toggle" "wallpaper"; + } + Mod+N hotkey-overlay-title="通知中心" { spawn "dms" "ipc" "call" "notifications" "toggle"; } + Mod+Shift+N hotkey-overlay-title="记事本" { spawn "dms" "ipc" "call" "notepad" "toggle"; } + + // === Security === + Mod+Alt+L hotkey-overlay-title="锁屏" { + spawn "dms" "ipc" "call" "lock" "lock"; + } + Mod+Shift+E hotkey-overlay-title="退出 niri" { quit; } + Ctrl+Alt+Delete hotkey-overlay-title="任务管理器" { + spawn "dms" "ipc" "call" "processlist" "focusOrToggle"; + } + + // === Audio Controls === + XF86AudioRaiseVolume hotkey-overlay-title="增大音量" allow-when-locked=true { + spawn "dms" "ipc" "call" "audio" "increment" "3"; + } + XF86AudioLowerVolume hotkey-overlay-title="减小音量" allow-when-locked=true { + spawn "dms" "ipc" "call" "audio" "decrement" "3"; + } + XF86AudioMute hotkey-overlay-title="静音/取消静音" allow-when-locked=true { + spawn "dms" "ipc" "call" "audio" "mute"; + } + XF86AudioMicMute hotkey-overlay-title="麦克风静音" allow-when-locked=true { + spawn "dms" "ipc" "call" "audio" "micmute"; + } + XF86AudioPause hotkey-overlay-title="播放/暂停" allow-when-locked=true { + spawn "dms" "ipc" "call" "mpris" "playPause"; + } + XF86AudioPlay hotkey-overlay-title="播放/暂停" allow-when-locked=true { + spawn "dms" "ipc" "call" "mpris" "playPause"; + } + XF86AudioPrev hotkey-overlay-title="上一首" allow-when-locked=true { + spawn "dms" "ipc" "call" "mpris" "previous"; + } + XF86AudioNext hotkey-overlay-title="下一首" allow-when-locked=true { + spawn "dms" "ipc" "call" "mpris" "next"; + } + Ctrl+XF86AudioRaiseVolume hotkey-overlay-title="播放器音量增大" allow-when-locked=true { + spawn "dms" "ipc" "call" "mpris" "increment" "3"; + } + Ctrl+XF86AudioLowerVolume hotkey-overlay-title="播放器音量减小" allow-when-locked=true { + spawn "dms" "ipc" "call" "mpris" "decrement" "3"; + } + + // === Brightness Controls === + XF86MonBrightnessUp hotkey-overlay-title="提高亮度" allow-when-locked=true { + spawn "dms" "ipc" "call" "brightness" "increment" "5" ""; + } + XF86MonBrightnessDown hotkey-overlay-title="降低亮度" allow-when-locked=true { + spawn "dms" "ipc" "call" "brightness" "decrement" "5" ""; + } + + // === Window Management === + Mod+Q hotkey-overlay-title="关闭窗口" repeat=false { close-window; } + Mod+F hotkey-overlay-title="最大化当前列" { maximize-column; } + Mod+Shift+F hotkey-overlay-title="全屏窗口" { fullscreen-window; } + Mod+Shift+T hotkey-overlay-title="切换浮动窗口" { toggle-window-floating; } + Mod+Shift+V hotkey-overlay-title="在浮动和普通窗口间切换焦点" { switch-focus-between-floating-and-tiling; } + Mod+W hotkey-overlay-title="切换标签页显示" { toggle-column-tabbed-display; } + Mod+Shift+W hotkey-overlay-title="创建窗口规则" { spawn "dms" "ipc" "call" "window-rules" "toggle"; } + + // === Focus Navigation === + Mod+Left hotkey-overlay-title="焦点移到左侧列" { focus-column-left; } + Mod+Down hotkey-overlay-title="焦点移到下方窗口" { focus-window-down; } + Mod+Up hotkey-overlay-title="焦点移到上方窗口" { focus-window-up; } + Mod+Right hotkey-overlay-title="焦点移到右侧列" { focus-column-right; } + Mod+H hotkey-overlay-title="焦点移到左侧列" { focus-column-left; } + Mod+J hotkey-overlay-title="焦点移到下方窗口" { focus-window-down; } + Mod+K hotkey-overlay-title="焦点移到上方窗口" { focus-window-up; } + Mod+L hotkey-overlay-title="焦点移到右侧列" { focus-column-right; } + + // === Window Movement === + Mod+Shift+Left hotkey-overlay-title="当前列左移" { move-column-left; } + Mod+Shift+Down hotkey-overlay-title="当前窗口下移" { move-window-down; } + Mod+Shift+Up hotkey-overlay-title="当前窗口上移" { move-window-up; } + Mod+Shift+Right hotkey-overlay-title="当前列右移" { move-column-right; } + Mod+Shift+H hotkey-overlay-title="当前列左移" { move-column-left; } + Mod+Shift+J hotkey-overlay-title="当前窗口下移" { move-window-down; } + Mod+Shift+K hotkey-overlay-title="当前窗口上移" { move-window-up; } + Mod+Shift+L hotkey-overlay-title="当前列右移" { move-column-right; } + + // === Column Navigation === + Mod+Home hotkey-overlay-title="焦点移到第一列" { focus-column-first; } + Mod+End hotkey-overlay-title="焦点移到最后一列" { focus-column-last; } + Mod+Ctrl+Home hotkey-overlay-title="当前列移到最前" { move-column-to-first; } + Mod+Ctrl+End hotkey-overlay-title="当前列移到最后" { move-column-to-last; } + + // === Monitor Navigation === + Mod+Ctrl+Left hotkey-overlay-title="焦点移到左侧显示器" { focus-monitor-left; } + //Mod+Ctrl+Down { focus-monitor-down; } + //Mod+Ctrl+Up { focus-monitor-up; } + Mod+Ctrl+Right hotkey-overlay-title="焦点移到右侧显示器" { focus-monitor-right; } + Mod+Ctrl+H hotkey-overlay-title="焦点移到左侧显示器" { focus-monitor-left; } + Mod+Ctrl+J hotkey-overlay-title="焦点移到下方显示器" { focus-monitor-down; } + Mod+Ctrl+K hotkey-overlay-title="焦点移到上方显示器" { focus-monitor-up; } + Mod+Ctrl+L hotkey-overlay-title="焦点移到右侧显示器" { focus-monitor-right; } + + // === Move to Monitor === + Mod+Shift+Ctrl+Left hotkey-overlay-title="当前列移到左侧显示器" { move-column-to-monitor-left; } + Mod+Shift+Ctrl+Down hotkey-overlay-title="当前列移到下方显示器" { move-column-to-monitor-down; } + Mod+Shift+Ctrl+Up hotkey-overlay-title="当前列移到上方显示器" { move-column-to-monitor-up; } + Mod+Shift+Ctrl+Right hotkey-overlay-title="当前列移到右侧显示器" { move-column-to-monitor-right; } + Mod+Shift+Ctrl+H hotkey-overlay-title="当前列移到左侧显示器" { move-column-to-monitor-left; } + Mod+Shift+Ctrl+J hotkey-overlay-title="当前列移到下方显示器" { move-column-to-monitor-down; } + Mod+Shift+Ctrl+K hotkey-overlay-title="当前列移到上方显示器" { move-column-to-monitor-up; } + Mod+Shift+Ctrl+L hotkey-overlay-title="当前列移到右侧显示器" { move-column-to-monitor-right; } + + // === Workspace Navigation === + Mod+Page_Down hotkey-overlay-title="切到下一个工作区" { focus-workspace-down; } + Mod+Page_Up hotkey-overlay-title="切到上一个工作区" { focus-workspace-up; } + Mod+U hotkey-overlay-title="切到下一个工作区" { focus-workspace-down; } + Mod+I hotkey-overlay-title="切到上一个工作区" { focus-workspace-up; } + Mod+Ctrl+Down hotkey-overlay-title="当前列移到下一个工作区" { move-column-to-workspace-down; } + Mod+Ctrl+Up hotkey-overlay-title="当前列移到上一个工作区" { move-column-to-workspace-up; } + Mod+Ctrl+U hotkey-overlay-title="当前列移到下一个工作区" { move-column-to-workspace-down; } + Mod+Ctrl+I hotkey-overlay-title="当前列移到上一个工作区" { move-column-to-workspace-up; } + + // === Workspace Management === + Ctrl+Shift+R hotkey-overlay-title="重命名工作区" { + spawn "dms" "ipc" "call" "workspace-rename" "open"; + } + + // === Move Workspaces === + Mod+Shift+Page_Down hotkey-overlay-title="工作区下移" { move-workspace-down; } + Mod+Shift+Page_Up hotkey-overlay-title="工作区上移" { move-workspace-up; } + Mod+Shift+U hotkey-overlay-title="工作区下移" { move-workspace-down; } + Mod+Shift+I hotkey-overlay-title="工作区上移" { move-workspace-up; } + + // === Mouse Wheel Navigation === + Mod+WheelScrollDown hotkey-overlay-title="切到下一个工作区" cooldown-ms=150 { focus-workspace-down; } + Mod+WheelScrollUp hotkey-overlay-title="切到上一个工作区" cooldown-ms=150 { focus-workspace-up; } + Mod+Ctrl+WheelScrollDown hotkey-overlay-title="当前列移到下一个工作区" cooldown-ms=150 { move-column-to-workspace-down; } + Mod+Ctrl+WheelScrollUp hotkey-overlay-title="当前列移到上一个工作区" cooldown-ms=150 { move-column-to-workspace-up; } + + Mod+WheelScrollRight hotkey-overlay-title="焦点移到右侧列" { focus-column-right; } + Mod+WheelScrollLeft hotkey-overlay-title="焦点移到左侧列" { focus-column-left; } + Mod+Ctrl+WheelScrollRight hotkey-overlay-title="当前列右移" { move-column-right; } + Mod+Ctrl+WheelScrollLeft hotkey-overlay-title="当前列左移" { move-column-left; } + + Mod+Shift+WheelScrollDown hotkey-overlay-title="焦点移到右侧列" { focus-column-right; } + Mod+Shift+WheelScrollUp hotkey-overlay-title="焦点移到左侧列" { focus-column-left; } + Mod+Ctrl+Shift+WheelScrollDown hotkey-overlay-title="当前列右移" { move-column-right; } + Mod+Ctrl+Shift+WheelScrollUp hotkey-overlay-title="当前列左移" { move-column-left; } + + // === Numbered Workspaces === + Mod+1 hotkey-overlay-title="切到工作区 1" { focus-workspace 1; } + Mod+2 hotkey-overlay-title="切到工作区 2" { focus-workspace 2; } + Mod+3 hotkey-overlay-title="切到工作区 3" { focus-workspace 3; } + Mod+4 hotkey-overlay-title="切到工作区 4" { focus-workspace 4; } + Mod+5 hotkey-overlay-title="切到工作区 5" { focus-workspace 5; } + Mod+6 hotkey-overlay-title="切到工作区 6" { focus-workspace 6; } + Mod+7 hotkey-overlay-title="切到工作区 7" { focus-workspace 7; } + Mod+8 hotkey-overlay-title="切到工作区 8" { focus-workspace 8; } + Mod+9 hotkey-overlay-title="切到工作区 9" { focus-workspace 9; } + + // === Move to Numbered Workspaces === + Mod+Shift+1 hotkey-overlay-title="当前列移到工作区 1" { move-column-to-workspace 1; } + Mod+Shift+2 hotkey-overlay-title="当前列移到工作区 2" { move-column-to-workspace 2; } + Mod+Shift+3 hotkey-overlay-title="当前列移到工作区 3" { move-column-to-workspace 3; } + Mod+Shift+4 hotkey-overlay-title="当前列移到工作区 4" { move-column-to-workspace 4; } + Mod+Shift+5 hotkey-overlay-title="当前列移到工作区 5" { move-column-to-workspace 5; } + Mod+Shift+6 hotkey-overlay-title="当前列移到工作区 6" { move-column-to-workspace 6; } + Mod+Shift+7 hotkey-overlay-title="当前列移到工作区 7" { move-column-to-workspace 7; } + Mod+Shift+8 hotkey-overlay-title="当前列移到工作区 8" { move-column-to-workspace 8; } + Mod+Shift+9 hotkey-overlay-title="当前列移到工作区 9" { move-column-to-workspace 9; } + + // === Column Management === + Mod+BracketLeft hotkey-overlay-title="向左吸收/移出窗口" { consume-or-expel-window-left; } + Mod+BracketRight hotkey-overlay-title="向右吸收/移出窗口" { consume-or-expel-window-right; } + Mod+Period hotkey-overlay-title="把窗口移出当前列" { expel-window-from-column; } + + // === Sizing & Layout === + Mod+R hotkey-overlay-title="切换列宽" { switch-preset-column-width; } + Mod+Shift+R hotkey-overlay-title="切换窗口高度" { switch-preset-window-height; } + Mod+Ctrl+R hotkey-overlay-title="重置窗口高度" { reset-window-height; } + Mod+Ctrl+F hotkey-overlay-title="列扩展到可用宽度" { expand-column-to-available-width; } + Mod+C hotkey-overlay-title="居中当前列" { center-column; } + Mod+Ctrl+C hotkey-overlay-title="居中可见列" { center-visible-columns; } + + // === Manual Sizing === + Mod+Minus hotkey-overlay-title="减小列宽" { set-column-width "-10%"; } + Mod+Equal hotkey-overlay-title="增大列宽" { set-column-width "+10%"; } + Mod+Shift+Minus hotkey-overlay-title="降低窗口高度" { set-window-height "-10%"; } + Mod+Shift+Equal hotkey-overlay-title="增加窗口高度" { set-window-height "+10%"; } + + // === Screenshots === + XF86Launch1 hotkey-overlay-title="截图选择区域" { screenshot; } + Ctrl+XF86Launch1 hotkey-overlay-title="截取屏幕" { screenshot-screen; } + Alt+XF86Launch1 hotkey-overlay-title="截取窗口" { screenshot-window; } + Print hotkey-overlay-title="截图选择区域" { screenshot; } + Ctrl+Print hotkey-overlay-title="截取屏幕" { screenshot-screen; } + Alt+Print hotkey-overlay-title="截取窗口" { screenshot-window; } + // === Display Profiles === + Mod+P hotkey-overlay-title="切换显示配置" { + spawn "dms" "ipc" "outputs" "cycleProfile"; + } + + // === System Controls === + Mod+Escape hotkey-overlay-title="允许/禁止应用拦截快捷键" allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } + Mod+Shift+P hotkey-overlay-title="关闭显示器" { power-off-monitors; } +} diff --git a/config/niri/dms/colors.kdl b/config/niri/dms/colors.kdl new file mode 100644 index 0000000..d0aae2b --- /dev/null +++ b/config/niri/dms/colors.kdl @@ -0,0 +1,39 @@ +// ! Auto-generated file. Do not edit directly. +// Remove `include "dms/colors.kdl"` from your config to override. + +layout { + background-color "transparent" + + focus-ring { + active-color "#afac9c" + inactive-color "#515457" + urgent-color "#ca8685" + } + + border { + active-color "#afac9c" + inactive-color "#515457" + urgent-color "#ca8685" + } + + shadow { + color "#00000070" + } + + tab-indicator { + active-color "#afac9c" + inactive-color "#515457" + urgent-color "#ca8685" + } + + insert-hint { + color "#afac9c80" + } +} + +recent-windows { + highlight { + active-color "#43423c" + urgent-color "#ca8685" + } +} diff --git a/config/niri/dms/cursor.kdl b/config/niri/dms/cursor.kdl new file mode 100644 index 0000000..e69de29 diff --git a/config/niri/dms/layout.kdl b/config/niri/dms/layout.kdl new file mode 100644 index 0000000..e9e7092 --- /dev/null +++ b/config/niri/dms/layout.kdl @@ -0,0 +1,23 @@ +// ! DO NOT EDIT ! +// ! AUTO-GENERATED BY DMS ! +// ! CHANGES WILL BE OVERWRITTEN ! +// ! PLACE YOUR CUSTOM CONFIGURATION ELSEWHERE ! + +layout { + gaps 8 + + border { + width 2 + } + + focus-ring { + width 2 + } +} + +window-rule { + geometry-corner-radius 12 + clip-to-geometry true + tiled-state true + draw-border-with-background false +} diff --git a/config/niri/dms/windowrules.kdl b/config/niri/dms/windowrules.kdl new file mode 100644 index 0000000..f97343a --- /dev/null +++ b/config/niri/dms/windowrules.kdl @@ -0,0 +1,2 @@ +// DMS Window Rules - Managed by DankMaterialShell +// Do not edit manually - changes may be overwritten diff --git a/config/swaylock/config b/config/swaylock/config deleted file mode 100644 index 9aca551..0000000 --- a/config/swaylock/config +++ /dev/null @@ -1,21 +0,0 @@ -daemonize -show-failed-attempts -ignore-empty-password -font=Noto Sans CJK SC -font-size=24 -indicator-radius=82 -indicator-thickness=8 -inside-color=181a1dcc -inside-clear-color=d4c5a5cc -inside-ver-color=5d83aacc -inside-wrong-color=dc7a78cc -ring-color=ffffff30 -ring-clear-color=d4c5a5ff -ring-ver-color=7aa2c8ff -ring-wrong-color=dc7a78ff -key-hl-color=d4c5a5ff -text-color=f0eee8ff -text-clear-color=181a1dff -text-ver-color=f0eee8ff -text-wrong-color=f0eee8ff -separator-color=00000000 diff --git a/config/systemd/dms.service b/config/systemd/dms.service new file mode 100644 index 0000000..047bb75 --- /dev/null +++ b/config/systemd/dms.service @@ -0,0 +1,17 @@ +[Unit] +Description=Dank Material Shell (Beyond Glass) +PartOf=graphical-session.target +After=graphical-session.target + +[Service] +Type=dbus +BusName=org.freedesktop.Notifications +Environment=PATH=%h/.local/bin:%h/.local/state/niri-beyond-glass/nix-profile/bin:/usr/local/bin:/usr/bin:/bin +ExecStart=%h/.local/state/niri-beyond-glass/nix-profile/bin/dms run --session +ExecReload=/usr/bin/pkill -USR1 -x dms +Restart=on-failure +RestartSec=1.23 +TimeoutStopSec=10 + +[Install] +WantedBy=graphical-session.target diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc deleted file mode 100644 index 722dbc0..0000000 --- a/config/waybar/config.jsonc +++ /dev/null @@ -1,56 +0,0 @@ -{ - "layer": "top", - "position": "top", - "height": 36, - "spacing": 6, - "margin-top": 6, - "margin-left": 8, - "margin-right": 8, - "modules-left": ["custom/launcher"], - "modules-center": [], - "modules-right": ["tray", "network", "pulseaudio", "battery", "custom/lock", "custom/power", "clock"], - "custom/launcher": { - "format": " \uf141 ", - "tooltip": false, - "on-click": "fuzzel" - }, - "tray": { - "icon-size": 17, - "spacing": 8 - }, - "network": { - "format-wifi": "\uf1eb {signalStrength}%", - "format-ethernet": "\uf1e6", - "format-disconnected": "\uf071", - "tooltip-format": "{ifname}: {ipaddr}/{cidr}" - }, - "pulseaudio": { - "format": "{icon} {volume}%", - "format-muted": "\uf026", - "format-icons": ["\uf026", "\uf027", "\uf028"], - "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", - "tooltip": false - }, - "battery": { - "states": {"warning": 30, "critical": 15}, - "format": "{icon} {capacity}%", - "format-charging": "\uf0e7 {capacity}%", - "format-icons": ["\uf244", "\uf243", "\uf242", "\uf241", "\uf240"], - "tooltip": false - }, - "clock": { - "interval": 1, - "format": "{:%m月%d日 %H:%M}", - "tooltip-format": "{calendar}" - }, - "custom/lock": { - "format": "\uf023", - "tooltip": false, - "on-click": "swaylock -f" - }, - "custom/power": { - "format": "\uf011", - "tooltip": false, - "on-click": "wlogout" - } -} diff --git a/config/waybar/style.css b/config/waybar/style.css deleted file mode 100644 index a742fde..0000000 --- a/config/waybar/style.css +++ /dev/null @@ -1,59 +0,0 @@ -@define-color panel rgba(24, 26, 29, 0.76); -@define-color text #f0eee8; -@define-color muted #a8abb2; -@define-color accent #d4c5a5; -@define-color red #dc7a78; - -* { - border: none; - border-radius: 0; - min-height: 0; - font-family: "Noto Sans CJK SC", "Noto Sans", "FontAwesome"; - font-size: 13px; - font-weight: 500; -} - -window#waybar { - background: @panel; - color: @text; - border: 1px solid rgba(255, 255, 255, 0.10); - border-radius: 10px; -} - -#custom-launcher, -#tray, -#network, -#pulseaudio, -#battery, -#clock, -#custom-lock, -#custom-power { - padding: 0 10px; - color: @text; -} - -#custom-launcher { - color: @accent; - font-size: 16px; -} - -#network.disconnected, -#battery.critical { - color: @red; -} - -#custom-lock, -#custom-power { - padding: 0 12px; -} - -#custom-power { - color: @red; -} - -tooltip { - background: #202226; - color: @text; - border: 1px solid rgba(255, 255, 255, 0.12); - border-radius: 6px; -} diff --git a/install.sh b/install.sh index 8fe3454..a405ead 100755 --- a/install.sh +++ b/install.sh @@ -5,6 +5,8 @@ readonly PROJECT="niri-beyond-glass" readonly NIRI_TAG="v26.04" readonly XWS_TAG="v0.8.2" readonly RUST_TOOLCHAIN="1.85.1" +readonly DMS_REV="069ddab041c738236a8910e4c39b65d9628d3018" +readonly NIXPKGS_REV="d407951447dcd00442e97087bf374aad70c04cea" readonly ARCHIVE_URL="https://git.k1412.top/wuyang/niri-beyond-glass/archive/main.tar.gz" wallpaper="" @@ -13,13 +15,14 @@ dry_run=0 rebuild=0 source_dir="${NBG_SOURCE_DIR:-}" tmp_dir="" +selected_wallpaper="" usage() { cat <<'EOF' 用法:install.sh [选项] --wallpaper PATH 使用指定的静态壁纸 - --config-only 只更新配置,不安装/编译软件 + --config-only 只更新配置(要求 DMS 运行层已经安装) --rebuild 强制重新编译 Niri 和 Xwayland Satellite --dry-run 显示将执行的主要步骤,不修改系统 -h, --help 显示帮助 @@ -127,10 +130,58 @@ install_packages() { libxcb1-dev libxcb-composite0-dev libxcb-randr0-dev \ libxcb-res0-dev libxcb-xfixes0-dev libxcb-cursor-dev \ xwayland xdg-desktop-portal-gnome xdg-desktop-portal-gtk \ - alacritty fuzzel waybar swaybg swaylock swayidle mako-notifier \ + alacritty \ nautilus policykit-1-gnome pipewire-pulse wireplumber \ - brightnessctl playerctl grim slurp wl-clipboard wlogout \ - fonts-noto-core fonts-noto-cjk fonts-noto-color-emoji fonts-font-awesome + brightnessctl playerctl grim slurp wl-clipboard libnotify-bin \ + accountsservice jq nix-bin nix-setup-systemd \ + fonts-noto-core fonts-noto-cjk fonts-noto-color-emoji fonts-font-awesome \ + fonts-inter fonts-jetbrains-mono +} + +install_dms_runtime() { + local state_home="${XDG_STATE_HOME:-$HOME/.local/state}" + local profile="$state_home/$PROJECT/nix-profile" + local dms_flake="github:AvengeMedia/DankMaterialShell/$DMS_REV" + local nixpkgs="github:NixOS/nixpkgs/$NIXPKGS_REV" + + if [[ -x "$profile/bin/dms" && -x "$profile/bin/quickshell" && + -x "$profile/bin/matugen" && -x "$profile/bin/dgop" && + -x "$profile/bin/dsearch" ]]; then + log "DMS 运行层已经安装,跳过" + return + fi + + log "安装隔离的 DMS 1.5.3 与 Quickshell 0.3.0" + run sudo usermod -aG nix-users "$USER" + run sudo systemctl enable --now nix-daemon.socket + run mkdir -p "$state_home/$PROJECT" + + if (( dry_run )); then + printf '+ sudo -u %q -g nix-users nix profile install --profile %q ...\n' \ + "$USER" "$profile" + return + fi + + local attempt + for attempt in 1 2 3 4 5; do + if sudo -u "$USER" -g nix-users env \ + HOME="$HOME" USER="$USER" \ + NIX_CONFIG="experimental-features = nix-command flakes" \ + nix profile install --profile "$profile" \ + "$dms_flake#dms-shell" \ + "$nixpkgs#quickshell" \ + "$nixpkgs#matugen" \ + "$nixpkgs#dgop" \ + "$nixpkgs#dsearch"; then + break + fi + (( attempt < 5 )) || die "DMS 运行层安装失败,请检查网络后重新运行脚本。" + log "下载中断,正在重试($attempt/5)" + sleep 3 + done + + [[ -x "$profile/bin/dms" && -x "$profile/bin/quickshell" ]] || + die "DMS 或 Quickshell 安装不完整。" } install_rust() { @@ -238,9 +289,12 @@ backup_and_install_config() { local state_home="${XDG_STATE_HOME:-$HOME/.local/state}" local stamp stamp="$(date +%Y%m%d-%H%M%S)" - local backup="$state_home/$PROJECT/backups/$stamp/config" + local backup_root="$state_home/$PROJECT/backups/$stamp" + local backup="$backup_root/config" local original="$state_home/$PROJECT/original" - local names=(niri waybar fuzzel mako swaylock niri-beyond-glass) + local names=(niri waybar fuzzel mako swaylock niri-beyond-glass DankMaterialShell alacritty) + + select_wallpaper "$config_home/niri-beyond-glass/wallpaper" log "备份并安装用户配置" run mkdir -p "$backup" @@ -250,42 +304,127 @@ backup_and_install_config() { run cp -a "$config_home/$name" "$backup/$name" fi done - - if [[ ! -e "$original/.captured" ]]; then - run mkdir -p "$original/config" - for name in "${names[@]}"; do - if [[ -e "$config_home/$name" ]]; then - run cp -a "$config_home/$name" "$original/config/$name" - fi - done - run touch "$original/.captured" + if [[ -d "$state_home/DankMaterialShell" ]]; then + run mkdir -p "$backup_root/state" + run cp -a "$state_home/DankMaterialShell" "$backup_root/state/DankMaterialShell" fi - run mkdir -p \ + run mkdir -p "$original/config" "$original/absent" + for name in "${names[@]}"; do + if [[ ! -e "$original/config/$name" && ! -e "$original/absent/$name" ]]; then + if [[ -e "$config_home/$name" ]]; then + run cp -a "$config_home/$name" "$original/config/$name" + else + run touch "$original/absent/$name" + fi + fi + done + run touch "$original/.captured" + + if (( dry_run )); then + printf '+ install DMS, Niri and Alacritty style while preserving wallpaper %q\n' \ + "$selected_wallpaper" + return + fi + + mkdir -p \ "$config_home/niri" \ - "$config_home/waybar" \ - "$config_home/fuzzel" \ - "$config_home/mako" \ - "$config_home/swaylock" \ + "$config_home/niri/dms" \ "$config_home/niri-beyond-glass" \ + "$config_home/DankMaterialShell/themes" \ + "$config_home/alacritty" \ + "$config_home/systemd/user" \ + "$state_home/DankMaterialShell" \ "$HOME/.local/bin" \ "$HOME/Pictures/Screenshots" - run install -m644 "$source_dir/config/niri/config.kdl" "$config_home/niri/config.kdl" - run install -m644 "$source_dir/config/waybar/config.jsonc" "$config_home/waybar/config.jsonc" - run install -m644 "$source_dir/config/waybar/style.css" "$config_home/waybar/style.css" - run install -m644 "$source_dir/config/fuzzel/fuzzel.ini" "$config_home/fuzzel/fuzzel.ini" - run install -m644 "$source_dir/config/mako/config" "$config_home/mako/config" - run install -m644 "$source_dir/config/swaylock/config" "$config_home/swaylock/config" - run install -m755 "$source_dir/scripts/niri-beyond-wallpaper" "$HOME/.local/bin/niri-beyond-wallpaper" + install -m644 "$source_dir/config/niri/config.kdl" "$config_home/niri/config.kdl" + sed "s|__HOME__|$HOME|g" "$source_dir/config/niri/beyond-glass.kdl" \ + > "$config_home/niri/beyond-glass.kdl" + install -m644 "$source_dir"/config/niri/dms/*.kdl "$config_home/niri/dms/" - select_wallpaper "$config_home/niri-beyond-glass/wallpaper" + local theme_file="$config_home/DankMaterialShell/themes/beyond-glass.json" + install -m644 "$source_dir/config/dms/beyond-glass.json" "$theme_file" + + local settings_tmp session_tmp + settings_tmp="$(mktemp)" + session_tmp="$(mktemp)" + jq --arg wallpaper "$selected_wallpaper" --arg theme "$theme_file" ' + .customThemeFile = $theme + | .greeterWallpaperPath = $wallpaper + | .lockScreenWallpaperPath = $wallpaper + | .lockScreenVideoPath = "" + ' "$source_dir/config/dms/settings.json" > "$settings_tmp" + jq --arg wallpaper "$selected_wallpaper" ' + .wallpaperPath = $wallpaper + | .wallpaperPathLight = $wallpaper + | .wallpaperPathDark = $wallpaper + | .monitorWallpapers = {} + | .monitorWallpapersLight = {} + | .monitorWallpapersDark = {} + | .perMonitorWallpaper = false + ' "$source_dir/config/dms/session.json" > "$session_tmp" + install -m644 "$settings_tmp" "$config_home/DankMaterialShell/settings.json" + install -m644 "$session_tmp" "$state_home/DankMaterialShell/session.json" + rm -f "$settings_tmp" "$session_tmp" + touch "$config_home/DankMaterialShell/.firstlaunch" \ + "$config_home/DankMaterialShell/.changelog-1.5" + + install -m644 "$source_dir/config/alacritty/alacritty.toml" \ + "$config_home/alacritty/alacritty.toml" + install -m644 "$source_dir/config/systemd/dms.service" \ + "$config_home/systemd/user/dms.service" + install -m755 "$source_dir/scripts/niri-beyond-browser" \ + "$HOME/.local/bin/niri-beyond-browser" + install -m755 "$source_dir/scripts/niri-beyond-refresh" \ + "$HOME/.local/bin/niri-beyond-refresh" + + local profile="$state_home/$PROJECT/nix-profile" + local binary + for binary in dms quickshell qs matugen dgop dsearch; do + if [[ -x "$profile/bin/$binary" ]]; then + ln -sfn "$profile/bin/$binary" "$HOME/.local/bin/$binary" + fi + done + + printf '%s\n' "$selected_wallpaper" > "$config_home/niri-beyond-glass/wallpaper" } select_wallpaper() { local state_file="$1" local selected="$wallpaper" + if [[ -z "$selected" ]]; then + local existing="" + if [[ -r "$state_file" ]]; then + existing="$(head -n1 "$state_file")" + fi + if [[ -n "$existing" && -f "$existing" ]]; then + selected="$existing" + fi + fi + + if [[ -z "$selected" ]]; then + local session="${XDG_STATE_HOME:-$HOME/.local/state}/DankMaterialShell/session.json" + local existing="" + if [[ -r "$session" ]]; then + existing="$(jq -r '.wallpaperPath // empty' "$session" 2>/dev/null || true)" + fi + if [[ -n "$existing" && -f "$existing" ]]; then + selected="$existing" + fi + fi + + if [[ -z "$selected" ]] && command -v gsettings >/dev/null 2>&1; then + local uri="" + uri="$(gsettings get org.gnome.desktop.background picture-uri-dark 2>/dev/null \ + | tr -d "'" || true)" + uri="${uri#file://}" + if [[ -n "$uri" && -f "$uri" ]]; then + selected="$uri" + fi + fi + if [[ -z "$selected" ]]; then local candidates=( /usr/share/backgrounds/warty-final-ubuntu.png @@ -306,10 +445,35 @@ select_wallpaper() { -print -quit 2>/dev/null || true)" fi + [[ -n "$selected" && -f "$selected" ]] || + die "没有找到可用壁纸;可用 --wallpaper PATH 指定目标机上的图片。" + selected_wallpaper="$selected" + log "保留目标机壁纸:$selected_wallpaper" +} + +activate_dms() { + local profile="${XDG_STATE_HOME:-$HOME/.local/state}/$PROJECT/nix-profile" + if (( dry_run )); then - printf '+ write wallpaper path %q to %q\n' "$selected" "$state_file" - else - printf '%s\n' "$selected" > "$state_file" + printf '+ stop legacy shell processes and enable dms.service\n' + return + fi + + if ! systemctl --user daemon-reload 2>/dev/null; then + log "当前没有可用的 systemd 用户会话;DMS 将在下次 Niri 登录时启动" + return + fi + systemctl --user disable --now waybar.service mako.service 2>/dev/null || true + pkill -x waybar 2>/dev/null || true + pkill -x mako 2>/dev/null || true + pkill -x swaybg 2>/dev/null || true + pkill -x swayidle 2>/dev/null || true + systemctl --user enable dms.service + + "$profile/bin/dms" auth resolve-lock --quiet >/dev/null 2>&1 || true + + if [[ -n "${WAYLAND_DISPLAY:-}" ]]; then + systemctl --user restart dms.service fi } @@ -331,14 +495,21 @@ main() { install_libdisplay_info install_niri install_xwayland_satellite + install_dms_runtime + else + local profile="${XDG_STATE_HOME:-$HOME/.local/state}/$PROJECT/nix-profile" + [[ -x "$profile/bin/dms" && -x "$profile/bin/quickshell" ]] || + die "--config-only 需要先完成一次完整安装。" fi backup_and_install_config validate_config + activate_dms log "安装完成" - printf '\n请注销,在 GDM 会话菜单中选择“Niri”后登录。\n' - printf 'GNOME 和 GDM 均未被修改;快捷键说明:Super+Shift+/。\n' + printf '\nDMS 个性化已迁移,目标机原壁纸和显示器布局未修改。\n' + printf '当前若在 Niri 中,顶栏会自动重启;否则注销后选择“Niri”登录。\n' + printf 'GNOME 和 GDM 均未修改;快捷键说明:Super+Shift+/。\n' } main diff --git a/scripts/niri-beyond-browser b/scripts/niri-beyond-browser new file mode 100755 index 0000000..a42e66a --- /dev/null +++ b/scripts/niri-beyond-browser @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +set -euo pipefail + +for browser in google-chrome google-chrome-stable chromium chromium-browser firefox; do + if command -v "$browser" >/dev/null 2>&1; then + exec "$browser" + fi +done + +exec xdg-open https://www.google.com diff --git a/scripts/niri-beyond-refresh b/scripts/niri-beyond-refresh new file mode 100755 index 0000000..0545ad3 --- /dev/null +++ b/scripts/niri-beyond-refresh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +systemctl --user restart dms.service diff --git a/scripts/niri-beyond-wallpaper b/scripts/niri-beyond-wallpaper deleted file mode 100755 index faf9c4a..0000000 --- a/scripts/niri-beyond-wallpaper +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -state="${XDG_CONFIG_HOME:-$HOME/.config}/niri-beyond-glass/wallpaper" -wallpaper="" - -if [[ -s "$state" ]]; then - IFS= read -r wallpaper < "$state" -fi - -if [[ -n "$wallpaper" && -f "$wallpaper" ]]; then - exec swaybg -m fill -i "$wallpaper" -fi - -exec swaybg -c '#15171a' diff --git a/uninstall.sh b/uninstall.sh index c06ce6c..bfac533 100755 --- a/uninstall.sh +++ b/uninstall.sh @@ -6,6 +6,9 @@ state_home="${XDG_STATE_HOME:-$HOME/.local/state}" backup_root="$state_home/niri-beyond-glass/backups" original_root="$state_home/niri-beyond-glass/original" latest="" +profile="$state_home/niri-beyond-glass/nix-profile" + +systemctl --user disable --now dms.service 2>/dev/null || true if [[ -e "$original_root/.captured" ]]; then latest="$original_root" @@ -19,8 +22,23 @@ rm -rf \ "$config_home/fuzzel" \ "$config_home/mako" \ "$config_home/swaylock" \ - "$config_home/niri-beyond-glass" -rm -f "$HOME/.local/bin/niri-beyond-wallpaper" + "$config_home/niri-beyond-glass" \ + "$config_home/DankMaterialShell" \ + "$config_home/alacritty" +rm -f "$config_home/systemd/user/dms.service" +rm -rf "$state_home/DankMaterialShell" + +for binary in dms quickshell qs matugen dgop dsearch; do + link="$HOME/.local/bin/$binary" + if [[ -L "$link" && "$(readlink "$link")" == "$profile/"* ]]; then + rm -f "$link" + fi +done +rm -f \ + "$HOME/.local/bin/niri-beyond-wallpaper" \ + "$HOME/.local/bin/niri-beyond-browser" \ + "$HOME/.local/bin/niri-beyond-refresh" +rm -f "$state_home/niri-beyond-glass"/nix-profile* if [[ -n "$latest" && -d "$latest/config" ]]; then cp -a "$latest/config/." "$config_home/" @@ -29,4 +47,5 @@ else printf '配置已移除;没有找到可恢复的备份。\n' fi -printf 'Niri 和系统软件包被保留。GNOME/GDM 未修改。\n' +systemctl --user daemon-reload 2>/dev/null || true +printf '已移除项目专用 DMS 运行层。Niri 和系统软件包被保留,GNOME/GDM 未修改。\n'