feat: move to dms and remove hyprland completely

This commit is contained in:
Nickolaj Jepsen 2025-12-12 03:38:32 +01:00
parent bc9a10e521
commit 357d01cc9b
24 changed files with 410 additions and 767 deletions

View file

@ -27,12 +27,15 @@
cp *.svg *.png $out/share/backgrounds
'';
};
unknownPng = background + "/share/backgrounds/unknown.png";
geometryPng = background + "/share/backgrounds/geometry.png";
pngs = [
(background + "/share/backgrounds/unknown.png")
(background + "/share/backgrounds/geometry.png")
unknownPng
geometryPng
];
in {
fireproof.home-manager = {
# Use hyprpaper as we can't currently set wallpapers through DMS
services.hyprpaper = {
enable = true;
settings = {
@ -40,5 +43,15 @@ in {
wallpaper = [",${builtins.head pngs}"];
};
};
programs.dankMaterialShell.default.settings = {
# Disables wallpaper management in DMS to avoid conflicts with Hyprpaper
screenPreferences.wallpaper = [];
};
programs.dankMaterialShell.default.session = {
# Attempt to set a default wallpaper on first run
wallpaperPath = unknownPng;
};
};
}

View file

Before

Width:  |  Height:  |  Size: 410 B

After

Width:  |  Height:  |  Size: 410 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 282 KiB

After

Width:  |  Height:  |  Size: 282 KiB

Before After
Before After

View file

@ -0,0 +1,91 @@
{config, ...}: let
commonBarSettings = {
enabled = true;
position = 0;
spacing = 0;
innerPadding = 0;
bottomGap = -5;
transparency = 0;
widgetTransparency = 1;
squareCorners = true;
noBackground = false;
gothCornersEnabled = false;
gothCornerRadiusOverride = false;
gothCornerRadiusValue = 12;
borderEnabled = false;
borderColor = "primary";
borderOpacity = 1;
borderThickness = 2;
widgetOutlineEnabled = false;
widgetOutlineColor = "primary";
widgetOutlineOpacity = 1;
widgetOutlineThickness = 1;
fontScale = 1;
autoHide = false;
autoHideDelay = 250;
openOnOverview = false;
visible = true;
popupGapsAuto = true;
popupGapsManual = 4;
maximizeDetection = true;
};
primaryBar =
{
id = "default";
name = "Primary Bar";
screenPreferences = [
{
name = (builtins.head config.monitors).name or "";
}
];
showOnLastDisplay = true;
leftWidgets = [
"launcherButton"
"workspaceSwitcher"
"runningApps"
];
centerWidgets = [
"focusedWindow"
];
rightWidgets = [
"music"
"systemTray"
"cpuUsage"
"controlCenterButton"
"notificationButton"
"clock"
];
}
// commonBarSettings;
secondaryBar =
{
id = "secondary";
name = "Secondary Bar";
screenPreferences = builtins.map (monitor: {
inherit (monitor) name;
}) (builtins.tail config.monitors);
showOnLastDisplay = false;
leftWidgets = [
"workspaceSwitcher"
];
centerWidgets = [];
rightWidgets = [];
}
// commonBarSettings;
in {
fireproof.home-manager = {
programs.dankMaterialShell.default.settings = {
launcherLogoMode = "os";
launcherLogoContrast = 1;
launcherLogoSizeOffset = 3;
centeringMode = "geometric";
runningAppsCurrentWorkspace = true;
runningAppsGroupByApp = true;
barConfigs = [primaryBar secondaryBar];
};
};
}

View file

@ -0,0 +1,70 @@
{
inputs,
pkgs,
...
}: {
imports = [
./theme.nix
./background.nix
./bar.nix
];
systemd.user.services.niri-flake-polkit.enable = false;
fireproof.home-manager = {
imports = [
inputs.dankMaterialShell.homeModules.dankMaterialShell.default
];
programs.dankMaterialShell = {
enable = true;
enableDynamicTheming = false;
enableClipboard = false;
enableVPN = false;
enableCalendarEvents = false;
default.settings = {
# General Settings
weatherCoordinates = "56.1496278,10.2134046";
# Lock Screen
loginctlLockIntegration = true;
fadeToLockEnabled = true;
fadeToLockGracePeriod = 5;
acMonitorTimeout = 1800;
acLockTimeout = 600;
acSuspendTimeout = 0;
batteryMonitorTimeout = 600;
batteryLockTimeout = 300;
batterySuspendTimeout = 1800;
# Power Menu
powerMenuActions = [
"reboot"
"logout"
"poweroff"
"lock"
"suspend"
];
powerMenuDefaultAction = "lock";
};
};
systemd.user.services = {
# A hack to always serve fresh settings from default-settings.json
dms-clean-settings = {
Unit = {
Description = "Delete DankMaterialShell settings before dms starts";
Before = ["dms.service"];
};
Service = {
Type = "oneshot";
ExecStart = "${pkgs.coreutils}/bin/rm -f %h/.config/DankMaterialShell/settings.json";
};
Install.WantedBy = ["dms.service"];
};
};
};
}

View file

@ -0,0 +1,43 @@
{username, ...}: {
fireproof.home-manager = {
home.file.".config/DankMaterialShell/colors.json".text = builtins.toJSON {
name = "custom";
primary = "#CF6A4C";
primaryText = "#F2F0E5";
primaryContainer = "#403E3C";
secondary = "#CE5D97";
surface = "#343331";
surfaceText = "#DAD8CE";
surfaceVariant = "#1C1B1A";
surfaceVariantText = "#B7B5AC";
surfaceTint = "#CF6A4C";
background = "#100F0F";
backgroundText = "#F2F0E5";
outline = "#878580";
surfaceContainer = "#1C1B1A";
surfaceContainerHigh = "#282726";
surfaceContainerHighest = "#403E3C";
error = "#D14D41";
warning = "#D0A215";
info = "#4385BE";
matugen_type = "scheme-expressive";
};
programs.dankMaterialShell.default.settings = {
# Color theme
currentThemeName = "custom";
customThemeFile = "/home/${username}/.config/DankMaterialShell/colors.json";
widgetBackgroundColor = "sth";
widgetColorMode = "default";
# General
cornerRadius = 8;
# Font
fontFamily = "Inter Variable";
monoFontFamily = "Hack Nerd Font Mono";
fontWeight = 400;
fontScale = 1;
};
};
}

View file

@ -1,26 +0,0 @@
{
config,
inputs,
pkgs,
pkgsUnstable,
...
}: let
fireproofPkgs = inputs.fireproof-shell.packages.${pkgs.system};
in {
environment.systemPackages = [
fireproofPkgs.fireproof-shell
fireproofPkgs.fireproof-ipc
pkgsUnstable.astal.io
];
programs.fireproof-shell = {
enable = true;
settings = {
monitor.main = (builtins.head config.monitors).name or "";
launcher.uwsm = true;
notification.ignore = ["/^Spotify/"];
tray.ignore = ["/spotify/"];
};
};
fireproof.home-manager.wayland.windowManager.hyprland.settings.execr = ["pkill .fireproof-shel; fireproof-shell"];
}

View file

@ -1,5 +0,0 @@
{pkgs, ...}: {
environment.systemPackages = [
pkgs.fuzzel
];
}

View file

@ -3,7 +3,7 @@
enable = true;
settings = {
default_session = {
command = "${pkgs.greetd.tuigreet}/bin/tuigreet --user-menu";
command = "${pkgs.tuigreet}/bin/tuigreet --user-menu";
};
};
};

View file

@ -1,307 +0,0 @@
{
lib,
config,
pkgs,
pkgsUnstable,
...
}:
with lib; let
cfg = config.fireproof;
primaryMonitorName = (builtins.head config.monitors).name or "";
color = {
bg = "rgb(1C1B1A)";
ui = "rgb(343331)";
fg = "rgb(DAD8CE)";
accent = "rgb(CF6A4C)";
black = "rgb(100F0F)";
transparent = "rgba(00000000)";
};
record_script = pkgs.writeShellScriptBin "record_script" ''
DIR="$HOME/recordings"
FILE="$DIR/$(date '+%Y-%m-%d_%H.%M.%S').mp4"
mkdir -p $DIR
if pgrep -f ${lib.getExe pkgs.wf-recorder} > /dev/null; then
pkill ${lib.getExe pkgs.wf-recorder}
${pkgs.libnotify}/bin/notify-send "Recording Stopped" "Recording saved to $FILE"
else
# Stolen from grimblast
FULLSCREEN_WORKSPACES="$(hyprctl workspaces -j | jq -r 'map(select(.hasfullscreen) | .id)')"
WORKSPACES="$(hyprctl monitors -j | jq -r '[(foreach .[] as $monitor (0; if $monitor.specialWorkspace.name == "" then $monitor.activeWorkspace else $monitor.specialWorkspace end)).id]')"
WINDOWS="$(hyprctl clients -j | jq -r --argjson workspaces "$WORKSPACES" --argjson fullscreenWorkspaces "$FULLSCREEN_WORKSPACES" 'map((select(([.workspace.id] | inside($workspaces)) and ([.workspace.id] | inside($fullscreenWorkspaces) | not) or .fullscreen > 0)))')"
GEOMETRY=$(echo "$WINDOWS" | jq -r '.[] | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' | ${lib.getExe pkgs.slurp})
# ${pkgs.libnotify}/bin/notify-send "Starting recording" "Recording in 3 seconds" -a "record_script" -t 1000
# sleep 1
# ${pkgs.libnotify}/bin/notify-send "Starting recording" "Recording in 2 seconds" -a "record_script" -t 1000
# sleep 1
# ${pkgs.libnotify}/bin/notify-send "Starting recording" "Recording in 1 second" -t 1000
# sleep 1
${pkgs.wf-recorder}/bin/wf-recorder --pixel-format yuv420p -f "$FILE" -t --geometry "$GEOMETRY" & disown
${pkgs.wl-clipboard}/bin/wl-copy < "$FILE"
fi
'';
mkKeyboard = name: {
inherit name;
kb_layout = "eu";
};
mkMouse = name: sensitivity: {
inherit name;
inherit sensitivity;
};
in {
imports = [
./hyprpolkitagent.nix
./hyprpaper.nix
./hyprlock.nix
./hypridle.nix
];
config = {
programs.uwsm.enable = true;
programs.hyprland = {
package = pkgsUnstable.hyprland;
portalPackage = pkgsUnstable.xdg-desktop-portal-hyprland;
enable = true;
withUWSM = true;
xwayland.enable = true;
};
security.polkit.enable = true;
services.dbus.enable = true;
services.systembus-notify.enable = true;
environment.sessionVariables.NIXOS_OZONE_WL = "1";
environment.systemPackages = with pkgs; [
hyprcursor
];
fireproof.home-manager = {
wayland.windowManager.hyprland = {
enable = true;
xwayland.enable = true;
systemd.enable = false; # Conficts with UWSM
settings = {
env = [
"HYPRCURSOR_THEME,Adwaita"
"HYPRCURSOR_SIZE,24"
];
monitor =
map (
m: let
name =
if m.name != null
then m.name
else "";
resolution =
if m.resolution != null
then "${builtins.toString m.resolution.width}x${builtins.toString m.resolution.height}"
else "preferred";
refreshRate =
if m.refreshRate != null
then "@${builtins.toString m.refreshRate}"
else "";
position = "${builtins.toString m.position.x}x${builtins.toString m.position.y}";
transform =
if m.transform != null
then ", transform, ${builtins.toString m.transform}"
else "";
in "${name}, ${resolution}${refreshRate}, ${position}, 1${transform}"
)
config.monitors;
exec = [
"systemctl --user start hyprpaper"
"systemctl --user start hypridle"
];
input = {
# Most unknown keyboards will be of the DK layout, we set known keyboards to eu in `devices`
kb_layout = "dk";
kb_options = "caps:backspace";
# Cursor focus will be detached from keyboard focus. Clicking on a window will move keyboard focus to that window.
follow_mouse = 2;
touchpad = {
natural_scroll = false;
};
sensitivity = 0;
accel_profile = "flat";
};
workspace =
if primaryMonitorName != ""
then [
"1, monitor:${primaryMonitorName}, persistent:true, default:true"
"2, monitor:${primaryMonitorName}, persistent:true"
"3, monitor:${primaryMonitorName}, persistent:true"
"4, monitor:${primaryMonitorName}, persistent:true"
"5, monitor:${primaryMonitorName}, persistent:true"
]
else [
"1, persistent:true, default:true"
"2, persistent:true"
"3, persistent:true"
"4, persistent:true"
"5, persistent:true"
];
# Names can be found with:
# $ hyprctl devices -j | jq '.["keyboards"].[].name' -r | grep -vE "(system|consumer)-control"
device =
[
# $ hyprctl devices -j | jq '.["mice"].[].name' -r
(mkMouse "logitech-usb-ps/2-optical-mouse" 0.2)
]
++ map mkKeyboard [
"splitkb-kyria-rev1"
"zsa-technology-labs-inc-ergodox-ez-shine"
"mattia-dal-ben-redox_wireless"
"zsa-technology-labs-inc-ergodox-ez-shine-keyboard"
];
general = {
gaps_in = 5;
gaps_out = 10;
border_size = 2;
"col.active_border" = color.accent;
"col.inactive_border" = color.ui;
layout = "dwindle";
};
cursor = {
no_warps = true;
};
misc = {
focus_on_activate = true;
disable_hyprland_logo = true;
background_color = color.bg;
force_default_wallpaper = 0;
middle_click_paste = false;
font_family = "Hack Nerd Font";
};
decoration = {
rounding = 8;
rounding_power = 4;
shadow = {
enabled = true;
color = "rgba(1a1a1aee)";
};
};
animations = {
enabled = true;
animation = [
"windows, 1, 4, default"
"windowsOut, 1, 4, default, popin 80%"
"border, 1, 10, default"
"borderangle, 1, 8, default"
"fade, 1, 7, default"
"workspaces, 1, 3, default"
];
};
dwindle = {
pseudotile = true;
preserve_split = true;
force_split = 2;
use_active_for_splits = true;
};
group = {
auto_group = false;
"col.border_inactive" = color.bg;
"col.border_active" = color.accent;
groupbar = {
enabled = true;
font_size = 12;
gradients = false;
height = 16;
indicator_height = 2;
"col.inactive" = color.ui;
"col.active" = color.accent;
"text_color" = color.fg;
};
};
bind = [
"SUPER, RETURN, exec, ${getExe config.programs.uwsm.package} app -- ${cfg.base.defaults.terminal}"
"SUPER, BACKSPACE, killactive"
"SUPER, SPACE, exec, astal launcher"
"SUPER, semicolon, exec, astal launcher .e"
"SUPER, p, exec, ${getExe config.programs.uwsm.package} app -- ${pkgs.systemd}/bin/loginctl lock-session"
", Print, exec, ${lib.getExe pkgs.grimblast} save area - | ${lib.getExe pkgs.satty} -f -"
"SHIFT, Print, exec, ${lib.getExe pkgs.grimblast} --freeze save area - | ${lib.getExe pkgs.satty} -f -"
"CTRL, Print, exec, ${lib.getExe record_script}"
"SUPER, S, togglefloating"
"SUPER, A, pseudo"
"SUPER, D, fullscreen"
"SUPER, BACKSLASH, togglesplit"
"SUPER, left, movefocus, l"
"SUPER, right, movefocus, r"
"SUPER, up, movefocus, u"
"SUPER, down, movefocus, d"
"SUPER, h, movefocus, l"
"SUPER, l, movefocus, r"
"SUPER, k, movefocus, u"
"SUPER, j, movefocus, d"
"SUPER, p, submap, preselect"
"SUPER, q, workspace, 1"
"SUPER, w, workspace, 2"
"SUPER, e, workspace, 3"
"SUPER, r, workspace, 4"
"SUPER, t, workspace, 5"
"SUPER SHIFT, q, movetoworkspace, 1"
"SUPER SHIFT, w, movetoworkspace, 2"
"SUPER SHIFT, e, movetoworkspace, 3"
"SUPER SHIFT, r, movetoworkspace, 4"
"SUPER SHIFT, t, movetoworkspace, 5"
"SUPER SHIFT, h, workspace, r-1"
"SUPER SHIFT, l, workspace, r+1"
"SUPER, M, togglegroup"
"SUPER, tab, changegroupactive, f"
"SUPER SHIFT, tab, changegroupactive, b"
];
bindm = [
"SUPER, mouse:272, movewindow"
"SUPER, mouse:273, resizewindow"
];
layerrule = [
"noanim, gtk4-layer-shell"
];
windowrulev2 = [
# Screenshots
"float,class:^(com.gabm.satty)$"
"dimaround,class:^(com.gabm.satty)$"
# Firefox
"float,class:^(firefox)$,title:^(Picture-in-Picture)$"
"float,class:^(firefox)$,title:^(Library)$"
"float,class:^(firefox)$,title:^(Bitwarden Password Manager)$"
# JetBrains
"center,class:^(jetbrains-.*)$,title:^$,floating:1"
"noinitialfocus,class:^(jetbrains-.*)$,title:^$,floating:1"
"noanim,class:^(jetbrains-.*)$,title:^$,floating:1"
"center,class:^(jetbrains-.*)$,title:^(splash)$,floating:1"
"nofocus,class:^(jetbrains-.*)$,title:^(splash)$,floating:1"
"noborder,class:^(jetbrains-.*)$,title:^(splash)$,floating:1"
];
};
};
};
};
}

View file

@ -1,33 +0,0 @@
{
config,
pkgs,
...
}: let
sleep_cmd = "${config.programs.hyprland.package}/bin/hyprctl dispatch dpms off";
wake_cmd = "${config.programs.hyprland.package}/bin/hyprctl dispatch dpms on";
lock_cmd = "pidof ${pkgs.hyprlock}/bin/hyprlock || ${pkgs.hyprlock}/bin/hyprlock";
in {
config = {
fireproof.home-manager.services.hypridle = {
enable = true;
settings = {
general = {
inherit lock_cmd;
before_sleep_cmd = "${pkgs.systemd}/bin/loginctl lock-session";
after_sleep_cmd = sleep_cmd;
};
listener = [
{
timeout = 60 * 5;
on-timeout = lock_cmd;
}
{
timeout = 60 * 15;
on-timeout = sleep_cmd;
on-resume = wake_cmd;
}
];
};
};
};
}

View file

@ -1,97 +0,0 @@
{
lib,
config,
pkgs,
...
}: let
background = pkgs.stdenvNoCC.mkDerivation {
pname = "desktop-background";
version = "0.2";
src = lib.fileset.toSource {
root = ./.;
fileset = lib.fileset.unions [
./backgrounds/unknown.svg
];
};
nativeBuildInputs = [pkgs.inkscape];
buildPhase = ''
inkscape -w 3840 -h 2160 backgrounds/unknown.svg -o unknown.png
'';
installPhase = ''
mkdir -p $out/share/backgrounds
cp *.svg *.png $out/share/backgrounds
'';
};
# Re-use the same color scheme as in the main Hyprland config
color = {
bg = "rgb(28, 27, 26)";
ui = "rgb(52, 51, 49)";
fg = "rgb(218, 216, 206)";
transparent = "rgba(0, 0, 0, 0)";
};
in {
config = {
fireproof.home-manager.programs.hyprlock = {
enable = true;
settings = {
general = {
disable_loading_bar = false;
grace = 0;
no_fade_in = false;
};
background = {
monitor = "";
color = color.bg;
path = background + "/share/backgrounds/unknown.png";
};
input-field = {
monitor = "";
size = "250, 60";
outline_thickness = 2;
dots_size = 0.2;
dots_spacing = 0.2;
dots_center = true;
outer_color = color.transparent;
inner_color = color.ui;
font_color = color.fg;
fade_on_empty = false;
font_family = "Hack Nerd Font";
placeholder_text = "";
hide_input = false;
position = "0, -35";
halign = "center";
valign = "center";
rounding = 8;
};
shape = [
{
monitor = "";
color = color.ui;
halign = "center";
valign = "center";
size = "150, 60";
position = "0, 35";
rounding = 8;
}
];
label = [
{
monitor = "";
text = "cmd[update:1000] echo \"<span>$(date +\"%H:%M\")</span>\"";
color = color.fg;
font_size = 30;
font_family = "Hack Nerd Font";
position = "0, 35";
halign = "center";
valign = "center";
}
];
};
};
};
}

View file

@ -1,26 +0,0 @@
{
pkgs,
config,
...
}: {
config = {
fireproof.home-manager.systemd.user.services.hyprpolkitagent = {
Unit = {
Description = "Hyprland Polkit Authentication Agent";
};
Service = {
Type = "simple";
ExecStart = "${pkgs.hyprpolkitagent}/libexec/hyprpolkitagent";
Restart = "on-failure";
RestartSec = 1;
TimeoutStopSec = 10;
Slice = "session.slice";
};
Install = {
WantedBy = ["graphical-session.target"];
};
};
};
}

View file

@ -1,17 +0,0 @@
{pkgs, ...}: {
fireproof.home-manager.services.mako.enable = true;
systemd.user.services."mako" = {
description = "Mako notification daemon";
documentation = ["man:mako(1)"];
partOf = ["graphical-session.target"];
after = ["graphical-session.target"];
serviceConfig = {
Type = "dbus";
BusName = "org.freedesktop.Notifications";
ExecCondition = "/bin/sh -c '[ -n \"$WAYLAND_DISPLAY\" ]'";
ExecReload = "${pkgs.mako}/bin/mako reload";
ExecStart = "${pkgs.mako}/bin/mako";
};
wantedBy = ["graphical-session.target"];
};
}

View file

@ -8,6 +8,8 @@
primaryMonitorName = (builtins.head config.monitors).name or "";
in {
# TODO: Move these to a separate module
programs.xwayland.enable = true;
fireproof.home-manager.programs.waybar = {
enable = true;
systemd.enable = true;
@ -41,7 +43,7 @@ in {
color: #DAD8CE;
border-bottom: 2px solid #CF6A4C;
}
#workspaces button.focused {
background: #CF6A4C;
color: #1C1B1A;
@ -117,6 +119,10 @@ in {
{command = ["systemctl" "--user" "start" "mako"];}
{command = ["systemctl" "--user" "start" "waybar"];}
];
xwayland-satellite = {
enable = true;
path = lib.getExe inputs.niri.packages."${pkgs.system}".xwayland-satellite-unstable;
};
environment = {
NIXOS_OZONE_WL = "1";
GDK_BACKEND = "wayland"; # Attempt to fix screen recording issue
@ -180,39 +186,43 @@ in {
binds = {
"XF86AudioRaiseVolume" = {
allow-when-locked = true;
action.spawn = [
"wpctl"
"set-volume"
"@DEFAULT_AUDIO_SINK@"
"0.1+"
];
action.spawn = ["dms" "ipc" "audio" "increment" "3"];
};
"XF86AudioLowerVolume" = {
allow-when-locked = true;
action.spawn = [
"wpctl"
"set-volume"
"@DEFAULT_AUDIO_SINK@"
"0.1-"
];
action.spawn = ["dms" "ipc" "audio" "decrement" "3"];
};
"XF86AudioMute" = {
allow-when-locked = true;
action.spawn = [
"wpctl"
"set-mute"
"@DEFAULT_AUDIO_SINK@"
"toggle"
];
action.spawn = ["dms" "ipc" "audio" "mute"];
};
"XF86AudioMicMute" = {
allow-when-locked = true;
action.spawn = [
"wpctl"
"set-mute"
"@DEFAULT_AUDIO_SOURCE@"
"toggle"
];
action.spawn = ["dms" "ipc" "audio" "micmute"];
};
"XF86MonBrightnessUp" = {
allow-when-locked = true;
action.spawn = ["dms" "ipc" "brightness" "increment" "5"];
};
"XF86MonBrightnessDown" = {
allow-when-locked = true;
action.spawn = ["dms" "ipc" "brightness" "decrement" "5"];
};
"Mod+N" = {
action.spawn = ["dms" "ipc" "notifications" "toggle"];
hotkey-overlay.title = "Toggle Notification Center";
};
"Mod+V" = {
action.spawn = ["dms" "ipc" "clipboard" "toggle"];
hotkey-overlay.title = "Toggle Clipboard Manager";
};
"Mod+Space" = {
action.spawn = ["dms" "ipc" "spotlight" "toggle"];
hotkey-overlay.title = "Toggle Application Launcher";
};
"Mod+P" = {
action.spawn = ["dms" "ipc" "powermenu" "toggle"];
hotkey-overlay.title = "Toggle Power Menu";
};
"Mod+Left".action.focus-column-or-monitor-left = {};
@ -291,7 +301,6 @@ in {
"Mod+Slash".action.show-hotkey-overlay = {};
"Mod+Return".action.spawn = ["ghostty"];
"Mod+Space".action.spawn = ["fuzzel"];
"Mod+Backspace".action.close-window = {};
};