Initial commit: sway + uwsm desktop dotfiles

Nord-themed Wayland setup on sway (via uwsm), including:

- sway/swayidle/swaylock/swaddle — WM, idle/lock/inhibit
- waybar, rofi — bar and launcher
- dunst — notifications
- foot — terminal
- zsh (+fzf, syntax highlighting, autosuggestions) — shell
- mpd/rmpc/mpc, mpv — music and video
- nvim — editor (lazy.nvim)
- ly — login manager
- rbw + pinentry-rofi wrapper — Bitwarden/Vaultwarden CLI
- per-window-layout, clipvault — helper systemd services
This commit is contained in:
2026-08-11 10:30:07 +04:00
commit a213b10a88
35 changed files with 2775 additions and 0 deletions
+253
View File
@@ -0,0 +1,253 @@
#![enable(implicit_some)]
#![enable(unwrap_newtypes)]
#![enable(unwrap_variant_newtypes)]
(
address: "127.0.0.1:6600",
password: None,
theme: "def",
cache_dir: None,
on_song_change: None,
volume_step: 5,
max_fps: 30,
scrolloff: 0,
wrap_navigation: false,
enable_mouse: true,
scroll_amount: 1,
enable_config_hot_reload: true,
enable_lyrics_hot_reload: false,
status_update_interval_ms: 1000,
rewind_to_start_sec: None,
keep_state_on_song_change: true,
reflect_changes_to_playlist: false,
select_current_song_on_change: false,
ignore_leading_the: true,
browser_song_sort: [Disc, Track, Artist, Title],
directories_sort: SortFormat(group_by_type: true, reverse: false),
auto_open_downloads: true,
album_art: (
method: Auto,
max_size_px: (width: 1200, height: 1200),
disabled_protocols: ["http://", "https://"],
vertical_align: Center,
horizontal_align: Center,
),
keybinds: (
global: {
"q": Quit,
"?": ShowHelp,
":": CommandMode,
"oI": ShowCurrentSongInfo,
"oo": ShowOutputs,
"op": ShowDecoders,
"od": ShowDownloads,
"oP": Partition(),
"z": ToggleRepeat,
"x": ToggleRandom,
"c": ToggleConsume,
"v": ToggleSingle,
"p": TogglePause,
"s": Stop,
">": NextTrack,
"<": PreviousTrack,
"f": SeekForward,
"b": SeekBack,
".": VolumeUp,
",": VolumeDown,
"<Tab>": NextTab,
"gt": NextTab,
"<S-Tab>": PreviousTab,
"gT": PreviousTab,
"1": SwitchToTab("Queue"),
"2": SwitchToTab("Directories"),
//"3": SwitchToTab("Artists"),
"3": SwitchToTab("Album Artists"),
//"5": SwitchToTab("Albums"),
"4": SwitchToTab("Playlists"),
"5": SwitchToTab("Search"),
"<C-u>": Update,
"<C-U>": Rescan,
"R": AddRandom,
},
navigation: {
"<C-c>": Close,
"<Esc>": Close,
"<CR>": Confirm,
"k": Up,
"<Up>": Up,
"j": Down,
"<Down>": Down,
"h": Left,
"<Left>": Left,
"l": Right,
"<Right>": Right,
"<C-w>k": PaneUp,
"<C-Up>": PaneUp,
"<C-w>j": PaneDown,
"<C-Down>": PaneDown,
"<C-w>h": PaneLeft,
"<C-Left>": PaneLeft,
"<C-w>l": PaneRight,
"<C-Right>": PaneRight,
"K": MoveUp,
"J": MoveDown,
"<C-u>": UpHalf,
"<C-d>": DownHalf,
"<C-b>": PageUp,
"<PageUp>": PageUp,
"<C-f>": PageDown,
"<PageDown>": PageDown,
"gg": Top,
"G": Bottom,
"<Space>": Select,
"<C-Space>": InvertSelection,
"/": EnterSearch,
"n": NextResult,
"N": PreviousResult,
"a": Add,
"A": AddAll,
"D": Delete,
"<C-r>": Rename,
"i": FocusInput,
"oi": ShowInfo,
"<C-z>": ContextMenu(),
"<C-s>s": Save(kind: Modal(all: false, duplicates_strategy: Ask)),
"<C-s>a": Save(kind: Modal(all: true, duplicates_strategy: Ask)),
"r": Rate(),
},
queue: {
"d": Delete,
"D": DeleteAll,
"<CR>": Play,
"C": JumpToCurrent,
"X": Shuffle,
},
),
search: (
case_sensitive: false,
ignore_diacritics: false,
search_button: true,
mode: Contains,
tags: [
(value: "any", label: "any tag"),
(value: "artist", label: "artist"),
(value: "album", label: "album"),
(value: "albumartist", label: "album artist"),
(value: "title", label: "title"),
(value: "filename", label: "filename"),
(value: "genre", label: "genre"),
],
),
artists: (
album_display_mode: SplitByDate,
album_sort_by: Date,
album_date_tags: [Date],
),
tabs: [
(
name: "queue",
pane: Split(
direction: Vertical,
panes: [
(
size: "100%",
pane: Split(
direction: Vertical,
panes: [
(
size: "1",
//borders: "ALL",
//border_symbols: Inherited(parent: Rounded, bottom_left: "├", bottom_right: "┤",),
pane: Split(
direction: Horizontal,
panes: [
/*(
size: "1",
pane: Pane(Empty())
),*/
(
size: "100%",
pane: Pane(QueueHeader())
),
]
)
),
(
size: "100%",
//borders: "LEFT | RIGHT | BOTTOM",
//border_symbols: Rounded,
pane: Split(
direction: Horizontal,
panes: [
/*(
size: "1",
pane: Pane(Empty())
),*/
(
size: "100%",
pane: Pane(Queue)
),
]
)
),
],
)
),
(
size: "8",
pane: Split(
direction: Horizontal,
panes: [
(
size: "19",
//borders: "", //LEFT | RIGHT | TOP",
//border_symbols: Rounded,
pane: Pane(AlbumArt)
),
(
size: "100%",
//borders: "", //ALL",
//border_symbols: Inherited(parent: Rounded, top_left: "├", top_right: "┤",),
//border_title: [(kind: Text(" Lyrics "))],
//border_title_alignment: Right,
pane: Component("column1"),
),
],
),
),
],
),
),
(
name: "directories",
pane: Split(
size: "100%",
direction: Vertical,
panes: [(pane: Pane(Directories), size: "100%")] //, borders: "ALL", border_symbols: Rounded)],
)
),
(
name: "album artists",
pane: Split(
size: "100%",
direction: Vertical,
panes: [(pane: Pane(AlbumArtists), size: "100%")] //, borders: "ALL", border_symbols: Rounded)],
)
),
(
name: "playlists",
pane: Split(
size: "100%",
direction: Vertical,
panes: [(pane: Pane(Playlists), size: "100%")] //, borders: "ALL", border_symbols: Rounded)],
)
),
(
name: "search",
pane: Split(
size: "100%",
direction: Vertical,
panes: [(pane: Pane(Search), size: "100%")] //, borders: "ALL", border_symbols: Rounded)],
)
),
],
)
+311
View File
@@ -0,0 +1,311 @@
#![enable(implicit_some)]
#![enable(unwrap_newtypes)]
#![enable(unwrap_variant_newtypes)]
(
default_album_art_path: None,
format_tag_separator: " | ",
browser_column_widths: [0,30,70],
background_color: None,
text_color: None,
header_background_color: None,
modal_background_color: None,
modal_backdrop: false,
preview_label_style: (fg: "#88c0d0"),
preview_metadata_group_style: (fg: "#88c0d0", modifiers: "Bold"),
highlighted_item_style: (fg: "#88c0d0", modifiers: "Bold"),
current_item_style: (fg: "#2e3440", bg: "#88c0d0", modifiers: "Bold"),
borders_style: (fg: "#88c0d0"),
highlight_border_style: (fg: "#88c0d0"),
symbols: (
song: "S",
dir: "D",
playlist: "P",
marker: "M",
ellipsis: "...",
song_style: (fg: "#88c0d0"),
dir_style: (fg: "#ebcb8b"),
playlist_style: (fg: "#b48ead"),
),
level_styles: (
info: (fg: "blue", bg: "black"),
warn: (fg: "yellow", bg: "black"),
error: (fg: "red", bg: "black"),
debug: (fg: "light_green", bg: "black"),
trace: (fg: "magenta", bg: "black"),
),
progress_bar: (
symbols: ["█", "█", "█", "█", "█"],
track_style: (fg: "#4c566a"),
elapsed_style: (fg: "#88c0d0"),
thumb_style: (fg: "#5e81ac"),
use_track_when_empty: true,
),
scrollbar: (
symbols: ["│", "█", "", ""],
track_style: (),
ends_style: (),
thumb_style: (fg: "#88c0d0"),
),
tab_bar: (
active_style: (fg: "#2e3440", bg: "#88c0d0"),
inactive_style: (fg: "#eceff4", bg: "#2e3440"),),
lyrics: (
timestamp: false
),
browser_song_format: [
(
kind: Group([
(kind: Property(Track)),
(kind: Text(" ")),
])
),
(
kind: Group([
(kind: Property(Artist)),
(kind: Text(" - ")),
(kind: Property(Title)),
]),
default: (kind: Property(Filename))
),
],
song_table_format: [
(
prop: (kind: Property(Artist), style: (fg: "#eceff4"),
default: (kind: Text("unknown"), style: (fg: "#eceff4"))
),
label_prop: (kind: Text("artist"), style: (fg: "#8fbcbb", modifiers: "Bold")),
width: "20%",
),
(
prop: (kind: Property(Title), style: (fg: "#eceff4"),
default: (kind: Text("unknown"), style: (fg: "#eceff4"))
),
label_prop: (kind: Text("title"), style: (fg: "#a3be8c", modifiers: "Bold")),
width: "35%",
),
(
prop: (kind: Property(Album), style: (fg: "#eceff4"),
default: (kind: Text("unknown"), style: (fg: "#eceff4"))
),
label_prop: (kind: Text("album"), style: (fg: "#b48ead", modifiers: "Bold")),
width: "30%",
),
(
prop: (kind: Property(Duration), style: (fg: "#eceff4"),
default: (kind: Text("-"), style: (fg: "#eceff4"))
),
label_prop: (kind: Text("duration"), style: (fg: "#ebcb8b", modifiers: "Bold")),
width: "15%",
alignment: Right,
),
],
layout: Split(
direction: Vertical,
panes: [
(
size: "1",
pane: Split(
direction: Horizontal,
panes: [
( pane: Pane(Tabs), size: "70" ),
( pane: Pane(Empty()), size: "100%" ),
],
),
),
(
pane: Pane(TabContent),
size: "100%",
),
(
size: "1",
pane: Split(
direction: Horizontal,
panes: [
(
size: "8",
pane: Component("input_mode")
),
(
size: "100%",
pane: Component("progress_bar"),
),
(
size: "20",
pane: Component("volume_and_state"),
)
]
),
),
],
),
components: {
"volume_and_state": Split(
direction: Horizontal,
panes: [
(size: "100%", pane: Component("volume")),
(size: "7", pane: Component("states")),
]
),
"column1": Split(
direction: Vertical,
panes: [
(size: "1", pane: Component("state")),
(size: "1", pane: Component("artist")),
(size: "1", pane: Component("album")),
(size: "1", pane: Component("track")),
(size: "1", pane: Component("title")),
(size: "1", pane: Component("date")),
(size: "1", pane: Component("elapsed")),
(size: "1", pane: Component("bitrate")),
]
),
"state": Pane(Property(
content: [
(kind: Text("state: "), style: (fg: "#88c0d0", modifiers: "Bold")),
(kind: Property(Status(StateV2( ))), style: (fg: "#eceff4")),
], align: Left, scroll_speed: 1
)),
"artist": Pane(Property(
content: [
(kind: Text("artist: "), style: (fg: "#88c0d0", modifiers: "Bold")),
(kind: Property(Song(Artist)), style: (fg: "#eceff4"),
default: (kind: Text("unknown"), style: (fg: "#eceff4"))),
], align: Left, scroll_speed: 1
)),
"album": Pane(Property(
content: [
(kind: Text("album: "), style: (fg: "#88c0d0", modifiers: "Bold")),
(kind: Property(Song(Album)), style: (fg: "#eceff4"),
default: (kind: Text("unknown"), style: (fg: "#eceff4"))),
], align: Left, scroll_speed: 1
)),
"track": Pane(Property(
content: [
(kind: Text("track: "), style: (fg: "#88c0d0", modifiers: "Bold")),
(kind: Property(Song(Track)), style: (fg: "#eceff4"),
default: (kind: Text("unknown"), style: (fg: "#eceff4"))),
], align: Left, scroll_speed: 1
)),
"title": Pane(Property(
content: [
(kind: Text("title: "), style: (fg: "#88c0d0", modifiers: "Bold")),
(kind: Property(Song(Title)), style: (fg: "#eceff4"),
default: (kind: Text("unknown"), style: (fg: "#eceff4"))),
], align: Left, scroll_speed: 1
)),
"date": Pane(Property(
content: [
(kind: Text("date: "), style: (fg: "#88c0d0", modifiers: "Bold")),
(kind: Property(Song(Other("date"))), style: (fg: "#eceff4"),
default: (kind: Text("unknown"), style: (fg: "#eceff4"))),
], align: Left, scroll_speed: 1
)),
"elapsed": Pane(Property(
content: [
(kind: Text("elapsed: "), style: (fg: "#88c0d0", modifiers: "Bold")),
(kind: Property(Status(Elapsed)), style: (fg: "#eceff4")),
(kind: Text(" / ")),
(kind: Property(Status(Duration)), style: (fg: "#eceff4")),
],
align: Left, scroll_speed: 1
)),
"bitrate": Pane(Property(
content: [
(kind: Text("bitrate: "), style: (fg: "#88c0d0", modifiers: "Bold")),
(kind: Property(Status(Bitrate)), style: (fg: "#eceff4")),
(kind: Text(" kbps"), style: (fg: "#eceff4")),
],
align: Left, scroll_speed: 1
)),
"volume": Split(
direction: Horizontal,
panes: [
(size: "100%", pane: Pane(Volume(kind: Slider(
symbols: (filled: "█", thumb: "█", track: "█"),
filled_style: (fg: "#d08770"),
track_style: (fg: "#4c566a"),
thumb_style: (fg: "#bf616a"),
)))),
], align: Right
),
"states": Split(
direction: Horizontal,
panes: [
(
size: "1",
pane: Pane(Empty())
),
(
size: "100%",
pane: Pane(Property(content: [(kind: Property(Status(InputBuffer())), style: (fg: "blue"), align: Right)]))
),
(
size: "1",
pane: Pane(Empty())
),
(
size: "6",
pane: Pane(Property(content: [
(kind: Text(" "), style: (bg: "#4c566a")),
(kind: Property(Status(RepeatV2(
on_label: "z",
off_label: "z",
on_style: (fg: "#ebcb8b", bg: "#4c566a", modifiers: "Bold"),
off_style: (fg: "#eceff4", bg: "#4c566a"),
)))),
(kind: Property(Status(RandomV2(
on_label: "x",
off_label: "x",
on_style: (fg: "#ebcb8b", bg: "#4c566a", modifiers: "Bold"),
off_style: (fg: "#eceff4", bg: "#4c566a"),
)))),
(kind: Property(Status(ConsumeV2(
on_label: "c",
off_label: "c",
oneshot_label: "c",
on_style: (fg: "#ebcb8b", bg: "#4c566a", modifiers: "Bold"),
off_style: (fg: "#eceff4", bg: "#4c566a"),
oneshot_style: (fg: "#d08770", bg: "#4c566a", modifiers: "Bold"),
)))),
(kind: Property(Status(SingleV2(
on_label: "v",
off_label: "v",
oneshot_label: "v",
on_style: (fg: "#ebcb8b", bg: "#4c566a", modifiers: "Bold"),
off_style: (fg: "#eceff4", bg: "#4c566a"),
oneshot_style: (fg: "#d08770", bg: "#4c566a", modifiers: "Bold"),
)))),
(kind: Text(" "), style: (bg: "#4c566a")),
],
align: Right
))
),
]
),
"input_mode": Pane(Property(
content: [
(kind: Transform(Replace(content: (kind: Property(Status(InputMode()))), replacements: [
(match: "Normal", replace: (kind: Text(" normal "), style: (fg: "#eceff4", bg: "#4c566a"))),
(match: "Insert", replace: (kind: Text(" insert "), style: (fg: "#2e3440", bg: "#a3be8c"))),
])))
], align: Left
)),
"progress_bar": Split(
direction: Horizontal,
panes: [
(
size: "1",
pane: Pane(Empty())
),
(
size: "100%",
pane: Pane(ProgressBar)
),
(
size: "1",
pane: Pane(Empty())
),
]
)
},
)