commit 5a151b2ea4584a2b3f8d04a00dedabbf05cd4310 Author: fi3w0 Date: Sat Oct 3 04:51:31 2026 +0200 Add Gentoo restoration presets, optional configs and selection TUI diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f25de7c --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/local/ +/build/ +__pycache__/ +*.pyc +.DS_Store +AGENTS.md +agents.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b1cc67b --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Fiw + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..bae1f9f --- /dev/null +++ b/README.md @@ -0,0 +1,149 @@ +
+ +# Fiw-Gentoo-Dots + +**My Gentoo setup, ready to make home feel like home again.** + +![Gentoo](https://img.shields.io/badge/Gentoo-54487A?logo=gentoo&logoColor=white) +![KDE Plasma](https://img.shields.io/badge/KDE_Plasma-1D99F3?logo=kde&logoColor=white) +![License](https://img.shields.io/badge/license-MIT-purple) +![Status](https://img.shields.io/badge/status-work_in_progress-yellow) + +[KDE & apps](#configs) · [Packages](#package-sections) · [Setup](docs/setup.md) · [Decisions](docs/DECISIONS.md) + +
+ +--- + +## Overview + +A personal Gentoo rice and restoration kit: my Plasma styling, current +shortcuts, package lists and the app preferences I use every day. Built +mainly for my own devices, with deliberate updates and a preview before +anything is applied. + +- **KDE first:** colours, fonts, cursor, window styling and current keybinds. +- **Pick what you want:** package sections and individually optional app configs. +- **Portable terminals:** Fish, Kitty and Neovim work across compositors. +- **Binaries preferred:** a small source list, with a choice before extra builds. +- **Keep your edits:** conflict prompts, backups and `.new` proposals on updates. + +**Work in progress:** configuration restoration and the TUI are ready for review. +Package installation needs a supervised first run on a fresh Gentoo system. +The existing installation has not been changed by creating this repo. + +## Start + +```sh +git clone https://git.fiwlabs.dev/fiwdev/Fiw-Gentoo-Dots.git +cd Fiw-Gentoo-Dots +./install +``` + +The Bubble Tea interface offers a preset, package sections, individual app +configs, kernel/bootloader choices, extras, and a final preview. Enter at the +preview saves a selection without applying it. `a` restores configs; `i` +starts the package installation workflow with sudo. Go 1.24+ builds the TUI; +Python 3.11+ runs the backend. Go dependencies are recorded in go.mod/go.sum. + +For a preview without building the TUI: + +```sh +./install --plan --profile stock +./install --plan --profile fiw-ryzen +``` + +See [setup](docs/setup.md) for installation steps and draft limitations. + +## Presets + +| Preset | Build settings | Kernel | +|---|---|---| +| Stock | Portable compiler settings; binary packages preferred | Generic Gentoo binary kernel | +| Fiw's Ryzen | Current Ryzen 9900X/Zen 5 tuning and NVIDIA configuration | Tested custom kernel plus generic binary fallback | + +Both deliberately compile Fastfetch, jq and zip. Custom kernels and their +matching external modules compile when selected. Other packages prefer +Portage binaries or upstream `-bin` packages. Additional source builds +require a compile-or-skip choice, with compilation recommended; skipped +dependencies also cause dependent requested applications to be skipped. + +The custom kernel snapshot currently targets 7.2.8 with the tested +CachyOS 7.2.7-1 patch. Refresh it explicitly when updating the snapshot. + +## Package sections + +| List | Contents | +|---|---| +| [kde](packages/kde.list) | Plasma, Plasma Login Manager, desktop components and supporting fonts | +| [fiw-apps](packages/fiw-apps.list) | Everyday apps including Dolphin, Ark, Gwenview and Spectacle | +| [cli](packages/cli.list) | Shell, terminal utilities and FFmpeg | +| [dev](packages/dev.list) | Languages and development tools | +| [gaming](packages/gaming.list) | Steam, Proton, Prism, MangoHud and r2modman; Sober is in flatpaks/gaming.list | +| [system](packages/system.list) | System utilities; the selected kernels are added by the installer | +| [fiw-tools](packages/fiw-tools.list) | OpenDeck and Music Presence; FiwNode and Apdatifier packaging is pending | +| [tidewm](packages/tidewm.list) | Optional compositor and supporting utilities | + +Filelight, NVIDIA drivers and Btrfs tools are separate extras. Ext4 does not +require Btrfs tools. LocalSend is an optional Flatpak in the apps section. +Limine and GRUB are optional alternatives; retaining the current loader is +the default. Kernel choice is independent of bootloader choice. + +## Configs + +Every config is independently selectable. KDE appearance covers colours, +fonts, cursor, window decorations and Dolphin styling. Panels, widgets and +wallpapers are excluded. All portable current shortcut assignments, +including disabled defaults, are captured with their launchers and helpers; +unused machine-specific activity IDs are omitted. + +Fish, Kitty and Neovim are usable without KDE or KWin. Fastfetch keeps the +tree layout and purple colours with the built-in Gentoo logo. MangoHud and +Vesktop preferences are included; browser profiles, chat sessions and account +data are excluded. App autostart is a separate optional selection. + +Spotify is stock by default. The existing customization scripts remain an +[explicit optional step](docs/spotify.md). [Firefox-Privacy](docs/firefox.md) +is also optional. + +Existing differences prompt apply-or-keep and get backups when replaced. +Updates leave locally edited configs intact and write the proposal to `.new`. +KConfig patches preserve unrelated keys and groups; JSON patches preserve +unrelated preferences and login data already on the target device. + +## Project layout + +```text +cmd/dots/ Bubble Tea selection interface +configs/ Optional KDE and app configs +packages/ Categorized Portage package lists +presets/ Stock and Fiw's Ryzen defaults +portage/ Build settings and binary preferences +overlay/ Selected additional packages +optional/ Kernel, boot and app helpers +flatpaks/ Separate optional Flatpak lists +docs/ Setup, decisions and asset credits +``` + +## Maintenance + +```sh +python3 tools/capture.py # recapture only the explicit allowlist +python3 tools/check-private.py +python3 -m unittest discover -s tests +go test ./... +``` + +Review captures before committing. `local/` and built binaries are ignored. +This repo starts with fresh history. Third-party theme/cursor assets retain +their licence notices; overlay ebuilds retain their original notices. + +## License + +Original code and configuration contributions are licensed under [MIT](LICENSE). +Bundled third-party assets, fonts, patches and ebuilds keep their own licences +and attribution; see [asset credits](docs/assets.md). + +--- + +
A personal Gentoo setup by Fiw.
diff --git a/cmd/dots/main.go b/cmd/dots/main.go new file mode 100644 index 0000000..3ae913b --- /dev/null +++ b/cmd/dots/main.go @@ -0,0 +1,406 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "os/exec" + "path/filepath" + "sort" + "strings" + + tea "github.com/charmbracelet/bubbletea" +) + +type selection struct { + Name string `json:"name"` + Profile string `json:"profile"` + Groups []string `json:"groups"` + Configs []string `json:"configs"` + Kernel string `json:"kernel"` + Bootloader string `json:"bootloader"` + Extras []string `json:"extras"` + Firefox bool `json:"firefox_privacy"` + Spotify bool `json:"spotify_custom"` +} +type config struct { + Label string `json:"label"` + Group string `json:"group"` +} +type catalog struct { + Groups []string `json:"groups"` + Configs map[string]config `json:"configs"` + Extras map[string]string `json:"extras"` + Stock selection `json:"stock"` + Ryzen selection `json:"ryzen"` +} +type row struct { + id, label string + checked bool +} +type previewMsg struct { + content string + err error +} +type model struct { + repo string + catalog catalog + selection selection + rows []row + stage, cursor, height, scroll int + preview, errorText, action string + done, loading bool +} + +func contains(values []string, target string) bool { + for _, value := range values { + if value == target { + return true + } + } + return false +} +func (m model) Init() tea.Cmd { return nil } +func (m *model) prepare() { + m.cursor, m.scroll = 0, 0 + m.rows = nil + switch m.stage { + case 0: + m.rows = []row{{"stock", "Stock — binary kernel, portable build settings", m.selection.Profile == "stock"}, {"fiw-ryzen", "Fiw's Ryzen — current Zen 5 tuning, custom + binary fallback", m.selection.Profile == "fiw-ryzen"}} + if m.selection.Profile == "fiw-ryzen" { + m.cursor = 1 + } + case 1: + for _, id := range m.catalog.Groups { + label := id + if id == "tidewm" { + label += " (optional)" + } + m.rows = append(m.rows, row{id, label, contains(m.selection.Groups, id)}) + } + case 2: + ids := make([]string, 0, len(m.catalog.Configs)) + for id := range m.catalog.Configs { + if id != "autostart" { + ids = append(ids, id) + } + } + sort.Strings(ids) + for _, id := range ids { + c := m.catalog.Configs[id] + if c.Group != "" && !contains(m.selection.Groups, c.Group) { + continue + } + m.rows = append(m.rows, row{id, c.Label, contains(m.selection.Configs, id)}) + } + case 3: + m.rows = []row{ + {"binary", "Kernel: generic binary", m.selection.Kernel == "binary"}, + {"custom", "Kernel: custom + generic binary fallback", m.selection.Kernel == "custom"}, + {"keep", "Bootloader: keep existing", m.selection.Bootloader == "keep"}, + {"limine", "Bootloader: optional Limine", m.selection.Bootloader == "limine"}, + {"grub", "Bootloader: optional GRUB", m.selection.Bootloader == "grub"}, + } + for _, id := range []string{"nvidia", "btrfs", "filelight"} { + m.rows = append(m.rows, row{id, m.catalog.Extras[id], contains(m.selection.Extras, id)}) + } + m.rows = append(m.rows, row{"autostart", "Optional app autostart", contains(m.selection.Configs, "autostart")}, row{"firefox", "Optional Firefox-Privacy setup", m.selection.Firefox}, row{"spotify", "Optional Spotify customization script (stock by default)", m.selection.Spotify}) + } +} +func (m *model) remember() { + switch m.stage { + case 1: + m.selection.Groups = []string{} + for _, r := range m.rows { + if r.checked { + m.selection.Groups = append(m.selection.Groups, r.id) + } + } + case 2: + autostart := contains(m.selection.Configs, "autostart") + m.selection.Configs = []string{} + for _, r := range m.rows { + if r.checked { + m.selection.Configs = append(m.selection.Configs, r.id) + } + } + if autostart { + m.selection.Configs = append(m.selection.Configs, "autostart") + } + case 3: + m.selection.Extras = []string{} + for _, r := range m.rows { + if _, ok := m.catalog.Extras[r.id]; ok && r.checked { + m.selection.Extras = append(m.selection.Extras, r.id) + } + if r.checked && (r.id == "binary" || r.id == "custom") { + m.selection.Kernel = r.id + } + if r.checked && (r.id == "keep" || r.id == "limine" || r.id == "grub") { + m.selection.Bootloader = r.id + } + if r.id == "firefox" { + m.selection.Firefox = r.checked + } + if r.id == "spotify" { + m.selection.Spotify = r.checked + } + } + configNames := []string{} + for _, id := range m.selection.Configs { + if id != "autostart" { + configNames = append(configNames, id) + } + } + for _, r := range m.rows { + if r.id == "autostart" && r.checked { + configNames = append(configNames, "autostart") + } + } + m.selection.Configs = configNames + } +} +func (m model) makePreview() tea.Cmd { + return func() tea.Msg { + file, err := os.CreateTemp("", "fiw-dots-selection-*.json") + if err != nil { + return previewMsg{err: err} + } + defer os.Remove(file.Name()) + data, err := json.Marshal(m.selection) + if err == nil { + _, err = file.Write(data) + } + file.Close() + if err != nil { + return previewMsg{err: err} + } + cmd := exec.Command("python3", filepath.Join(m.repo, "lib", "rice.py"), "--plan", "--selection", file.Name()) + output, err := cmd.CombinedOutput() + return previewMsg{string(output), err} + } +} +func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch v := msg.(type) { + case tea.WindowSizeMsg: + m.height = v.Height + case previewMsg: + m.loading = false + m.preview = v.content + if v.err != nil { + m.errorText = v.err.Error() + } + case tea.KeyMsg: + key := v.String() + if key == "ctrl+c" || key == "q" { + return m, tea.Quit + } + if m.loading { + return m, nil + } + if m.stage == 4 { + switch key { + case "up", "k": + if m.scroll > 0 { + m.scroll-- + } + case "down", "j": + if m.scroll < len(strings.Split(m.preview, "\n"))-1 { + m.scroll++ + } + case "esc": + m.stage-- + m.prepare() + case "enter", "s", "a", "i": + if m.errorText == "" { + m.done = true + m.action = key + return m, tea.Quit + } + } + return m, nil + } + switch key { + case "up", "k": + if m.cursor > 0 { + m.cursor-- + } + case "down", "j": + if m.cursor < len(m.rows)-1 { + m.cursor++ + } + case " ": + if len(m.rows) == 0 { + break + } + if m.stage == 0 { + if m.rows[m.cursor].id == "stock" { + m.selection = m.catalog.Stock + } else { + m.selection = m.catalog.Ryzen + } + m.prepare() + } else { + id := m.rows[m.cursor].id + if m.stage == 3 && (id == "binary" || id == "custom") { + for i := range m.rows { + if m.rows[i].id == "binary" || m.rows[i].id == "custom" { + m.rows[i].checked = false + } + } + m.rows[m.cursor].checked = true + } else if m.stage == 3 && (id == "keep" || id == "limine" || id == "grub") { + for i := range m.rows { + if m.rows[i].id == "keep" || m.rows[i].id == "limine" || m.rows[i].id == "grub" { + m.rows[i].checked = false + } + } + m.rows[m.cursor].checked = true + } else { + m.rows[m.cursor].checked = !m.rows[m.cursor].checked + } + } + case "enter": + if m.stage == 0 { + if m.rows[m.cursor].id == "stock" { + m.selection = m.catalog.Stock + } else { + m.selection = m.catalog.Ryzen + } + } + m.remember() + m.stage++ + if m.stage == 4 { + m.loading = true + m.errorText = "" + return m, m.makePreview() + } + m.prepare() + case "esc": + if m.stage > 0 { + m.remember() + m.stage-- + m.prepare() + } + } + } + return m, nil +} + +func (m model) View() string { + const purple = "\033[38;2;157;143;217m" + const reset = "\033[0m" + titles := []string{"Preset", "Package sections", "Optional app configs", "Kernel, bootloader and extras", "Final preview"} + text := purple + " Fiw-Gentoo-Dots\n" + reset + " " + titles[m.stage] + " · " + m.selection.Name + "\n\n" + budget := m.height - 10 + if budget < 5 { + budget = 5 + } + if m.stage == 4 { + if m.loading { + return text + " Preparing preview…\n" + } + lines := strings.Split(m.preview, "\n") + end := m.scroll + budget + if end > len(lines) { + end = len(lines) + } + for _, line := range lines[m.scroll:end] { + text += " " + line + "\n" + } + text += "\n ↑/↓ scroll · Esc back · Enter save plan · a restore configs · i install packages\n q cancel\n" + if m.errorText != "" { + text += " " + m.errorText + "\n" + } + return text + } + start := 0 + if m.cursor >= budget { + start = m.cursor - budget + 1 + } + end := start + budget + if end > len(m.rows) { + end = len(m.rows) + } + for i := start; i < end; i++ { + r := m.rows[i] + mark := "[ ]" + if r.checked { + mark = "[✓]" + } + cursor := " " + if m.cursor == i { + cursor = "› " + } + line := " " + cursor + mark + " " + r.label + if m.cursor == i { + line = purple + line + reset + } + text += line + "\n" + } + return text + "\n ↑/↓ move · Space select · Enter next · Esc back · q cancel\n" +} + +func main() { + repo, err := os.Getwd() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + output, err := exec.Command("python3", filepath.Join(repo, "lib", "rice.py"), "--catalog").Output() + if err != nil { + fmt.Fprintln(os.Stderr, "Cannot load the installer catalogue:", err) + os.Exit(1) + } + var c catalog + if err := json.Unmarshal(output, &c); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + m := model{repo: repo, catalog: c, selection: c.Stock, height: 28} + m.prepare() + result, err := tea.NewProgram(m, tea.WithAltScreen()).Run() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + final := result.(model) + if !final.done { + return + } + path := filepath.Join(repo, "local", "selection.json") + if err := os.MkdirAll(filepath.Dir(path), 0700); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + data, _ := json.MarshalIndent(final.selection, "", " ") + if err := os.WriteFile(path, append(data, '\n'), 0600); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + fmt.Println(final.preview) + fmt.Println("\nSaved selection:", path) + args := []string{filepath.Join(repo, "lib", "rice.py"), "--selection", path} + switch final.action { + case "a": + args = append(args, "--apply-configs") + case "i": + args = append([]string{"python3"}, args...) + args = append(args, "--install-packages") + default: + fmt.Println("Review the setup notes in docs/setup.md before applying.") + return + } + program := "python3" + if final.action == "i" { + program = "sudo" + } + cmd := exec.Command(program, args...) + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/cmd/dots/main_test.go b/cmd/dots/main_test.go new file mode 100644 index 0000000..31ba992 --- /dev/null +++ b/cmd/dots/main_test.go @@ -0,0 +1,41 @@ +package main + +import ( + tea "github.com/charmbracelet/bubbletea" + "testing" +) + +func TestRyzenSelectionSurvivesSpaceAndEnter(t *testing.T) { + c := catalog{Stock: selection{Name: "Stock", Profile: "stock"}, Ryzen: selection{Name: "Fiw's Ryzen", Profile: "fiw-ryzen"}} + m := model{catalog: c, selection: c.Stock} + m.prepare() + m.cursor = 1 + next, _ := m.Update(tea.KeyMsg{Type: tea.KeySpace}) + m = next.(model) + next, _ = m.Update(tea.KeyMsg{Type: tea.KeyEnter}) + m = next.(model) + if m.selection.Profile != "fiw-ryzen" || m.stage != 1 { + t.Fatalf("selected wrong preset: %+v", m.selection) + } +} + +func TestBootloaderChoicesAreExclusive(t *testing.T) { + m := model{stage: 3, selection: selection{Kernel: "binary", Bootloader: "keep"}, catalog: catalog{Extras: map[string]string{}}} + m.prepare() + m.cursor = 4 + next, _ := m.Update(tea.KeyMsg{Type: tea.KeySpace}) + m = next.(model) + m.remember() + if m.selection.Bootloader != "grub" { + t.Fatal("GRUB was not selected") + } + selected := 0 + for _, r := range m.rows { + if r.checked && (r.id == "keep" || r.id == "limine" || r.id == "grub") { + selected++ + } + } + if selected != 1 { + t.Fatal("multiple bootloaders selected") + } +} diff --git a/configs/autostart/files/.config/autostart/musicpresence.desktop b/configs/autostart/files/.config/autostart/musicpresence.desktop new file mode 100644 index 0000000..5a2a4eb --- /dev/null +++ b/configs/autostart/files/.config/autostart/musicpresence.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Application +Name=Music Presence +Exec=musicpresence +X-GNOME-Autostart-enabled=true +X-KDE-autostart-after=panel diff --git a/configs/autostart/files/.config/autostart/opendeck.desktop b/configs/autostart/files/.config/autostart/opendeck.desktop new file mode 100644 index 0000000..254f620 --- /dev/null +++ b/configs/autostart/files/.config/autostart/opendeck.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Type=Application +Version=1.0 +Name=opendeck +Comment=opendeckstartup script +Exec=/usr/bin/opendeck --hide +StartupNotify=false +Terminal=false \ No newline at end of file diff --git a/configs/autostart/files/.config/autostart/spotify.desktop b/configs/autostart/files/.config/autostart/spotify.desktop new file mode 100644 index 0000000..829589a --- /dev/null +++ b/configs/autostart/files/.config/autostart/spotify.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Application +Name=Spotify +Exec=spotify --enable-features=UseOzonePlatform --ozone-platform=wayland +X-GNOME-Autostart-enabled=true +X-KDE-autostart-after=panel diff --git a/configs/autostart/files/.config/autostart/steam.desktop b/configs/autostart/files/.config/autostart/steam.desktop new file mode 100644 index 0000000..80111aa --- /dev/null +++ b/configs/autostart/files/.config/autostart/steam.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Application +Name=Steam +Exec=steam -silent +X-GNOME-Autostart-enabled=true +X-KDE-autostart-after=panel diff --git a/configs/autostart/files/.config/autostart/vesktop.desktop b/configs/autostart/files/.config/autostart/vesktop.desktop new file mode 100644 index 0000000..08689e9 --- /dev/null +++ b/configs/autostart/files/.config/autostart/vesktop.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Application +Name=Vesktop +Exec=/usr/bin/vesktop-bin --start-minimized +X-GNOME-Autostart-enabled=true +X-KDE-autostart-after=panel diff --git a/configs/autostart/kconfig/.config/kwinrulesrc b/configs/autostart/kconfig/.config/kwinrulesrc new file mode 100644 index 0000000..0c676c6 --- /dev/null +++ b/configs/autostart/kconfig/.config/kwinrulesrc @@ -0,0 +1,27 @@ +[General] +rules=fiw-autostart-minimized-discord,fiw-autostart-minimized-opendeck,fiw-autostart-minimized-spotify +count=3 + +[fiw-autostart-minimized-discord] +Description=Start Discord minimized +minimize=true +minimizerule=3 +types=1 +wmclass=discord +wmclassmatch=1 + +[fiw-autostart-minimized-opendeck] +Description=Start OpenDeck minimized +minimize=true +minimizerule=3 +types=1 +wmclass=opendeck +wmclassmatch=1 + +[fiw-autostart-minimized-spotify] +Description=Start Spotify minimized +minimize=true +minimizerule=3 +types=1 +wmclass=spotify +wmclassmatch=1 diff --git a/configs/catalog.json b/configs/catalog.json new file mode 100644 index 0000000..be17b19 --- /dev/null +++ b/configs/catalog.json @@ -0,0 +1,59 @@ +{ + "kde-style": { + "label": "KDE colours, fonts, cursor and decorations", + "group": "kde", + "kde": true + }, + "kde-shortcuts": { + "label": "All KDE shortcuts + keyboard layouts + screenshot helpers", + "group": "kde", + "kde": true + }, + "dolphin": { + "label": "Dolphin toolbar, sidebar and transparency", + "group": "fiw-apps", + "kde": true + }, + "spectacle": { + "label": "Spectacle capture preferences", + "group": "fiw-apps", + "kde": true + }, + "fish": { + "label": "Fish aliases, greeting and notification settings", + "group": "cli" + }, + "kitty": { + "label": "Kitty lavender profiles", + "group": "fiw-apps" + }, + "neovim": { + "label": "Neovim transparent purple style", + "group": "cli" + }, + "fastfetch": { + "label": "Fastfetch tree layout with Gentoo logo", + "group": "cli" + }, + "mangohud": { + "label": "MangoHud appearance and detail presets", + "group": "gaming" + }, + "vesktop": { + "label": "Vesktop preferences (no account data)", + "group": "fiw-apps" + }, + "vscode": { + "label": "VS Code preferences", + "group": "fiw-apps" + }, + "autostart": { + "label": "Optional application autostart", + "group": null, + "kde": true + }, + "fonts": { + "label": "JetBrainsMono Nerd Font Mono (four styles)", + "group": null + } +} diff --git a/configs/dolphin/files/.local/share/kxmlgui5/dolphin/dolphinui.rc b/configs/dolphin/files/.local/share/kxmlgui5/dolphin/dolphinui.rc new file mode 100644 index 0000000..acabb73 --- /dev/null +++ b/configs/dolphin/files/.local/share/kxmlgui5/dolphin/dolphinui.rc @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Location Bar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Toolbar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/dolphin/kconfig/.config/dolphinrc b/configs/dolphin/kconfig/.config/dolphinrc new file mode 100644 index 0000000..3ccfacd --- /dev/null +++ b/configs/dolphin/kconfig/.config/dolphinrc @@ -0,0 +1,6 @@ +[KFileDialog Settings] +Places Icons Auto-resize=false +Places Icons Static Size=22 + +[MainWindow] +MenuBar=Disabled diff --git a/configs/dolphin/kconfig/.config/kwinrulesrc b/configs/dolphin/kconfig/.config/kwinrulesrc new file mode 100644 index 0000000..9bac00b --- /dev/null +++ b/configs/dolphin/kconfig/.config/kwinrulesrc @@ -0,0 +1,13 @@ +[General] +rules=fiw-dolphin-opacity +count=1 + +[fiw-dolphin-opacity] +Description=Dolphin transparency +opacityactive=96 +opacityactiverule=2 +opacityinactive=92 +opacityinactiverule=2 +types=1 +wmclass=org.kde.dolphin +wmclassmatch=1 diff --git a/configs/dolphin/kconfig/.local/state/dolphinstaterc b/configs/dolphin/kconfig/.local/state/dolphinstaterc new file mode 100644 index 0000000..4a8afb4 --- /dev/null +++ b/configs/dolphin/kconfig/.local/state/dolphinstaterc @@ -0,0 +1,6 @@ +[FilterBar] +caseSensitive=false +filterMode=1 + +[State] +State=AAAA/wAAAAD9AAAAAwAAAAAAAACNAAADyvwCAAAAAvsAAAAWAGYAbwBsAGQAZQByAHMARABvAGMAawgAAAAuAAAArAAAAAAA////+wAAABQAcABsAGEAYwBlAHMARABvAGMAawEAAAAuAAADygAAAFMA////AAAAAQAAAKwAAAKf/AIAAAAB+wAAABAAaQBuAGYAbwBEAG8AYwBrCAAAAC4AAAKfAAAAAAD///8AAAADAAAEugAAAED8AQAAAAH7AAAAGAB0AGUAcgBtAGkAbgBhAGwARABvAGMAawgAAAAAAAAEugAAAAAA////AAAEZAAAA8oAAAAEAAAABAAAAAgAAAAI/AAAAAEAAAACAAAAAQAAABYAbQBhAGkAbgBUAG8AbwBsAEIAYQByAQAAAAD/////AAAAAAAAAAA= diff --git a/configs/fastfetch/files/.config/fastfetch/config.jsonc b/configs/fastfetch/files/.config/fastfetch/config.jsonc new file mode 100644 index 0000000..22539fe --- /dev/null +++ b/configs/fastfetch/files/.config/fastfetch/config.jsonc @@ -0,0 +1,139 @@ +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", + "logo": { + "source": "gentoo", + "type": "builtin", + "padding": { + "top": 1, + "right": 3 + } + }, + "display": { + "separator": " ", + "color": { + "keys": "#9D8FD9", + "title": "#DDDAEC" + } + }, + "modules": [ + { + "type": "title", + "format": "{user-name}@{host-name}" + }, + "break", + { + "type": "custom", + "format": "\u001b[1;38;2;157;143;217m system" + }, + { + "type": "os", + "key": " \u251c \uf30d os ", + "keyColor": "#9D8FD9" + }, + { + "type": "kernel", + "key": " \u251c \uf013 kernel ", + "keyColor": "#9D8FD9" + }, + { + "type": "command", + "key": " \u251c \udb82\udce8 profile ", + "keyColor": "#9D8FD9", + "text": "readlink /etc/portage/make.profile | sed 's#.*/profiles/default/linux/amd64/##'" + }, + { + "type": "packages", + "key": " \u251c \udb80\udfd6 pkgs ", + "keyColor": "#9D8FD9" + }, + { + "type": "de", + "key": " \u251c \uf488 desktop ", + "keyColor": "#9D8FD9" + }, + { + "type": "wm", + "key": " \u251c \udb81\uddb2 session ", + "keyColor": "#9D8FD9" + }, + { + "type": "terminal", + "key": " \u251c \uf489 term ", + "keyColor": "#9D8FD9" + }, + { + "type": "shell", + "key": " \u2514 \uf120 shell ", + "keyColor": "#9D8FD9" + }, + "break", + { + "type": "custom", + "format": "\u001b[1;38;2;185;174;230m hardware" + }, + { + "type": "host", + "key": " \u251c \udb80\udf22 board ", + "keyColor": "#B9AEE6" + }, + { + "type": "cpu", + "key": " \u251c \uf4bc cpu ", + "keyColor": "#B9AEE6", + "format": "{1}" + }, + { + "type": "gpu", + "key": " \u251c \udb82\udcae gpu ", + "keyColor": "#B9AEE6", + "format": "{2}", + "hideType": "integrated" + }, + { + "type": "memory", + "key": " \u251c \udb80\udf5b mem ", + "keyColor": "#B9AEE6" + }, + { + "type": "disk", + "key": " \u251c \udb80\udeca disk ", + "keyColor": "#B9AEE6", + "folders": "/", + "showReadOnly": false + }, + { + "type": "display", + "key": " \u2514 \udb80\udf79 display ", + "keyColor": "#B9AEE6", + "compactType": "original-with-refresh-rate" + }, + "break", + { + "type": "custom", + "format": "\u001b[1;38;2;221;218;236m uptime" + }, + { + "type": "command", + "key": " \u251c \udb86\udd9f os age ", + "keyColor": "#DDDAEC", + "text": "birth=$(stat -c %W /); now=$(date +%s); echo $(( (now - birth) / 86400 )) days" + }, + { + "type": "uptime", + "key": " \u251c \udb81\udd1b uptime ", + "keyColor": "#DDDAEC" + }, + { + "type": "command", + "key": " \u2514 \udb82\udd54 time ", + "keyColor": "#DDDAEC", + "text": "date '+%I:%M %p \u00b7 %Y-%m-%d'" + }, + "break", + { + "type": "colors", + "paddingLeft": 2, + "symbol": "circle" + } + ] +} diff --git a/configs/fish/files/.config/fish/conf.d/done.fish b/configs/fish/files/.config/fish/conf.d/done.fish new file mode 100644 index 0000000..9252660 --- /dev/null +++ b/configs/fish/files/.config/fish/conf.d/done.fish @@ -0,0 +1,340 @@ +# MIT License + +# Copyright (c) 2016 Francisco Lourenço & Daniel Wehner + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +if not status is-interactive + exit +end + +set -g __done_version 1.19.1 + +function __done_run_powershell_script + set -l powershell_exe (command --search "powershell.exe") + + if test $status -ne 0 + and command --search wslvar + + set -l powershell_exe (wslpath (wslvar windir)/System32/WindowsPowerShell/v1.0/powershell.exe) + end + + if string length --quiet "$powershell_exe" + and test -x "$powershell_exe" + + set cmd (string escape $argv) + + eval "$powershell_exe -Command $cmd" + end +end + +function __done_windows_notification -a title -a message + if test "$__done_notify_sound" -eq 1 + set soundopt "