Add Bazzite configs and README

Copy Niri, btop, glow, GTK, xsettingsd, environment.d and autostart
configs from Bazzite machine. Add README with project structure and
setup instructions for both macOS and Bazzite.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Mikhail Kilin
2026-03-01 14:02:59 +03:00
parent 26befe3de4
commit 85d01cefda
13 changed files with 1486 additions and 0 deletions

616
bazzite/niri/config.kdl Normal file
View File

@@ -0,0 +1,616 @@
debug {
// preview-render "screencast"
// preview-render "screen-capture"
// dbus-interfaces-in-non-session-instances
// wait-for-frame-completion-before-queueing
// enable-overlay-planes
disable-cursor-plane
// disable-direct-scanout
// render-drm-device "/dev/dri/renderD129"
// render-drm-device "/dev/dri/card1"
// enable-color-transformations-capability
// emulate-zero-presentation-time
}
input {
keyboard {
xkb {
}
repeat-delay 500
repeat-rate 30
// track-layout "window"
}
touchpad {
tap
// dwt
// dwtp
natural-scroll
accel-speed 0.4
// click-method "clickfinger"
// accel-profile "flat"
// tap-button-map "left-middle-right"
}
mouse {
// natural-scroll
// accel-speed -1.0
// accel-profile "flat"
}
tablet {
// map-to-output "eDP-1"
// map-to-output "HDMI-A-1"
}
// disable-power-key-handling
// warp-mouse-to-focus
// focus-follows-mouse
// workspace-auto-back-and-forth
}
output "winit" {
// scale 2.0
// scale 3.0
// transform "flipped-90"
position x=100 y=200
}
output "DP-1" {
// off
scale 1.0
// transform "90"
position x=0 y=0
// mode "1920x1200"
mode "2560x1440@170.001"
// mode "1280x1024"
// mode "1280x720"
// mode "640x480"
// variable-refresh-rate
}
layout {
focus-ring {
off
width 2
// catppuccin-mocha Sapphire
active-color "#74c7ec"
// catppuccin-mocha Surface2
inactive-color "#585b70"
// active-gradient from="#80c8ff" to="#bbddff" angle=45
}
border {
// off
width 2
// width 128
// active-color "#f38ba8"
// inactive-color "#585b70"
active-gradient from="#f38ba8" to="#f9e2af" angle=45 relative-to="workspace-view"
inactive-gradient from="#585b70" to="#7f849c" angle=45 relative-to="workspace-view"
// inactive-gradient from="green" to="lightblue" angle=45 relative-to="workspace-view"
// active-gradient from="#f00" to="#0f0" angle=90
// active-gradient from="yellow" to="red" angle=45 relative-to="workspace-view"
// inactive-gradient from="yellow" to="red" angle=45
}
preset-column-widths {
proportion 0.3333333333333333
proportion 0.5
proportion 0.66667
// proportion 0.25
// fixed 1000
}
default-column-width { proportion 0.3333333333333333; }
// default-column-width { }
gaps 4
struts {
// left 64
// right 64
// top 44
// bottom 64
// top 64
}
// center-focused-column "on-overflow"
// center-focused-column "always"
}
cursor {
// xcursor-theme "breeze_cursors"
// xcursor-theme "arstieonart"
// xcursor-size 48
}
prefer-no-csd
// spawn-at-startup "alacritty" "-e" "fish"
environment {
// GSK_RENDERER "cairo"
// WAYLAND_DISPLAY null
}
// screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
spawn-at-startup "waybar"
hotkey-overlay {
// skip-at-startup
}
animations {
// off
// slowdown 10.0
// slowdown 4.0
// slowdown 2.0
// slowdown 1.5
workspace-switch {
// off
// duration-ms 2500
// curve "ease-out-cubic"
// spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001
}
window-open {
// off
// duration-ms 2500
// curve "ease-out-expo"
// spring damping-ratio=0.8 stiffness=1000 epsilon=0.0001
}
window-close {
// off
// duration-ms 2500
// curve "ease-out-cubic"
// spring damping-ratio=0.8 stiffness=1000 epsilon=0.0001
}
horizontal-view-movement {
// off
// duration-ms 500
// curve "ease-out-cubic"
// spring damping-ratio=1.0 stiffness=20 epsilon=0.00001
// spring damping-ratio=10.0 stiffness=800 epsilon=0.0001
}
window-movement {
// off
// duration-ms 750
// curve "ease-out-cubic"
// spring damping-ratio=1.0 stiffness=20 epsilon=0.00001
// spring damping-ratio=0.2 stiffness=800 epsilon=0.0001
}
window-resize {
// off
// duration-ms 500
// duration-ms 2500
// curve "ease-out-cubic"
// spring damping-ratio=0.2 stiffness=800 epsilon=0.0001
custom-shader r"
vec4 resize_color(vec3 coords_curr_geo, vec3 size_curr_geo) {
vec3 coords_next_geo = niri_curr_geo_to_next_geo * coords_curr_geo;
vec3 coords_prev_geo = niri_curr_geo_to_prev_geo * coords_curr_geo;
vec3 coords_crop = niri_geo_to_tex_next * coords_next_geo;
vec3 coords_stretch = niri_geo_to_tex_next * coords_curr_geo;
vec3 coords_stretch_prev = niri_geo_to_tex_prev * coords_curr_geo;
// We can crop if the current window size is smaller than the next window
// size. One way to tell is by comparing to 1.0 the X and Y scaling
// coefficients in the current-to-next transformation matrix.
bool can_crop_by_x = niri_curr_geo_to_next_geo[0][0] <= 1.0;
bool can_crop_by_y = niri_curr_geo_to_next_geo[1][1] <= 1.0;
bool crop = can_crop_by_x && can_crop_by_y;
vec4 color;
if (crop) {
// However, when we crop, we also want to crop out anything outside the
// current geometry. This is because the area of the shader is unspecified
// and usually bigger than the current geometry, so if we don't fill pixels
// outside with transparency, the texture will leak out.
//
// When stretching, this is not an issue because the area outside will
// correspond to client-side decoration shadows, which are already supposed
// to be outside.
if (coords_curr_geo.x < 0.0 || 1.0 < coords_curr_geo.x ||
coords_curr_geo.y < 0.0 || 1.0 < coords_curr_geo.y) {
color = vec4(0.0);
} else {
color = texture2D(niri_tex_next, coords_crop.st);
}
} else {
// If we can't crop, then crossfade.
color = texture2D(niri_tex_next, coords_stretch.st);
vec4 color_prev = texture2D(niri_tex_prev, coords_stretch_prev.st);
color = mix(color_prev, color, niri_clamped_progress);
}
return color;
}
"
}
config-notification-open-close {
// off
// duration-ms 250
// curve "ease-out-cubic"
// spring damping-ratio=0.1 stiffness=1000 epsilon=0.001
}
}
window-rule {
// match app-id="Alacritty"
// match app-id="Adwaita"
// opacity 0.9
// opacity 0.5
// opacity 0.98
// open-on-output "eDP-1"
// default-column-width { proportion 0.5; }
// default-column-width { fixed 400; }
// default-column-width {}
// open-maximized true
// open-fullscreen true
// block-out-from "screencast"
// min-width 400
// max-width 400
// min-height 400
// max-height 400
focus-ring {
// on
// active-gradient from="red" to="green"
// active-color "lightgreen"
// width 1
}
border {
// off
// on
// width 12
// width 0
// active-color "#ff808080"
// active-color "red"
}
// draw-border-with-background true
// draw-border-with-background false
// geometry-corner-radius 12 24 32 64
// geometry-corner-radius 999
// geometry-corner-radius 1
geometry-corner-radius 6
clip-to-geometry true
}
/-window-rule {
match app-id="Adwaita"
// opacity 0.5
block-out-from "screencast"
geometry-corner-radius 12
clip-to-geometry false
border {
// off
width 12
}
}
/-window-rule {
match app-id="terminal"
clip-to-geometry false
geometry-corner-radius 8 8 0 0
border {
// width 4
}
}
/-window-rule {
match app-id="code"
// opacity 0.98
border {
// off
}
}
/-window-rule {
match app-id="weston."
// block-out-from "screencast"
geometry-corner-radius 12 24 32 64
// geometry-corner-radius 999
clip-to-geometry true
}
// window-rule {
// match app-id="Alacritty"
// geometry-corner-radius 12 12 0 0
// border {
// width 2
// }
// }
window-rule {
match title="simple-egl"
// min-width 128
// max-width 128
// min-height 128
// max-height 128
// match is-focused=true
// match is-active=false
// opacity 0.9
// block-out-from "screencast"
// block-out-from "screen-capture"
// min-width 1000
draw-border-with-background false
// match app-id="mpv"
// open-on-output "HDMI-A-1"
// open-maximized true
// default-column-width { proportion 0.5; }
// open-fullscreen false
}
window-rule {
match is-active=false
// opacity 0.95
}
window-rule {
match app-id=r#"^org\.telegram\.desktop$"# title="^Media viewer$"
open-fullscreen false
default-column-width { proportion 0.5; }
}
window-rule {
match app-id=r#"^org\.wezfurlong\.wezterm$"#
match app-id="^mpv$"
default-column-width {}
}
// Qt used by OBS doesn't signal min size yet, so do it manually.
window-rule {
match app-id=r#"^com\.obsproject\.Studio$"#
min-width 876
}
window-rule {
match app-id="^blender$"
match app-id="^gimp"
default-column-width { fixed 1200; }
}
window-rule {
match app-id="^obsidian$"
default-column-width { fixed 1000; }
}
window-rule {
match app-id=r#"^org\.mozilla\.firefox$"#
match app-id=r#"^org\.telegram\.desktop$"#
exclude app-id=r#"^org\.telegram\.desktop$"# title="^Media viewer$"
open-on-output "DP-2"
}
window-rule {
match app-id=r#"^org\.mozilla\.firefox$"#
default-column-width { proportion 0.66667; }
}
window-rule {
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
match app-id=r#"^org\.gnome\.World\.Secrets$"#
match app-id=r#"^org\.telegram\.desktop$"#
// Doesn't quite work: Firefox changes the title one frame early.
match app-id=r#"^org\.mozilla\.firefox$"# title="- Gmail "
match app-id=r#"^org\.mozilla\.firefox$"# title="^Google Calendar "
match app-id=r#"^org\.mozilla\.firefox$"# title="Todoist "
match app-id=r#"^org\.mozilla\.firefox$"# title=r#"^GNOME( \*)? \| "#
match app-id=r#"^org\.mozilla\.firefox$"# title=r#"^Element "#
match app-id=r#"^org\.mozilla\.firefox$"# title=r#"Discord \| "#
block-out-from "screencast"
// block-out-from "screen-capture"
border {
// active-color "red"
}
}
binds {
Mod+Shift+Slash { show-hotkey-overlay; }
Mod+Shift+C { spawn "sh" "-c" "t env DISPLAY=:0 xsel -ob | wl-copy"; }
Mod+Shift+V { spawn "sh" "-c" "wl-paste -n | t env DISPLAY=:0 xsel -ib"; }
// Mod+T { spawn "sh" "-c" "alacritty msg create-window -e fish -C t || alacritty -e fish -C t"; }
Mod+T { spawn "sh" "-c" "alacritty msg create-window || alacritty"; }
Mod+Shift+T { spawn "alacritty"; }
// Mod+Shift+T { spawn "sh" "-c" "alacritty msg create-window || alacritty"; }
// Mod+Return { spawn "~/arst"; }
// Mod+T { spawn "flatpak" "run" "org.gnome.Ptyxis.Devel" "-s"; }
// Mod+T { spawn "~/.local/bin/spawn-ptyxis.sh"; }
// Mod+T { spawn "bash" "-c" "notify-send hello && exec alacritty"; }
// Mod+T { spawn "kgx" "-e" "fish -C t"; }
Mod+D { spawn "fuzzel"; }
Mod+H { spawn "nautilus"; }
Super+Alt+L allow-when-locked=true { spawn "swaylock"; }
Mod+W { spawn "sh" "-c" "t mpv --pause $(wl-paste)"; }
Super+Alt+H { spawn "refresh.sh" "144"; }
Super+Alt+Comma { spawn "refresh.sh" "120"; }
XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; }
XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; }
XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
Mod+Q { close-window; }
Mod+BackSpace { close-window; }
Mod+M { focus-column-left; }
Mod+N { focus-window-down; }
Mod+E { focus-window-up; }
Mod+I { focus-column-right; }
Mod+Left { focus-column-left; }
Mod+Down { focus-window-down; }
Mod+Up { focus-window-up; }
Mod+Right { focus-column-right; }
Mod+Ctrl+M { move-column-left; }
Mod+Ctrl+N { move-window-down; }
Mod+Ctrl+E { move-window-up; }
Mod+Ctrl+I { move-column-right; }
Mod+Ctrl+Left { move-column-left; }
Mod+Ctrl+Down { move-window-down; }
Mod+Ctrl+Up { move-window-up; }
Mod+Ctrl+Right { move-column-right; }
Mod+Home { focus-column-first; }
Mod+End { focus-column-last; }
Mod+Ctrl+Home { move-column-to-first; }
Mod+Ctrl+End { move-column-to-last; }
Mod+Shift+M { focus-monitor-left; }
Mod+Shift+N { focus-monitor-down; }
Mod+Shift+E { focus-monitor-up; }
Mod+Shift+I { focus-monitor-right; }
Mod+Shift+Left { focus-monitor-left; }
Mod+Shift+Down { focus-monitor-down; }
Mod+Shift+Up { focus-monitor-up; }
Mod+Shift+Right { focus-monitor-right; }
Mod+Shift+Ctrl+M { move-column-to-monitor-left; }
Mod+Shift+Ctrl+N { move-column-to-monitor-down; }
Mod+Shift+Ctrl+E { move-column-to-monitor-up; }
Mod+Shift+Ctrl+I { move-column-to-monitor-right; }
Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
Mod+Shift+Alt+M { move-workspace-to-monitor-left; }
Mod+Shift+Alt+N { move-workspace-to-monitor-down; }
Mod+Shift+Alt+E { move-workspace-to-monitor-up; }
Mod+Shift+Alt+I { move-workspace-to-monitor-right; }
Mod+Shift+Alt+Left { move-workspace-to-monitor-left; }
Mod+Shift+Alt+Down { move-workspace-to-monitor-down; }
Mod+Shift+Alt+Up { move-workspace-to-monitor-up; }
Mod+Shift+Alt+Right { move-workspace-to-monitor-right; }
Mod+L { focus-workspace-down; }
Mod+U { focus-workspace-up; }
Mod+Page_Down { focus-workspace-down; }
Mod+Page_Up { focus-workspace-up; }
Mod+Ctrl+L { move-column-to-workspace-down; }
Mod+Ctrl+U { move-column-to-workspace-up; }
Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
Mod+WheelScrollRight { focus-column-right; }
Mod+WheelScrollLeft { focus-column-left; }
Mod+Ctrl+WheelScrollRight { move-column-right; }
Mod+Ctrl+WheelScrollLeft { move-column-left; }
Mod+Shift+WheelScrollDown { focus-column-right; }
Mod+Shift+WheelScrollUp { focus-column-left; }
Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
Mod+TouchpadScrollUp allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; }
Mod+TouchpadScrollDown allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; }
// Mod+TouchpadScrollLeft { focus-column-left; }
// Mod+TouchpadScrollRight { focus-column-right; }
Mod+Shift+L { move-workspace-down; }
Mod+Shift+U { move-workspace-up; }
Mod+Shift+Page_Down { move-workspace-down; }
Mod+Shift+Page_Up { move-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+6 { focus-workspace 6; }
Mod+7 { focus-workspace 7; }
Mod+8 { focus-workspace 8; }
Mod+9 { focus-workspace 9; }
Mod+Ctrl+1 { move-column-to-workspace 1; }
Mod+Ctrl+2 { move-column-to-workspace 2; }
Mod+Ctrl+3 { move-column-to-workspace 3; }
Mod+Ctrl+4 { move-column-to-workspace 4; }
Mod+Ctrl+5 { move-column-to-workspace 5; }
Mod+Ctrl+6 { move-column-to-workspace 6; }
Mod+Ctrl+7 { move-column-to-workspace 7; }
Mod+Ctrl+8 { move-column-to-workspace 8; }
Mod+Ctrl+9 { move-column-to-workspace 9; }
// Mod+Tab { focus-workspace-previous; }
Mod+Comma { consume-window-into-column; }
Mod+Period { expel-window-from-column; }
Mod+BracketLeft { consume-or-expel-window-left; }
Mod+BracketRight { consume-or-expel-window-right; }
Mod+R { switch-preset-column-width; }
Mod+F { maximize-column; }
Mod+Shift+F { fullscreen-window; }
Mod+C { center-column; }
Mod+Minus { set-column-width "-10%"; }
Mod+Equal { set-column-width "+10%"; }
Mod+Ctrl+Minus { set-column-width "-1"; }
Mod+Ctrl+Equal { set-column-width "+1"; }
Mod+Shift+Minus { set-window-height "-10%"; }
Mod+Shift+Equal { set-window-height "+10%"; }
Mod+Shift+Ctrl+Minus { set-window-height "-1"; }
Mod+Shift+Ctrl+Equal { set-window-height "+1"; }
Mod+0 { set-column-width "960"; }
Mod+Shift+0 { set-window-height "540"; }
Mod+Alt+0 { set-column-width "1280"; }
Mod+Shift+Alt+0 { set-window-height "720"; }
Mod+Ctrl+0 { set-column-width "1920"; }
Mod+Shift+Ctrl+0 { set-window-height "1080"; }
Mod+Space { switch-layout "next"; }
Mod+Shift+Space { switch-layout "prev"; }
Print { screenshot; }
Ctrl+Print { screenshot-screen; }
Alt+Print { screenshot-window; }
Mod+P { screenshot; }
Mod+Shift+Y { quit; }
Mod+Shift+P { power-off-monitors; }
Mod+Shift+Ctrl+T { toggle-debug-tint; }
Mod+Shift+Ctrl+O { debug-toggle-opaque-regions; }
Mod+Shift+Ctrl+D { debug-toggle-damage; }
}