aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md161
-rw-r--r--CODE_OF_CONDUCT.es.md81
-rw-r--r--COMMIT_MESSAGE_GUIDELINES.es.md148
-rw-r--r--CONTRIBUTING.es.md69
-rwxr-xr-xDistro-Hyprland.sh14
-rw-r--r--README.md37
-rwxr-xr-xarchive/release.sh (renamed from release.sh)0
-rwxr-xr-xarchive/upgrade.sh (renamed from upgrade.sh)0
-rw-r--r--config/ghostty/ghostty.config29
-rw-r--r--config/hypr/UserConfigs/UserDecorations.conf14
-rwxr-xr-xconfig/hypr/UserScripts/RainbowBorders.bak.sh89
-rwxr-xr-xconfig/hypr/UserScripts/RainbowBorders.sh14
-rwxr-xr-xconfig/hypr/UserScripts/WallpaperEffects.sh40
-rwxr-xr-xconfig/hypr/UserScripts/WallpaperRandom.sh5
-rwxr-xr-xconfig/hypr/UserScripts/WallpaperSelect.sh47
-rwxr-xr-xconfig/hypr/UserScripts/Weather.sh46
-rwxr-xr-xconfig/hypr/UserScripts/WeatherWrap.sh26
-rw-r--r--config/hypr/configs/Keybinds.conf15
-rw-r--r--config/hypr/configs/Startup_Apps.conf27
-rw-r--r--config/hypr/configs/SystemSettings.conf5
-rw-r--r--config/hypr/configs/WindowRules-config-v3.conf65
-rw-r--r--config/hypr/configs/WindowRules-pre-53.conf4
-rw-r--r--config/hypr/configs/WindowRules.conf95
-rw-r--r--config/hypr/hyprlock-2k.conf183
-rwxr-xr-xconfig/hypr/initial-boot.sh3
-rwxr-xr-xconfig/hypr/scripts/ChangeLayout.sh31
-rwxr-xr-xconfig/hypr/scripts/DarkLight.sh15
-rwxr-xr-xconfig/hypr/scripts/Distro_update.sh2
-rwxr-xr-xconfig/hypr/scripts/Hypridle.sh3
-rwxr-xr-xconfig/hypr/scripts/KeyBinds.sh136
-rwxr-xr-xconfig/hypr/scripts/KeyHints.sh3
-rwxr-xr-xconfig/hypr/scripts/KeyboardLayout.sh119
-rwxr-xr-xconfig/hypr/scripts/KillActiveProcess.sh7
-rwxr-xr-xconfig/hypr/scripts/KooLsDotsUpdate.sh12
-rwxr-xr-xconfig/hypr/scripts/Kool_Quick_Settings.sh153
-rwxr-xr-xconfig/hypr/scripts/PortalHyprland.sh40
-rwxr-xr-xconfig/hypr/scripts/RofiSearch.sh15
-rwxr-xr-xconfig/hypr/scripts/ScreenShot.sh3
-rwxr-xr-xconfig/hypr/scripts/Sounds.sh17
-rwxr-xr-xconfig/hypr/scripts/SwitchKeyboardLayout.sh103
-rwxr-xr-xconfig/hypr/scripts/Tak0-Per-Window-Switch.sh20
-rwxr-xr-xconfig/hypr/scripts/ThemeChanger.sh145
-rwxr-xr-xconfig/hypr/scripts/TouchPad.sh48
-rwxr-xr-xconfig/hypr/scripts/Volume.sh132
-rwxr-xr-xconfig/hypr/scripts/WallustSwww.sh81
-rwxr-xr-xconfig/hypr/scripts/WaybarScripts.sh10
-rwxr-xr-xconfig/hypr/scripts/keybinds_parser.py245
-rwxr-xr-xconfig/hypr/scripts/sddm_wallpaper.sh51
-rwxr-xr-xconfig/hypr/scripts/update_WindowRules.sh60
-rw-r--r--config/hypr/v2.3.19 (renamed from config/hypr/v2.3.18)0
-rw-r--r--config/kitty/kitty-themes/00-Default.conf1
-rw-r--r--config/rofi/themes/KooL_style-1.rasi2
-rw-r--r--config/rofi/themes/KooL_style-13-Vertical.rasi2
-rw-r--r--config/rofi/themes/KooL_style-14.rasi2
-rw-r--r--config/rofi/themes/KooL_style-3-FullScreen-v1.rasi14
-rw-r--r--config/rofi/themes/KooL_style-3-Fullscreen-v2.rasi2
-rw-r--r--config/rofi/themes/KooL_style-4.rasi30
-rw-r--r--config/rofi/themes/KooL_style-5.rasi9
-rw-r--r--config/rofi/themes/KooL_style-6.rasi25
-rw-r--r--config/rofi/themes/KooL_style-7.rasi9
-rw-r--r--config/rofi/themes/KooL_style-8.rasi15
-rw-r--r--config/rofi/themes/KooL_style-9.rasi2
-rw-r--r--config/rofi/themes/saint-rofi.rasi6
-rw-r--r--config/swappy/config2
-rwxr-xr-xconfig/swaync/config.json4
-rw-r--r--config/wallust/templates/colors-ghostty.conf28
-rw-r--r--config/wallust/templates/colors-rofi.rasi12
-rw-r--r--config/wallust/wallust.toml3
-rw-r--r--config/waybar/ModulesCustom4
-rw-r--r--config/waybar/configs/[TOP & BOT] SummitSplit-glass93
-rw-r--r--config/waybar/configs/[TOP] Default Laptop13
-rw-r--r--config/waybar/configs/[TOP] Default Laptop (old v5)60
-rw-r--r--config/waybar/configs/[TOP] Default Laptop-glass51
-rw-r--r--config/waybar/configs/[TOP] Everforest-glass143
-rw-r--r--config/waybar/style/Crystal Clear Glass.css245
-rw-r--r--config/waybar/style/ML4W Glass-3d.css327
-rw-r--r--config/waybar/style/ML4W Glass.css295
-rw-r--r--config/waybar/style/ML4W/glass.css52
-rw-r--r--config/waybar/style/[0 VERTICAL] Golden Noir.css3
-rw-r--r--config/waybar/style/[0 VERTICAL] Oglo Chicklets.css5
-rw-r--r--config/waybar/style/[0 VERTICAL] [Catpuccin] Mocha.css3
-rw-r--r--config/waybar/style/[Black & White] Monochrome.css3
-rw-r--r--config/waybar/style/[Catppuccin] Frappe.css3
-rw-r--r--config/waybar/style/[Catppuccin] Latte.css3
-rw-r--r--config/waybar/style/[Catppuccin] Mocha.css3
-rw-r--r--config/waybar/style/[Colored] Chroma Glow.css4
-rw-r--r--config/waybar/style/[Colored] Translucent.css6
-rw-r--r--config/waybar/style/[Colorful] Aurora Blossom.css3
-rw-r--r--config/waybar/style/[Colorful] Aurora.css3
-rw-r--r--config/waybar/style/[Colorful] Oglo Chicklets.css5
-rw-r--r--config/waybar/style/[Colorful] Rainbow Spectrum.css5
-rw-r--r--config/waybar/style/[Colorful] stolen-style.css3
-rw-r--r--config/waybar/style/[Dark] Golden Eclipse.css3
-rw-r--r--config/waybar/style/[Dark] Golden Noir.css3
-rw-r--r--config/waybar/style/[Dark] Half-Moon.css2
-rw-r--r--config/waybar/style/[Dark] Latte-Wallust combined v2.css4
-rw-r--r--config/waybar/style/[Dark] Latte-Wallust combined.css4
-rw-r--r--config/waybar/style/[Dark] Purpl.css3
-rw-r--r--config/waybar/style/[Dark] Wallust Obsidian Edge.css3
-rw-r--r--config/waybar/style/[Extra] Arrow.css2
-rw-r--r--config/waybar/style/[Extra] Crimson.css3
-rw-r--r--config/waybar/style/[Extra] EverForest.css4
-rw-r--r--config/waybar/style/[Extra] ML4W starter.css2
-rw-r--r--config/waybar/style/[Extra] Mauve.css3
-rw-r--r--config/waybar/style/[Extra] Modern-Combined - Transparent.css4
-rw-r--r--config/waybar/style/[Extra] Modern-Combined.css4
-rw-r--r--config/waybar/style/[Extra] Neon Circuit.css2
-rw-r--r--config/waybar/style/[Extra] Prismatic Glow.css2
-rw-r--r--config/waybar/style/[Extra] Rose Pine.css3
-rw-r--r--config/waybar/style/[Extra] Simple Pink.css3
-rw-r--r--config/waybar/style/[Light] Monochrome Contrast.css3
-rw-r--r--config/waybar/style/[Light] Obsidian Glow.css3
-rw-r--r--config/waybar/style/[Rainbow] RGB Bordered.css3
-rw-r--r--config/waybar/style/[Retro] Simple Style.css3
-rw-r--r--config/waybar/style/[Transparent] Crystal Clear.css3
-rw-r--r--config/waybar/style/[VERTICAL] [Catpuccin] Mocha.css3
-rw-r--r--config/waybar/style/[WALLUST] ML4W-modern-mixed.css26
-rw-r--r--config/waybar/style/[WALLUST] ML4W-modern.css14
-rw-r--r--config/waybar/style/[Wallust Bordered] Chroma Fusion Edge.css5
-rw-r--r--config/waybar/style/[Wallust Bordered] Chroma Simple.css3
-rw-r--r--config/waybar/style/[Wallust Transparent] Crystal Clear.css3
-rw-r--r--config/waybar/style/[Wallust] Box type.css183
-rw-r--r--config/waybar/style/[Wallust] Chroma Edge.css6
-rw-r--r--config/waybar/style/[Wallust] Chroma Fusion.css5
-rw-r--r--config/waybar/style/[Wallust] Chroma Tally V2.css5
-rw-r--r--config/waybar/style/[Wallust] Chroma Tally.css5
-rw-r--r--config/waybar/style/[Wallust] Colored.css3
-rw-r--r--config/waybar/style/[Wallust] Simple.css3
-rw-r--r--config/waybar/wallust/colors-waybar.css6
-rw-r--r--config/wezterm/wezterm.lua115
-rwxr-xr-xcopy.sh1193
-rwxr-xr-xscripts/copy_menu.sh82
-rw-r--r--scripts/lib_apps.sh116
-rw-r--r--scripts/lib_backup.sh72
-rw-r--r--scripts/lib_copy.sh362
-rw-r--r--scripts/lib_detect.sh49
-rw-r--r--scripts/lib_prompts.sh249
-rw-r--r--scripts/lib_update.sh84
-rwxr-xr-xupdate-dots.sh81
139 files changed, 5296 insertions, 1617 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e8c59721..c3e8ca96 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,166 @@
# Changelog — JAK's Hyprland Dotfiles
+## v2.3.19
+
+- 2026-01-20
+- Fixed CSS to format the `custom/nightlight` module
+- Fixed padding on some CSS files
+
+- 2026-01-19
+- Removed "Set wallpaper SDDM prompt"
+- When changing wallpaper there is no longer a prompt to set it on SDDM
+- It's now a menu option under Quick Settings menu `SUPER SHIFT + E`
+- Fixed `Glass` style sheets
+
+- 2026-01-16
+- Added `Rainbow Borders sub memu`
+ - Code provided by [brunoorsolon](https://github.com/brunoorsolon)
+ - There are now mulitple modes for the Rainbow Borders feature
+ - `Disabled`, `Wallust Color`, `Rainbow`, `Gradient flow`
+ - Thank you for the submission
+- Disabled `RainbowBorders.sh` by default
+- Use the quick setings menu `SUPERSHIFT + E` to enable, select mode
+
+- 2026-01-15
+- Created waybar configs for ML4W Glass style
+- `TOP & Bottom Summit - glass`
+- `Default Laptop - Glass`
+- `Everforest - Glass`
+- Fixed menu for express-update
+- Fixed `Toggle Rainbow` checked for wrong file
+
+- 2026-01-13
+- Added `Toggle Rainbow borders` option to settings menu
+- `SUPERSHIFT+E` search for `Rainbow`
+- It will toggle the current state and run `Refresh.sh` to start or stop
+ - Thanks to @Arkboi for suggesting it.
+ - Later if there are more settings like this I will create a new menu
+
+- 2026-01-11
+ - Improved `ML4W Glass` theme
+ - Now has proper 3d gradient look
+ - Theme based nightlight color
+ - `copy.sh` is now more modular
+ - Helper scripts in `scripts` dir per function
+ - Making `copy.sh` smaller (1200 lines to 800 so far)
+ - Easier to maintain going forward
+
+- 2026-01-09
+ - Fixed: Keybind parser latency
+ - Changed the parsing login to python instead of bash
+ - Also fixed duplicates when you unmap, then remap keybinds
+ - Ex. Change keybind for `file manger`
+ - Both the old and new keybind were show in keybind menu
+ - Added: `--express-update` to `copy.sh`
+ - `./copy.sh --express-update`
+ - This will bypass some of the questions
+ - Updating SDDM wallpaper
+ - Downloading wallpaper from repo
+ - Mostly like that was done at install time or previous upgrade
+ - Restoring User configs :
+ - `Weather.sh` and `Weather.sh`
+ - `Rofibeats.sh`
+ - etc.
+ - Automatically trims the backed up directories leaving just latest backup
+ - This dramatically reduces the time/effort to update dotfiles
+ - Most users don't restore these custom files on upgrades
+
+- 2026-01-08
+- Fixed: MPRIS artwork in Sway notification center only 10 pixels
+ - Adjusted to 96 pixels
+ - Thank you @godlyfas for fixing this
+- Fixing scripts
+ - `TouchPad.sh` never expands `$TOUCHPAD_ENABLED` (and doesn’t source the file that defines it)
+ - `Volume.sh` has multiple microphone-control bugs (bad `pamixer` arguments, typoed function name, invalid notification payloads) that break mic toggling and volume feedback.
+ - `DarkLight.sh` wipes the Qt theme paths each run because the `qt5ct/qt6ct` palette variables are commented out.
+ - `KooLsDotsUpdate.sh` contains a malformed `notify-send` string that crashes the script when no local version is detected.
+ - `Distro_update.sh` runs `sudo apt upgrade` outside the kitty window, so the Debian/Ubuntu flow never finishes inside the terminal.
+ - `Hypridle.sh` now launches `hypridle` in the background (`& disown`) when enabling the daemon, preventing the toggle command from hanging Waybar.
+ - `RofiSearch.sh` verifies that `jq` is available, captures the user’s query explicitly, URL-encodes it via `jq` `@uri`,
+ - opens the configured search engine with the encoded query instead of dropping the term.
+ - `Sounds.sh` now tries `pw-play`, then `paplay`, then `aplay`, emitting a clear error if none are installed, so the script no longer calls the non-existent pa-play.
+ - `Tak0-Per-Window-Switch.sh` now records the listener PID in `~/.cache/kb_layout_per_window.listener.pid` and reuses it if still running, preventing multiple background listeners, and reports missing Hyprland sockets without exiting the main script.
+ - `WaybarScripts.sh` adds a `launch_files()` helper that checks `$files` before execution; if unset, it shows a notification instead of running an empty command.
+ - `sddm_wallpaper.sh` validates `~/.config/rofi/wallust/colors-rofi.rasi` before use, extracts colors via a helper, and aborts with a notification if any required colors are missing.
+ - `WallustSwww.sh` now reads the focused monitor’s cache file (or parses swww query per-monitor) to pick the correct wallpaper path
+ - Eliminating the previous “last line wins” bug on multi-monitor setups.
+ - Wallpaper and global theme changes are now dramatically faster
+ - `PortalHyprland.sh` suppresses harmless killall errors and launches only the first available portal binary in each category (hyprland + general)
+ - Avoiding duplicate processes when both `/usr/lib` and `/usr/libexec` variants exist.
+ - `KillActiveProcess.sh` checks that Hyprland returned a numeric PID before calling kill
+ - Notifies the user when no active window is available instead of throwing kill usage errors.
+
+- 2026-01-06
+ - Added Global Theme Changer.
+ - There are many themes to choose from
+ - `SUPER + T`
+ - Added "Glass Style" taken from `ML4W` dotfiles
+ - Thank you [TheAhumMaitra](https://github.com/TheAhumMaitra)
+ - Fixed more WindowRules
+ - Fixed rofi themes to work with Theme changer
+ - Added `ghostty` terminal config file integrated with Themes
+ - `ghostty` is not installed by default
+ - The `COPR` is already there for Fedora
+ - `sudo dnf install ghostty`
+ - The `COPR` repo for `wezterm` is also available
+ - `sudo dnf install wezterm`
+ - A config file is already available when you install it
+ - Most other distros have these terminals in their repo
+
+- 2026-01-04
+- Fullscreen or maximized would exit using `ALT-TAB` (cycle next/bring-to-front)
+ - User `GoodBorn` found this fix
+
+ ```
+ misc {
+ on_focus_under_fullscreen = 1
+ # 0 - Default, no change
+ # 1 - New focused window takes over fullscreen (Windows-like Alt-Tab)
+ # 2 - New focused window stays behind the fullscreen one
+ }
+ ```
+
+ > Note: The above change only works on Hyprland v0.53+.
+ > Users with lower will have to comment that line out.
+ > `~/.config/hypr/UserSettings/SystemSettings.conf`
+
+- Added: modal rule so popup diaglog, like `Save as` or `Open File` center and float by default
+ - `windowrule = float on, center on, match:modal:1`
+
+- 2026-01-01
+- Added more blur and enabled xray
+ - Thank you [TheAhumMaitra](https://github.com/TheAhumMaitra)
+
+- 2025-12-31
+ - Fixed rule for `Gnome Calculator`
+ - Thanks Warlord for finding/fixing that
+ - Fixed rule for `yad`
+ - Size was being overridden by `settings` tag
+ - `~/Pictures` now follows `XDG dir` vs. hard coded
+ - Thanks for Jaël Champagne Gareau for the code
+ - Fixed `opache toggle`
+ - `Weather.py` and `Weather.sh` updated and improved
+ - Thank you Lumethra
+ - Added network check to `WeatherWrap` script
+ - Thank you Maximilian Zhu
+ - Added sample workspace rules to start apps on specific workspaces
+ - They are commented out but serve as references
+
+- 2025-12-29
+ - Fixed pathing in Wallust script
+ - Thank you [Lumethra](https://github.com/Lumethra)
+
+— 2025-12-22
+
+- Added:
+ - Optional keybinding to increment/decrement audio in 1% steps vs. 5%
+ - Thanks [rgarofono](https://github.com/rgarofano) for the code
+- Fixed:
+ - Switch Layout was looking in wrong location
+ - SUPER - J/K not working in both `master` and `dwindle` layouts
+ - You also get notification message on layout change
+ - Thanks [@suresh466](https://github.com/suresh466) for fixing it
+
## v2.3.18 — 2025-12-10
## FIXES:
diff --git a/CODE_OF_CONDUCT.es.md b/CODE_OF_CONDUCT.es.md
new file mode 100644
index 00000000..14d7b067
--- /dev/null
+++ b/CODE_OF_CONDUCT.es.md
@@ -0,0 +1,81 @@
+# Código de Conducta del Pacto del Colaborador
+
+[Ver versión en inglés](./CODE_OF_CONDUCT.md)
+
+## Nuestro compromiso
+
+Nosotros, como miembros, contribuyentes y líderes, nos comprometemos a hacer que la participación en nuestra comunidad sea una experiencia libre de acoso para todas las personas, sin distinción de edad, complexión, discapacidad visible o invisible, etnia, características sexuales, identidad y expresión de género, nivel de experiencia, educación, situación socioeconómica, nacionalidad, apariencia personal, raza, religión, orientación o identidad sexual.
+
+Nos comprometemos a actuar e interactuar de maneras que contribuyan a una comunidad abierta, acogedora, diversa, inclusiva y saludable.
+
+## Nuestros estándares
+
+Ejemplos de comportamiento que contribuye a un entorno positivo para nuestra comunidad incluyen:
+
+- Demostrar empatía y amabilidad hacia otras personas.
+- Ser respetuoso con opiniones, puntos de vista y experiencias que difieran de las nuestras.
+- Dar y aceptar con gracia retroalimentación constructiva.
+- Asumir la responsabilidad y disculparse ante quienes se vean afectados por nuestros errores, y aprender de la experiencia.
+- Centrarse en lo que es mejor no solo para nosotros como individuos, sino para la comunidad en su conjunto.
+
+Ejemplos de comportamiento inaceptable incluyen:
+
+- El uso de lenguaje o imágenes sexualizadas, y cualquier tipo de atención o insinuación sexual.
+- Troleo, comentarios insultantes o despectivos, y ataques personales o políticos.
+- Acoso público o privado.
+- Publicación de información privada de otras personas, como direcciones físicas o de correo electrónico, sin su permiso explícito.
+- Otra conducta que, razonablemente, pudiera considerarse inapropiada en un entorno profesional.
+
+## Responsabilidades de cumplimiento
+
+Los líderes de la comunidad son responsables de aclarar y hacer cumplir nuestros estándares de comportamiento aceptable y tomarán medidas correctivas apropiadas y justas en respuesta a cualquier comportamiento que consideren inapropiado, amenazante, ofensivo o dañino.
+
+Los líderes de la comunidad tienen el derecho y la responsabilidad de eliminar, editar o rechazar comentarios, confirmaciones de cambios (commits), código, ediciones del wiki, incidencias y otras contribuciones que no estén alineadas con este Código de Conducta, y comunicarán los motivos de las decisiones de moderación cuando corresponda.
+
+## Alcance
+
+Este Código de Conducta se aplica a todos los espacios de la comunidad y también cuando una persona representa oficialmente a la comunidad en espacios públicos. Ejemplos de representar a nuestra comunidad incluyen usar una dirección de correo electrónico oficial, publicar a través de una cuenta oficial en redes sociales o actuar como representante designado en un evento en línea o presencial.
+
+## Cumplimiento
+
+Los casos de comportamiento abusivo, acosador o de otra forma inaceptable pueden ser reportados a los líderes de la comunidad responsables del cumplimiento en [abrir un issue o discusión]. Todas las quejas serán revisadas e investigadas de manera rápida y justa.
+
+Todos los líderes de la comunidad están obligados a respetar la privacidad y seguridad de quien reporte cualquier incidente.
+
+## Guías de aplicación
+
+Los líderes de la comunidad seguirán estas Guías de Impacto Comunitario para determinar las consecuencias por cualquier acción que consideren en violación de este Código de Conducta:
+
+### 1. Corrección
+
+Impacto comunitario: Uso de lenguaje inapropiado u otro comportamiento considerado no profesional o no bienvenido en la comunidad.
+
+Consecuencia: Una advertencia privada y por escrito de parte de los líderes de la comunidad, brindando claridad sobre la naturaleza de la violación y una explicación de por qué el comportamiento fue inapropiado. Se puede solicitar una disculpa pública.
+
+### 2. Advertencia
+
+Impacto comunitario: Una violación por un incidente único o una serie de acciones.
+
+Consequence: Una advertencia con consecuencias para comportamientos continuados. Ninguna interacción con las personas involucradas, incluida la interacción no solicitada con quienes hacen cumplir el Código de Conducta, por un período de tiempo especificado. Esto incluye evitar interacciones en espacios de la comunidad así como en canales externos como redes sociales. Violaciones a estos términos pueden llevar a una suspensión temporal o permanente.
+
+### 3. Suspensión temporal
+
+Impacto comunitario: Una violación grave de los estándares de la comunidad, incluido el comportamiento inapropiado sostenido.
+
+Consecuencia: Una suspensión temporal de cualquier tipo de interacción o comunicación pública con la comunidad por un período de tiempo especificado. No se permite interacción pública o privada con las personas involucradas, incluida la interacción no solicitada con quienes hacen cumplir el Código de Conducta, durante este período. Violar estos términos puede llevar a una suspensión permanente.
+
+### 4. Suspensión permanente
+
+Impacto comunitario: Demostrar un patrón de violación de los estándares de la comunidad, incluido el comportamiento inapropiado sostenido, acoso a una persona o agresión o desprecio hacia clases de individuos.
+
+Consecuencia: Suspensión permanente de cualquier tipo de interacción pública dentro de la comunidad.
+
+## Atribución
+
+Este Código de Conducta está adaptado del [Contributor Covenant][homepage], versión 2.0, disponible en https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
+
+Las Guías de Impacto Comunitario se inspiraron en la [escala de aplicación del código de conducta de Mozilla](https://github.com/mozilla/diversity).
+
+[homepage]: https://www.contributor-covenant.org
+
+Para respuestas a preguntas comunes sobre este código de conducta, vea las preguntas frecuentes en https://www.contributor-covenant.org/faq. Traducciones disponibles en https://www.contributor-covenant.org/translations.
diff --git a/COMMIT_MESSAGE_GUIDELINES.es.md b/COMMIT_MESSAGE_GUIDELINES.es.md
new file mode 100644
index 00000000..87888736
--- /dev/null
+++ b/COMMIT_MESSAGE_GUIDELINES.es.md
@@ -0,0 +1,148 @@
+# Guía para Mensajes de Commit
+
+[Ver versión en inglés](./COMMIT_MESSAGE_GUIDELINES.md)
+
+Un buen mensaje de commit debe ser descriptivo y aportar contexto sobre los cambios realizados. Esto facilita entender y revisar los cambios en el futuro.
+
+## Recomendaciones
+
+- Empieza con un resumen breve de los cambios del commit.
+- Usa el modo imperativo en el resumen, como si dieras una instrucción. Por ejemplo, "Add feature" en lugar de "Added feature".
+- Proporciona detalles adicionales en el cuerpo del mensaje, si es necesario: motivo del cambio, impacto, dependencias añadidas o eliminadas, etc.
+- Mantén cada línea en 72 caracteres o menos para que sea fácil de leer en la salida de `git log`.
+
+### Ejemplos de buenos mensajes
+
+- "Add authentication feature for user login"
+- "Fix bug causing application to crash on startup"
+- "Update documentation for API endpoints"
+
+Recordatorio: escribir mensajes de commit descriptivos ahorra tiempo en el futuro y ayuda a otras personas a entender los cambios hechos al código.
+
+## Tipos de commit
+
+A continuación, una lista (ampliable) de tipos de commit que puedes usar:
+
+`feat`: Añade una característica nueva al proyecto
+
+```markdown
+feat: Add multi-image upload support
+```
+
+`fix`: Corrige un error o problema en el proyecto
+
+```markdown
+fix: Fix bug causing application to crash on startup
+```
+
+`docs`: Cambios en documentación
+
+```markdown
+docs: Update documentation for API endpoints
+```
+
+`style`: Cambios cosméticos o de formato (colores, formateo de código, etc.)
+
+```markdown
+style: Update colors and formatting
+```
+
+`refactor`: Cambios internos que no alteran el comportamiento, pero mejoran calidad/mantenibilidad
+
+```markdown
+refactor: Remove unused code
+```
+
+`test`: Añadir o modificar tests
+
+```markdown
+test: Add tests for new feature
+```
+
+`chore`: Cambios que no encajan en otras categorías (actualizar dependencias, configurar build, etc.)
+
+```markdown
+chore: Update dependencies
+```
+
+`perf`: Mejoras de rendimiento
+
+```markdown
+perf: Improve performance of image processing
+```
+
+`security`: Aborda temas de seguridad
+
+```markdown
+security: Update dependencies to address security issues
+```
+
+`merge`: Fusiones de ramas
+
+```markdown
+merge: Merge branch 'feature/branch-name' into develop
+```
+
+`revert`: Revertir un commit previo
+
+```markdown
+revert: Revert "Add feature"
+```
+
+`build`: Cambios en el sistema de build o dependencias
+
+```markdown
+build: Update dependencies
+```
+
+`ci`: Cambios en la integración continua (CI)
+
+```markdown
+ci: Update CI configuration
+```
+
+`config`: Cambios en archivos de configuración
+
+```markdown
+config: Update configuration files
+```
+
+`deploy`: Cambios en el proceso de despliegue
+
+```markdown
+deploy: Update deployment scripts
+```
+
+`init`: Inicialización de repositorio o proyecto
+
+```markdown
+init: Initialize project
+```
+
+`move`: Mover archivos o directorios
+
+```markdown
+move: Move files to new directory
+```
+
+`rename`: Renombrar archivos o directorios
+
+```markdown
+rename: Rename files
+```
+
+`remove`: Eliminar archivos o directorios
+
+```markdown
+remove: Remove files
+```
+
+`update`: Actualización de código, dependencias u otros componentes
+
+```markdown
+update: Update code
+```
+
+Estos son solo ejemplos; puedes definir tipos personalizados si los usas de forma consistente y con mensajes claros y descriptivos.
+
+**Importante:** Si planeas usar un tipo de commit personalizado que no esté en la lista, añádelo aquí para que otras personas lo entiendan también. Crea un pull request para incluirlo en este archivo.
diff --git a/CONTRIBUTING.es.md b/CONTRIBUTING.es.md
new file mode 100644
index 00000000..e0d5e28e
--- /dev/null
+++ b/CONTRIBUTING.es.md
@@ -0,0 +1,69 @@
+# Guía para Contribuir a KooL Hyprland Projects
+
+[Ver versión en inglés](./CONTRIBUTING.md)
+
+¡Gracias por tu interés en contribuir a KooL Hyprland Projects! Aceptamos todo tipo de contribuciones: correcciones de errores, nuevas características, mejoras en documentación y otras mejoras generales.
+
+## Primeros pasos
+
+1. Haz un fork del repositorio de la rama `development` en tu cuenta de GitHub. Así tendrás una copia sobre la cual trabajar sin afectar el repositorio original.
+ - Para hacer fork, pulsa el botón **Fork** en la esquina superior derecha de esta página o haz clic [aquí](https://github.com/JaKooLit/Hyprland-Dots/fork).
+ - Asegúrate de desmarcar la opción de copiar solo la rama `main`. Así se copiarán la rama `development` y otras ramas (si existen).
+
+2. Clona tu repositorio bifurcado en tu equipo.
+
+ - Usa el siguiente comando para clonar tu fork:
+
+ ```bash
+ git clone --depth=1 -b development https://github.com/JaKooLit/Hyprland-Dots.git
+ ```
+
+3. Crea una rama nueva para tus cambios.
+
+ - Por ejemplo, para crear una rama llamada `tu-rama`, ejecuta:
+
+ ```bash
+ git checkout -b tu-rama
+ ```
+
+4. Realiza tus cambios y haz commit con un mensaje descriptivo.
+
+ - Por ejemplo, para hacer commit de tus cambios, ejecuta (siguiendo la [guía de mensajes de commit](./COMMIT_MESSAGE_GUIDELINES.md)):
+
+ ```bash
+ git commit -m "feat: add a new feature"
+ ```
+
+5. Empuja tu rama a tu fork.
+
+ ```bash
+ git push origin tu-rama
+ ```
+
+6. Abre un **pull request** contra el repositorio en la rama `development`.
+ - Pasos sugeridos:
+ 1. Ve a tu fork en GitHub.
+ 2. Haz clic en **Compare & pull request** junto a tu rama.
+ 3. Añade un título y una descripción.
+ 4. Pulsa **Create pull request** y recuerda añadir las etiquetas correspondientes usando la [plantilla de PR](https://github.com/JaKooLit/Hyprland-Dots/blob/main/.github/PULL_REQUEST_TEMPLATE.md).
+
+## Directrices
+
+- Sigue el estilo de código del proyecto.
+- Actualiza la **documentación** si es necesario.
+- Añade tests cuando corresponda.
+- Asegúrate de que todos los tests pasen o que los cambios estén probados antes de enviar.
+- Mantén tu PR enfocado y evita incluir cambios no relacionados.
+- Revisa estos archivos antes de enviar tus cambios:
+ - [bug.yml](https://github.com/JaKooLit/Hyprland-Dots/blob/main/.github/ISSUE_TEMPLATE/bug.yml) – Reporte de errores.
+ - [feature.yml](https://github.com/JaKooLit/Hyprland-Dots/blob/main/.github/ISSUE_TEMPLATE/feature.yml) – Sugerir características.
+ - [documentation-update.yml](https://github.com/JaKooLit/Hyprland-Dots/blob/main/.github/ISSUE_TEMPLATE/documentation-update.yml) – Cambios de documentación.
+ - [PULL_REQUEST_TEMPLATE.md](https://github.com/JaKooLit/Hyprland-Dots/blob/main/.github/PULL_REQUEST_TEMPLATE.md) – Plantilla de PR.
+ - [COMMIT_MESSAGE_GUIDELINES.md](./COMMIT_MESSAGE_GUIDELINES.md) – Guía de mensajes de commit.
+ - [CONTRIBUTING.md](./CONTRIBUTING.md) – Guía en inglés.
+ - [LICENSE](https://github.com/JaKooLit/Hyprland-Dots/blob/main/LICENSE.md) – Licencia.
+ - [README.md](https://github.com/JaKooLit/Hyprland-Dots/blob/main/README.md) – Proyecto.
+
+## Contacto
+
+Si tienes preguntas, utiliza [GitHub Discussions](https://github.com/JaKooLit/Hyprland-Dots/discussions) o el [Servidor de Discord](https://discord.gg/kool-tech-world).
diff --git a/Distro-Hyprland.sh b/Distro-Hyprland.sh
index 99a1fc34..88964ea7 100755
--- a/Distro-Hyprland.sh
+++ b/Distro-Hyprland.sh
@@ -64,6 +64,20 @@ elif [ "$distro_name" = "Ubuntu" ]; then
Distro_DIR="$HOME/$Distro-$Github_URL_branch"
echo "${INFO} Ubuntu 25.04 detected. Customizing setup for Ubuntu 25.04."
;;
+ "25.10")
+ Distro="Ubuntu-Hyprland"
+ Github_URL="https://github.com/JaKooLit/$Distro.git"
+ Github_URL_branch="25.10"
+ Distro_DIR="$HOME/$Distro-$Github_URL_branch"
+ echo "${INFO} Ubuntu 25.10 detected. Customizing setup for Ubuntu 25.10."
+ ;;
+ "26.04-development")
+ Distro="Ubuntu-Hyprland"
+ Github_URL="https://github.com/JaKooLit/$Distro.git"
+ Github_URL_branch="26.04-development"
+ Distro_DIR="$HOME/$Distro-$Github_URL_branch"
+ echo "${INFO} Ubuntu 26.04 (development) detected. Customizing setup for Ubuntu 26.04 development branch."
+ ;;
*)
Distro="Ubuntu-Hyprland"
echo "${ERROR} Unsupported distribution: $distro_version. Exiting."
diff --git a/README.md b/README.md
index 6aff8fd2..f8fe3954 100644
--- a/README.md
+++ b/README.md
@@ -62,8 +62,8 @@ https://github.com/user-attachments/assets/49bc12b2-abaf-45de-a21c-67aacd9bb872
sh <(curl -L https://raw.githubusercontent.com/JaKooLit/Hyprland-Dots/main/Distro-Hyprland.sh)
```
-- you can now use above command to automatically clone the Distro-Hyprland install scripts below
-- it will clone the install scripts and start the `install.sh` 😎
+- You can use the above command to automatically clone the `Distro-Hyprland` install scripts
+- It will clone the install script and start the `install.sh` 😎
### 👁️‍🗨️ My Hyprland install Scripts 👁️‍🗨️
@@ -101,16 +101,23 @@ sh <(curl -L https://raw.githubusercontent.com/JaKooLit/Hyprland-Dots/main/Distr
- To easily track changes, I will be updating the [CHANGELOGS](https://github.com/JaKooLit/Hyprland-Dots/wiki/Changelogs) Screenshots will be included if worth mentioning the changes!
> [!NOTE]
-> Kindly note that by defeault, Kools Dots are adjusted / configured for 2k (1440p) display without scaling.
+> Kindly note that by default, Kools Dots are adjusted / configured for 2k (1440p) display without scaling.
### 💥 Copying / Installation / Update instructions 💥
- [`MORE INFO HERE`](https://github.com/JaKooLit/Hyprland-Dots/wiki/Install_&_Update)
> [!Note]
- > The auto copy script "copy.sh" will create backups of intended directories to be copied. However, still a good idea to manually backup just incase script failed to backup!
-- clone this repo by using git. Change directory, make executable and run the script
+ > The auto copy script `copy.sh` will create backups of intended directories to be copied.
+ > However, it's still a good idea to manually backup just incase script fails to backup your configuration.
+ > If you already have a hyprland configuration, uninstall it first, or create a new user, and install it with that user
+
+- Clone this repo by using `git`.
+- Change directory, i.e. `cd Arch-Hyprland`
+- Make `install.sh` executable `chmod +x ./install.sh`
+- Run the script `./install.sh`
-> to download from Master branch
+> To download from Master branch
+> Note: Ubuntu is exception, it has version specific branches
```bash
git clone --depth=1 https://github.com/JaKooLit/Hyprland-Dots.git
@@ -162,9 +169,9 @@ chmod +x upgrade.sh
#### ⚠️⚠️⚠️ ATTENTION - BACKUPS CREATED by SCRIPT
> [!CAUTION]
-> copy.sh, release.sh and even upgrade.sh creates a backup!
-> Kindly investigate manually contents on your $HOME/.config
-> Delete manually all the backups which you dont need
+> `copy.sh`, `release.sh` and even `upgrade.sh` creates a backup!
+> Kindly investigate manually contents on your `$HOME/.config`
+> Delete manually any backups which you dont want.
#### 🛎️ a small note on wallpapers
@@ -172,7 +179,8 @@ chmod +x upgrade.sh
#### ⚠️⚠️⚠️ A MUST! after copying / Installing these dots
-- Press SUPER W and set a wallpaper. This is also to initiate wallust for waybar, kitty (tty) and rofi themes. However, If you use the copy.sh or the release.sh, there will be a preset initial Wallpaper and you dont have to do this
+- Press `SUPER W` and set a wallpaper. This is also to initiate wallust for waybar, kitty (tty) and rofi themes.
+- However, If you use the `copy.sh` or the `release.sh`, there will be a preset initial Wallpaper and you dont have to do this
- Nvidia Owners. Make sure to edit your `~/.config/hypr/UserConfigs/ENVariables.conf` (highly recommended).
@@ -197,11 +205,13 @@ chmod +x upgrade.sh
#### 🙏 Special request
-- If you have improvements on the dotfiles or configuration, feel free to submit a PR for improvement. I always welcome improvements as I am also just learning just like you guys!
+- If you have improvements on the dotfiles or configuration, feel free to submit a PR for improvement.
+- I always welcome improvements as I am also just learning just like you guys!
#### ✍️ Contributing
- Want to contribute? Click [`HERE`](https://github.com/JaKooLit/Hyprland-Dots/blob/main/CONTRIBUTING.md) for a guide how to contribute
+> Thanks to all who have contributed code, or support on the Discord server. You efforts are greatly appreciated
#### 🤷‍♂️ TO DO!
@@ -234,3 +244,8 @@ Or you can donate cryto on my btc wallet :)
## 🫰 Thank you for the stars 🩷
[![Stargazers over time](https://starchart.cc/JaKooLit/Hyprland-Dots.svg?variant=adaptive)](https://starchart.cc/JaKooLit/Hyprland-Dots)
+
+
+### Document translations
+
+- Spanish: [Código de Conducta](./CODE_OF_CONDUCT.es.md) · [Guía de mensajes de commit](./COMMIT_MESSAGE_GUIDELINES.es.md) · [Guía de contribución](./CONTRIBUTING.es.md)
diff --git a/release.sh b/archive/release.sh
index e29eaa79..e29eaa79 100755
--- a/release.sh
+++ b/archive/release.sh
diff --git a/upgrade.sh b/archive/upgrade.sh
index 45624c4f..45624c4f 100755
--- a/upgrade.sh
+++ b/archive/upgrade.sh
diff --git a/config/ghostty/ghostty.config b/config/ghostty/ghostty.config
new file mode 100644
index 00000000..3795ec3f
--- /dev/null
+++ b/config/ghostty/ghostty.config
@@ -0,0 +1,29 @@
+adjust-cell-height = 10%
+background-blur-radius = 60
+background-opacity = 1.00
+bold-is-bright = false
+confirm-close-surface = false
+cursor-style = bar
+font-family = FantasqueSansM Nerd Font Mono
+font-size = 12
+gtk-single-instance = true
+mouse-hide-while-typing = true
+quick-terminal-position = center
+selection-background = #2d3f76
+selection-foreground = #c8d3f5
+shell-integration = detect
+shell-integration-features = cursor,sudo
+term = xterm-256color
+title = GhosTTY
+unfocused-split-opacity = 0.5
+wait-after-command = false
+window-height = 32
+window-save-state = always
+window-theme = dark
+window-width = 110
+
+# Theme switching (optional): managed by your theme changer (symlink or generated file).
+config-file = ?~/.config/ghostty/theme.conf
+
+# Wallust (optional): wallust template should write Ghostty colors here; it will override theme colors.
+config-file = ?~/.config/ghostty/wallust.conf
diff --git a/config/hypr/UserConfigs/UserDecorations.conf b/config/hypr/UserConfigs/UserDecorations.conf
index 0b450904..f203fe5b 100644
--- a/config/hypr/UserConfigs/UserDecorations.conf
+++ b/config/hypr/UserConfigs/UserDecorations.conf
@@ -12,14 +12,14 @@ general {
border_size = 2
gaps_in = 2
gaps_out = 4
-
- col.active_border = $color12
+
+ col.active_border = $color12
col.inactive_border = $color10
}
decoration {
rounding = 10
-
+
active_opacity = 1.0
inactive_opacity = 0.9
fullscreen_opacity = 1.0
@@ -37,13 +37,13 @@ decoration {
color_inactive = $color10
}
-
blur {
- enabled = true
+ enabled = true
size = 6
- passes = 2
- ignore_opacity = true
+ passes = 3
new_optimizations = true
+ xray = true
+ ignore_opacity = true
special = true
popups = true
}
diff --git a/config/hypr/UserScripts/RainbowBorders.bak.sh b/config/hypr/UserScripts/RainbowBorders.bak.sh
new file mode 100755
index 00000000..67269b8a
--- /dev/null
+++ b/config/hypr/UserScripts/RainbowBorders.bak.sh
@@ -0,0 +1,89 @@
+#!/usr/bin/env bash
+# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
+# Smooth border cycling effect using Wallust palette or full rainbow
+
+# Possible values: "wallust_random", "rainbow", "gradient_flow"
+EFFECT_TYPE="gradient_flow"
+
+WALLUST_COLORS_SOURCE="$HOME/.config/hypr/wallust/wallust-hyprland.conf"
+
+WALLUST_COLORS=()
+
+# ---------- LOAD WALLUST COLORS ----------
+if [[ "$EFFECT_TYPE" == "wallust_random" || "$EFFECT_TYPE" == "gradient_flow" ]]; then
+ # Accept either hex (0xffRRGGBB) or rgb(r,g,b) and normalize to 0xffRRGGBB
+ mapfile -t WALLUST_COLORS < <(
+ grep -E '^\$color[0-9]+' "$WALLUST_COLORS_SOURCE" | awk '
+ function hex2(s){ return (length(s)==6 ? "0xff"s : ""); }
+ function rgb2(r,g,b){ return sprintf("0xff%02x%02x%02x", r, g, b); }
+ {
+ if (match($0, /0x([0-9a-fA-F]{8})/, m)) { print "0x" m[1]; next }
+ if (match($0, /#([0-9a-fA-F]{6})/, m)) { print hex2(m[1]); next }
+ if (match($0, /rgb\(([0-9]+),[ ]*([0-9]+),[ ]*([0-9]+)\)/, m)) {
+ print rgb2(m[1], m[2], m[3]); next
+ }
+ }'
+ )
+
+ if (( ${#WALLUST_COLORS[@]} == 0 )); then
+ # If wallust colors can't be loaded, fall back to random_hex
+ EFFECT_TYPE="rainbow"
+ fi
+fi
+
+# ---------- RANDOM WALLUST COLORS ----------
+function wallust_random() {
+ echo "${WALLUST_COLORS[RANDOM % ${#WALLUST_COLORS[@]}]}"
+}
+
+# ---------- RAINBOW COLORS ----------
+function random_hex() {
+ echo "0xff$(openssl rand -hex 3)"
+}
+
+# ---------- FLOW MODE ----------
+BASE_COLOR="${WALLUST_COLORS[10]}"
+GRAD1_COLOR="${WALLUST_COLORS[14]}"
+GRAD2_COLOR="${WALLUST_COLORS[13]}"
+GLOW_COLOR="${WALLUST_COLORS[15]}"
+
+MAX_POS=10
+GLOW_POS=0
+
+function gradient_flow_color() {
+ local pos=$1
+ local d=$(( pos - GLOW_POS ))
+
+ # wrap distance (-9..9)
+ if (( d > MAX_POS/2 )); then d=$((d - MAX_POS)); fi
+ if (( d < -MAX_POS/2 )); then d=$((d + MAX_POS)); fi
+
+ case "${d#-}" in
+ 0) echo "$GLOW_COLOR" ;;
+ 1) echo "$GRAD1_COLOR" ;;
+ 2) echo "$GRAD2_COLOR" ;;
+ *) echo "$BASE_COLOR" ;;
+ esac
+
+ if (( pos == MAX_POS - 1 )); then
+ GLOW_POS=$(( (GLOW_POS + 1) % MAX_POS ))
+ fi
+}
+
+# ---------- Main function ----------
+
+function get_color() {
+ if [[ "$EFFECT_TYPE" == "wallust_random" && ${#WALLUST_COLORS[@]} -gt 0 ]]; then
+ wallust_random
+ elif [[ "$EFFECT_TYPE" == "gradient_flow" && ${#WALLUST_COLORS[@]} -ge 16 ]]; then
+ gradient_flow_color "$1"
+ else
+ random_hex
+ fi
+}
+
+# border effect for ACTIVE window
+hyprctl keyword general:col.active_border $(get_color 0) $(get_color 1) $(get_color 2) $(get_color 3) $(get_color 4) $(get_color 5) $(get_color 6) $(get_color 7) $(get_color 8) $(get_color 9) 270deg
+
+# border effect for INACTIVE windows
+#hyprctl keyword general:col.inactive_border $(get_color 0) $(get_color 1) $(get_color 2) $(get_color 3) $(get_color 4) $(get_color 5) $(get_color 6) $(get_color 7) $(get_color 8) $(get_color 9) 270deg \ No newline at end of file
diff --git a/config/hypr/UserScripts/RainbowBorders.sh b/config/hypr/UserScripts/RainbowBorders.sh
deleted file mode 100755
index 0a7fd721..00000000
--- a/config/hypr/UserScripts/RainbowBorders.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/env bash
-# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
-# for rainbow borders animation
-
-function random_hex() {
- random_hex=("0xff$(openssl rand -hex 3)")
- echo $random_hex
-}
-
-# rainbow colors only for active window
-hyprctl keyword general:col.active_border $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) 270deg
-
-# rainbow colors for inactive window (uncomment to take effect)
-#hyprctl keyword general:col.inactive_border $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) 270deg \ No newline at end of file
diff --git a/config/hypr/UserScripts/WallpaperEffects.sh b/config/hypr/UserScripts/WallpaperEffects.sh
index 89577efa..475969d6 100755
--- a/config/hypr/UserScripts/WallpaperEffects.sh
+++ b/config/hypr/UserScripts/WallpaperEffects.sh
@@ -106,43 +106,3 @@ fi
main
sleep 1
-
-if [[ -n "$choice" ]]; then
- # Resolve SDDM themes directory (standard and NixOS path)
- sddm_themes_dir=""
- if [ -d "/usr/share/sddm/themes" ]; then
- sddm_themes_dir="/usr/share/sddm/themes"
- elif [ -d "/run/current-system/sw/share/sddm/themes" ]; then
- sddm_themes_dir="/run/current-system/sw/share/sddm/themes"
- fi
-
- if [ -n "$sddm_themes_dir" ]; then
- sddm_simple="$sddm_themes_dir/simple_sddm_2"
-
- # Only prompt if theme exists and its Backgrounds directory is writable
- if [ -d "$sddm_simple" ] && [ -w "$sddm_simple/Backgrounds" ]; then
- # Check if yad is running to avoid multiple yad notification
- if pidof yad > /dev/null; then
- killall yad
- fi
-
- if yad --info --text="Set current wallpaper as SDDM background?\n\nNOTE: This only applies to SIMPLE SDDM v2 Theme" \
- --text-align=left \
- --title="SDDM Background" \
- --timeout=5 \
- --timeout-indicator=right \
- --button="yad-yes:0" \
- --button="yad-no:1" \
- ; then
-
- # Check if terminal exists
- if ! command -v "$terminal" &>/dev/null; then
- notify-send -i "$iDIR/ja.png" "Missing $terminal" "Install $terminal to enable setting of wallpaper background"
- exit 1
- fi
-
- exec "$SCRIPTSDIR/sddm_wallpaper.sh" --effects
- fi
- fi
- fi
-fi
diff --git a/config/hypr/UserScripts/WallpaperRandom.sh b/config/hypr/UserScripts/WallpaperRandom.sh
index 654d4bd3..8dd680d5 100755
--- a/config/hypr/UserScripts/WallpaperRandom.sh
+++ b/config/hypr/UserScripts/WallpaperRandom.sh
@@ -2,12 +2,13 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Script for Random Wallpaper ( CTRL ALT W)
-wallDIR="$HOME/Pictures/wallpapers"
+PICTURES_DIR="$(xdg-user-dir PICTURES 2>/dev/null || echo "$HOME/Pictures")"
+wallDIR="$PICTURES_DIR/wallpapers"
SCRIPTSDIR="$HOME/.config/hypr/scripts"
focused_monitor=$(hyprctl monitors -j | jq -r '.[] | select(.focused) | .name')
-PICS=($(find -L ${wallDIR} -type f \( -name "*.jpg" -o -name "*.jpeg" -o -name "*.png" -o -name "*.pnm" -o -name "*.tga" -o -name "*.tiff" -o -name "*.webp" -o -name "*.bmp" -o -name "*.farbfeld" -o -name "*.gif" \)))
+PICS=($(find -L "${wallDIR}" -type f \( -name "*.jpg" -o -name "*.jpeg" -o -name "*.png" -o -name "*.pnm" -o -name "*.tga" -o -name "*.tiff" -o -name "*.webp" -o -name "*.bmp" -o -name "*.farbfeld" -o -name "*.gif" \)))
RANDOMPICS=${PICS[ $RANDOM % ${#PICS[@]} ]}
diff --git a/config/hypr/UserScripts/WallpaperSelect.sh b/config/hypr/UserScripts/WallpaperSelect.sh
index 0029d3e5..316a7cd4 100755
--- a/config/hypr/UserScripts/WallpaperSelect.sh
+++ b/config/hypr/UserScripts/WallpaperSelect.sh
@@ -4,7 +4,8 @@
# WALLPAPERS PATH
terminal=kitty
-wallDIR="$HOME/Pictures/wallpapers"
+PICTURES_DIR="$(xdg-user-dir PICTURES 2>/dev/null || echo "$HOME/Pictures")"
+wallDIR="$PICTURES_DIR/wallpapers"
SCRIPTSDIR="$HOME/.config/hypr/scripts"
wallpaper_current="$HOME/.config/hypr/wallpaper_effects/.wallpaper_current"
@@ -98,49 +99,6 @@ menu() {
done
}
-# Offer SDDM Simple Wallpaper Option (only for non-video wallpapers)
-set_sddm_wallpaper() {
- sleep 1
-
- # Resolve SDDM themes directory (standard and NixOS path)
- local sddm_themes_dir=""
- if [ -d "/usr/share/sddm/themes" ]; then
- sddm_themes_dir="/usr/share/sddm/themes"
- elif [ -d "/run/current-system/sw/share/sddm/themes" ]; then
- sddm_themes_dir="/run/current-system/sw/share/sddm/themes"
- fi
-
- [ -z "$sddm_themes_dir" ] && return 0
-
- local sddm_simple="$sddm_themes_dir/simple_sddm_2"
-
- # Only prompt if theme exists and its Backgrounds directory is writable
- if [ -d "$sddm_simple" ] && [ -w "$sddm_simple/Backgrounds" ]; then
-
- # Check if yad is running to avoid multiple notifications
- if pidof yad >/dev/null; then
- killall yad
- fi
-
- if yad --info --text="Set current wallpaper as SDDM background?\n\nNOTE: This only applies to SIMPLE SDDM v2 Theme" \
- --text-align=left \
- --title="SDDM Background" \
- --timeout=5 \
- --timeout-indicator=right \
- --button="yes:0" \
- --button="no:1"; then
-
- # Check if terminal exists
- if ! command -v "$terminal" &>/dev/null; then
- notify-send -i "$iDIR/error.png" "Missing $terminal" "Install $terminal to enable setting of wallpaper background"
- exit 1
- fi
-
- exec "$SCRIPTSDIR/sddm_wallpaper.sh" --normal
-
- fi
- fi
-}
modify_startup_config() {
local selected_file="$1"
@@ -186,7 +144,6 @@ apply_image_wallpaper() {
"$SCRIPTSDIR/Refresh.sh"
sleep 1
- set_sddm_wallpaper
}
apply_video_wallpaper() {
diff --git a/config/hypr/UserScripts/Weather.sh b/config/hypr/UserScripts/Weather.sh
index ac9abc13..4588ed1d 100755
--- a/config/hypr/UserScripts/Weather.sh
+++ b/config/hypr/UserScripts/Weather.sh
@@ -2,16 +2,50 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# weather info from wttr. https://github.com/chubin/wttr.in
# Remember to add city
+# Function to get current city from IP address with fallback
-city=""
+# Get your current location with your IP adress
+get_current_city() {
+ local city
+
+ # First try: ipinfo.io
+ local location_data=$(curl -fsS "https://ipinfo.io/json" 2>/dev/null)
+ if [ $? -eq 0 ] && [ -n "$location_data" ]; then
+ city=$(echo "$location_data" | grep -o '"city"[[:space:]]*:[[:space:]]*"[^"]*"' | cut -d'"' -f4)
+ if [ -n "$city" ]; then
+ echo "$city"
+ return 0
+ fi
+ fi
+
+ # Fallback: ipapi.co
+ city=$(curl -fsS "https://ipapi.co/json" 2>/dev/null | grep -o '"city"[[:space:]]*:[[:space:]]*"[^"]*"' | cut -d'"' -f4)
+ if [ -n "$city" ]; then
+ echo "$city"
+ return 0
+ fi
+
+ # Last resort: ipwho.is
+ city=$(curl -fsS "https://ipwho.is/" 2>/dev/null | grep -o '"city"[[:space:]]*:[[:space:]]*"[^"]*"' | cut -d'"' -f4)
+ if [ -n "$city" ]; then
+ echo "$city"
+ return 0
+ fi
+
+ # If all fail
+ echo "Unknown" >&2
+ return 1
+}
+city=$(get_current_city)
-# if city is blank, use https://ipapi.co/json to get location from IP
-if [ -z "$city" ]; then
- city=$(curl -fsS https://ipapi.co/json | grep city | cut -f4 -d'"')
+# If city is empty, that means the IP check failed, which means, we should use manual setting
+if [ -z "$city" ] || [ "$city" = "Unknown" ]; then
+ # SET YOUR MANUAL CITY HERE
+ city=" " # ← Change this to your preferred city
+ echo "Using manual city: $city" >&2
fi
-
# URL-encode city for safe use in URLs
encoded_city="$city"
if command -v python3 >/dev/null 2>&1; then
@@ -206,4 +240,4 @@ tooltip_json=$(json_escape "${weather[0]}: $temperature $cond_disp")
printf '{"text":"%s", "alt":"%s", "tooltip":"%s"}\n' "$text_json" "$alt_json" "$tooltip_json"
# Write a two-line cache with an actual newline between lines
-printf ' %s \n%s %s\n' "$temperature" "$condition" "${weather[1]}" > "$HOME/.cache/.weather_cache" \ No newline at end of file
+printf ' %s \n%s %s\n' "$temperature" "$condition" "${weather[1]}" > "$HOME/.cache/.weather_cache"
diff --git a/config/hypr/UserScripts/WeatherWrap.sh b/config/hypr/UserScripts/WeatherWrap.sh
index 10c125dc..5b266930 100755
--- a/config/hypr/UserScripts/WeatherWrap.sh
+++ b/config/hypr/UserScripts/WeatherWrap.sh
@@ -6,6 +6,30 @@ SCRIPT_DIR="$(dirname "$0")"
PY_SCRIPT="$SCRIPT_DIR/Weather.py"
BASH_FALLBACK="$SCRIPT_DIR/Weather.sh"
+# Function to check network connectivity
+check_network() {
+ # Try multiple methods to check network
+ if ping -c1 -W2 8.8.8.8 >/dev/null 2>&1; then
+ return 0
+ fi
+
+ if ping -c1 -W2 1.1.1.1 >/dev/null 2>&1; then
+ return 0
+ fi
+
+ if curl -s --connect-timeout 3 "https://ipinfo.io" >/dev/null 2>&1; then
+ return 0
+ fi
+
+ return 1
+}
+
+# If no network, return offline status immediately
+if ! check_network; then
+ echo '{"text":"󰖪", "alt":"Offline", "tooltip":"No network connection"}'
+ exit 0
+fi
+
run_fallback() {
if [ -f "$BASH_FALLBACK" ]; then
# Invoke via bash to avoid requiring +x and ensure consistent shell
@@ -30,4 +54,4 @@ else
echo "python3 not found in PATH — falling back to Weather.sh" >&2
run_fallback "$@"
exit $?
-fi \ No newline at end of file
+fi
diff --git a/config/hypr/configs/Keybinds.conf b/config/hypr/configs/Keybinds.conf
index 1ddbc81a..dea22719 100644
--- a/config/hypr/configs/Keybinds.conf
+++ b/config/hypr/configs/Keybinds.conf
@@ -23,6 +23,7 @@ bindd = $mainMod, Return, Open terminal, exec, $term
bindd = $mainMod, E, file manager, exec, $files
# FEATURES / EXTRAS
+bindd = $mainMod, T, Global theme switcher using Wallust, exec, $scriptsDir/ThemeChanger.sh #Global theme switcher
bindd = $mainMod, H, help / cheat sheet, exec, $scriptsDir/KeyHints.sh
bindd = $mainMod ALT, R, refresh bar and menus, exec, $scriptsDir/Refresh.sh
bindd = $mainMod ALT, E, emoji menu, exec, $scriptsDir/RofiEmoji.sh
@@ -43,7 +44,7 @@ bindd = $mainMod SHIFT, Return, DropDown terminal, exec, $scriptsDir/Droptermina
# Desktop zooming or magnifier
bindd = $mainMod ALT, mouse_down, zoom in, exec, hyprctl keyword cursor:zoom_factor "$(hyprctl getoption cursor:zoom_factor | awk 'NR==1 {factor = $2; if (factor < 1) {factor = 1}; print factor * 2.0}')"
-bindd = $mainMod ALT, mouse_up, zoom out, exec, hyprctl keyword cursor:zoom_factor "$(hyprctl getoption cursor:zoom_factor | awk 'NR==1 {factor = $2; if (factor < 1) {factor = 1}; print factor / 2.0}')"
+bindd = $mainMod ALT, mouse_up, zoom out, exec, hyprctl keyword cursor:zoom_factor "$(hyprctl getoption cursor:zoom_factor | awk 'NR==1 {factor = $2; if (factor < 1) {factor = 1}; print factor / 2.0}')"
# Waybar / Bar related
bindd = $mainMod CTRL ALT, B, toggle waybar on/off, exec, pkill -SIGUSR1 waybar
@@ -58,11 +59,11 @@ bindd = $mainMod SHIFT, M, online music, exec, $UserScripts/RofiBeats.sh
bindd = $mainMod, W, select wallpaper, exec, $UserScripts/WallpaperSelect.sh
bindd = $mainMod SHIFT, W, wallpaper effects, exec, $UserScripts/WallpaperEffects.sh
bindd = CTRL ALT, W, random wallpaper, exec, $UserScripts/WallpaperRandom.sh
-bindd = $mainMod CTRL, O, toggle active window opacity, exec, hyprctl setprop active opaque toggle
+bindd = $mainMod CTRL, O, toggle active window opacity, setprop, active opaque toggle
bindd = $mainMod SHIFT, K, search keybinds, exec, $scriptsDir/KeyBinds.sh
bindd = $mainMod SHIFT, A, animations menu, exec, $scriptsDir/Animations.sh
bindd = $mainMod SHIFT, O, change oh-my-zsh theme, exec, $UserScripts/ZshChangeTheme.sh
-bindlnd = ALT_L, SHIFT_L, switch keyboard layout globally, exec, $scriptsDir/SwitchKeyboardLayout.sh
+bindlnd = ALT_L, SHIFT_L, switch keyboard layout globally, exec, $scriptsDir/KeyboardLayout.sh switch
bindlnd = SHIFT_L, ALT_L, switch keyboard layout per-window, exec, $scriptsDir/Tak0-Per-Window-Switch.sh
bindd = $mainMod ALT, C, calculator, exec, $UserScripts/RofiCalc.sh
@@ -97,6 +98,8 @@ bindd = $mainMod, P, toggle pseudo (dwindle), pseudo,
# Works on either layout (Master or Dwindle)
bindd = $mainMod, M, set split ratio 0.3, exec, hyprctl dispatch splitratio 0.3
+# layout aware keybinds
+exec-once = $scriptsDir/ChangeLayout.sh init
# Cycle windows; if floating bring to top
@@ -106,6 +109,8 @@ bindd = ALT, tab, bring active to top, bringactivetotop
# Special Keys / Hot Keys
bindeld = , xf86audioraisevolume, volume up, exec, $scriptsDir/Volume.sh --inc
bindeld = , xf86audiolowervolume, volume down, exec, $scriptsDir/Volume.sh --dec
+bindeld = ALT, xf86audioraisevolume, volume up precise, exec, $scriptsDir/Volume.sh --inc-precise
+bindeld = ALT, xf86audiolowervolume, volume down precise, exec, $scriptsDir/Volume.sh --dec-precise
bindld = , xf86AudioMicMute, toggle mic mute, exec, $scriptsDir/Volume.sh --toggle-mic
bindld = , xf86audiomute, toggle mute, exec, $scriptsDir/Volume.sh --toggle
bindld = , xf86Sleep, sleep, exec, systemctl suspend
@@ -160,7 +165,7 @@ bindd = $mainMod CTRL, K, Move left into group, moveintogroup, l # Move active w
bindd = $mainMod CTRL, L, Move Right into group, moveintogroup, r # Move active window right into a group
bindd = $mainMod CTRL, H, Move active out of group, moveoutofgroup # Move active window out of group
-# Try to dynamically move in grouped window and when ungrouped
+# Try to dynamically move in grouped window and when ungrouped
# Not working for me DW 11/26/25 PR: https://github.com/JaKooLit/Hyprland-Dots/pull/872
#bindd = $mainMod, right, focus right, exec, bash -c 'if hyprctl activewindow -j | jq -e "((.grouped | type) == \"boolean\") or (.address == (.grouped[-1] // empty))" >/dev/null 2>&1; then hyprctl dispatch movefocus r; else hyprctl dispatch changegroupactive f; fi'
#bindd = $mainMod, left, focus left, exec, bash -c 'if hyprctl activewindow -j | jq -e "((.grouped | type) == \"boolean\") or (.address == (.grouped[0] // empty))" >/dev/null 2>&1; then hyprctl dispatch movefocus l; else hyprctl dispatch changegroupactive b; fi'
@@ -181,7 +186,7 @@ bindd = $mainMod, U, toggle special workspace, togglespecialworkspace,
# The following mappings use the key codes to better support various keyboard layouts
# 1 is code:10, 2 is code 11, etc
-# Switch workspaces with mainMod + [0-9]
+# Switch workspaces with mainMod + [0-9]
bindd = $mainMod, code:10, workspace 1, workspace, 1 # NOTE: code:10 = key 1
bindd = $mainMod, code:11, workspace 2, workspace, 2 # NOTE: code:11 = key 2
bindd = $mainMod, code:12, workspace 3, workspace, 3 # NOTE: code:12 = key 3
diff --git a/config/hypr/configs/Startup_Apps.conf b/config/hypr/configs/Startup_Apps.conf
index 0cfb6427..0cc5da11 100644
--- a/config/hypr/configs/Startup_Apps.conf
+++ b/config/hypr/configs/Startup_Apps.conf
@@ -1,35 +1,23 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# Commands and Apps to be executed at launch (vendor defaults)
-
$scriptsDir = $HOME/.config/hypr/scripts
$UserScripts = $HOME/.config/hypr/UserScripts
-
-$wallDIR=$HOME/Pictures/wallpapers
$lock = $scriptsDir/LockScreen.sh
$SwwwRandom = $UserScripts/WallpaperAutoChange.sh
$livewallpaper=""
+$wallDIR = $HOME/Pictures/wallpapers # change path manually here if needed
### wallpaper stuff ###
exec-once = swww-daemon --format xrgb
#exec-once = mpvpaper '*' -o "load-scripts=no no-audio --loop" $livewallpaper
-
# wallpaper random
#exec-once = $SwwwRandom $wallDIR # random wallpaper switcher every 30 minutes
### Startup ###
exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
-exec-once = $scriptsDir/KeybindsLayoutInit.sh
-
-# Drop Down terminal
-# See Bug#810 https://github.com/JaKooLit/Hyprland-Dots/issues/810#issuecomment-3351947644
exec-once = $HOME/.config/hypr/scripts/Dropterminal.sh kitty &
-
-
-# Polkit (Polkit Gnome / KDE)
exec-once = $scriptsDir/Polkit.sh
-
-# starup apps
exec-once = nm-applet --indicator
exec-once = nm-tray # For ubuntu
exec-once = swaync
@@ -38,23 +26,20 @@ exec-once = swaync
#exec-once = rog-control-center
exec-once = waybar
exec-once = qs -c overview # Quickshell Overview
+exec-once = hypridle
+exec-once = $scriptsDir/Hyprsunset.sh init
# Clipboard manager
exec-once = wl-paste --type text --watch cliphist store
exec-once = wl-paste --type image --watch cliphist store
-# Rainbow borders
-exec-once = $UserScripts/RainbowBorders.sh
+# Rainbow borders (disabled by default; use quick settings menu)
+#exec-once = $UserScripts/RainbowBorders.sh
-# hypridle for hyprlock
-exec-once = hypridle
-
-# Resume Hyprsunset if state is "on" from previous session
-exec-once = $scriptsDir/Hyprsunset.sh init
# Here are list of features available but disabled by default
# Persistent wallpaper
-# exec-once = swww-daemon --format xrgb && swww img $HOME/Pictures/wallpapers/mecha-nostalgia.png
+# exec-once = swww-daemon --format xrgb && swww img $wallDIR/mecha-nostalgia.png
# Gnome polkit for NixOS
#exec-once = $scriptsDir/Polkit-NixOS.sh
diff --git a/config/hypr/configs/SystemSettings.conf b/config/hypr/configs/SystemSettings.conf
index 44521156..f49960cd 100644
--- a/config/hypr/configs/SystemSettings.conf
+++ b/config/hypr/configs/SystemSettings.conf
@@ -93,6 +93,11 @@ misc {
enable_anr_dialog = true # Application not Responding (ANR)
anr_missed_pings = 15 # ANR Threshold default 1 is too low
allow_session_lock_restore = true # Prevent lockscreen crash when resume from suspend
+ # This only works with HL v0.53+
+ on_focus_under_fullscreen = 1
+ # 0 - Default, no change
+ # 1 - New focused window takes over fullscreen (Windows-like Alt-Tab)
+ # 2 - New focused window stays behind the fullscreen one
}
#opengl {
diff --git a/config/hypr/configs/WindowRules-config-v3.conf b/config/hypr/configs/WindowRules-config-v3.conf
index ba179461..6aab2590 100644
--- a/config/hypr/configs/WindowRules-config-v3.conf
+++ b/config/hypr/configs/WindowRules-config-v3.conf
@@ -2,10 +2,24 @@
# Vendor defaults for window rules and layerrules
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
-# NOTES: This is only for Hyprland > 0.52.1
-# note for ja: This should NOT be implemented on Debian and Ubuntu
+# NOTES: This is only for Hyprland >= 0.53
-# windowrule - tags - add apps under appropriate tag to use the same settings
+# Some samples on hwo to start apps on specific workspaces
+# windowrule = match:tag email*, workspace 1
+# windowrule = match:tag browser*, workspace 2
+# windowrule = match:tag projects*, workspace 3
+# windowrule = match:tag screenshare*, workspace 4 silent
+# windowrule = match:tag gamestore*, workspace 5
+# windowrule = match:class ^(virt-manager)$, workspace 6 silent
+# windowrule = match:class ^(.virt-manager-wrapped)$, workspace 6 silent
+# windowrule = match:tag im*, workspace 7
+# windowrule = match:class obsidian, workspace 8
+# windowrule = match:tag games*, workspace 8
+# windowrule = match:tag multimedia*, workspace 9 silent
+
+
+
+# TAGS - add apps under appropriate tag to use the same settings
# browser tags
windowrule = match:class ^([Ff]irefox|org.mozilla.firefox|[Ff]irefox-esr|[Ff]irefox-bin)$, tag +browser
windowrule = match:class ^([Gg]oogle-chrome(-beta|-dev|-unstable)?)$, tag +browser
@@ -14,7 +28,7 @@ windowrule = match:class ^([Cc]hromium)$, tag +browser
windowrule = match:class ^([Mm]icrosoft-edge(-stable|-beta|-dev|-unstable))$, tag +browser
windowrule = match:class ^(Brave-browser(-beta|-dev|-unstable)?)$, tag +browser
windowrule = match:class ^([Tt]horium-browser|[Cc]achy-browser)$, tag +browser
-windowrule = match:class ^(zen-alpha|zen)$, tag +browser
+windowrule = match:class ^(zen)$, tag +browser
# notif tags
windowrule = match:class ^(swaync-control-center|swaync-notification-window|swaync-client|class)$, tag +notif
@@ -30,11 +44,13 @@ windowrule = match:class ^(Alacritty|kitty|kitty-dropterm)$, tag +terminal
# email tags
windowrule = match:class ^([Tt]hunderbird|org.gnome.Evolution)$, tag +email
windowrule = match:class ^(eu.betterbird.Betterbird)$, tag +email
+windowrule = match:class ^(org.gnome.Evolution)$, tag +email
# project tags
windowrule = match:class ^(codium|codium-url-handler|VSCodium)$, tag +projects
windowrule = match:class ^(VSCode|code|code-url-handler)$, tag +projects
windowrule = match:class ^(jetbrains-.+)$, tag +projects
+windowrule = match:class ^(dev.zed.Zed|antigravity)$, tag +projects
# screenshare tags
windowrule = match:class ^(com.obsproject.Studio)$, tag +screenshare
@@ -43,7 +59,6 @@ windowrule = match:class ^(com.obsproject.Studio)$, tag +screenshare
windowrule = match:class ^([Dd]iscord|[Ww]ebCord|[Vv]esktop)$, tag +im
windowrule = match:class ^([Ff]erdium)$, tag +im
windowrule = match:class ^([Ww]hatsapp-for-linux)$, tag +im
-windowrule = match:class ^(ZapZap|com.rtosta.zapzap)$, tag +im
windowrule = match:class ^(org.telegram.desktop|io.github.tdesktop_x64.TDesktop)$, tag +im
windowrule = match:class ^(teams-for-linux)$, tag +im
windowrule = match:class ^(im.riot.Riot|Element)$, tag +im
@@ -79,10 +94,12 @@ windowrule = match:title (Kvantum Manager), tag +settings
windowrule = match:class ^(file-roller|org.gnome.FileRoller)$, tag +settings
windowrule = match:class ^(nm-applet|nm-connection-editor|blueman-manager)$, tag +settings
windowrule = match:class ^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$, tag +settings
-windowrule = match:class ^(qt5ct|qt6ct|[Yy]ad)$, tag +settings
+windowrule = match:class ^(qt5ct|qt6ct)$, tag +settings
windowrule = match:class (xdg-desktop-portal-gtk), tag +settings
windowrule = match:class ^(org.kde.polkit-kde-authentication-agent-1)$, tag +settings
windowrule = match:class ^([Rr]ofi)$, tag +settings
+windowrule = match:class ^(btrfs-assistant)$, tag +settings
+windowrule = match:class ^(timeshift-gtk)$, tag +settings
# viewer tags
windowrule = match:class ^(gnome-system-monitor|org.gnome.SystemMonitor|io.missioncenter.MissionCenter)$, tag +viewer
@@ -153,23 +170,21 @@ windowrule = match:tag wallpaper, opacity 0.9 0.7
windowrule = match:class ^(gedit|org.gnome.TextEditor|mousepad)$, opacity 0.8 0.7
windowrule = match:class ^(deluge)$, opacity 0.9 0.8
windowrule = match:class ^(seahorse)$, opacity 0.9 0.8
-windowrule = match:title ^(Picture-in-Picture)$, opacity 0.95 0.75
# SIZE
windowrule = match:tag KooL_Cheat, size (monitor_w*0.65) (monitor_h*0.9)
windowrule = match:tag wallpaper, size (monitor_w*0.7) (monitor_h*0.7)
windowrule = match:tag settings, size (monitor_w*0.7) (monitor_h*0.7)
-windowrule = match:class ^([Ww]hatsapp-for-linux|ZapZap|com.rtosta.zapzap)$, size (monitor_w*0.6) (monitor_h*0.7)
windowrule = match:class ^([Ff]erdium)$, size (monitor_w*0.6) (monitor_h*0.7)
+windowrule = match:class (org.gnome.Calculator|qalculate-gtk), center on, size (monitor_w*0.25) (monitor_h*0.3)
-# PINNING
-windowrule = match:title ^(Picture-in-Picture)$, pin on, keep_aspect_ratio on
# BLUR & FULLSCREEN
windowrule = match:tag games, no_blur on, fullscreen 0
windowrule = match:tag games, fullscreen 0
-# This not gonna take the focus to the window that appears when hovering over some of the parts of the IntelliJ Products
+# This not gonna take the focus to the window that appears when
+# hovering over some of the parts of the IntelliJ Products
windowrule = match:class ^(jetbrains-*), no_initial_focus on
windowrule = match:title ^(wind.*)$, no_initial_focus on
@@ -178,3 +193,31 @@ layerrule = match:namespace rofi, blur on
layerrule = match:namespace notifications, blur on
layerrule = match:namespace quickshell:overview, blur on
layerrule = match:namespace quickshell:overview, ignore_alpha 0.5
+
+# Named rules for special cases
+windowrule {
+ name = Whatsapp-zapzap
+ match:class = ^([Ww]hatsapp-for-linux|ZapZap|com.rtosta.zapzap)$
+ size = (monitor_w*0.6) (monitor_h*0.7)
+ center = on
+}
+windowrule {
+ name = Picture-in-Picture
+ match:title = ^(Picture-in-Picture)$
+ float = on
+ move = 72% 7%
+ opacity = 0.95 0.75
+ pin = on
+ keep_aspect_ratio = on
+ size = (monitor_w*0.3) (monitor_h*0.3)
+}
+# Thunar copy progress dialog
+windowrule {
+ name = Thunar-Progress-bar
+ match:class = ^(thunar)$
+ match:title = ^(File Operation Progress)$
+ float = on
+ center = on
+ size = (monitor_w*0.26) (monitor_h*0.18)
+}
+
diff --git a/config/hypr/configs/WindowRules-pre-53.conf b/config/hypr/configs/WindowRules-pre-53.conf
index d1fb9315..8a5f99c7 100644
--- a/config/hypr/configs/WindowRules-pre-53.conf
+++ b/config/hypr/configs/WindowRules-pre-53.conf
@@ -4,8 +4,6 @@
# NOTES: This is only for Hyprland > 0.48
-# note for ja: This should NOT be implemented on Debian and Ubuntu
-
# windowrule - tags - add apps under appropriate tag to use the same settings
# browser tags
windowrule = tag +browser, class:^([Ff]irefox|org.mozilla.firefox|[Ff]irefox-esr|[Ff]irefox-bin)$
@@ -228,4 +226,4 @@ layerrule = ignorealpha 0.5, quickshell:overview
#layerrule = ignorezero, <rofi>
#layerrule = ignorezero, overview
-#layerrule = blur, overview \ No newline at end of file
+#layerrule = blur, overview
diff --git a/config/hypr/configs/WindowRules.conf b/config/hypr/configs/WindowRules.conf
index ba179461..d110cd4a 100644
--- a/config/hypr/configs/WindowRules.conf
+++ b/config/hypr/configs/WindowRules.conf
@@ -2,10 +2,24 @@
# Vendor defaults for window rules and layerrules
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
-# NOTES: This is only for Hyprland > 0.52.1
-# note for ja: This should NOT be implemented on Debian and Ubuntu
+# NOTES: This is only for Hyprland >= 0.53
-# windowrule - tags - add apps under appropriate tag to use the same settings
+# Some samples on hwo to start apps on specific workspaces
+# windowrule = match:tag email*, workspace 1
+# windowrule = match:tag browser*, workspace 2
+# windowrule = match:tag projects*, workspace 3
+# windowrule = match:tag screenshare*, workspace 4 silent
+# windowrule = match:tag gamestore*, workspace 5
+# windowrule = match:class ^(virt-manager)$, workspace 6 silent
+# windowrule = match:class ^(.virt-manager-wrapped)$, workspace 6 silent
+# windowrule = match:tag im*, workspace 7
+# windowrule = match:class obsidian, workspace 8
+# windowrule = match:tag games*, workspace 8
+# windowrule = match:tag multimedia*, workspace 9 silent
+
+
+
+# TAGS - add apps under appropriate tag to use the same settings
# browser tags
windowrule = match:class ^([Ff]irefox|org.mozilla.firefox|[Ff]irefox-esr|[Ff]irefox-bin)$, tag +browser
windowrule = match:class ^([Gg]oogle-chrome(-beta|-dev|-unstable)?)$, tag +browser
@@ -28,13 +42,15 @@ windowrule = match:class ^(nwg-displays|nwg-look)$, tag +KooL-Settings
windowrule = match:class ^(Alacritty|kitty|kitty-dropterm)$, tag +terminal
# email tags
-windowrule = match:class ^([Tt]hunderbird|org.gnome.Evolution)$, tag +email
+windowrule = match:class ^([Tt]hunderbird|org.mozilla.Thunderbird)$, tag +email
windowrule = match:class ^(eu.betterbird.Betterbird)$, tag +email
+windowrule = match:class ^(org.gnome.Evolution)$, tag +email
# project tags
windowrule = match:class ^(codium|codium-url-handler|VSCodium)$, tag +projects
windowrule = match:class ^(VSCode|code|code-url-handler)$, tag +projects
windowrule = match:class ^(jetbrains-.+)$, tag +projects
+windowrule = match:class ^(dev.zed.Zed|antigravity)$, tag +projects
# screenshare tags
windowrule = match:class ^(com.obsproject.Studio)$, tag +screenshare
@@ -43,7 +59,6 @@ windowrule = match:class ^(com.obsproject.Studio)$, tag +screenshare
windowrule = match:class ^([Dd]iscord|[Ww]ebCord|[Vv]esktop)$, tag +im
windowrule = match:class ^([Ff]erdium)$, tag +im
windowrule = match:class ^([Ww]hatsapp-for-linux)$, tag +im
-windowrule = match:class ^(ZapZap|com.rtosta.zapzap)$, tag +im
windowrule = match:class ^(org.telegram.desktop|io.github.tdesktop_x64.TDesktop)$, tag +im
windowrule = match:class ^(teams-for-linux)$, tag +im
windowrule = match:class ^(im.riot.Riot|Element)$, tag +im
@@ -79,10 +94,12 @@ windowrule = match:title (Kvantum Manager), tag +settings
windowrule = match:class ^(file-roller|org.gnome.FileRoller)$, tag +settings
windowrule = match:class ^(nm-applet|nm-connection-editor|blueman-manager)$, tag +settings
windowrule = match:class ^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$, tag +settings
-windowrule = match:class ^(qt5ct|qt6ct|[Yy]ad)$, tag +settings
+windowrule = match:class ^(qt5ct|qt6ct)$, tag +settings
windowrule = match:class (xdg-desktop-portal-gtk), tag +settings
windowrule = match:class ^(org.kde.polkit-kde-authentication-agent-1)$, tag +settings
windowrule = match:class ^([Rr]ofi)$, tag +settings
+windowrule = match:class ^(btrfs-assistant)$, tag +settings
+windowrule = match:class ^(timeshift-gtk)$, tag +settings
# viewer tags
windowrule = match:class ^(gnome-system-monitor|org.gnome.SystemMonitor|io.missioncenter.MissionCenter)$, tag +viewer
@@ -92,53 +109,46 @@ windowrule = match:class ^(eog|org.gnome.Loupe)$, tag +viewer
# Some special override rules
windowrule = match:tag multimedia_video, no_blur on
windowrule = match:tag multimedia_video, opacity 1.0
+windowrule = match:tag multimedia, no_blur on
+windowrule = match:tag multimedia, opacity 1.0
# POSITION
-# windowrule = match:floating true, center on
windowrule = match:tag KooL_Cheat, center on
-windowrule = match:class ([Tt]hunar) match:title negative:(.*[Tt]hunar.*), center on
-windowrule = match:title ^(ROG Control)$, center on
windowrule = match:tag KooL-Settings, center on
+windowrule = match:title ^(ROG Control)$, center on
windowrule = match:title ^(Keybindings)$, center on
windowrule = match:class ^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$, center on
-windowrule = match:class ^([Ww]hatsapp-for-linux|ZapZap|com.rtosta.zapzap)$, center on
windowrule = match:class ^([Ff]erdium)$, center on
-windowrule = match:title ^(Picture-in-Picture)$, move 72% 7%
# windowrule to avoid idle for fullscreen apps
windowrule = match:fullscreen true, idle_inhibit fullscreen
+windowrule = idle_inhibit fullscreen, match:fullscreen 1
+windowrule = idle_inhibit fullscreen, match:class ^(*)$
+windowrule = idle_inhibit fullscreen, match:title ^(*)$
# FLOAT
windowrule = match:tag KooL_Cheat, float on
-windowrule = match:tag wallpaper, float on
-windowrule = match:tag settings, float on
-windowrule = match:tag viewer, float on
-windowrule = match:tag KooL-Settings, float on
+windowrule = match:tag wallpaper, float on, center on
+windowrule = match:tag settings, float on, center on
+windowrule = match:tag viewer, float on, center on
+windowrule = match:tag KooL-Settings, float on, center on
windowrule = match:class ([Zz]oom|onedriver|onedriver-launcher), float on
-windowrule = match:class (org.gnome.Calculator) match:title (Calculator), float on
+windowrule = match:class (org.gnome.Calculator|qalculate-gtk), float on
windowrule = match:class ^(mpv|com.github.rafostar.Clapper)$, float on
windowrule = match:class ^([Qq]alculate-gtk)$, float on
windowrule = match:class ^([Ff]erdium)$, float on
-windowrule = match:title ^(Picture-in-Picture)$, float on
-# windowrule - ######### float popups and dialogue #######
+# popups and dialogue
windowrule = match:title ^(Authentication Required)$, float on, center on
windowrule = match:class (codium|codium-url-handler|VSCodium) match:title negative:(.*codium.*|.*VSCodium.*), float on
windowrule = match:class ^(com.heroicgameslauncher.hgl)$ match:title negative:(Heroic Games Launcher), float on
windowrule = match:class ^([Ss]team)$ match:title negative:^([Ss]team)$, float on
-windowrule = match:class ([Tt]hunar) match:title negative:(.*[Tt]hunar.*), float on
-
windowrule = match:title ^(Add Folder to Workspace)$, float on, size (monitor_w*0.7) (monitor_h*0.6), center on
-
windowrule = match:title ^(Save As)$, float on, size (monitor_w*0.7) (monitor_h*0.6), center on
-
windowrule = match:initial_title (Open Files), float on, size (monitor_w*0.7) (monitor_h*0.6)
-
windowrule = match:title ^(SDDM Background)$, float on, center on, size (monitor_w*0.16) (monitor_h*0.12)
-
-# YAD dialog for wallpaper confirmation
-windowrule = match:class ^(yad)$ match:title ^(YAD)$, float on, center on, size (monitor_w*0.2) (monitor_h*0.2)
-# END of float popups and dialogue #######
+windowrule = match:class ^(yad)$, float on, center on, size (monitor_w*0.2) (monitor_h*0.2)
+windowrule = match:class ^(hyprland-donate-screen)$, float on, center on
# OPACITY
windowrule = match:tag browser, opacity 0.99 0.8
@@ -169,7 +179,8 @@ windowrule = match:title ^(Picture-in-Picture)$, pin on, keep_aspect_ratio on
windowrule = match:tag games, no_blur on, fullscreen 0
windowrule = match:tag games, fullscreen 0
-# This not gonna take the focus to the window that appears when hovering over some of the parts of the IntelliJ Products
+# This not gonna take the focus to the window that appears when
+# hovering over some of the parts of the IntelliJ Products
windowrule = match:class ^(jetbrains-*), no_initial_focus on
windowrule = match:title ^(wind.*)$, no_initial_focus on
@@ -178,3 +189,31 @@ layerrule = match:namespace rofi, blur on
layerrule = match:namespace notifications, blur on
layerrule = match:namespace quickshell:overview, blur on
layerrule = match:namespace quickshell:overview, ignore_alpha 0.5
+
+# Named rules for special cases
+windowrule {
+ name = Whatsapp-zapzap
+ match:class = ^([Ww]hatsapp-for-linux|ZapZap|com.rtosta.zapzap)$
+ size = (monitor_w*0.6) (monitor_h*0.7)
+ center = on
+}
+windowrule {
+ name = Picture-in-Picture
+ match:title = ^(Picture-in-Picture)$
+ float = on
+ move = 72% 7%
+ opacity = 0.95 0.75
+ pin = on
+ keep_aspect_ratio = on
+ size = (monitor_w*0.3) (monitor_h*0.3)
+}
+# Thunar copy progress dialog
+windowrule {
+ name = Thunar-Progress-bar
+ match:class = ^(thunar)$
+ match:title = ^(File Operation Progress)$
+ float = on
+ center = on
+ size = (monitor_w*0.26) (monitor_h*0.18)
+}
+
diff --git a/config/hypr/hyprlock-2k.conf b/config/hypr/hyprlock-2k.conf
new file mode 100644
index 00000000..f359357f
--- /dev/null
+++ b/config/hypr/hyprlock-2k.conf
@@ -0,0 +1,183 @@
+# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
+# Hyprlock config for => 2k monitor resolutions
+# Original config submitted by https://github.com/SherLock707
+
+# Sourcing colors generated by wallust
+source = $HOME/.config/hypr/wallust/wallust-hyprland.conf
+$Scripts = $HOME/.config/hypr/scripts
+
+general {
+ grace = 1
+ fractional_scaling = 2
+ immediate_render = true
+}
+
+background {
+ monitor =
+ # NOTE: use only 1 path
+ #path = screenshot # screenshot of your desktop
+ #path = $HOME/.config/hypr/wallpaper_effects/.wallpaper_modified # by wallpaper effects
+ path = $HOME/.config/hypr/wallpaper_effects/.wallpaper_current # current wallpaper
+
+ color = rgb(0,0,0) # color will be rendered initially until path is available
+
+ # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations
+ blur_size = 3
+ blur_passes = 2 # 0 disables blurring
+ noise = 0.0117
+ contrast = 1.3000 # Vibrant!!!
+ brightness = 0.8000
+ vibrancy = 0.2100
+ vibrancy_darkness = 0.0
+}
+
+
+# Date
+label {
+ monitor =
+ text = cmd[update:18000000] echo "<b> "$(date +'%A, %-d %B')" </b>"
+ color = $color13
+ font_size = 64
+ font_family = Victor Mono Bold Italic
+ position = 0, -20
+ halign = center
+ valign = center
+}
+
+# Hour-Time (single horizontal time like 1080p variant)
+label {
+ monitor =
+# text = cmd[update:1000] echo "$(date +"%H:%M")" # 24h option
+ text = cmd[update:1000] echo "$(date +"%I:%M %p")" # AM/PM
+ #color = rgba(255, 185, 0, .8)
+ color = $color8
+ font_size = 173
+ font_family = JetBrainsMono Nerd Font ExtraBold
+ position = 0, -133
+ halign = center
+ valign = top
+}
+
+# Minute-Time (disabled; kept for reference)
+# label {
+# monitor =
+# text = cmd[update:1000] echo "$(date +"%M")"
+# #color = rgba(15, 10, 222, .8)
+# color = $color12
+# font_size = 240
+# font_family = JetBrainsMono Nerd Font ExtraBold
+# position = 0, -450
+# halign = center
+# valign = top
+# }
+
+# Seconds-Time (disabled; kept for reference)
+# label {
+# monitor =
+# text = cmd[update:1000] echo "$(date +"%S")"
+# # text = cmd[update:1000] echo "$(date +"%S %p")" #AM/PM
+# color = $color11
+# font_size = 50
+# font_family = JetBrainsMono Nerd Font ExtraBold
+# position = 0, -450
+# halign = center
+# valign = top
+# }
+
+# Put a picture of choice here. Default is the current wallpaper
+#image {
+# monitor =
+# #path = $HOME/.config/hypr/wallpaper_effects/.wallpaper_current
+# size = 160
+# rounding = -1
+# border_size = 0
+# border_color = $color11
+# rotate = 0
+# reload_time = -1
+# position = 0, 400
+# halign = center
+# valign = bottom
+#}
+
+# USER
+label {
+ monitor =
+ text =  $USER
+ color = $color9
+ font_size = 48
+ font_family = Victor Mono Bold Oblique
+ position = 0, 300
+ halign = center
+ valign = bottom
+}
+
+# INPUT FIELD
+input-field {
+ monitor =
+ size = 306, 93
+ outline_thickness = 2
+ dots_size = 0.2 # Scale of input-field height, 0.2 - 0.8
+ dots_spacing = 0.2 # Scale of dots' absolute size, 0.0 - 1.0
+ dots_center = true
+ outer_color = $color8
+ inner_color = rgba(255, 255, 255, 0.1)
+ capslock_color = rgb(255,255,255)
+ font_color = $color13
+ fade_on_empty = false
+ font_family = Victor Mono Bold Oblique
+ placeholder_text = <i><span foreground="##ffffff99">🔒 Type Password</span></i>
+ hide_input = false
+ position = 0, 100
+ halign = center
+ valign = bottom
+}
+
+# Keyboard LAYOUT
+label {
+ monitor =
+ text = $LAYOUT
+ color = $color8
+ font_size = 19
+ font_family = Victor Mono Bold Oblique
+ position = 0, 53
+ halign = center
+ valign = bottom
+}
+
+# uptime
+label {
+ monitor =
+ text = cmd[update:60000] echo "<b> "$(uptime -p || $Scripts/UptimeNixOS.sh)" </b>"
+ color = $color8
+ font_size = 32
+ font_family = Victor Mono Bold Oblique
+ position = 0, 0
+ halign = right
+ valign = bottom
+}
+
+# battery information
+label {
+ monitor =
+ text = cmd[update:1000] echo "<b> "$($Scripts/Battery.sh)" </b>"
+ color = $color8
+ font_size = 21
+ font_family = Victor Mono Bold Oblique
+ position = 0, 40
+ halign = right
+ valign = bottom
+}
+
+# weather edit the scripts for locations
+# weather scripts are located in ~/.config/hypr/UserScripts Weather.sh and/or Weather.py
+# see https://github.com/JaKooLit/Hyprland-Dots/wiki/TIPS#%EF%B8%8F-weather-app-related-for-waybar-and-hyprlock
+label {
+ monitor =
+ text = cmd[update:3600000] [ -f "$HOME/.cache/.weather_cache" ] && cat "$HOME/.cache/.weather_cache"
+ color = $color8
+ font_size = 19
+ font_family = Victor Mono Bold Oblique
+ position = 50, 0
+ halign = left
+ valign = bottom
+}
diff --git a/config/hypr/initial-boot.sh b/config/hypr/initial-boot.sh
index 1313f104..eeabdef5 100755
--- a/config/hypr/initial-boot.sh
+++ b/config/hypr/initial-boot.sh
@@ -49,9 +49,6 @@ if [ ! -f "$HOME/.config/hypr/.initial_startup_done" ]; then
# initiate kvantum theme
kvantummanager --set "$kvantum_theme" > /dev/null 2>&1 &
- # initiate the kb_layout (for some reason) waybar cant launch it
- "$scriptsDir/SwitchKeyboardLayout.sh" > /dev/null 2>&1 &
-
# waybar style
#if [ -L "$HOME/.config/waybar/config" ]; then
## ln -sf "$waybar_style" "$HOME/.config/waybar/style.css"
diff --git a/config/hypr/scripts/ChangeLayout.sh b/config/hypr/scripts/ChangeLayout.sh
index e2436b79..221f9637 100755
--- a/config/hypr/scripts/ChangeLayout.sh
+++ b/config/hypr/scripts/ChangeLayout.sh
@@ -6,19 +6,34 @@ notif="$HOME/.config/swaync/images/ja.png"
LAYOUT=$(hyprctl -j getoption general:layout | jq '.str' | sed 's/"//g')
+# Reverse layout value to reuse toggle logic. So layouts don't get swapped initially.
+if [ "$1" = "init" ]; then
+ if [ "$LAYOUT" = "master" ]; then
+ LAYOUT="dwindle"
+ else
+ LAYOUT="master"
+ fi
+fi
+
case $LAYOUT in
"master")
- hyprctl keyword general:layout dwindle
- # SUPER+J/K are global and managed by KeybindsLayoutInit.sh; only manage SUPER+O here
- hyprctl keyword bind SUPER,O,togglesplit
+ hyprctl keyword general:layout dwindle
+ hyprctl keyword unbind SUPER,J
+ hyprctl keyword unbind SUPER,K
+ hyprctl keyword bind SUPER,J,cyclenext
+ hyprctl keyword bind SUPER,K,cyclenext,prev
+ hyprctl keyword bind SUPER,O,togglesplit
notify-send -e -u low -i "$notif" " Dwindle Layout"
- ;;
+ ;;
"dwindle")
- hyprctl keyword general:layout master
- # Drop togglesplit binding on SUPER+O when switching back to master
- hyprctl keyword unbind SUPER,O
+ hyprctl keyword general:layout master
+ hyprctl keyword unbind SUPER,J
+ hyprctl keyword unbind SUPER,K
+ hyprctl keyword unbind SUPER,O
+ hyprctl keyword bind SUPER,J,layoutmsg,cyclenext
+ hyprctl keyword bind SUPER,K,layoutmsg,cycleprev
notify-send -e -u low -i "$notif" " Master Layout"
- ;;
+ ;;
*) ;;
esac
diff --git a/config/hypr/scripts/DarkLight.sh b/config/hypr/scripts/DarkLight.sh
index e473efb2..37016ec3 100755
--- a/config/hypr/scripts/DarkLight.sh
+++ b/config/hypr/scripts/DarkLight.sh
@@ -4,7 +4,8 @@
# Note: Scripts are looking for keywords Light or Dark except for wallpapers as the are in a separate directories
# Paths
-wallpaper_base_path="$HOME/Pictures/wallpapers/Dynamic-Wallpapers"
+PICTURES_DIR="$(xdg-user-dir PICTURES 2>/dev/null || echo "$HOME/Pictures")"
+wallpaper_base_path="$PICTURES_DIR/wallpapers/Dynamic-Wallpapers"
dark_wallpapers="$wallpaper_base_path/Dark"
light_wallpapers="$wallpaper_base_path/Light"
hypr_config_path="$HOME/.config/hypr"
@@ -19,6 +20,10 @@ kitty_conf="$HOME/.config/kitty/kitty.conf"
wallust_config="$HOME/.config/wallust/wallust.toml"
pallete_dark="dark16"
pallete_light="light16"
+qt5ct_dark="$HOME/.config/qt5ct/colors/Catppuccin-Mocha.conf"
+qt5ct_light="$HOME/.config/qt5ct/colors/Catppuccin-Latte.conf"
+qt6ct_dark="$HOME/.config/qt6ct/colors/Catppuccin-Mocha.conf"
+qt6ct_light="$HOME/.config/qt6ct/colors/Catppuccin-Latte.conf"
# intial kill process
for pid in waybar rofi swaync ags swaybg; do
@@ -43,6 +48,14 @@ else
# Logic for Light mode
wallpaper_path="$light_wallpapers"
fi
+# Select Qt color scheme templates for the upcoming mode
+if [ "$next_mode" = "Dark" ]; then
+ qt5ct_color_scheme="$qt5ct_dark"
+ qt6ct_color_scheme="$qt6ct_dark"
+else
+ qt5ct_color_scheme="$qt5ct_light"
+ qt6ct_color_scheme="$qt6ct_light"
+fi
# Function to update theme mode for the next cycle
update_theme_mode() {
diff --git a/config/hypr/scripts/Distro_update.sh b/config/hypr/scripts/Distro_update.sh
index 2b3376e3..917f303b 100755
--- a/config/hypr/scripts/Distro_update.sh
+++ b/config/hypr/scripts/Distro_update.sh
@@ -27,7 +27,7 @@ elif command -v dnf &> /dev/null; then
notify-send -i "$iDIR/ja.png" -u low 'Fedora system' 'has been updated.'
elif command -v apt &> /dev/null; then
# Debian-based (Debian, Ubuntu, etc.)
- kitty -T update sudo apt update && sudo apt upgrade -y
+ kitty -T update bash -c "sudo apt update && sudo apt upgrade -y"
notify-send -i "$iDIR/ja.png" -u low 'Debian/Ubuntu system' 'has been updated.'
elif command -v zypper &> /dev/null; then
# openSUSE-based
diff --git a/config/hypr/scripts/Hypridle.sh b/config/hypr/scripts/Hypridle.sh
index 6acff434..a9bb90d7 100755
--- a/config/hypr/scripts/Hypridle.sh
+++ b/config/hypr/scripts/Hypridle.sh
@@ -15,7 +15,8 @@ elif [[ "$1" == "toggle" ]]; then
if pgrep -x "$PROCESS" >/dev/null; then
pkill "$PROCESS"
else
- "$PROCESS"
+ "$PROCESS" >/dev/null 2>&1 &
+ disown
fi
else
echo "Usage: $0 {status|toggle}"
diff --git a/config/hypr/scripts/KeyBinds.sh b/config/hypr/scripts/KeyBinds.sh
index 4158b762..26ae832b 100755
--- a/config/hypr/scripts/KeyBinds.sh
+++ b/config/hypr/scripts/KeyBinds.sh
@@ -21,135 +21,19 @@ msg='☣️ NOTE ☣️: Clicking with Mouse or Pressing ENTER will have NO func
files=("$keybinds_conf" "$user_keybinds_conf")
[[ -f "$laptop_conf" ]] && files+=("$laptop_conf")
-# Parse binds/unbinds from files, detect overrides, and keep unique effective binds
-declare -A binding_map # combo -> bind line (effective)
-declare -A source_map # combo -> source file
-declare -A user_bind_map # combo -> user bind line
-declare -A unbound_user # combo -> 1 if explicitly unbound in user file
-declare -A seen_any_bind # combo -> 1 if any bind seen (for iteration)
-declare -A default_seen # combo -> 1 if default bind exists
-declare -a missing_unbind_suggestions_arr
+# Parse binds using the python script for speed
+# The last argument must be the user config for override logic to work correctly
+display_keybinds=$("$HOME/.config/hypr/scripts/keybinds_parser.py" "${files[@]}")
-normalize_combo() { echo "$1" | sed -E 's/[[:space:]]//g'; }
-
-extract_combo() {
- # arg: a bind/unbind line; returns "mods,key" via echo
- local s="$1"
- s="$(echo "$s" | sed -E 's/[[:space:]]+#.*$//')"
- if [[ "$s" =~ = ]]; then
- local rhs="${s#*=}"
- local mods="$(echo "$rhs" | awk -F',' '{gsub(/^[ \t]+|[ \t]+$/,"",$1); print $1}')"
- local key="$(echo "$rhs" | awk -F',' '{gsub(/^[ \t]+|[ \t]+$/,"",$2); print $2}')"
- echo "${mods},${key}"
- fi
-}
-
-for file in "${files[@]}"; do
- [[ ! -f "$file" ]] && continue
- while IFS= read -r line; do
- [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
-
- if [[ "$line" =~ ^[[:space:]]*bind[a-z]*[[:space:]]*= ]]; then
- combo_raw="$(extract_combo "$line")"
- [[ -z "$combo_raw" ]] && continue
- combo="$(normalize_combo "$combo_raw")"
- seen_any_bind["$combo"]=1
-
- if [[ "$file" != "$user_keybinds_conf" ]]; then
- default_seen["$combo"]=1
- fi
-
- # prefer user bind, else first seen
- if [[ -z "${source_map[$combo]}" ]]; then
- binding_map["$combo"]="$line"
- source_map["$combo"]="$file"
- fi
- if [[ "$file" == "$user_keybinds_conf" ]]; then
- user_bind_map["$combo"]="$line"
- binding_map["$combo"]="$line"
- source_map["$combo"]="$file"
- fi
-
- elif [[ "$line" =~ ^[[:space:]]*unbind[[:space:]]*= ]]; then
- combo_raw="$(extract_combo "$line")"
- [[ -z "$combo_raw" ]] && continue
- combo="$(normalize_combo "$combo_raw")"
- if [[ "$file" == "$user_keybinds_conf" ]]; then
- unbound_user["$combo"]=1
- fi
- fi
- done < "$file"
-done
-
-# Build raw_keybinds for display and collect missing unbind suggestions
-raw_keybinds=""
-for combo in "${!seen_any_bind[@]}"; do
- eff_line="${binding_map[$combo]}"
- src="${source_map[$combo]}"
- [[ -z "$eff_line" ]] && continue
- raw_keybinds+="$eff_line"$'\n'
-
- # If user overrides a default but didn't unbind in user file, suggest unbind
- if [[ "$src" == "$user_keybinds_conf" && -n "${default_seen[$combo]}" && -z "${unbound_user[$combo]}" ]]; then
- suggest="$(echo "$eff_line" | sed -E 's/^[[:space:]]*bind[a-z]*/unbind/')"
- missing_unbind_suggestions_arr+=("$suggest")
+# Check for suggestions file created by python script
+if [[ -f "/tmp/hypr_keybind_suggestions_file" ]]; then
+ suggestions_file=$(cat "/tmp/hypr_keybind_suggestions_file")
+ rm "/tmp/hypr_keybind_suggestions_file"
+ if [[ -n "$suggestions_file" && -f "$suggestions_file" ]]; then
+ count=$(wc -l < "$suggestions_file")
+ msg="$msg | Overrides missing unbind: $count (suggestions: $suggestions_file)"
fi
-done
-
-# If there are missing unbinds, write suggestions to a temp file and note in message
-if (( ${#missing_unbind_suggestions_arr[@]} > 0 )); then
- suggestions_file="$(mktemp -t hypr-unbind-suggestions.XXXX.conf)"
- printf '%s\n' "${missing_unbind_suggestions_arr[@]}" > "$suggestions_file"
- msg="$msg | Overrides missing unbind: ${#missing_unbind_suggestions_arr[@]} (suggestions: $suggestions_file)"
fi
-# check for any keybinds to display
-if [[ -z "$raw_keybinds" ]]; then
- echo "no keybinds found."
- exit 1
-fi
-
-# transform into a readable list: MODS+KEY — DESCRIPTION (for bindd) or DISPATCHER [PARAMS] (for bind)
-display_keybinds=$(echo "$raw_keybinds" | awk -F'=' '
- function trim(s){ gsub(/^[ \t]+|[ \t]+$/,"",s); return s }
- /^[[:space:]]*bind/ {
- binder=$1; gsub(/[ \t]/, "", binder);
- hasdesc = (index(binder, "d")>0);
-
- rhs=$2; rhs=trim(rhs);
- n=split(rhs, a, /[ \t]*,[ \t]*/);
-
- mods=trim(a[1]); key=(n>=2?trim(a[2]):"");
- desc=""; dispatcher=""; params="";
-
- if (hasdesc) {
- desc=(n>=3?trim(a[3]):"");
- dispatcher=(n>=4?trim(a[4]):"");
- start=5;
- } else {
- dispatcher=(n>=3?trim(a[3]):"");
- start=4;
- }
-
- for(i=start;i<=n;i++){ if(length(a[i])){ p=trim(a[i]); if(p!="") params = (params?params", ":"") p } }
-
- gsub(/\$mainMod/,"SUPER",mods);
- gsub(/[ \t]+/,"+",mods);
-
- combo = (mods && key) ? mods "+" key : (key?key:mods);
-
- if (hasdesc && desc != "") {
- print combo, " — ", desc;
- } else {
- if (dispatcher != "" && params != "")
- print combo, " — ", dispatcher, " ", params;
- else if (dispatcher != "")
- print combo, " — ", dispatcher;
- else
- print combo;
- }
- }
-')
-
# use rofi to display the keybinds
printf '%s\n' "$display_keybinds" | rofi -dmenu -i -config "$rofi_theme" -mesg "$msg"
diff --git a/config/hypr/scripts/KeyHints.sh b/config/hypr/scripts/KeyHints.sh
index 8a478039..5511cfed 100755
--- a/config/hypr/scripts/KeyHints.sh
+++ b/config/hypr/scripts/KeyHints.sh
@@ -34,6 +34,7 @@ GDK_BACKEND=$BACKEND yad \
" D" "Application Launcher" "(rofi-wayland)" \
" E" "Open File Manager" "(Thunar)" \
" S" "Google Search using rofi" "(rofi)" \
+" T" "Global theme switcher" "(rofi)" \
" Q" "close active window" "(not kill)" \
" Shift Q " "kills an active window" "(kill)" \
" ALT mouse scroll up/down " "Desktop Zoom" "Desktop Magnifier" \
@@ -69,4 +70,4 @@ GDK_BACKEND=$BACKEND yad \
" ALT E" "Rofi Emoticons" "Emoticon" \
" H" "Launch this Quick Cheat Sheet" "" \
"" "" "" \
-"More tips:" "https://github.com/JaKooLit/Hyprland-Dots/wiki" ""\ \ No newline at end of file
+"More tips:" "https://github.com/JaKooLit/Hyprland-Dots/wiki" ""\
diff --git a/config/hypr/scripts/KeyboardLayout.sh b/config/hypr/scripts/KeyboardLayout.sh
new file mode 100755
index 00000000..ec280826
--- /dev/null
+++ b/config/hypr/scripts/KeyboardLayout.sh
@@ -0,0 +1,119 @@
+#!/usr/bin/env bash
+# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
+# This is for changing kb_layouts. Set kb_layouts in "$HOME/.config/hypr/UserConfigs/UserSettings.conf"
+
+notif_icon="$HOME/.config/swaync/images/ja.png"
+SCRIPTSDIR="$HOME/.config/hypr/scripts"
+
+# Refined ignore list with patterns or specific device names
+ignore_patterns=(
+ "--(avrcp)"
+ "Bluetooth Speaker"
+ "Other Device
+ Name"
+)
+
+# Function to get keyboard names
+get_keyboard_names() {
+ hyprctl devices -j | jq -r '.keyboards[].name'
+}
+
+# Function to check if a device matches any ignore pattern
+is_ignored() {
+ local device_name=$1
+ for pattern in "${ignore_patterns[@]}"; do
+ if [[ "$device_name" == *"$pattern"* ]]; then
+ return 0 # Device matches ignore pattern
+ fi
+ done
+ return 1 # Device does not match any ignore pattern
+}
+
+# Function to get current layout info
+# Stores values in layout_mapping, variant_mapping and layout_index
+get_current_layout_info() {
+ local found_kb=false
+
+ # Read from the first non-ignored layout
+ while read -r name; do
+ if ! is_ignored "$name"; then
+ found_kb=true
+ local layout_mapping_str=$(hyprctl devices -j |
+ jq -r --arg name "$name" '.keyboards[] | select(.name==$name).layout')
+ IFS="," read -r -a layout_mapping <<<"$layout_mapping_str"
+
+ local variant_mapping_str=$(hyprctl devices -j |
+ jq -r --arg name "$name" '.keyboards[] | select(.name==$name).variant')
+ IFS="," read -r -a variant_mapping <<<"$variant_mapping_str"
+
+ layout_index=$(hyprctl devices -j |
+ jq -r --arg name "$name" '.keyboards[] | select(.name==$name).active_layout_index')
+ break
+ fi
+ done <<< "$(get_keyboard_names)"
+
+ $found_kb && return 0
+ return 1
+}
+
+# Function to change keyboard layout
+change_layout() {
+ local error_found=false
+
+ while read -r name; do
+ if is_ignored "$name"; then
+ echo "Skipping ignored device: $name"
+ continue
+ fi
+
+ echo "Switching layout for $name to $new_layout..."
+ hyprctl switchxkblayout "$name" "$next_index"
+ if [ $? -ne 0 ]; then
+ echo "Error while switching layout for $name." >&2
+ error_found=true
+ fi
+ done <<<"$(get_keyboard_names)"
+
+ $error_found && return 1
+ return 0
+}
+
+
+# Stores values in layout_mapping, variant_mapping and layout_index
+if ! get_current_layout_info; then
+ echo "Could not get current layout information." >&2
+ echo "There might not be any keyboards available, \
+ or some were unnecessarily set as ignored." >&2
+ notify-send -u low -t 2000 'kb_layout' " Error:" " Layout change failed"
+ echo "Exiting $0 $@" >&2
+ exit 1
+fi
+
+current_layout=${layout_mapping[$layout_index]}
+current_variant=${variant_mapping[$layout_index]}
+
+if [[ "$1" == "status" ]]; then
+ echo "$current_layout${current_variant:+($current_variant)}"
+elif [[ "$1" == "switch" ]]; then
+ echo "Current layout: $current_layout($current_variant)"
+
+ layout_count=${#layout_mapping[@]}
+ echo "Number of layouts: $layout_count"
+
+ next_index=$(( (layout_index + 1) % layout_count ))
+ new_layout="${layout_mapping[$next_index]}"
+ new_variant="${variant_mapping[$next_index]}"
+ echo "Next layout: $new_layout"
+
+ # Execute layout change and notify
+ if ! change_layout; then
+ notify-send -u low -t 2000 'kb_layout' " Error:" " Layout change failed"
+ echo "Layout change failed." >&2
+ exit 1
+ else
+ notify-send -u low -i "$notif_icon" " kb_layout: $new_layout${new_variant:+($new_variant)}"
+ echo "Layout change notification sent."
+ fi
+else
+ echo "Usage: $0 {status|switch}"
+fi
diff --git a/config/hypr/scripts/KillActiveProcess.sh b/config/hypr/scripts/KillActiveProcess.sh
index 2bc108f2..d9d26bb3 100755
--- a/config/hypr/scripts/KillActiveProcess.sh
+++ b/config/hypr/scripts/KillActiveProcess.sh
@@ -7,5 +7,10 @@
# Get id of an active window
active_pid=$(hyprctl activewindow | grep -o 'pid: [0-9]*' | cut -d' ' -f2)
+if [[ -z "$active_pid" || ! "$active_pid" =~ ^[0-9]+$ ]]; then
+ notify-send -u low -i "$HOME/.config/swaync/images/error.png" "Kill Active Window" "No active window PID found."
+ exit 1
+fi
+
# Close active window
-kill $active_pid \ No newline at end of file
+kill "$active_pid"
diff --git a/config/hypr/scripts/KooLsDotsUpdate.sh b/config/hypr/scripts/KooLsDotsUpdate.sh
index 51277ab1..a49f5430 100755
--- a/config/hypr/scripts/KooLsDotsUpdate.sh
+++ b/config/hypr/scripts/KooLsDotsUpdate.sh
@@ -5,12 +5,12 @@
# Local Paths
local_dir="$HOME/.config/hypr"
iDIR="$HOME/.config/swaync/images/"
-local_version=$(ls $local_dir/v* 2>/dev/null | sort -V | tail -n 1 | sed 's/.*v\(.*\)/\1/')
+local_version=$(find "$local_dir" -maxdepth 1 -name 'v*' -printf '%f\n' 2>/dev/null | sort -V | tail -n 1 | sed 's/^v//')
KooL_Dots_DIR="$HOME/Hyprland-Dots"
# exit if cannot find local version
if [ -z "$local_version" ]; then
- notify-send -i "$iDIR/error.png" "ERROR "!?!?!!"" "Unable to find KooL's dots version . exiting.... "
+ notify-send -i "$iDIR/error.png" 'ERROR !?!?!!' "Unable to find KooL's dots version. Exiting."
exit 1
fi
@@ -19,7 +19,7 @@ branch="main"
github_url="https://github.com/JaKooLit/Hyprland-Dots/tree/$branch/config/hypr/"
# Fetch the version from GitHub URL - KooL's dots
-github_version=$(curl -s $github_url | grep -o 'v[0-9]\+\.[0-9]\+\.[0-9]\+' | sort -V | tail -n 1 | sed 's/v//')
+github_version=$(curl -s "$github_url" | grep -o 'v[0-9]\+\.[0-9]\+\.[0-9]\+' | sort -V | tail -n 1 | sed 's/v//')
# Cant find GitHub URL - KooL's dots version
if [ -z "$github_version" ]; then
@@ -39,13 +39,13 @@ else
case "$response" in
"action1")
- if [ -d $KooL_Dots_DIR ]; then
+ if [ -d "$KooL_Dots_DIR" ]; then
if ! command -v kitty &> /dev/null; then
notify-send -i "$iDIR/error.png" "E-R-R-O-R" "Kitty terminal not found. Please install Kitty terminal."
exit 1
fi
kitty -e bash -c "
- cd $KooL_Dots_DIR &&
+ cd \"$KooL_Dots_DIR\" &&
git stash &&
git pull &&
./copy.sh &&
@@ -59,7 +59,7 @@ else
fi
kitty -e bash -c "
git clone --depth=1 https://github.com/JaKooLit/Hyprland-Dots.git $KooL_Dots_DIR &&
- cd $KooL_Dots_DIR &&
+ cd \"$KooL_Dots_DIR\" &&
chmod +x copy.sh &&
./copy.sh &&
notify-send -u critical -i "$iDIR/ja.png" 'Update Completed:' 'Kindly log out and relogin to take effect'
diff --git a/config/hypr/scripts/Kool_Quick_Settings.sh b/config/hypr/scripts/Kool_Quick_Settings.sh
index 8ab71ba2..0cd58f48 100755
--- a/config/hypr/scripts/Kool_Quick_Settings.sh
+++ b/config/hypr/scripts/Kool_Quick_Settings.sh
@@ -22,7 +22,154 @@ UserScripts="$HOME/.config/hypr/UserScripts"
# Function to show info notification
show_info() {
- notify-send -i "$iDIR/info.png" "Info" "$1"
+ if [[ -f "$iDIR/info.png" ]]; then
+ notify-send -i "$iDIR/info.png" "Info" "$1"
+ else
+ notify-send "Info" "$1"
+ fi
+}
+# Function to toggle Rainbow Borders script availability and refresh UI components
+toggle_rainbow_borders() {
+ local rainbow_script="$UserScripts/RainbowBorders.sh"
+ local disabled_sh_bak="${rainbow_script}.bak" # RainbowBorders.sh.bak
+ local disabled_bak_sh="$UserScripts/RainbowBorders.bak.sh" # RainbowBorders.bak.sh (created by copy.sh when disabled)
+ local refresh_script="$scriptsDir/Refresh.sh"
+ local status=""
+
+ # If both disabled variants exist, keep the newer one to avoid ambiguity
+ if [[ -f "$disabled_sh_bak" && -f "$disabled_bak_sh" ]]; then
+ if [[ "$disabled_sh_bak" -nt "$disabled_bak_sh" ]]; then
+ rm -f "$disabled_bak_sh"
+ else
+ rm -f "$disabled_sh_bak"
+ fi
+ fi
+
+ if [[ -f "$rainbow_script" ]]; then
+ # Currently enabled -> disable to canonical .sh.bak
+ if mv "$rainbow_script" "$disabled_sh_bak"; then
+ status="disabled"
+ if command -v hyprctl &>/dev/null; then
+ hyprctl reload >/dev/null 2>&1 || true
+ fi
+ fi
+ elif [[ -f "$disabled_sh_bak" ]]; then
+ # Disabled (.sh.bak) -> enable
+ if mv "$disabled_sh_bak" "$rainbow_script"; then
+ status="enabled"
+ fi
+ elif [[ -f "$disabled_bak_sh" ]]; then
+ # Disabled (.bak.sh) -> enable (normalize to .sh)
+ if mv "$disabled_bak_sh" "$rainbow_script"; then
+ status="enabled"
+ fi
+ else
+ show_info "RainbowBorders script not found in $UserScripts (checked .sh, .sh.bak, .bak.sh)."
+ return
+ fi
+
+ # Run refresh if available, otherwise apply borders directly
+ if [[ -x "$refresh_script" ]]; then
+ "$refresh_script" >/dev/null 2>&1 &
+ elif [[ "$current" != "disabled" && -x "$rainbow_script" ]]; then
+ "$rainbow_script" >/dev/null 2>&1 &
+ fi
+
+ if [[ -n "$status" ]]; then
+ show_info "Rainbow Borders ${status}."
+ fi
+}
+
+# Submenu to choose Rainbow Borders mode (disable, wallust_random, rainbow, gradient_flow)
+rainbow_borders_menu() {
+ local rainbow_script="$UserScripts/RainbowBorders.sh"
+ local disabled_sh_bak="${rainbow_script}.bak"
+ local disabled_bak_sh="$UserScripts/RainbowBorders.bak.sh"
+ local refresh_script="$scriptsDir/Refresh.sh"
+
+ # Determine current mode/status (internal)
+ local current="disabled"
+ if [[ -f "$rainbow_script" ]]; then
+ current=$(grep -E '^EFFECT_TYPE=' "$rainbow_script" 2>/dev/null | sed -E 's/^EFFECT_TYPE="?([^"]*)"?/\1/')
+ [[ -z "$current" ]] && current="unknown"
+ fi
+
+ # Map internal mode to friendly display
+ local current_display="$current"
+ case "$current" in
+ wallust_random) current_display="Wallust Color" ;;
+ rainbow) current_display="Original Rainbow" ;;
+ gradient_flow) current_display="Gradient Flow" ;;
+ disabled) current_display="Disabled" ;;
+ esac
+
+
+ # Build options and prompt
+ local options="Disable Rainbow Borders\nWallust Color\nOriginal Rainbow\nGradient Flow"
+ local choice
+ choice=$(printf "%b" "$options" | rofi -i -dmenu -config "$rofi_theme" -mesg "Rainbow Borders: current = $current_display")
+
+ [[ -z "$choice" ]] && return
+
+ local previous="$current"
+
+ case "$choice" in
+ "Disable Rainbow Borders")
+ if [[ -f "$rainbow_script" ]]; then
+ mv "$rainbow_script" "$disabled_sh_bak"
+ fi
+ current="disabled"
+ if command -v hyprctl &>/dev/null; then
+ hyprctl reload >/dev/null 2>&1 || true
+ fi
+ ;;
+ "Wallust Color"|"Original Rainbow"|"Gradient Flow")
+ local mode=""
+ case "$choice" in
+ "Wallust Color") mode="wallust_random" ;;
+ "Original Rainbow") mode="rainbow" ;;
+ "Gradient Flow") mode="gradient_flow" ;;
+ esac
+ # Ensure script is enabled
+ if [[ ! -f "$rainbow_script" ]]; then
+ if [[ -f "$disabled_sh_bak" ]]; then
+ mv "$disabled_sh_bak" "$rainbow_script"
+ elif [[ -f "$disabled_bak_sh" ]]; then
+ mv "$disabled_bak_sh" "$rainbow_script"
+ else
+ show_info "RainbowBorders script not found in $UserScripts."
+ return
+ fi
+ fi
+
+ # Update EFFECT_TYPE in place; insert if missing
+ if grep -q '^EFFECT_TYPE=' "$rainbow_script" 2>/dev/null; then
+ sed -i 's/^EFFECT_TYPE=.*/EFFECT_TYPE="'"$mode"'"/' "$rainbow_script"
+ else
+ if head -n1 "$rainbow_script" | grep -q '^#!'; then
+ sed -i '1a EFFECT_TYPE="'"$mode"'"' "$rainbow_script"
+ else
+ sed -i '1i EFFECT_TYPE="'"$mode"'"' "$rainbow_script"
+ fi
+ fi
+ # Set current to chosen mode
+ current="$mode"
+ ;;
+ *)
+ return ;;
+ esac
+
+ # Run refresh if available
+ if [[ -x "$refresh_script" ]]; then
+ "$refresh_script" >/dev/null 2>&1 &
+ fi
+
+ # Apply mode immediately (in case refresh doesn't trigger it)
+ if [[ "$current" != "disabled" && -x "$rainbow_script" ]]; then
+ "$rainbow_script" >/dev/null 2>&1 &
+ fi
+
+ # No notifications; mode is shown in the menu
}
# Function to display the menu options without numbers
@@ -44,6 +191,7 @@ Edit System Default Startup Apps
Edit System Default Window Rules
Edit System Default Settings
--- UTILITIES ---
+Set SDDM Wallpaper
Choose Kitty Terminal Theme
Configure Monitors (nwg-displays)
Configure Workspace Rules (nwg-displays)
@@ -56,6 +204,7 @@ Choose Rofi Themes
Search for Keybinds
Toggle Game Mode
Switch Dark-Light Theme
+Rainbow Borders Mode
EOF
}
@@ -78,6 +227,7 @@ main() {
"Edit System Default Startup Apps") file="$configs/Startup_Apps.conf" ;;
"Edit System Default Window Rules") file="$configs/WindowRules.conf" ;;
"Edit System Default Settings") file="$configs/SystemSettings.conf" ;;
+ "Set SDDM Wallpaper") $scriptsDir/sddm_wallpaper.sh --normal ;;
"Choose Kitty Terminal Theme") $scriptsDir/Kitty_themes.sh ;;
"Configure Monitors (nwg-displays)")
if ! command -v nwg-displays &>/dev/null; then
@@ -115,6 +265,7 @@ main() {
"Search for Keybinds") $scriptsDir/KeyBinds.sh ;;
"Toggle Game Mode") $scriptsDir/GameMode.sh ;;
"Switch Dark-Light Theme") $scriptsDir/DarkLight.sh ;;
+ "Rainbow Borders Mode") rainbow_borders_menu ;;
*) return ;; # Do nothing for invalid choices
esac
diff --git a/config/hypr/scripts/PortalHyprland.sh b/config/hypr/scripts/PortalHyprland.sh
index 21cb7db4..653e9b58 100755
--- a/config/hypr/scripts/PortalHyprland.sh
+++ b/config/hypr/scripts/PortalHyprland.sh
@@ -2,15 +2,39 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# For manually starting xdg-desktop-portal-hyprland
+set -euo pipefail
+
+kill_quietly() {
+ killall -q "$1" 2>/dev/null || true
+}
+
+start_portal_binary() {
+ local description="$1"
+ shift
+ for candidate in "$@"; do
+ if [[ -x "$candidate" ]]; then
+ "$candidate" &
+ return 0
+ fi
+ done
+ echo "Warning: no $description binary found (checked: $*)" >&2
+ return 1
+}
+
sleep 1
-killall xdg-desktop-portal-hyprland
-killall xdg-desktop-portal-wlr
-killall xdg-desktop-portal-gnome
-killall xdg-desktop-portal
+kill_quietly xdg-desktop-portal-hyprland
+kill_quietly xdg-desktop-portal-wlr
+kill_quietly xdg-desktop-portal-gnome
+kill_quietly xdg-desktop-portal
sleep 1
-/usr/lib/xdg-desktop-portal-hyprland &
-/usr/libexec/xdg-desktop-portal-hyprland &
+
+start_portal_binary "xdg-desktop-portal-hyprland" \
+ /usr/lib/xdg-desktop-portal-hyprland \
+ /usr/libexec/xdg-desktop-portal-hyprland
+
sleep 2
-/usr/lib/xdg-desktop-portal &
-/usr/libexec/xdg-desktop-portal &
+
+start_portal_binary "xdg-desktop-portal" \
+ /usr/lib/xdg-desktop-portal \
+ /usr/libexec/xdg-desktop-portal
diff --git a/config/hypr/scripts/RofiSearch.sh b/config/hypr/scripts/RofiSearch.sh
index 8ef12c46..dfeb19ac 100755
--- a/config/hypr/scripts/RofiSearch.sh
+++ b/config/hypr/scripts/RofiSearch.sh
@@ -4,6 +4,10 @@
# Define the path to the config file
config_file=$HOME/.config/hypr/UserConfigs/01-UserDefaults.conf
+if ! command -v jq >/dev/null 2>&1; then
+ notify-send -u low "Rofi Search" "jq is required for URL encoding. Please install jq."
+ exit 1
+fi
# Check if the config file exists
if [[ ! -f "$config_file" ]]; then
@@ -32,5 +36,12 @@ if pgrep -x "rofi" >/dev/null; then
pkill rofi
fi
-# Open Rofi and pass the selected query to xdg-open for Google search
-echo "" | rofi -dmenu -config "$rofi_theme" -mesg "$msg" | xargs -I{} xdg-open $Search_Engine \ No newline at end of file
+# Open Rofi and pass the selected query to xdg-open for the configured search engine
+query=$(printf '' | rofi -dmenu -config "$rofi_theme" -mesg "$msg")
+
+if [[ -z "$query" ]]; then
+ exit 0
+fi
+
+encoded_query=$(printf '%s' "$query" | jq -sRr @uri)
+xdg-open "${Search_Engine}${encoded_query}" >/dev/null 2>&1 &
diff --git a/config/hypr/scripts/ScreenShot.sh b/config/hypr/scripts/ScreenShot.sh
index 0ef70964..3d578a51 100755
--- a/config/hypr/scripts/ScreenShot.sh
+++ b/config/hypr/scripts/ScreenShot.sh
@@ -4,7 +4,8 @@
# variables
time=$(date "+%d-%b_%H-%M-%S")
-dir="$(xdg-user-dir PICTURES)/Screenshots"
+PICTURES_DIR="$(xdg-user-dir PICTURES 2>/dev/null || echo "$HOME/Pictures")"
+dir="$PICTURES_DIR/Screenshots"
file="Screenshot_${time}_${RANDOM}.png"
iDIR="$HOME/.config/swaync/icons"
diff --git a/config/hypr/scripts/Sounds.sh b/config/hypr/scripts/Sounds.sh
index b372d714..e92248da 100755
--- a/config/hypr/scripts/Sounds.sh
+++ b/config/hypr/scripts/Sounds.sh
@@ -73,5 +73,18 @@ if ! test -f "$sound_file"; then
fi
fi
-# pipewire priority, fallback pulseaudio
-pw-play "$sound_file" || pa-play "$sound_file" \ No newline at end of file
+# Play the sound: prefer PipeWire, then PulseAudio, then ALSA
+if command -v pw-play >/dev/null 2>&1; then
+ pw-play "$sound_file" && exit 0
+fi
+
+if command -v paplay >/dev/null 2>&1; then
+ paplay "$sound_file" && exit 0
+fi
+
+if command -v aplay >/dev/null 2>&1; then
+ aplay "$sound_file" && exit 0
+fi
+
+echo "Error: No suitable audio player (pw-play/paplay/aplay) found."
+exit 1
diff --git a/config/hypr/scripts/SwitchKeyboardLayout.sh b/config/hypr/scripts/SwitchKeyboardLayout.sh
deleted file mode 100755
index 34d008a1..00000000
--- a/config/hypr/scripts/SwitchKeyboardLayout.sh
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/env bash
-# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
-# This is for changing kb_layouts. Set kb_layouts in $settings_file
-
-layout_file="$HOME/.cache/kb_layout"
-settings_file="$HOME/.config/hypr/configs/SystemSettings.conf"
-notif_icon="$HOME/.config/swaync/images/ja.png"
-
-# Refined ignore list with patterns or specific device names
-ignore_patterns=(
- "--(avrcp)"
- "Bluetooth Speaker"
- "Other Device
- Name"
-)
-
-# Create layout file with default layout if it does not exist
-if [ ! -f "$layout_file" ]; then
- echo "Creating layout file..."
- default_layout=$(grep 'kb_layout = ' "$settings_file" | cut -d '=' -f 2 | tr -d '[:space:]' | cut -d ',' -f 1 2>/dev/null)
- default_layout=${default_layout:-"us"} # Default to 'us' layout
- echo "$default_layout" >"$layout_file"
- echo "Default layout set to $default_layout"
-fi
-
-current_layout=$(cat "$layout_file")
-echo "Current layout: $current_layout"
-
-# Read available layouts from settings file
-if [ -f "$settings_file" ]; then
- kb_layout_line=$(grep 'kb_layout = ' "$settings_file" | cut -d '=' -f 2)
- # Remove leading and trailing spaces around each layout
- kb_layout_line=$(echo "$kb_layout_line" | tr -d '[:space:]')
- IFS=',' read -r -a layout_mapping <<<"$kb_layout_line"
-else
- echo "Settings file not found!"
- exit 1
-fi
-
-layout_count=${#layout_mapping[@]}
-echo "Number of layouts: $layout_count"
-
-# Find current layout index and calculate next layout
-for ((i = 0; i < layout_count; i++)); do
- if [ "$current_layout" == "${layout_mapping[i]}" ]; then
- current_index=$i
- break
- fi
-done
-
-next_index=$(((current_index + 1) % layout_count))
-new_layout="${layout_mapping[next_index]}"
-echo "Next layout: $new_layout"
-
-# Function to get keyboard names
-get_keyboard_names() {
- hyprctl devices -j | jq -r '.keyboards[].name'
-}
-
-# Function to check if a device matches any ignore pattern
-is_ignored() {
- local device_name=$1
- for pattern in "${ignore_patterns[@]}"; do
- if [[ "$device_name" == *"$pattern"* ]]; then
- return 0 # Device matches ignore pattern
- fi
- done
- return 1 # Device does not match any ignore pattern
-}
-
-# Function to change keyboard layout
-change_layout() {
- local error_found=false
-
- while read -r name; do
- if is_ignored "$name"; then
- echo "Skipping ignored device: $name"
- continue
- fi
-
- echo "Switching layout for $name to $new_layout..."
- hyprctl switchxkblayout "$name" "$next_index"
- if [ $? -ne 0 ]; then
- echo "Error while switching layout for $name." >&2
- error_found=true
- fi
- done <<<"$(get_keyboard_names)"
-
- $error_found && return 1
- return 0
-}
-
-# Execute layout change and notify
-if ! change_layout; then
- notify-send -u low -t 2000 'kb_layout' " Error:" " Layout change failed"
- echo "Layout change failed." >&2
- exit 1
-else
- notify-send -u low -i "$notif_icon" " kb_layout: $new_layout"
- echo "Layout change notification sent."
-fi
-
-echo "$new_layout" >"$layout_file"
diff --git a/config/hypr/scripts/Tak0-Per-Window-Switch.sh b/config/hypr/scripts/Tak0-Per-Window-Switch.sh
index 7879fb85..7cec89a6 100755
--- a/config/hypr/scripts/Tak0-Per-Window-Switch.sh
+++ b/config/hypr/scripts/Tak0-Per-Window-Switch.sh
@@ -17,6 +17,7 @@ MAP_FILE="$HOME/.cache/kb_layout_per_window"
CFG_FILE="$HOME/.config/hypr/configs/SystemSettings.conf"
ICON="$HOME/.config/swaync/images/ja.png"
SCRIPT_NAME="$(basename "$0")"
+LISTENER_PIDFILE="$HOME/.cache/kb_layout_per_window.listener.pid"
# Ensure map file exists
touch "$MAP_FILE"
@@ -99,7 +100,7 @@ subscribe() {
local SOCKET2="$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock"
[[ -S "$SOCKET2" ]] || {
echo "Error: Hyprland socket not found." >&2
- exit 1
+ return 1
}
socat -u UNIX-CONNECT:"$SOCKET2" - | while read -r line; do
@@ -108,9 +109,20 @@ subscribe() {
}
# Ensure only one listener
-if ! pgrep -f "$SCRIPT_NAME.*--listener" >/dev/null; then
- subscribe --listener &
-fi
+start_listener_once() {
+ if [[ -f "$LISTENER_PIDFILE" ]]; then
+ local existing_pid
+ existing_pid=$(cat "$LISTENER_PIDFILE" 2>/dev/null || true)
+ if [[ -n "$existing_pid" ]] && kill -0 "$existing_pid" 2>/dev/null; then
+ return
+ fi
+ fi
+
+ subscribe &
+ echo $! >"$LISTENER_PIDFILE"
+}
+
+start_listener_once
# CLI
case "$1" in
diff --git a/config/hypr/scripts/ThemeChanger.sh b/config/hypr/scripts/ThemeChanger.sh
new file mode 100755
index 00000000..19ee3298
--- /dev/null
+++ b/config/hypr/scripts/ThemeChanger.sh
@@ -0,0 +1,145 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+# SPDX-FileCopyrightText: 2025-present Ahum Maitra theahummaitra@gmail.com
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# Repository url : https://github.com/TheAhumMaitra/cautious-waddle
+
+require() {
+ command -v "$1" >/dev/null 2>&1 || {
+ printf '%s\n' "Missing dependency: $1" >&2
+ exit 127
+ }
+}
+
+require wallust
+require rofi
+
+# notify-send is optional
+have_notify() { command -v notify-send >/dev/null 2>&1; }
+
+# Prompt for theme; guard -e on cancel
+set +e
+choice="$(wallust theme list \
+ | sed -e '1d' -e 's/^- //' \
+ | rofi -dmenu -i -p 'Select Global Theme')"
+prompt_status=$?
+set -e
+
+# Exit cleanly on cancel or empty selection
+if (( prompt_status != 0 )) || [[ -z "${choice}" ]]; then
+ exit 0
+fi
+
+# Record time before applying so we can wait for fresh template outputs
+start_ts=$(date +%s)
+
+# Apply the theme and report result
+if wallust theme -- "${choice}"; then
+ have_notify && notify-send -a ThemeChanger \
+ -h string:x-dunst-stack-tag:themechanger \
+ "Global theme changed" "Selected: ${choice}"
+
+ # Wait until template targets exist, are newer than start_ts, and are stable (size/mtime stops changing)
+ # Ensure Ghostty directory exists so Wallust can write target even if Ghostty isn't installed
+ mkdir -p "$HOME/.config/ghostty" || true
+
+ targets=(
+ "$HOME/.config/waybar/wallust/colors-waybar.css"
+ "$HOME/.config/rofi/wallust/colors-rofi.rasi"
+ "$HOME/.config/kitty/kitty-themes/01-Wallust.conf"
+ "$HOME/.config/hypr/wallust/wallust-hyprland.conf"
+ "$HOME/.config/ghostty/wallust.conf"
+ )
+
+ # Normalize Ghostty palette syntax in case upstream templates or older targets used ':'
+ ghostty_conf="$HOME/.config/ghostty/wallust.conf"
+ if [ -f "$ghostty_conf" ]; then
+ sed -i -E 's/^(\s*palette\s*=\s*)([0-9]{1,2}):/\1\2=/' "$ghostty_conf" 2>/dev/null || true
+ fi
+
+ # Phase 1: appearance + freshness
+ for _ in $(seq 1 100); do # up to ~10s
+ ok=1
+ for f in "${targets[@]}"; do
+ [ -s "$f" ] || { ok=0; break; }
+ mtime=$(stat -c %Y "$f" 2>/dev/null || echo 0)
+ [ "$mtime" -ge "$start_ts" ] || { ok=0; break; }
+ done
+ [ $ok -eq 1 ] && break
+ sleep 0.1
+ done
+
+ # Phase 2: stability (avoid reading half-written files)
+ if [ $ok -eq 1 ]; then
+ for _ in 1 2 3; do
+ sizes_a=(); mtimes_a=()
+ for f in "${targets[@]}"; do
+ sizes_a+=("$(stat -c %s "$f" 2>/dev/null || echo 0)")
+ mtimes_a+=("$(stat -c %Y "$f" 2>/dev/null || echo 0)")
+ done
+ sleep 0.15
+ sizes_b=(); mtimes_b=()
+ for f in "${targets[@]}"; do
+ sizes_b+=("$(stat -c %s "$f" 2>/dev/null || echo 0)")
+ mtimes_b+=("$(stat -c %Y "$f" 2>/dev/null || echo 0)")
+ done
+ if [ "${sizes_a[*]}" = "${sizes_b[*]}" ] && [ "${mtimes_a[*]}" = "${mtimes_b[*]}" ]; then
+ break
+ fi
+ done
+ else
+ # As a safety net, wait a bit to avoid racing rofi reload against template writes
+ sleep 0.5
+ fi
+
+ # Small cushion before refresh to mirror wallpaper flow
+ sleep 0.2
+ # Normalize Rofi selection colors to use the palette's accent (color12)
+ rofi_colors="$HOME/.config/rofi/wallust/colors-rofi.rasi"
+ if [ -f "$rofi_colors" ]; then
+ accent_hex=$(sed -n 's/^\s*color12:\s*\(#[0-9A-Fa-f]\{6\}\).*/\1/p' "$rofi_colors" | head -n1)
+ [ -z "$accent_hex" ] && accent_hex=$(sed -n 's/^\s*color13:\s*\(#[0-9A-Fa-f]\{6\}\).*/\1/p' "$rofi_colors" | head -n1)
+ if [ -n "$accent_hex" ]; then
+ sed -i -E "s|^(\s*selected-normal-background:\s*).*$|\1$accent_hex;|" "$rofi_colors"
+ sed -i -E "s|^(\s*selected-active-background:\s*).*$|\1$accent_hex;|" "$rofi_colors"
+ sed -i -E "s|^(\s*selected-urgent-background:\s*).*$|\1$accent_hex;|" "$rofi_colors"
+ sed -i -E "s|^(\s*selected-normal-foreground:\s*).*$|\1#000000;|" "$rofi_colors"
+ sed -i -E "s|^(\s*selected-active-foreground:\s*).*$|\1#000000;|" "$rofi_colors"
+ sed -i -E "s|^(\s*selected-urgent-foreground:\s*).*$|\1#000000;|" "$rofi_colors"
+ fi
+ fi
+
+ # Reload Hyprland so new border colors from wallust-hyprland.conf take effect
+ if command -v hyprctl >/dev/null 2>&1; then
+ hyprctl reload >/dev/null 2>&1 || true
+ fi
+
+ # Refresh bars/menus after files are ready
+ if [ -x "$HOME/.config/hypr/scripts/Refresh.sh" ]; then
+ "$HOME/.config/hypr/scripts/Refresh.sh" >/dev/null 2>&1 || true
+ else
+ if command -v waybar-msg >/dev/null 2>&1; then
+ waybar-msg cmd reload >/dev/null 2>&1 || true
+ else
+ pkill -SIGUSR2 waybar >/dev/null 2>&1 || true
+ fi
+ fi
+
+ # Ask kitty to reload its config so the new 01-Wallust.conf is picked up
+ if pidof kitty >/dev/null; then
+ for pid in $(pidof kitty); do kill -SIGUSR1 "$pid" 2>/dev/null || true; done
+ fi
+
+ # Ask ghostty to reload its config so the updated wallust.conf is applied
+ if pidof ghostty >/dev/null; then
+ for pid in $(pidof ghostty); do kill -SIGUSR2 "$pid" 2>/dev/null || true; done
+ fi
+else
+ have_notify && notify-send -u critical -a ThemeChanger \
+ -h string:x-dunst-stack-tag:themechanger \
+ "Failed to apply theme" "${choice}"
+ exit 1
+fi
diff --git a/config/hypr/scripts/TouchPad.sh b/config/hypr/scripts/TouchPad.sh
index 030c36de..f14165a0 100755
--- a/config/hypr/scripts/TouchPad.sh
+++ b/config/hypr/scripts/TouchPad.sh
@@ -5,28 +5,50 @@
# use hyprctl devices to get your system touchpad device name
# source https://github.com/hyprwm/Hyprland/discussions/4283?sort=new#discussioncomment-8648109
+set -euo pipefail
+
notif="$HOME/.config/swaync/images/ja.png"
+laptops_conf="$HOME/.config/hypr/UserConfigs/Laptops.conf"
+
+touchpad_device="${TOUCHPAD_DEVICE:-}"
+if [[ -z "$touchpad_device" && -f "$laptops_conf" ]]; then
+ touchpad_device="$(
+ awk -F= '/^\$Touchpad_Device/ {
+ gsub(/[[:space:]]*/, "", $1);
+ gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2);
+ print $2;
+ exit
+ }' "$laptops_conf"
+ )"
+fi
+
+if [[ -z "$touchpad_device" ]]; then
+ notify-send -u low -i "$notif" " Touchpad" " Device name not set (check Laptops.conf)"
+ exit 1
+fi
-export STATUS_FILE="$XDG_RUNTIME_DIR/touchpad.status"
+touchpad_keyword="${TOUCHPAD_KEYWORD:-device:${touchpad_device}:enabled}"
+status_file="${XDG_RUNTIME_DIR:-/tmp}/touchpad.status"
enable_touchpad() {
- printf "true" >"$STATUS_FILE"
- notify-send -u low -i $notif " Enabling" " touchpad"
- hyprctl keyword '$TOUCHPAD_ENABLED' "true" -r
+ printf "true" >"$status_file"
+ notify-send -u low -i "$notif" " Enabling" " touchpad"
+ hyprctl keyword "$touchpad_keyword" true -r
}
disable_touchpad() {
- printf "false" >"$STATUS_FILE"
- notify-send -u low -i $notif " Disabling" " touchpad"
- hyprctl keyword '$TOUCHPAD_ENABLED' "false" -r
+ printf "false" >"$status_file"
+ notify-send -u low -i "$notif" " Disabling" " touchpad"
+ hyprctl keyword "$touchpad_keyword" false -r
}
-if ! [ -f "$STATUS_FILE" ]; then
- enable_touchpad
-else
- if [ $(cat "$STATUS_FILE") = "true" ]; then
+current_state="false"
+if [[ -f "$status_file" ]]; then
+ current_state="$(<"$status_file")"
+fi
+
+if [[ "$current_state" == "true" ]]; then
disable_touchpad
- elif [ $(cat "$STATUS_FILE") = "false" ]; then
+else
enable_touchpad
- fi
fi
diff --git a/config/hypr/scripts/Volume.sh b/config/hypr/scripts/Volume.sh
index 4c82f543..e1034a68 100755
--- a/config/hypr/scripts/Volume.sh
+++ b/config/hypr/scripts/Volume.sh
@@ -7,8 +7,14 @@ sDIR="$HOME/.config/hypr/scripts"
# Get Volume
get_volume() {
+ if [[ "$(pamixer --get-mute)" == "true" ]]; then
+ echo "Muted"
+ return
+ fi
+
+ local volume
volume=$(pamixer --get-volume)
- if [[ "$volume" -eq "0" ]]; then
+ if [[ "$volume" -eq 0 ]]; then
echo "Muted"
else
echo "$volume %"
@@ -17,12 +23,15 @@ get_volume() {
# Get icons
get_icon() {
- current=$(get_volume)
- if [[ "$current" == "Muted" ]]; then
+ if [[ "$(pamixer --get-mute)" == "true" ]]; then
echo "$iDIR/volume-mute.png"
- elif [[ "${current%\%}" -le 30 ]]; then
+ return
+ fi
+
+ current=$(pamixer --get-volume)
+ if [[ "$current" -le 30 ]]; then
echo "$iDIR/volume-low.png"
- elif [[ "${current%\%}" -le 60 ]]; then
+ elif [[ "$current" -le 60 ]]; then
echo "$iDIR/volume-mid.png"
else
echo "$iDIR/volume-high.png"
@@ -31,11 +40,18 @@ get_icon() {
# Notify
notify_user() {
- if [[ "$(get_volume)" == "Muted" ]]; then
- notify-send -e -h string:x-canonical-private-synchronous:volume_notif -h boolean:SWAYNC_BYPASS_DND:true -u low -i "$(get_icon)" " Volume:" " Muted"
+ local muted="$(pamixer --get-mute)"
+ local level="$(pamixer --get-volume)"
+
+ if [[ "$muted" == "true" || "$level" -eq 0 ]]; then
+ notify-send -e -h string:x-canonical-private-synchronous:volume_notif \
+ -h boolean:SWAYNC_BYPASS_DND:true -u low -i "$(get_icon)" \
+ " Volume:" " Muted"
else
- notify-send -e -h int:value:"$(get_volume | sed 's/%//')" -h string:x-canonical-private-synchronous:volume_notif -h boolean:SWAYNC_BYPASS_DND:true -u low -i "$(get_icon)" " Volume Level:" " $(get_volume)" &&
- "$sDIR/Sounds.sh" --volume
+ notify-send -e -h int:value:"$level" -h string:x-canonical-private-synchronous:volume_notif \
+ -h boolean:SWAYNC_BYPASS_DND:true -u low -i "$(get_icon)" \
+ " Volume Level:" " ${level}%" &&
+ "$sDIR/Sounds.sh" --volume
fi
}
@@ -44,7 +60,7 @@ inc_volume() {
if [ "$(pamixer --get-mute)" == "true" ]; then
toggle_mute
else
- pamixer -i 5 --allow-boost --set-limit 150 && notify_user
+ pamixer -i "$1" --allow-boost --set-limit 150 && notify_user
fi
}
@@ -53,7 +69,7 @@ dec_volume() {
if [ "$(pamixer --get-mute)" == "true" ]; then
toggle_mute
else
- pamixer -d 5 && notify_user
+ pamixer -d "$1" && notify_user
fi
}
@@ -71,13 +87,14 @@ toggle_mic() {
if [ "$(pamixer --default-source --get-mute)" == "false" ]; then
pamixer --default-source -m && notify-send -e -u low -h boolean:SWAYNC_BYPASS_DND:true -i "$iDIR/microphone-mute.png" " Microphone:" " Switched OFF"
elif [ "$(pamixer --default-source --get-mute)" == "true" ]; then
- pamixer -u --default-source u && notify-send -e -u low -h boolean:SWAYNC_BYPASS_DND:true -i "$iDIR/microphone.png" " Microphone:" " Switched ON"
+ pamixer --default-source -u && notify-send -e -u low -h boolean:SWAYNC_BYPASS_DND:true -i "$iDIR/microphone.png" " Microphone:" " Switched ON"
fi
}
# Get Mic Icon
get_mic_icon() {
- current=$(pamixer --default-source --get-volume)
- if [[ "$current" -eq "0" ]]; then
+ local muted="$(pamixer --default-source --get-mute)"
+ local current="$(pamixer --default-source --get-volume)"
+ if [[ "$muted" == "true" || "$current" -eq "0" ]]; then
echo "$iDIR/microphone-mute.png"
else
echo "$iDIR/microphone.png"
@@ -86,8 +103,14 @@ get_mic_icon() {
# Get Microphone Volume
get_mic_volume() {
+ if [[ "$(pamixer --default-source --get-mute)" == "true" ]]; then
+ echo "Muted"
+ return
+ fi
+
+ local volume
volume=$(pamixer --default-source --get-volume)
- if [[ "$volume" -eq "0" ]]; then
+ if [[ "$volume" -eq 0 ]]; then
echo "Muted"
else
echo "$volume %"
@@ -96,9 +119,21 @@ get_mic_volume() {
# Notify for Microphone
notify_mic_user() {
- volume=$(get_mic_volume)
- icon=$(get_mic_icon)
- notify-send -e -h int:value:"$volume" -h "string:x-canonical-private-synchronous:volume_notif" -h boolean:SWAYNC_BYPASS_DND:true -u low -i "$icon" " Mic Level:" " $volume"
+ local muted="$(pamixer --default-source --get-mute)"
+ local level="$(pamixer --default-source --get-volume)"
+ local icon message
+
+ if [[ "$muted" == "true" || "$level" -eq 0 ]]; then
+ icon="$iDIR/microphone-mute.png"
+ notify-send -e -h "string:x-canonical-private-synchronous:volume_notif" \
+ -h boolean:SWAYNC_BYPASS_DND:true -u low -i "$icon" \
+ " Mic Level:" " Muted"
+ else
+ icon="$iDIR/microphone.png"
+ notify-send -e -h int:value:"$level" -h "string:x-canonical-private-synchronous:volume_notif" \
+ -h boolean:SWAYNC_BYPASS_DND:true -u low -i "$icon" \
+ " Mic Level:" " ${level}%"
+ fi
}
# Increase MIC Volume
@@ -113,31 +148,48 @@ inc_mic_volume() {
# Decrease MIC Volume
dec_mic_volume() {
if [ "$(pamixer --default-source --get-mute)" == "true" ]; then
- toggle-mic
+ toggle_mic
else
pamixer --default-source -d 5 && notify_mic_user
fi
}
# Execute accordingly
-if [[ "$1" == "--get" ]]; then
- get_volume
-elif [[ "$1" == "--inc" ]]; then
- inc_volume
-elif [[ "$1" == "--dec" ]]; then
- dec_volume
-elif [[ "$1" == "--toggle" ]]; then
- toggle_mute
-elif [[ "$1" == "--toggle-mic" ]]; then
- toggle_mic
-elif [[ "$1" == "--get-icon" ]]; then
- get_icon
-elif [[ "$1" == "--get-mic-icon" ]]; then
- get_mic_icon
-elif [[ "$1" == "--mic-inc" ]]; then
- inc_mic_volume
-elif [[ "$1" == "--mic-dec" ]]; then
- dec_mic_volume
-else
- get_volume
-fi \ No newline at end of file
+case "$1" in
+"--get")
+ get_volume
+ ;;
+"--inc")
+ inc_volume 5
+ ;;
+"--inc-precise")
+ inc_volume 1
+ ;;
+"--dec")
+ dec_volume 5
+ ;;
+"--dec-precise")
+ dec_volume 1
+ ;;
+"--toggle")
+ toggle_mute
+ ;;
+"--toggle-mic")
+ toggle_mic
+ ;;
+"--get-icon")
+ get_icon
+ ;;
+"--get-mic-icon")
+ get_mic_icon
+ ;;
+"--mic-inc")
+ inc_mic_volume
+ ;;
+"--mic-dec")
+ dec_mic_volume
+ ;;
+*)
+ get_volume
+ ;;
+esac
diff --git a/config/hypr/scripts/WallustSwww.sh b/config/hypr/scripts/WallustSwww.sh
index 657f41ab..63911036 100755
--- a/config/hypr/scripts/WallustSwww.sh
+++ b/config/hypr/scripts/WallustSwww.sh
@@ -10,6 +10,27 @@ passed_path="${1:-}"
cache_dir="$HOME/.cache/swww/"
rofi_link="$HOME/.config/rofi/.current_wallpaper"
wallpaper_current="$HOME/.config/hypr/wallpaper_effects/.wallpaper_current"
+read_cached_wallpaper() {
+ local cache_file="$1"
+ if [[ -f "$cache_file" ]]; then
+ awk 'NF && $0 !~ /^filter/ {print; exit}' "$cache_file"
+ fi
+}
+
+read_wallpaper_from_query() {
+ local monitor="$1"
+ swww query | awk -v mon="$monitor" '
+ /^Monitor/ {
+ cur=$2
+ gsub(":", "", cur)
+ }
+ /image:/ && cur==mon {
+ sub(/^.*image: /,"")
+ print
+ exit
+ }
+ '
+}
# Helper: get focused monitor name (prefer JSON)
get_focused_monitor() {
@@ -39,8 +60,11 @@ else
if [[ -f "$cache_file" ]]; then
# The first non-filter line is the original wallpaper path
- # wallpaper_path="$(grep -v 'Lanczos3' "$cache_file" | head -n 1)"
- wallpaper_path=$(swww query | grep $current_monitor | awk '{print $9}')
+ wallpaper_path="$(read_cached_wallpaper "$cache_file")"
+ fi
+
+ if [[ -z "$wallpaper_path" ]]; then
+ wallpaper_path="$(read_wallpaper_from_query "$current_monitor")"
fi
fi
@@ -54,6 +78,59 @@ ln -sf "$wallpaper_path" "$rofi_link" || true
mkdir -p "$(dirname "$wallpaper_current")"
cp -f "$wallpaper_path" "$wallpaper_current" || true
+# Ensure Ghostty directory exists so Wallust can write target even if Ghostty isn't installed
+mkdir -p "$HOME/.config/ghostty" || true
+wait_for_templates() {
+ local start_ts="$1"
+ shift
+ local files=("$@")
+ for _ in {1..50}; do
+ local ready=true
+ for file in "${files[@]}"; do
+ if [[ ! -s "$file" ]]; then
+ ready=false
+ break
+ fi
+ local mtime
+ mtime=$(stat -c %Y "$file" 2>/dev/null || echo 0)
+ if (( mtime < start_ts )); then
+ ready=false
+ break
+ fi
+ done
+ $ready && return 0
+ sleep 0.1
+ done
+ return 1
+}
+
# Run wallust (silent) to regenerate templates defined in ~/.config/wallust/wallust.toml
# -s is used in this repo to keep things quiet and avoid extra prompts
+start_ts=$(date +%s)
wallust run -s "$wallpaper_path" || true
+wallust_targets=(
+ "$HOME/.config/waybar/wallust/colors-waybar.css"
+ "$HOME/.config/rofi/wallust/colors-rofi.rasi"
+)
+wait_for_templates "$start_ts" "${wallust_targets[@]}" || true
+
+# Normalize Ghostty palette syntax in case ':' was used by older files
+if [ -f "$HOME/.config/ghostty/wallust.conf" ]; then
+ sed -i -E 's/^(\s*palette\s*=\s*)([0-9]{1,2}):/\1\2=/' "$HOME/.config/ghostty/wallust.conf" 2>/dev/null || true
+fi
+
+# Light wait for Ghostty colors file to be present then signal Ghostty to reload (SIGUSR2)
+for _ in 1 2 3; do
+ [ -s "$HOME/.config/ghostty/wallust.conf" ] && break
+ sleep 0.1
+done
+if pidof ghostty >/dev/null; then
+ for pid in $(pidof ghostty); do kill -SIGUSR2 "$pid" 2>/dev/null || true; done
+fi
+
+# Prompt Waybar to reload colors
+if command -v waybar-msg >/dev/null 2>&1; then
+ waybar-msg cmd reload >/dev/null 2>&1 || true
+elif pidof waybar >/dev/null; then
+ killall -SIGUSR2 waybar 2>/dev/null || true
+fi
diff --git a/config/hypr/scripts/WaybarScripts.sh b/config/hypr/scripts/WaybarScripts.sh
index d2205c42..54f7a4b4 100755
--- a/config/hypr/scripts/WaybarScripts.sh
+++ b/config/hypr/scripts/WaybarScripts.sh
@@ -24,6 +24,14 @@ if [[ -z "$term" ]]; then
fi
# Execute accordingly based on the passed argument
+launch_files() {
+ if [[ -z "$files" ]]; then
+ notify-send -u low -i "$HOME/.config/swaync/images/error.png" "Waybar: files" "Set \$files in 01-UserDefaults.conf or install a default file manager."
+ return 1
+ fi
+ eval "$files &"
+}
+
if [[ "$1" == "--btop" ]]; then
$term --title btop sh -c 'btop'
elif [[ "$1" == "--nvtop" ]]; then
@@ -33,7 +41,7 @@ elif [[ "$1" == "--nmtui" ]]; then
elif [[ "$1" == "--term" ]]; then
$term &
elif [[ "$1" == "--files" ]]; then
- $files &
+ launch_files
else
echo "Usage: $0 [--btop | --nvtop | --nmtui | --term]"
echo "--btop : Open btop in a new term"
diff --git a/config/hypr/scripts/keybinds_parser.py b/config/hypr/scripts/keybinds_parser.py
new file mode 100755
index 00000000..d12e3854
--- /dev/null
+++ b/config/hypr/scripts/keybinds_parser.py
@@ -0,0 +1,245 @@
+#!/usr/bin/env python3
+import sys
+import re
+import os
+
+def normalize_combo(combo):
+ return combo.replace(" ", "").replace("\t", "")
+
+def extract_combo(line):
+ # Remove comments and whitespace
+ line = re.sub(r'\s*#.*$', '', line).strip()
+
+ if '=' not in line:
+ return None
+
+ try:
+ rhs = line.split('=', 1)[1]
+ parts = [p.strip() for p in rhs.split(',')]
+ if len(parts) < 2:
+ return None
+
+ mods = parts[0]
+ key = parts[1]
+ return f"{mods},{key}"
+ except Exception:
+ return None
+
+def parse_files(files):
+ # Data structures to match original logic
+ binding_map = {} # combo -> effective line
+ source_map = {} # combo -> source file
+ user_bind_map = {} # combo -> user bind line
+ unbound_user = {} # combo -> True if explicitly unbound in user file
+ seen_any_bind = {} # combo -> True if seen
+ default_seen = {} # combo -> True if default bind exists
+
+ # We assume the last file in the list is the user config (UserKeybinds.conf)
+ # This matches the bash script logic where user_keybinds_conf is passed last
+ if not files:
+ return [], []
+
+ user_conf_path = files[-1] if len(files) > 1 else None
+
+ for file_path in files:
+ if not os.path.exists(file_path):
+ continue
+
+ try:
+ with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
+ for line in f:
+ line = line.rstrip('\n')
+ if not line or line.strip().startswith('#'):
+ continue
+
+ is_bind = re.match(r'^\s*bind[a-z]*\s*=', line)
+ is_unbind = re.match(r'^\s*unbind\s*=', line)
+
+ if is_bind:
+ combo_raw = extract_combo(line)
+ if not combo_raw:
+ continue
+ combo = normalize_combo(combo_raw)
+ seen_any_bind[combo] = True
+
+ is_user_file = (file_path == user_conf_path)
+
+ if not is_user_file:
+ default_seen[combo] = True
+
+ # prefer user bind, else first seen
+ if combo not in source_map:
+ binding_map[combo] = line
+ source_map[combo] = file_path
+
+ if is_user_file:
+ user_bind_map[combo] = line
+ binding_map[combo] = line
+ source_map[combo] = file_path
+
+ elif is_unbind:
+ combo_raw = extract_combo(line)
+ if not combo_raw:
+ continue
+ combo = normalize_combo(combo_raw)
+
+ if file_path == user_conf_path:
+ unbound_user[combo] = True
+
+ # If unbind is found, we should remove the bind from our map
+ # so it doesn't show up in the menu.
+ if combo in binding_map:
+ del binding_map[combo]
+ if combo in source_map:
+ del source_map[combo]
+
+ except Exception as e:
+ # Silently ignore read errors to mimic bash behavior or log to stderr
+ sys.stderr.write(f"Error reading {file_path}: {e}\n")
+ continue
+
+ # Build results
+ raw_keybinds = []
+ missing_unbind_suggestions = []
+
+ for combo in seen_any_bind:
+ eff_line = binding_map.get(combo)
+ src = source_map.get(combo)
+
+ if not eff_line:
+ continue
+
+ raw_keybinds.append(eff_line)
+
+ # Check for missing unbind suggestions
+ # If user overrides a default but didn't unbind in user file
+ if (src == user_conf_path and
+ combo in default_seen and
+ combo not in unbound_user):
+
+ # Create suggestion: replace 'bind' with 'unbind'
+ suggest = re.sub(r'^\s*bind[a-z]*', 'unbind', eff_line)
+ missing_unbind_suggestions.append(suggest)
+
+ return raw_keybinds, missing_unbind_suggestions
+
+def format_for_rofi(raw_binds):
+ formatted_lines = []
+
+ for line in raw_binds:
+ # line is like "bind = MODS, KEY, DISPATCHER, PARAMS" or "bindd = ..."
+ # Parsing logic from awk script:
+
+ # 1. Cleaner binder
+ match = re.match(r'^\s*(bind[a-z]*)\s*=(.*)', line)
+ if not match:
+ continue
+
+ binder = match.group(1).replace(" ", "").replace("\t", "")
+ rhs = match.group(2).strip()
+
+ # "bind" ends in d, but doesn't have a description. "bindd" does.
+ # Original script logic `index(binder, "d")>0` was likely buggy for "bind".
+ # We'll assume strict check for bindd or similar if needed,
+ # but avoiding "bind" having a description is crucial for correct output.
+ has_desc = 'd' in binder and binder != 'bind'
+
+ # Split by comma regex (handling spaces)
+ parts = [p.strip() for p in rhs.split(',')]
+
+ if len(parts) < 2:
+ continue
+
+ mods = parts[0]
+ key = parts[1]
+
+ desc = ""
+ dispatcher = ""
+ params = ""
+
+ start_idx = 0
+
+ if has_desc:
+ desc = parts[2] if len(parts) >= 3 else ""
+ dispatcher = parts[3] if len(parts) >= 4 else ""
+ start_idx = 4
+ else:
+ dispatcher = parts[2] if len(parts) >= 3 else ""
+ start_idx = 3
+
+ # Collect params
+ remaining_parts = []
+ if start_idx < len(parts):
+ for i in range(start_idx, len(parts)):
+ if parts[i]:
+ remaining_parts.append(parts[i])
+
+ if remaining_parts:
+ params = ", ".join(remaining_parts)
+
+ # Formatting mods
+ mods = mods.replace("$mainMod", "SUPER")
+ mods = re.sub(r'[ \t]+', '+', mods)
+
+ # Build combo string
+ if mods and key:
+ combo_str = f"{mods}+{key}"
+ elif key:
+ combo_str = key
+ else:
+ combo_str = mods
+
+ # Final Print Format
+ if has_desc and desc:
+ formatted_lines.append(f"{combo_str} — {desc}")
+ elif dispatcher:
+ if params:
+ formatted_lines.append(f"{combo_str} — {dispatcher} {params}")
+ else:
+ formatted_lines.append(f"{combo_str} — {dispatcher}")
+ else:
+ formatted_lines.append(combo_str)
+
+ return formatted_lines
+
+def main():
+ if len(sys.argv) < 2:
+ # No files provided
+ sys.exit(0)
+
+ config_files = sys.argv[1:]
+
+ binds, suggestions = parse_files(config_files)
+
+ if not binds:
+ print("no keybinds found.")
+ sys.exit(1)
+
+ formatted = format_for_rofi(binds)
+
+ for line in formatted:
+ print(line)
+
+ # Handle suggestions (print to stderr or a specific file if needed,
+ # but the original script assigns it to a variable 'msg'.
+ # To pass this back to bash, we might need a separate mechanism or just print to a known file.)
+ if suggestions:
+ import tempfile
+ try:
+ with tempfile.NamedTemporaryFile(mode='w', delete=False, prefix='hypr-unbind-suggestions-', suffix='.conf') as tf:
+ tf.write('\n'.join(suggestions) + '\n')
+ # We print a special marker line to stdout that the bash script can capture?
+ # Or better, just print to stderr and let the user ignore it,
+ # OR, since the original script specifically puts it in the Rofi message,
+ # we can print a special string at the END of stdout or to a side channel.
+
+ # Let's decide to print the valid keybinds to stdout (for rofi).
+ # And print the suggestion file path to a known location or specific fd if possible.
+ # Simplest: Write to a fixed temp file location that the bash script checks.
+ with open("/tmp/hypr_keybind_suggestions_file", "w") as sf:
+ sf.write(tf.name)
+ except Exception:
+ pass
+
+if __name__ == "__main__":
+ main()
diff --git a/config/hypr/scripts/sddm_wallpaper.sh b/config/hypr/scripts/sddm_wallpaper.sh
index 9dca2f72..17640f40 100755
--- a/config/hypr/scripts/sddm_wallpaper.sh
+++ b/config/hypr/scripts/sddm_wallpaper.sh
@@ -6,7 +6,8 @@
# variables
terminal=kitty
-wallDIR="$HOME/Pictures/wallpapers"
+PICTURES_DIR="$(xdg-user-dir PICTURES 2>/dev/null || echo "$HOME/Pictures")"
+wallDIR="$PICTURES_DIR/wallpapers"
SCRIPTSDIR="$HOME/.config/hypr/scripts"
wallpaper_current="$HOME/.config/hypr/wallpaper_effects/.wallpaper_current"
wallpaper_modified="$HOME/.config/hypr/wallpaper_effects/.wallpaper_modified"
@@ -20,6 +21,10 @@ sddm_simple="$sddm_themes_dir/simple_sddm_2"
# rofi-wallust-sddm colors path
rofi_wallust="$HOME/.config/rofi/wallust/colors-rofi.rasi"
sddm_theme_conf="$sddm_simple/theme.conf"
+if [[ ! -f "$rofi_wallust" ]]; then
+ notify-send -i "$iDIR/error.png" "SDDM" "Wallust colors file not found ($rofi_wallust). Aborting."
+ exit 1
+fi
# Directory for swaync
iDIR="$HOME/.config/swaync/images"
@@ -33,15 +38,45 @@ elif [[ "$1" == "--effects" ]]; then
mode="effects"
fi
+# Abort if SDDM is not running (avoid errors on non-SDDM systems)
+if command -v systemctl >/dev/null 2>&1; then
+ if ! systemctl is-active --quiet sddm; then
+ notify-send -i "$iDIR/error.png" "SDDM" "SDDM is not running. Skipping SDDM wallpaper update."
+ exit 0
+ fi
+elif ! pidof sddm >/dev/null 2>&1; then
+ notify-send -i "$iDIR/error.png" "SDDM" "SDDM is not running. Skipping SDDM wallpaper update."
+ exit 0
+fi
+
# Extract colors from rofi wallust config
-color0=$(grep -oP 'color1:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust")
-color1=$(grep -oP 'color0:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust")
-color7=$(grep -oP 'color14:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust")
-color10=$(grep -oP 'color10:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust")
-color12=$(grep -oP 'color12:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust")
-color13=$(grep -oP 'color13:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust")
-foreground=$(grep -oP 'foreground:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust")
+extract_color() {
+ local key="$1"
+ local value
+ value=$(grep -oP "$key:\s*\K#[A-Fa-f0-9]+" "$rofi_wallust" | head -n1)
+ echo "$value"
+}
+
+color0=$(extract_color "color1")
+color1=$(extract_color "color0")
+color7=$(extract_color "color14")
+color10=$(extract_color "color10")
+color12=$(extract_color "color12")
+color13=$(extract_color "color13")
+foreground=$(extract_color "foreground")
+
+missing_colors=()
+for var in color0 color1 color7 color10 color12 color13 foreground; do
+ if [[ -z "${!var}" ]]; then
+ missing_colors+=("$var")
+ fi
+done
+
+if [[ ${#missing_colors[@]} -gt 0 ]]; then
+ notify-send -i "$iDIR/error.png" "SDDM" "Missing color(s): ${missing_colors[*]}. Run Wallust first."
+ exit 1
+fi
#background-color=$(grep -oP 'background:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust")
# wallpaper to use
diff --git a/config/hypr/scripts/update_WindowRules.sh b/config/hypr/scripts/update_WindowRules.sh
new file mode 100755
index 00000000..8b4262ba
--- /dev/null
+++ b/config/hypr/scripts/update_WindowRules.sh
@@ -0,0 +1,60 @@
+#!/usr/bin/env bash
+# Script to update WindowRules config if Hyprland version is >= 0.53
+
+CONFIGS_DIR="$HOME/.config/hypr/configs"
+TARGET_FILE="$CONFIGS_DIR/WindowRules.conf"
+V3_FILE="$CONFIGS_DIR/WindowRules-config-v3.conf"
+
+if [[ ! -f "$V3_FILE" ]]; then
+ echo "Error: Source configuration file not found: $V3_FILE"
+ exit 1
+fi
+
+get_hyprland_version() {
+ local ver="0.0.0"
+ local raw_ver=""
+
+ if command -v hyprctl &>/dev/null; then
+ raw_ver=$(hyprctl version 2>/dev/null | grep "Tag:" | cut -d 'v' -f2)
+ fi
+
+ if [ -z "$raw_ver" ] && command -v Hyprland &>/dev/null; then
+ raw_ver=$(Hyprland --version 2>/dev/null | grep "Tag:" | cut -d 'v' -f2 | awk '{print $1}')
+ fi
+
+ if [ -n "$raw_ver" ]; then
+ ver=$(echo "$raw_ver" | grep -oE '^[0-9]+\.[0-9]+(\.[0-9]+)?')
+ fi
+
+ if [ -z "$ver" ]; then
+ echo "0.0.0"
+ else
+ echo "$ver"
+ fi
+}
+
+VERSION=$(get_hyprland_version)
+REQUIRED_VER="0.53"
+
+# Check if version >= REQUIRED_VER
+SMALLEST=$(printf '%s\n' "$REQUIRED_VER" "$VERSION" | sort -V | head -n1)
+
+if [ "$SMALLEST" = "$REQUIRED_VER" ]; then
+ echo "Version $VERSION >= $REQUIRED_VER. Updating WindowRules config..."
+ # Backup existing config if it exists
+ if [ -f "$TARGET_FILE" ]; then
+ echo "Backing up existing WindowRules.conf to WindowRules.conf.bak"
+ mv "$TARGET_FILE" "$TARGET_FILE.bak"
+ fi
+ cp "$V3_FILE" "$TARGET_FILE"
+
+ if command -v hyprctl &>/dev/null; then
+ if hyprctl instances &>/dev/null; then
+ echo "Reloading Hyprland..."
+ hyprctl reload
+ fi
+ fi
+else
+ echo "Version $VERSION < $REQUIRED_VER. No update needed."
+fi
+
diff --git a/config/hypr/v2.3.18 b/config/hypr/v2.3.19
index 31b3414d..31b3414d 100644
--- a/config/hypr/v2.3.18
+++ b/config/hypr/v2.3.19
diff --git a/config/kitty/kitty-themes/00-Default.conf b/config/kitty/kitty-themes/00-Default.conf
index 2c1ac15d..39fc496c 100644
--- a/config/kitty/kitty-themes/00-Default.conf
+++ b/config/kitty/kitty-themes/00-Default.conf
@@ -1,3 +1,4 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# This is just created to remove all the themes
+include ./01-Wallust.conf
diff --git a/config/rofi/themes/KooL_style-1.rasi b/config/rofi/themes/KooL_style-1.rasi
index 89bb959e..0e2eb709 100644
--- a/config/rofi/themes/KooL_style-1.rasi
+++ b/config/rofi/themes/KooL_style-1.rasi
@@ -25,7 +25,7 @@ configuration {
background-alt: @color1;
selected: @color12;
active: @color11;
- urgent: red;
+ urgent: @color13;
text-selected: @background;
text-color: @foreground;
diff --git a/config/rofi/themes/KooL_style-13-Vertical.rasi b/config/rofi/themes/KooL_style-13-Vertical.rasi
index 1e7f8337..850b564c 100644
--- a/config/rofi/themes/KooL_style-13-Vertical.rasi
+++ b/config/rofi/themes/KooL_style-13-Vertical.rasi
@@ -25,7 +25,7 @@ configuration {
background-alt: @color10;
selected: @color12;
active: @color11;
- urgent: red;
+ urgent: @color13;
text-selected: @background;
text-color: @foreground;
diff --git a/config/rofi/themes/KooL_style-14.rasi b/config/rofi/themes/KooL_style-14.rasi
index a766cb96..fddf18bd 100644
--- a/config/rofi/themes/KooL_style-14.rasi
+++ b/config/rofi/themes/KooL_style-14.rasi
@@ -19,7 +19,7 @@ configuration {
background-alt: @color0;
selected: @color13;
active: @color12;
- urgent: #8E3596;
+ urgent: @color13;
}
/*****----- Main Window -----*****/
diff --git a/config/rofi/themes/KooL_style-3-FullScreen-v1.rasi b/config/rofi/themes/KooL_style-3-FullScreen-v1.rasi
index 4efe106c..542f3a1f 100644
--- a/config/rofi/themes/KooL_style-3-FullScreen-v1.rasi
+++ b/config/rofi/themes/KooL_style-3-FullScreen-v1.rasi
@@ -23,10 +23,10 @@ configuration {
/* ---- Global Properties ---- */
* {
- background-alt: @selected-active-background; // Buttons background
- selected: @selected-urgent-background; // Button selected
- active: @selected-normal-background; // Window activated
- urgent: @selected; // When hovering the activated window (maybe more?)
+ background-alt: @color0; // neutral background
+ selected: @color12; // accent
+ active: @color11; // secondary
+ urgent: @color13; // alert
text-selected: @background;
text-color: @foreground;
@@ -150,7 +150,7 @@ button {
}
button selected {
background-color: @selected;
- text-color: @text-selected;
+ text-color: @background;
}
/* ---- Scrollbar ---- */
@@ -191,8 +191,8 @@ element selected.normal {
border: 0px 3px 0px 3px;
border-radius: 16px;
border-color: @selected;
- background-color: transparent;
- text-color: @background-alt;
+ background-color: @selected;
+ text-color: @background;
}
element selected.urgent {
diff --git a/config/rofi/themes/KooL_style-3-Fullscreen-v2.rasi b/config/rofi/themes/KooL_style-3-Fullscreen-v2.rasi
index 7e771105..37e515a9 100644
--- a/config/rofi/themes/KooL_style-3-Fullscreen-v2.rasi
+++ b/config/rofi/themes/KooL_style-3-Fullscreen-v2.rasi
@@ -26,7 +26,7 @@ configuration {
background-alt: @color7;
selected: @color12;
active: @color11;
- urgent: red;
+ urgent: @color13;
border-color: @selected;
handle-color: @selected;
diff --git a/config/rofi/themes/KooL_style-4.rasi b/config/rofi/themes/KooL_style-4.rasi
index ea7b1977..b1859c37 100644
--- a/config/rofi/themes/KooL_style-4.rasi
+++ b/config/rofi/themes/KooL_style-4.rasi
@@ -22,12 +22,13 @@ configuration {
/*****----- Global Properties -----*****/
* {
- background-alt: @color1;
+ background-alt: @color0;
+ /* selected uses color12, active uses color11 (match other working styles) */
selected: @color12;
active: @color11;
- urgent: #F7768E;
+ urgent: @color13;
- border-color: @color11;
+ border-color: @active;
handle-color: @selected;
background-color: @background;
foreground-color: @foreground;
@@ -38,12 +39,13 @@ configuration {
urgent-foreground: @background;
active-background: @active;
active-foreground: @background;
+ /* force selection to use the selected accent, not imported selected-* values */
selected-normal-background: @selected;
selected-normal-foreground: @background;
- selected-urgent-background: @active;
+ selected-urgent-background: @selected;
selected-urgent-foreground: @background;
- selected-active-background: @urgent;
- selected-active-foreground: @color12;
+ selected-active-background: @selected;
+ selected-active-foreground: @background;
alternate-normal-background: @background;
alternate-normal-foreground: @foreground;
alternate-urgent-background: @urgent;
@@ -219,16 +221,16 @@ element normal.active {
element-text selected,
element selected.normal {
- background-color: @selected-normal-background;
- text-color: @selected-normal-foreground;
+ background-color: @selected;
+ text-color: @background;
}
element selected.urgent {
- background-color: @selected-urgent-background;
- text-color: @selected-urgent-foreground;
+ background-color: @selected;
+ text-color: @background;
}
element selected.active {
- background-color: @selected-active-background;
- text-color: @selected-active-foreground;
+ background-color: @selected;
+ text-color: @background;
}
element alternate.normal {
background-color: @alternate-normal-background;
@@ -285,8 +287,8 @@ button selected {
border: 2px 0px 2px 2px;
border-radius: 6px;
border-color: @border-color;
- background-color: @selected-normal-foreground;
- text-color: @selected-normal-background;
+ background-color: @selected;
+ text-color: @background;
}
/*****----- Message -----*****/
diff --git a/config/rofi/themes/KooL_style-5.rasi b/config/rofi/themes/KooL_style-5.rasi
index 94555ebb..72ec7675 100644
--- a/config/rofi/themes/KooL_style-5.rasi
+++ b/config/rofi/themes/KooL_style-5.rasi
@@ -26,7 +26,7 @@ configuration {
background-alt: @color1;
selected: @color12;
active: @color11;
- urgent: red;
+ urgent: @color13;
text-selected: @background;
text-color: @foreground;
@@ -140,10 +140,9 @@ button {
button selected {
background-color: @selected;
- text-color: @foreground;
+ text-color: @background;
border: 1px;
border-color: transparent;
-
}
/* ---- Listview ---- */
@@ -203,8 +202,8 @@ element normal.active {
element-text selected,
element selected.normal {
- background-color: @active;
- text-color: inherit;
+ background-color: @selected;
+ text-color: @background;
}
element selected.urgent {
diff --git a/config/rofi/themes/KooL_style-6.rasi b/config/rofi/themes/KooL_style-6.rasi
index c0b1eaa6..a25eaa19 100644
--- a/config/rofi/themes/KooL_style-6.rasi
+++ b/config/rofi/themes/KooL_style-6.rasi
@@ -26,7 +26,7 @@ configuration {
background-alt: @color1;
selected: @color12;
active: @color11;
- urgent: red;
+ urgent: @color13;
text-selected: @background;
text-color: @foreground;
@@ -145,8 +145,8 @@ button {
cursor: pointer;
}
button selected {
- background-color: @active;
- text-color: @text-selected;
+ background-color: @selected;
+ text-color: @background;
}
@@ -169,23 +169,28 @@ element normal.urgent {
text-color: @foreground;
}
-element-text selected,
+/* Separate rules so selected text does not paint a second background */
+element-text selected {
+ background-color: transparent;
+ text-color: @background;
+}
+
element normal.active {
background-color: @active;
text-color: @foreground;
}
element selected.normal {
- background-color: @color11;
- text-color: @text-selected;
+ background-color: @selected;
+ text-color: @background;
}
element selected.urgent {
- background-color: @urgent;
- text-color: @text-selected;
+ background-color: @selected;
+ text-color: @background;
}
element selected.active {
- background-color: @urgent;
- text-color: @text-selected;
+ background-color: @selected;
+ text-color: @background;
}
// Adapt rofi theme
element alternate.normal {
diff --git a/config/rofi/themes/KooL_style-7.rasi b/config/rofi/themes/KooL_style-7.rasi
index b1a1a9a9..bea2ba47 100644
--- a/config/rofi/themes/KooL_style-7.rasi
+++ b/config/rofi/themes/KooL_style-7.rasi
@@ -23,10 +23,11 @@ configuration {
/*****----- Global Properties -----*****/
* {
- background-alt: @color1;
+ background-alt: @color0;
+ /* selected uses color12, active uses color11 (match other working styles) */
selected: @color12;
active: @color11;
- urgent: #8E3596;
+ urgent: @color13;
}
/*****----- Main Window -----*****/
@@ -153,8 +154,8 @@ element normal.normal {
element-text selected,
element selected.normal {
border-radius: 30px;
- background-color: @color11;
- text-color: @foreground;
+ background-color: @selected;
+ text-color: @background;
}
element-icon {
padding: 0px;
diff --git a/config/rofi/themes/KooL_style-8.rasi b/config/rofi/themes/KooL_style-8.rasi
index e0ca3208..a3dea01a 100644
--- a/config/rofi/themes/KooL_style-8.rasi
+++ b/config/rofi/themes/KooL_style-8.rasi
@@ -23,6 +23,13 @@ configuration {
/* ---- Global Properties ---- */
* {
+ /* Define palette mappings used below */
+ selected: @color12; /* accent */
+ active: @color11; /* secondary */
+ urgent: @color13; /* alerts */
+ text-selected: @background; /* readable over accent */
+ text-color: @foreground;
+
border-width: 2px;
border-radius: 12px;
}
@@ -131,8 +138,8 @@ button {
}
button selected {
- background-color: @color12;
- text-color: @foreground;
+ background-color: @selected;
+ text-color: @background;
}
/* ---- Scrollbar ---- */
@@ -156,8 +163,8 @@ element {
element-text selected,
element selected.normal {
- background-color: @color11;
- text-color: @foreground;
+ background-color: @selected;
+ text-color: @background;
border-radius: 1.5em;
}
diff --git a/config/rofi/themes/KooL_style-9.rasi b/config/rofi/themes/KooL_style-9.rasi
index 6b1346f6..dc50f941 100644
--- a/config/rofi/themes/KooL_style-9.rasi
+++ b/config/rofi/themes/KooL_style-9.rasi
@@ -23,7 +23,7 @@ configuration {
/*****----- Global Properties -----*****/
* {
BG: @background;
- BGA: @color11;
+ BGA: @color12;
FG: @foreground;
FGA: #F28FADff;
BDR: @color12;
diff --git a/config/rofi/themes/saint-rofi.rasi b/config/rofi/themes/saint-rofi.rasi
index e85c678f..27fdea13 100644
--- a/config/rofi/themes/saint-rofi.rasi
+++ b/config/rofi/themes/saint-rofi.rasi
@@ -23,7 +23,7 @@ configuration {
background-alt: @color1;
selected: @color12;
active: @color11;
- urgent: red;
+ urgent: @color13;
text-selected: @background;
text-color: @foreground;
border-color: @selected;
@@ -143,8 +143,8 @@ element normal.active {
}
element selected.normal {
- background-color: @color11;
- text-color: @text-selected;
+ background-color: @selected;
+ text-color: @background;
}
element selected.urgent {
background-color: @urgent;
diff --git a/config/swappy/config b/config/swappy/config
index 45d84e49..ea04ccc2 100644
--- a/config/swappy/config
+++ b/config/swappy/config
@@ -1,5 +1,5 @@
[Default]
-save_dir=$HOME/Pictures/Screenshots
+save_dir=$(xdg-user-dir PICTURES 2>/dev/null || echo "$HOME/Pictures")/Screenshots
save_filename_format=swappy-%Y%m%d-%H%M%S.png
show_pannel=false
line_size=5
diff --git a/config/swaync/config.json b/config/swaync/config.json
index 0aa1af40..a5518596 100755
--- a/config/swaync/config.json
+++ b/config/swaync/config.json
@@ -51,8 +51,8 @@
"text": "Notification"
},
"mpris": {
- "image-size": 10,
- "image-radius": 0
+ "image-size": 96,
+ "image-radius": 8
},
"volume": {
"label": "󰕾"
diff --git a/config/wallust/templates/colors-ghostty.conf b/config/wallust/templates/colors-ghostty.conf
new file mode 100644
index 00000000..abbae8f9
--- /dev/null
+++ b/config/wallust/templates/colors-ghostty.conf
@@ -0,0 +1,28 @@
+# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */
+# wallust template - colors for Ghostty
+# This file is included by ~/.config/ghostty/ghostty.config when present.
+
+# Core UI colors
+foreground = {{foreground}}
+background = {{background}}
+cursor-color = {{cursor}}
+selection-foreground = {{foreground}}
+selection-background = {{color12}}
+
+# 16-color palette
+palette = 0={{color0}}
+palette = 1={{color1}}
+palette = 2={{color2}}
+palette = 3={{color3}}
+palette = 4={{color4}}
+palette = 5={{color5}}
+palette = 6={{color6}}
+palette = 7={{color7}}
+palette = 8={{color8}}
+palette = 9={{color9}}
+palette = 10={{color10}}
+palette = 11={{color11}}
+palette = 12={{color12}}
+palette = 13={{color13}}
+palette = 14={{color14}}
+palette = 15={{color15}}
diff --git a/config/wallust/templates/colors-rofi.rasi b/config/wallust/templates/colors-rofi.rasi
index 68bc8b6b..b839d827 100644
--- a/config/wallust/templates/colors-rofi.rasi
+++ b/config/wallust/templates/colors-rofi.rasi
@@ -16,12 +16,12 @@ alternate-normal-foreground: {{foreground}};
alternate-urgent-background: {{background}};
alternate-urgent-foreground: {{foreground}};
-selected-active-background: {{color13}};
-selected-active-foreground: {{foreground}};
-selected-normal-background: {{color13}};
-selected-normal-foreground: {{foreground}};
-selected-urgent-background: {{color12}};
-selected-urgent-foreground: {{foreground}};
+selected-active-background: {{color12}};
+selected-active-foreground: {{background}};
+selected-normal-background: {{color12}};
+selected-normal-foreground: {{background}};
+selected-urgent-background: {{color11}};
+selected-urgent-foreground: {{background}};
background-color: {{background}};
background: rgba(0,0,0,0.7);
diff --git a/config/wallust/wallust.toml b/config/wallust/wallust.toml
index d1f40ab2..7565dd47 100644
--- a/config/wallust/wallust.toml
+++ b/config/wallust/wallust.toml
@@ -49,6 +49,9 @@ waybar.target = '~/.config/waybar/wallust/colors-waybar.css'
kitty.template = 'colors-kitty.conf'
kitty.target = '~/.config/kitty/kitty-themes/01-Wallust.conf'
+ghostty.template = 'colors-ghostty.conf'
+ghostty.target = '~/.config/ghostty/wallust.conf'
+
quickshell.template = 'qml_color.json'
quickshell.target = '~/.config/quickshell/qml_color.json'
diff --git a/config/waybar/ModulesCustom b/config/waybar/ModulesCustom
index f4c871f7..cb390c0f 100644
--- a/config/waybar/ModulesCustom
+++ b/config/waybar/ModulesCustom
@@ -90,10 +90,10 @@
},
"custom/keyboard": {
- "exec": "cat $HOME/.cache/kb_layout",
+ "exec": "$HOME/.config/hypr/scripts/KeyboardLayout.sh status",
"interval": 1,
"format": " {}",
- "on-click": "$HOME/.config/hypr/scripts/SwitchKeyboardLayout.sh",
+ "on-click": "$HOME/.config/hypr/scripts/KeyboardLayout.sh switch",
},
"custom/light_dark": {
diff --git a/config/waybar/configs/[TOP & BOT] SummitSplit-glass b/config/waybar/configs/[TOP & BOT] SummitSplit-glass
new file mode 100644
index 00000000..0c36cc14
--- /dev/null
+++ b/config/waybar/configs/[TOP & BOT] SummitSplit-glass
@@ -0,0 +1,93 @@
+/* ---- 💫 https://github.com/JaKooLit 💫 ---- */
+
+// ### DUAL TOP and BOTTOM ### //
+
+[{
+"include": [
+ "$HOME/.config/waybar/Modules",
+ "$HOME/.config/waybar/ModulesWorkspaces",
+ "$HOME/.config/waybar/ModulesCustom",
+ "$HOME/.config/waybar/ModulesGroups",
+ "$HOME/.config/waybar/UserModules",
+ ],
+"layer": "top",
+//"mode": "dock",
+"exclusive": true,
+"passthrough": false,
+"position": "bottom",
+"spacing": 3,
+"fixed-center": true,
+"ipc": true,
+"margin-top": 1,
+"margin-left": 8,
+"margin-right": 8,
+
+"modules-left": [
+ "cpu",
+ "power-profiles-daemon",
+ "temperature",
+ "memory",
+ "disk",
+ ],
+
+"modules-center": [
+ "idle_inhibitor",
+ "clock",
+ "custom/light_dark",
+ ],
+
+"modules-right": [
+ "custom/weather",
+ "battery",
+ "backlight",
+ "bluetooth",
+ "network",
+ "custom/updater",
+ "custom/cycle_wall",
+ "custom/nightlight",
+ "custom/lock",
+ ],
+},
+
+{
+"include": [
+ "$HOME/.config/waybar/Modules",
+ "$HOME/.config/waybar/ModulesWorkspaces",
+ "$HOME/.config/waybar/ModulesCustom",
+ "$HOME/.config/waybar/ModulesGroups",
+ "$HOME/.config/waybar/UserModules",
+ ],
+"layer": "top",
+//"mode": "dock",
+"exclusive": true,
+"passthrough": false,
+"position": "top",
+"spacing": 5,
+"fixed-center": true,
+"ipc": true,
+"height": 0,
+"margin-left": 8,
+"margin-right": 8,
+//"gtk-layer-shell": true,
+//"margin-bottom": 0,
+
+"modules-left": [
+ "custom/menu",
+ // "wlr/taskbar",
+ "hyprland/window",
+ "mpris",
+ ],
+
+"modules-center": [
+ "hyprland/workspaces#rw",
+ ],
+
+"modules-right": [
+ "tray",
+ "group/notify",
+ "pulseaudio",
+ //"wireplumber",
+ "pulseaudio#microphone",
+ "custom/power",
+ ],
+}],
diff --git a/config/waybar/configs/[TOP] Default Laptop b/config/waybar/configs/[TOP] Default Laptop
index 0b264c6b..08a87244 100644
--- a/config/waybar/configs/[TOP] Default Laptop
+++ b/config/waybar/configs/[TOP] Default Laptop
@@ -26,20 +26,17 @@
"custom/cava_mviz",
"custom/separator#blank",
"custom/playerctl",
- "custom/separator#blank_2",
+ "custom/separator#blank",
"hyprland/window",
],
"modules-center": [
- "group/app_drawer",
"custom/separator#blank",
+ "group/app_drawer",
"group/notify",
- "custom/separator#dot-line",
"hyprland/workspaces#rw",
"clock",
- "custom/separator#dot-line",
"custom/weather",
- "custom/separator#dot-line",
"idle_inhibitor",
"custom/hint",
],
@@ -47,14 +44,10 @@
"modules-right": [
"tray",
"network#speed",
- "custom/separator#dot-line",
"group/laptop",
- "custom/separator#dot-line",
"group/mobo_drawer",
- "custom/separator#line",
"group/audio",
- "custom/separator#dot-line",
"custom/nightlight",
"group/status",
],
-} \ No newline at end of file
+}
diff --git a/config/waybar/configs/[TOP] Default Laptop (old v5) b/config/waybar/configs/[TOP] Default Laptop (old v5)
new file mode 100644
index 00000000..0b264c6b
--- /dev/null
+++ b/config/waybar/configs/[TOP] Default Laptop (old v5)
@@ -0,0 +1,60 @@
+/* ---- 💫 https://github.com/JaKooLit 💫 ---- */
+
+// ### DEFAULT Laptop - Top ### //
+{
+"include": [
+ "$HOME/.config/waybar/Modules",
+ "$HOME/.config/waybar/ModulesWorkspaces",
+ "$HOME/.config/waybar/ModulesCustom",
+ "$HOME/.config/waybar/ModulesGroups",
+ "$HOME/.config/waybar/UserModules",
+ ],
+"layer": "top",
+//"mode": "dock",
+"exclusive": true,
+"passthrough": false,
+"position": "top",
+"spacing": 3,
+"fixed-center": true,
+"ipc": true,
+"margin-top": 3,
+"margin-left": 8,
+"margin-right": 8,
+
+"modules-left": [
+ "custom/separator#blank",
+ "custom/cava_mviz",
+ "custom/separator#blank",
+ "custom/playerctl",
+ "custom/separator#blank_2",
+ "hyprland/window",
+ ],
+
+"modules-center": [
+ "group/app_drawer",
+ "custom/separator#blank",
+ "group/notify",
+ "custom/separator#dot-line",
+ "hyprland/workspaces#rw",
+ "clock",
+ "custom/separator#dot-line",
+ "custom/weather",
+ "custom/separator#dot-line",
+ "idle_inhibitor",
+ "custom/hint",
+ ],
+
+"modules-right": [
+ "tray",
+ "network#speed",
+ "custom/separator#dot-line",
+ "group/laptop",
+ "custom/separator#dot-line",
+ "group/mobo_drawer",
+ "custom/separator#line",
+ "group/audio",
+ "custom/separator#dot-line",
+ "custom/nightlight",
+ "group/status",
+ ],
+} \ No newline at end of file
diff --git a/config/waybar/configs/[TOP] Default Laptop-glass b/config/waybar/configs/[TOP] Default Laptop-glass
new file mode 100644
index 00000000..2a6db533
--- /dev/null
+++ b/config/waybar/configs/[TOP] Default Laptop-glass
@@ -0,0 +1,51 @@
+/* ---- 💫 https://github.com/JaKooLit 💫 ---- */
+
+// ### DEFAULT Laptop - Top ### //
+{
+"include": [
+ "$HOME/.config/waybar/Modules",
+ "$HOME/.config/waybar/ModulesWorkspaces",
+ "$HOME/.config/waybar/ModulesCustom",
+ "$HOME/.config/waybar/ModulesGroups",
+ "$HOME/.config/waybar/UserModules",
+ ],
+"layer": "top",
+//"mode": "dock",
+"exclusive": true,
+"passthrough": false,
+"position": "top",
+"spacing": 3,
+"fixed-center": true,
+"ipc": true,
+"margin-top": 3,
+"margin-left": 8,
+"margin-right": 8,
+
+"modules-left": [
+ "custom/separator#blank",
+ "custom/cava_mviz",
+ "custom/separator#blank",
+ "custom/playerctl",
+ "hyprland/window",
+ ],
+
+"modules-center": [
+ "group/app_drawer",
+ "custom/separator#blank",
+ "group/notify",
+ "hyprland/workspaces#rw",
+ "clock",
+ "custom/weather",
+ "idle_inhibitor",
+ "custom/hint",
+ ],
+
+"modules-right": [
+ "tray",
+ "group/laptop",
+ "group/mobo_drawer",
+ "group/audio",
+ "custom/nightlight",
+ "group/status",
+ ],
+}
diff --git a/config/waybar/configs/[TOP] Everforest-glass b/config/waybar/configs/[TOP] Everforest-glass
new file mode 100644
index 00000000..8032f216
--- /dev/null
+++ b/config/waybar/configs/[TOP] Everforest-glass
@@ -0,0 +1,143 @@
+/* ---- 💫 https://github.com/JaKooLit 💫 ---- */
+/* -- designed by https://github.com/DevNChill */
+// ### Everforest ### //
+
+{
+"include": [
+ "$HOME/.config/waybar/Modules",
+ "$HOME/.config/waybar/ModulesWorkspaces",
+ "$HOME/.config/waybar/ModulesCustom",
+ "$HOME/.config/waybar/ModulesGroups",
+ "$HOME/.config/waybar/UserModules",
+ ],
+"layer": "top",
+//"mode": "dock",
+"exclusive": true,
+"passthrough": false,
+"position": "top",
+//"spacing": 6,
+"fixed-center": true,
+"ipc": true,
+//"margin-top": 3,
+//"margin-left": 8,
+//"margin-right": 8,
+
+"modules-left": [
+ "custom/arch",
+ "hyprland/workspaces#rw",
+// "mpris",
+ "group/notify",
+ "tray",
+ ],
+"modules-center": [
+ "clock#forest",
+ "idle_inhibitor",
+ ],
+"modules-right": [
+ "cpu#forest",
+ "memory#forest",
+ "temperature#forest",
+ "disk#forest",
+ "backlight",
+ "battery#forest",
+ "group/audio",
+ "custom/nightlight",
+ ],
+
+// Additional / Edited Waybar Modules //
+"custom/arch": {
+ "format":" ",
+ "tooltip": false,
+ "on-click": "rofi -show drun"
+},
+"clock#forest": {
+ "format": "{:L%A %d.%m.%Y - %H:%M}",
+ "tooltip-format": "<span color='#D3C6AA' size='larger'>{:%Y %B}</span>\n<tt>{calendar}</tt>",
+ "calendar-weeks-pos": "right",
+ "today-format": "<span color='#E67E80' weight='ultrabold'>{}</span>",
+ "format-calendar": "<span color='#D3C6AA' weight='normal'>{}</span>",
+ "format-calendar-weeks": "<span color='#7FBBB3'><b>W{:%V}</b></span>",
+ "format-calendar-weekdays": "<span color='#A7C080'><b>{}</b></span>",
+ "on-scroll": {
+ "calendar": 1
+ }
+},
+"battery#forest": {
+ //"interval": 5,
+ "align": 0,
+ "rotate": 0,
+ //"bat": "BAT1",
+ //"adapter": "ACAD",
+ "full-at": 100,
+ "design-capacity": false,
+ "states": {
+ "good": 95,
+ "warning": 30,
+ "critical": 15
+ },
+ "format": "Battery {icon} {capacity}%",
+ "format-charging": "Battery  {capacity}%",
+ "format-plugged": "Battery 󱘖 {capacity}%",
+ "format-alt-click": "click",
+ "format-full": "Battery {icon} Full",
+ "format-alt": "Battery {icon} {time}",
+ "format-icons": [
+ "󰂎", "󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"
+ ],
+ "format-time": "{H}h {M}min",
+ "tooltip": true,
+ "tooltip-format": "{timeTo} {power}w",
+ "on-click-middle": "$HOME/.config/hypr/scripts/ChangeBlur.sh",
+ "on-click-right": "$HOME/.config/hypr/scripts/Wlogout.sh",
+},
+
+"cpu#forest": {
+ "format": "Cpu 󰍛 {usage}%",
+ "interval": 1,
+ "min-length": 5,
+ "format-alt-click": "click",
+ "format-alt": "{icon0}{icon1}{icon2}{icon3} {usage:>2}% 󰍛",
+ "format-icons": [
+ "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"
+ ],
+ "on-click-right": "gnome-system-monitor",
+},
+
+"disk#forest": {
+ "interval": 30,
+ //"format": "Disk 󰋊",
+ "path": "/",
+ //"format-alt-click": "click",
+ "format": "Disk 󰋊 {used}",
+ "on-click-right": "baobab",
+// "tooltip": true,
+// "tooltip-format": "Disk {used} used out of {total} on {path} ({percentage_used}%)",
+},
+
+"memory#forest": {
+ "interval": 10,
+ "format": "Ram 󰾆 {used:0.1f}G",
+ "format-alt": "Ram {percentage}% 󰾆",
+ "format-alt-click": "click",
+ "tooltip": true,
+ "tooltip-format": "Ram {used:0.1f}GB/{total:0.1f}G",
+ "on-click-right": "kitty --title btop sh -c 'btop'"
+},
+"temperature#forest": {
+ "interval": 10,
+ "tooltip": true,
+ "hwmon-path": [
+ "/sys/class/hwmon/hwmon1/temp1_input",
+ "/sys/class/thermal/thermal_zone0/temp"
+ ],
+ //"thermal-zone": 0,
+ "critical-threshold": 82,
+ "format-critical": "Temp {icon} {temperatureC}°C",
+ "format": "Temp {icon} {temperatureC}°C",
+ "format-icons": [
+ " 󰈸"
+ ],
+ "on-click-right": "kitty --title nvtop sh -c 'nvtop'"
+},
+}
+
diff --git a/config/waybar/style/Crystal Clear Glass.css b/config/waybar/style/Crystal Clear Glass.css
new file mode 100644
index 00000000..3e309abb
--- /dev/null
+++ b/config/waybar/style/Crystal Clear Glass.css
@@ -0,0 +1,245 @@
+/* CRYSTAL CLEAR Glass theme for Waybar */
+
+/* SPDX-FileCopyrightText: 2026-present Ahum Maitra theahummaitra@gmail.com
+SPDX-License-Identifier: GPL-3.0-or-later */
+
+/*
+-----------------------------------------------------
+General
+-----------------------------------------------------
+*/
+
+* {
+ background-color: transparent;
+ font-family: "JetBrainsMono Nerd Font";
+ border: none;
+ font-weight: bolder;
+ border-radius: 0px;
+
+ /* Extra tweaks */
+ min-height: 0;
+ /* set font-size to 100% if font scaling is set to 1.00 using nwg-look */
+ font-size: 97%;
+ font-feature-settings: '"zero", "ss01", "ss02", "ss03", "ss04", "ss05", "cv31"';
+ margin-top: 3px;
+ padding-bottom: 2px;
+}
+
+window#waybar {
+ background: transparent;
+}
+
+.modules-left {
+ border-radius: 12px;
+ border: 1px solid transparent;
+ opacity: 0.8;
+ padding-left: 5px;
+ padding-right: 15px;
+ margin: 10px;
+ background-color: rgba(255, 255, 255, 0.25);
+ box-shadow: inset 1px 2px 2px rgba(255, 255, 255, 0.2);
+}
+
+.modules-right {
+ border-radius: 12px;
+ border: 1px solid transparent;
+ opacity: 0.8;
+ padding-left: 15px;
+ margin: 10px;
+ background-color: rgba(255, 255, 255, 0.25);
+ box-shadow: inset 1px 2px 2px rgba(255, 255, 255, 0.3);
+}
+
+.modules-center {
+ border-radius: 12px;
+ border: 1px solid transparent;
+ opacity: 0.8;
+ margin: 10px;
+ background-color: rgba(255, 255, 255, 0.25);
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.2);
+}
+
+label.module {
+ font-size: 14px;
+ margin-left: 8px;
+ margin-right: 8px;
+ border-radius: 5px;
+}
+
+label.module {
+ font-size: 14px;
+ padding: 3px 10px;
+ transition: all 0.3s ease-out;
+ border-radius: 10px;
+ border: 0px solid transparent;
+}
+
+label.module:hover {
+}
+
+/* -----------------------------------------------------
+ * Workspaces
+ * ----------------------------------------------------- */
+
+#workspaces {
+ padding: 5px 3px 5px 3px;
+ min-width: 176px;
+ font-weight: 600;
+}
+
+#workspaces button {
+ border-radius: 3px;
+ padding: 0px 5px 0px 5px;
+ margin: 0px 2px 0px 2px;
+ transition: all 0.3s ease-in-out;
+ border: 1px solid transparent;
+}
+
+#workspaces button.active {
+ background-color: rgba(255, 255, 255, 0.35);
+
+ border: 1px solid transparent;
+ transition: all 0.3s ease-in-out;
+ min-width: 30px;
+ border-radius: 8px;
+ box-shadow:
+ inset 1px 2px 2px rgba(255, 255, 255, 0.5),
+ inset 0 1px 1px rgba(255, 255, 255, 0.8);
+}
+
+#workspaces button:hover {
+ background-color: rgba(255, 255, 255, 0.2);
+ border-radius: 15px;
+}
+
+/* -----------------------------------------------------
+ * Tooltips
+ * ----------------------------------------------------- */
+
+tooltip {
+ border-radius: 12px;
+ border: 1px solid transparent;
+ opacity: 0.7;
+ margin: 10px;
+}
+
+/* -----------------------------------------------------
+ * Window
+ * ----------------------------------------------------- */
+
+#window {
+ background-color: transparent;
+ padding-right: 12px;
+}
+
+window#waybar.empty #window {
+ background-color: transparent;
+}
+
+/* -----------------------------------------------------
+ * Taskbar
+ * ----------------------------------------------------- */
+
+#taskbar {
+ padding: 5px 0px 5px 0px;
+}
+
+#taskbar button {
+ border-radius: 6px;
+ padding: 0px 5px 0px 5px;
+}
+
+#custom-updates.yellow {
+ border-radius: 8px;
+ margin: 5px 0px 5px 5px;
+ padding: 0px 6px 0px 6px;
+}
+
+#custom-updates.red {
+ border-radius: 8px;
+ margin: 6px 0px 6px 7px;
+ padding: 0px 6px 0px 6px;
+}
+
+/* -----------------------------------------------------
+ * Clock
+ * ----------------------------------------------------- */
+
+#clock {
+ margin-left: 12px;
+ margin-right: 12px;
+}
+
+@keyframes blink {
+ to {
+ background-color: #ffffff;
+ color: #ffffff;
+ }
+}
+
+#battery.critical:not(.charging) {
+ background-color: transparent;
+}
+
+#backlight,
+#backlight-slider,
+#battery,
+#bluetooth,
+#clock,
+#cpu,
+#disk,
+#idle_inhibitor,
+#keyboard-state,
+#memory,
+#mode,
+#mpris,
+#network,
+#power-profiles-daemon,
+#pulseaudio,
+#pulseaudio-slider,
+#taskbar button,
+#taskbar,
+#temperature,
+#tray,
+#window,
+#wireplumber,
+#workspaces,
+#custom-backlight,
+#custom-nightlight,
+#custom-browser,
+#custom-cava_mviz,
+#custom-cycle_wall,
+#custom-dot_update,
+#custom-file_manager,
+#custom-keybinds,
+#custom-keyboard,
+#custom-light_dark,
+#custom-nightlight,
+#custom-lock,
+#custom-hint,
+#custom-hypridle,
+#custom-menu,
+#custom-playerctl,
+#custom-power_vertical,
+#custom-power,
+#custom-quit,
+#custom-reboot,
+#custom-settings,
+#custom-spotify,
+#custom-swaync,
+#custom-tty,
+#custom-updater,
+#custom-hyprpicker,
+#custom-weather,
+#custom-weather.clearNight,
+#custom-weather.cloudyFoggyDay,
+#custom-weather.cloudyFoggyNight,
+#custom-weather.default,
+#custom-weather.rainyDay,
+#custom-weather.rainyNight,
+#custom-weather.severe,
+#custom-weather.showyIcyDay,
+#custom-weather.snowyIcyNight,
+#custom-weather.sunnyDay {
+ background-color: transparent;
+}
diff --git a/config/waybar/style/ML4W Glass-3d.css b/config/waybar/style/ML4W Glass-3d.css
new file mode 100644
index 00000000..e54b07cc
--- /dev/null
+++ b/config/waybar/style/ML4W Glass-3d.css
@@ -0,0 +1,327 @@
+/* ML4W GLASS THEME */
+
+/* SPDX-FileCopyrightText: 2026-present Ahum Maitra theahummaitra@gmail.com
+SPDX-License-Identifier: GPL-3.0-or-later */
+
+/*
+-----------------------------------------------------
+General
+-----------------------------------------------------
+*/
+
+* {
+ background-color: transparent;
+ font-family: "JetBrainsMono Nerd Font";
+ border: none;
+ font-weight: bolder;
+ border-radius: 0px;
+
+ /* Extra tweaks */
+ min-height: 0;
+ /* set font-size to 100% if font scaling is set to 1.00 using nwg-look */
+ font-size: 97%;
+ font-feature-settings: '"zero", "ss01", "ss02", "ss03", "ss04", "ss05", "cv31"';
+ margin-top: 3px;
+ padding-bottom: 2px;
+}
+
+@import "style/ML4W/glass.css";
+/* Soft-neutral override: keeps glass gradients but avoids red-dominant palettes */
+@define-color surface @background-alt;
+@define-color surface_dim @background;
+@define-color primary @foreground;
+@define-color on_primary @background;
+@define-color on_primary_fixed @background;
+@define-color on_primary_fixed_variant @foreground;
+@define-color secondary @foreground;
+@define-color on_secondary @background;
+@define-color on_tertiary_fixed @background;
+@define-color on_tertiary_fixed_variant @foreground;
+@define-color error @foreground;
+@define-color on_error @background;
+@define-color accent @color12; /* wallust primary for subtle highlights */
+
+window#waybar {
+ background: transparent;
+ border: 0;
+ outline: none;
+}
+
+.modules-left {
+ background-color: @surface;
+ border-radius: 12px;
+ background:
+ radial-gradient(
+ circle at 50% 250%,
+ alpha(darker(@surface), 0.9),
+ alpha(@surface_dim, 0.9)
+ )
+ padding-box,
+ linear-gradient(@primary, @on_primary) border-box;
+ border: 1px solid transparent;
+ opacity: 0.8;
+ padding-right: 15px;
+ margin: 10px;
+ box-shadow:
+ inset 0 -2px 0 alpha(@accent, 0.45),
+ inset 1px 2px 2px rgba(255, 255, 255, 0.2);
+}
+
+.modules-right {
+ background-color: @surface;
+ border-radius: 12px;
+ background:
+ radial-gradient(
+ circle at 50% 250%,
+ alpha(darker(@surface), 0.9),
+ alpha(@surface_dim, 0.9)
+ )
+ padding-box,
+ linear-gradient(@primary, @on_primary) border-box;
+ border: 1px solid transparent;
+ opacity: 0.8;
+ padding-left: 15px;
+ margin: 10px;
+ box-shadow:
+ inset 0 -2px 0 alpha(@accent, 0.45),
+ inset 1px 2px 2px rgba(255, 255, 255, 0.3);
+}
+
+.modules-center {
+ background-color: @surface;
+ border-radius: 12px;
+ background:
+ radial-gradient(
+ circle at 50% 250%,
+ alpha(darker(@surface), 0.9),
+ alpha(@surface_dim, 0.9)
+ )
+ padding-box,
+ linear-gradient(@primary, @on_primary) border-box;
+ border: 1px solid transparent;
+ opacity: 0.8;
+ margin: 10px;
+ box-shadow:
+ inset 0 -2px 0 alpha(@accent, 0.45),
+ inset 0px 2px 2px rgba(255, 255, 255, 0.2);
+}
+
+label.module {
+ font-size: 14px;
+ margin-left: 8px;
+ margin-right: 8px;
+ border-radius: 5px;
+}
+
+label.module {
+ font-size: 14px;
+ color: @on_surface;
+ padding: 3px 10px;
+ transition: all 0.3s ease-out;
+ background:
+ radial-gradient(
+ circle at 50% 250%,
+ @on_tertiary_fixed_variant,
+ @on_tertiary_fixed
+ )
+ padding-box,
+ linear-gradient(@on_primary_fixed_variant, @on_primary_fixed) border-box;
+ border-radius: 10px;
+ border: 0px solid transparent;
+}
+
+label.module:hover {
+}
+
+/* -----------------------------------------------------
+ * Workspaces
+ * ----------------------------------------------------- */
+
+#workspaces {
+ padding: 5px 3px 5px 3px;
+ min-width: 176px;
+ font-weight: 600;
+}
+
+#workspaces button {
+ color: @on_surface;
+ border-radius: 3px;
+ padding: 0px 5px 0px 5px;
+ margin: 0px 2px 0px 2px;
+ transition: all 0.3s ease-in-out;
+ border: 1px solid transparent;
+}
+
+#workspaces button.active {
+ background: alpha(@accent, 0.2);
+ border: 1px solid transparent;
+ transition: all 0.3s ease-in-out;
+ min-width: 30px;
+ border-radius: 8px;
+ box-shadow:
+ inset 0 -3px 0 alpha(@accent, 0.8),
+ inset 1px 2px 2px rgba(255, 255, 255, 0.45),
+ inset 0 1px 1px rgba(255, 255, 255, 0.7);
+}
+
+#workspaces button:hover {
+ background: alpha(@secondary, 0.2);
+ border-radius: 15px;
+}
+
+/* -----------------------------------------------------
+ * Tooltips
+ * ----------------------------------------------------- */
+
+tooltip {
+ background-color: @surface;
+ border-radius: 12px;
+ background:
+ radial-gradient(circle at 50% 250%, @surface, @surface_dim) padding-box,
+ linear-gradient(#ffffff, @on_primary) border-box;
+ border: 1px solid transparent;
+ opacity: 0.7;
+ margin: 10px;
+}
+
+tooltip label {
+ color: @on_surface;
+}
+
+/* -----------------------------------------------------
+ * Window
+ * ----------------------------------------------------- */
+
+#window {
+ background-color: transparent;
+ /* Override global margin/padding so the window pill hugs the bar edges */
+ margin: 0;
+ padding: 0;
+}
+
+window#waybar.empty #window {
+ background-color: transparent;
+}
+
+/* Tighter content padding specifically for the window title */
+#window label {
+ margin: 0;
+ padding: 4px 10px;
+}
+
+/* -----------------------------------------------------
+ * Taskbar
+ * ----------------------------------------------------- */
+
+#taskbar {
+ padding: 5px 0px 5px 0px;
+}
+
+#taskbar button {
+ border-radius: 6px;
+ padding: 0px 5px 0px 5px;
+}
+
+#taskbar button:hover {
+ background: @primary;
+ color: @on_primary;
+}
+
+#custom-updates.yellow {
+ border-radius: 8px;
+ margin: 5px 0px 5px 5px;
+ padding: 0px 6px 0px 6px;
+ background-color: @secondary;
+ color: @on_secondary;
+}
+
+#custom-updates.red {
+ border-radius: 8px;
+ margin: 6px 0px 6px 7px;
+ padding: 0px 6px 0px 6px;
+ background-color: @error;
+ color: @on_error;
+}
+
+/* -----------------------------------------------------
+ * Clock
+ * ----------------------------------------------------- */
+
+#clock {
+ margin-left: 12px;
+ margin-right: 12px;
+}
+
+@keyframes blink {
+ to {
+ background-color: @background;
+ color: @on_surface;
+ }
+}
+
+#battery.critical:not(.charging) {
+ background-color: transparent;
+}
+
+#backlight,
+#backlight-slider,
+#battery,
+#bluetooth,
+#clock,
+#cpu,
+#disk,
+#idle_inhibitor,
+#keyboard-state,
+#memory,
+#mode,
+#mpris,
+#network,
+#power-profiles-daemon,
+#pulseaudio,
+#pulseaudio-slider,
+#taskbar button,
+#taskbar,
+#temperature,
+#tray,
+#window,
+#wireplumber,
+#workspaces,
+#custom-backlight,
+#custom-nightlight,
+#custom-browser,
+#custom-cava_mviz,
+#custom-cycle_wall,
+#custom-dot_update,
+#custom-file_manager,
+#custom-keybinds,
+#custom-keyboard,
+#custom-light_dark,
+#custom-nightlight,
+#custom-lock,
+#custom-hint,
+#custom-hypridle,
+#custom-menu,
+#custom-playerctl,
+#custom-power_vertical,
+#custom-power,
+#custom-quit,
+#custom-reboot,
+#custom-settings,
+#custom-spotify,
+#custom-swaync,
+#custom-tty,
+#custom-updater,
+#custom-hyprpicker,
+#custom-weather,
+#custom-weather.clearNight,
+#custom-weather.cloudyFoggyDay,
+#custom-weather.cloudyFoggyNight,
+#custom-weather.default,
+#custom-weather.rainyDay,
+#custom-weather.rainyNight,
+#custom-weather.severe,
+#custom-weather.showyIcyDay,
+#custom-weather.snowyIcyNight,
+#custom-weather.sunnyDay {
+ background-color: transparent;
+}
diff --git a/config/waybar/style/ML4W Glass.css b/config/waybar/style/ML4W Glass.css
new file mode 100644
index 00000000..3a48d39a
--- /dev/null
+++ b/config/waybar/style/ML4W Glass.css
@@ -0,0 +1,295 @@
+/* ML4W GLASS THEME - CRYSTAL CLEAR */
+
+/* SPDX-FileCopyrightText: 2026-present Ahum Maitra theahummaitra@gmail.com
+SPDX-License-Identifier: GPL-3.0-or-later */
+
+/*
+-----------------------------------------------------
+General
+-----------------------------------------------------
+*/
+
+* {
+ background-color: transparent;
+ font-family: "JetBrainsMono Nerd Font";
+ border: none;
+ font-weight: bolder;
+ border-radius: 0px;
+
+ /* Extra tweaks */
+ min-height: 0;
+ /* set font-size to 100% if font scaling is set to 1.00 using nwg-look */
+ font-size: 97%;
+ font-feature-settings: '"zero", "ss01", "ss02", "ss03", "ss04", "ss05", "cv31"';
+ margin-top: 3px;
+ padding-bottom: 2px;
+}
+
+@import "style/ML4W/glass.css";
+
+window#waybar {
+ background: transparent;
+}
+
+.modules-left {
+ background-color: @surface;
+ border-radius: 12px;
+ background:
+ radial-gradient(
+ circle at 50% 250%,
+ alpha(darker(@surface), 0.9),
+ alpha(@surface_dim, 0.9)
+ )
+ padding-box,
+ linear-gradient(@primary, @on_primary) border-box;
+ border: 1px solid transparent;
+ opacity: 0.8;
+ padding-right: 15px;
+ margin: 10px;
+ box-shadow: inset 1px 2px 2px rgba(255, 255, 255, 0.2);
+}
+
+.modules-right {
+ background-color: @surface;
+ border-radius: 12px;
+ background:
+ radial-gradient(
+ circle at 50% 250%,
+ alpha(darker(@surface), 0.9),
+ alpha(@surface_dim, 0.9)
+ )
+ padding-box,
+ linear-gradient(@primary, @on_primary) border-box;
+ border: 1px solid transparent;
+ opacity: 0.8;
+ padding-left: 15px;
+ margin: 10px;
+ box-shadow: inset 1px 2px 2px rgba(255, 255, 255, 0.3);
+}
+
+.modules-center {
+ background-color: @surface;
+ border-radius: 12px;
+ background:
+ radial-gradient(
+ circle at 50% 250%,
+ alpha(darker(@surface), 0.9),
+ alpha(@surface_dim, 0.9)
+ )
+ padding-box,
+ linear-gradient(@primary, @on_primary) border-box;
+ border: 1px solid transparent;
+ opacity: 0.8;
+ margin: 10px;
+ box-shadow: inset 0px 2px 2px rgba(255, 255, 255, 0.2);
+}
+
+label.module {
+ font-size: 14px;
+ margin-left: 8px;
+ margin-right: 8px;
+ border-radius: 5px;
+}
+
+label.module {
+ font-size: 14px;
+ color: @on_surface;
+ padding: 3px 10px;
+ transition: all 0.3s ease-out;
+ background:
+ radial-gradient(
+ circle at 50% 250%,
+ @on_tertiary_fixed_variant,
+ @on_tertiary_fixed
+ )
+ padding-box,
+ linear-gradient(@on_primary_fixed_variant, @on_primary_fixed) border-box;
+ border-radius: 10px;
+ border: 0px solid transparent;
+}
+
+label.module:hover {
+}
+
+/* -----------------------------------------------------
+ * Workspaces
+ * ----------------------------------------------------- */
+
+#workspaces {
+ padding: 5px 3px 5px 3px;
+ min-width: 176px;
+ font-weight: 600;
+}
+
+#workspaces button {
+ color: @on_surface;
+ border-radius: 3px;
+ padding: 0px 5px 0px 5px;
+ margin: 0px 2px 0px 2px;
+ transition: all 0.3s ease-in-out;
+ border: 1px solid transparent;
+}
+
+#workspaces button.active {
+ background: alpha(@primary, 0.2);
+ border: 1px solid transparent;
+ transition: all 0.3s ease-in-out;
+ min-width: 30px;
+ border-radius: 8px;
+ box-shadow:
+ inset 1px 2px 2px rgba(255, 255, 255, 0.5),
+ inset 0 1px 1px rgba(255, 255, 255, 0.8);
+}
+
+#workspaces button:hover {
+ background: alpha(@secondary, 0.2);
+ border-radius: 15px;
+}
+
+/* -----------------------------------------------------
+ * Tooltips
+ * ----------------------------------------------------- */
+
+tooltip {
+ background-color: @surface;
+ border-radius: 12px;
+ background:
+ radial-gradient(circle at 50% 250%, @surface, @surface_dim) padding-box,
+ linear-gradient(#ffffff, @on_primary) border-box;
+ border: 1px solid transparent;
+ opacity: 0.7;
+ margin: 10px;
+}
+
+tooltip label {
+ color: @on_surface;
+}
+
+/* -----------------------------------------------------
+ * Window
+ * ----------------------------------------------------- */
+
+#window {
+ background-color: transparent;
+}
+
+window#waybar.empty #window {
+ background-color: transparent;
+}
+
+/* -----------------------------------------------------
+ * Taskbar
+ * ----------------------------------------------------- */
+
+#taskbar {
+ padding: 5px 0px 5px 0px;
+}
+
+#taskbar button {
+ border-radius: 6px;
+ padding: 0px 5px 0px 5px;
+}
+
+#taskbar button:hover {
+ background: @primary;
+ color: @on_primary;
+}
+
+#custom-updates.yellow {
+ border-radius: 8px;
+ margin: 5px 0px 5px 5px;
+ padding: 0px 6px 0px 6px;
+ background-color: @secondary;
+ color: @on_secondary;
+}
+
+#custom-updates.red {
+ border-radius: 8px;
+ margin: 6px 0px 6px 7px;
+ padding: 0px 6px 0px 6px;
+ background-color: @error;
+ color: @on_error;
+}
+
+/* -----------------------------------------------------
+ * Clock
+ * ----------------------------------------------------- */
+
+#clock {
+ margin-left: 12px;
+ margin-right: 12px;
+}
+
+@keyframes blink {
+ to {
+ background-color: @background;
+ color: @on_surface;
+ }
+}
+
+#battery.critical:not(.charging) {
+ background-color: transparent;
+}
+
+#backlight,
+#backlight-slider,
+#battery,
+#bluetooth,
+#clock,
+#cpu,
+#disk,
+#idle_inhibitor,
+#keyboard-state,
+#memory,
+#mode,
+#mpris,
+#network,
+#power-profiles-daemon,
+#pulseaudio,
+#pulseaudio-slider,
+#taskbar button,
+#taskbar,
+#temperature,
+#tray,
+#window,
+#wireplumber,
+#workspaces,
+#custom-backlight,
+#custom-nightlight,
+#custom-browser,
+#custom-cava_mviz,
+#custom-cycle_wall,
+#custom-dot_update,
+#custom-file_manager,
+#custom-keybinds,
+#custom-keyboard,
+#custom-light_dark,
+#custom-nightlight,
+#custom-lock,
+#custom-hint,
+#custom-hypridle,
+#custom-menu,
+#custom-playerctl,
+#custom-power_vertical,
+#custom-power,
+#custom-quit,
+#custom-reboot,
+#custom-settings,
+#custom-spotify,
+#custom-swaync,
+#custom-tty,
+#custom-updater,
+#custom-hyprpicker,
+#custom-weather,
+#custom-weather.clearNight,
+#custom-weather.cloudyFoggyDay,
+#custom-weather.cloudyFoggyNight,
+#custom-weather.default,
+#custom-weather.rainyDay,
+#custom-weather.rainyNight,
+#custom-weather.severe,
+#custom-weather.showyIcyDay,
+#custom-weather.snowyIcyNight,
+#custom-weather.sunnyDay {
+ background-color: transparent;
+}
diff --git a/config/waybar/style/ML4W/glass.css b/config/waybar/style/ML4W/glass.css
new file mode 100644
index 00000000..6986a6d1
--- /dev/null
+++ b/config/waybar/style/ML4W/glass.css
@@ -0,0 +1,52 @@
+/* ML4W Glass theme for Kool's Hyprland */
+
+/* SPDX-FileCopyrightText: 2025-present Ahum Maitra theahummaitra@gmail.com
+
+SPDX-License-Identifier: GPL-3.0-or-later */
+
+@import "../../wallust/colors-waybar.css";
+
+/* -------------------------
+ * Base surfaces
+ * ------------------------- */
+
+@define-color background @background;
+@define-color surface @color9;
+@define-color surface_dim @color1;
+
+/* -------------------------
+ * Primary colors
+ * ------------------------- */
+
+@define-color primary @color12;
+@define-color on_primary @color7;
+
+@define-color on_primary_fixed @color1;
+@define-color on_primary_fixed_variant @color10;
+
+/* -------------------------
+ * Secondary colors
+ * ------------------------- */
+
+@define-color secondary @color14;
+@define-color on_secondary @color1;
+
+/* -------------------------
+ * Tertiary (used for module pills)
+ * ------------------------- */
+
+@define-color on_tertiary_fixed @color1;
+@define-color on_tertiary_fixed_variant @color11;
+
+/* -------------------------
+ * Text
+ * ------------------------- */
+
+@define-color on_surface @foreground;
+
+/* -------------------------
+ * Error states
+ * ------------------------- */
+
+@define-color error @color9;
+@define-color on_error @color7;
diff --git a/config/waybar/style/[0 VERTICAL] Golden Noir.css b/config/waybar/style/[0 VERTICAL] Golden Noir.css
index c64fedf9..c89aefda 100644
--- a/config/waybar/style/[0 VERTICAL] Golden Noir.css
+++ b/config/waybar/style/[0 VERTICAL] Golden Noir.css
@@ -118,6 +118,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -126,6 +127,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -173,6 +175,7 @@ tooltip {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#battery.critical:not(.charging) {
diff --git a/config/waybar/style/[0 VERTICAL] Oglo Chicklets.css b/config/waybar/style/[0 VERTICAL] Oglo Chicklets.css
index 3a6084cb..053cb007 100644
--- a/config/waybar/style/[0 VERTICAL] Oglo Chicklets.css
+++ b/config/waybar/style/[0 VERTICAL] Oglo Chicklets.css
@@ -80,6 +80,7 @@ button.active {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -88,6 +89,7 @@ button.active {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -221,6 +223,7 @@ label:focus {
#custom-lock,
#custom-light_dark,
+#custom-nightlight,
#backlight {
background-color: #64b6ac;
color: #2d353b;
@@ -296,10 +299,12 @@ label:focus {
#idle_inhibitor {
background-color: #2d3436;
+ border-bottom: 8px solid #7a8c37;
}
#idle_inhibitor.activated {
background-color: #ecf0f1;
+ border-bottom: 8px solid #7a8c37;
color: #2d3436;
}
diff --git a/config/waybar/style/[0 VERTICAL] [Catpuccin] Mocha.css b/config/waybar/style/[0 VERTICAL] [Catpuccin] Mocha.css
index 971dc40f..0aa6fd45 100644
--- a/config/waybar/style/[0 VERTICAL] [Catpuccin] Mocha.css
+++ b/config/waybar/style/[0 VERTICAL] [Catpuccin] Mocha.css
@@ -90,6 +90,7 @@ tooltip label {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -98,6 +99,7 @@ tooltip label {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -133,6 +135,7 @@ tooltip label {
#idle_inhibitor {
color: @pink;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#mpris {
diff --git a/config/waybar/style/[Black & White] Monochrome.css b/config/waybar/style/[Black & White] Monochrome.css
index 700bebfc..e1e08a60 100644
--- a/config/waybar/style/[Black & White] Monochrome.css
+++ b/config/waybar/style/[Black & White] Monochrome.css
@@ -127,6 +127,7 @@ tooltip label{
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -135,6 +136,7 @@ tooltip label{
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -170,6 +172,7 @@ tooltip label{
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#pulseaudio.muted {
diff --git a/config/waybar/style/[Catppuccin] Frappe.css b/config/waybar/style/[Catppuccin] Frappe.css
index 82f79678..5ea4884c 100644
--- a/config/waybar/style/[Catppuccin] Frappe.css
+++ b/config/waybar/style/[Catppuccin] Frappe.css
@@ -91,6 +91,7 @@ window#waybar.hidden {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -99,6 +100,7 @@ window#waybar.hidden {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -135,6 +137,7 @@ window#waybar.hidden {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 3px solid @sapphire;
}
#backlight {
diff --git a/config/waybar/style/[Catppuccin] Latte.css b/config/waybar/style/[Catppuccin] Latte.css
index 80608e53..4f7411c6 100644
--- a/config/waybar/style/[Catppuccin] Latte.css
+++ b/config/waybar/style/[Catppuccin] Latte.css
@@ -90,6 +90,7 @@ window#waybar.hidden {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -98,6 +99,7 @@ window#waybar.hidden {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -134,6 +136,7 @@ window#waybar.hidden {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 3px solid @lavender;
}
#backlight {
diff --git a/config/waybar/style/[Catppuccin] Mocha.css b/config/waybar/style/[Catppuccin] Mocha.css
index 67f4efa5..c2b70a2a 100644
--- a/config/waybar/style/[Catppuccin] Mocha.css
+++ b/config/waybar/style/[Catppuccin] Mocha.css
@@ -113,6 +113,7 @@ window#waybar.empty #window {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -121,6 +122,7 @@ window#waybar.empty #window {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -156,6 +158,7 @@ window#waybar.empty #window {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#bluetooth,
diff --git a/config/waybar/style/[Colored] Chroma Glow.css b/config/waybar/style/[Colored] Chroma Glow.css
index 2497d69f..794ca085 100644
--- a/config/waybar/style/[Colored] Chroma Glow.css
+++ b/config/waybar/style/[Colored] Chroma Glow.css
@@ -114,6 +114,7 @@ tooltip label{
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -122,6 +123,7 @@ tooltip label{
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -214,6 +216,7 @@ label:focus {
}
#custom-light_dark,
+#custom-nightlight,
#backlight {
color: white;
}
@@ -281,6 +284,7 @@ label:focus {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#mpd {
diff --git a/config/waybar/style/[Colored] Translucent.css b/config/waybar/style/[Colored] Translucent.css
index 50803ef7..edac012c 100644
--- a/config/waybar/style/[Colored] Translucent.css
+++ b/config/waybar/style/[Colored] Translucent.css
@@ -115,6 +115,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -123,6 +124,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -290,13 +292,15 @@ label:focus {
#custom-hypridle,
#idle_inhibitor {
color: #f9e2af;
- /*background-color: #2d3436;*/
+ /*background-color: #2d3436;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);*/
}
/*-----Indicators----*/
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#mpd {
diff --git a/config/waybar/style/[Colorful] Aurora Blossom.css b/config/waybar/style/[Colorful] Aurora Blossom.css
index dbd405d2..8de9c905 100644
--- a/config/waybar/style/[Colorful] Aurora Blossom.css
+++ b/config/waybar/style/[Colorful] Aurora Blossom.css
@@ -106,6 +106,7 @@ tooltip label{
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -114,6 +115,7 @@ tooltip label{
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -152,6 +154,7 @@ tooltip label{
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#pulseaudio.muted {
diff --git a/config/waybar/style/[Colorful] Aurora.css b/config/waybar/style/[Colorful] Aurora.css
index 92c058c6..c5e5fde8 100644
--- a/config/waybar/style/[Colorful] Aurora.css
+++ b/config/waybar/style/[Colorful] Aurora.css
@@ -95,6 +95,7 @@ tooltip label{
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -103,6 +104,7 @@ tooltip label{
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -159,6 +161,7 @@ tooltip label{
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#pulseaudio.muted {
diff --git a/config/waybar/style/[Colorful] Oglo Chicklets.css b/config/waybar/style/[Colorful] Oglo Chicklets.css
index b5ac3584..b1910128 100644
--- a/config/waybar/style/[Colorful] Oglo Chicklets.css
+++ b/config/waybar/style/[Colorful] Oglo Chicklets.css
@@ -80,6 +80,7 @@ button.active {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -88,6 +89,7 @@ button.active {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -221,6 +223,7 @@ label:focus {
#custom-lock,
#custom-light_dark,
+#custom-nightlight,
#backlight {
background-color: #64b6ac;
color: #2d353b;
@@ -296,10 +299,12 @@ label:focus {
#idle_inhibitor {
background-color: #2d3436;
+ border-bottom: 8px solid #1d2327;
}
#idle_inhibitor.activated {
background-color: #ecf0f1;
+ border-bottom: 8px solid #7a8c37;
color: #2d3436;
}
diff --git a/config/waybar/style/[Colorful] Rainbow Spectrum.css b/config/waybar/style/[Colorful] Rainbow Spectrum.css
index 6ca5906f..4cd9cda8 100644
--- a/config/waybar/style/[Colorful] Rainbow Spectrum.css
+++ b/config/waybar/style/[Colorful] Rainbow Spectrum.css
@@ -98,6 +98,7 @@ tooltip label{
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -106,6 +107,7 @@ tooltip label{
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -260,15 +262,18 @@ tooltip label{
#custom-power_vertical,
#custom-light_dark,
+#custom-nightlight,
#custom-hypridle,
#idle_inhibitor {
background-color: #86b4fa;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
/*-----Indicators----*/
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#bluetooth {
diff --git a/config/waybar/style/[Colorful] stolen-style.css b/config/waybar/style/[Colorful] stolen-style.css
index c6b3345f..be1a9f61 100644
--- a/config/waybar/style/[Colorful] stolen-style.css
+++ b/config/waybar/style/[Colorful] stolen-style.css
@@ -51,12 +51,14 @@ window#waybar.empty #window {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-cycle_wall,
#custom-github,
#custom-hint,
#custom-hyprWindowMode,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-menu,
#custom-power,
@@ -115,6 +117,7 @@ window#waybar.empty #window {
#idle_inhibitor {
color: #7aa2f7;
+ border-bottom: 2px solid #455a64;
}
#backlight {
diff --git a/config/waybar/style/[Dark] Golden Eclipse.css b/config/waybar/style/[Dark] Golden Eclipse.css
index af3160a6..cb152b48 100644
--- a/config/waybar/style/[Dark] Golden Eclipse.css
+++ b/config/waybar/style/[Dark] Golden Eclipse.css
@@ -54,6 +54,7 @@ window#waybar.hidden {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -62,6 +63,7 @@ window#waybar.hidden {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -115,6 +117,7 @@ window#waybar.hidden {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: cyan;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#battery.critical:not(.charging) {
diff --git a/config/waybar/style/[Dark] Golden Noir.css b/config/waybar/style/[Dark] Golden Noir.css
index 17025266..8664c35e 100644
--- a/config/waybar/style/[Dark] Golden Noir.css
+++ b/config/waybar/style/[Dark] Golden Noir.css
@@ -118,6 +118,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -126,6 +127,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -173,6 +175,7 @@ tooltip {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#battery.critical:not(.charging) {
diff --git a/config/waybar/style/[Dark] Half-Moon.css b/config/waybar/style/[Dark] Half-Moon.css
index ab89c048..ba6f78de 100644
--- a/config/waybar/style/[Dark] Half-Moon.css
+++ b/config/waybar/style/[Dark] Half-Moon.css
@@ -122,6 +122,7 @@ color: #F3F4F5;
}
#custom-light_dark,
+#custom-nightlight,
#custom-dot_update,
#custom-swaync,
#custom-hypridle,
@@ -138,6 +139,7 @@ color: #F3F4F5;
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 1px solid rgba(26,27,38,0);
}
#bluetooth {
diff --git a/config/waybar/style/[Dark] Latte-Wallust combined v2.css b/config/waybar/style/[Dark] Latte-Wallust combined v2.css
index 46d55346..e8d8f438 100644
--- a/config/waybar/style/[Dark] Latte-Wallust combined v2.css
+++ b/config/waybar/style/[Dark] Latte-Wallust combined v2.css
@@ -132,6 +132,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -140,6 +141,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -248,12 +250,14 @@ tooltip {
#custom-lock,
#idle_inhibitor {
color: @teal;
+ border-bottom: 2px solid @border-color;
}
/*-----Indicators----*/
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 2px solid @border-color;
}
#clock {
diff --git a/config/waybar/style/[Dark] Latte-Wallust combined.css b/config/waybar/style/[Dark] Latte-Wallust combined.css
index ea5c08a5..a969c395 100644
--- a/config/waybar/style/[Dark] Latte-Wallust combined.css
+++ b/config/waybar/style/[Dark] Latte-Wallust combined.css
@@ -137,6 +137,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -145,6 +146,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -253,12 +255,14 @@ tooltip {
#custom-lock,
#idle_inhibitor {
color: @teal;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
/*-----Indicators----*/
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
diff --git a/config/waybar/style/[Dark] Purpl.css b/config/waybar/style/[Dark] Purpl.css
index 5e2ff8aa..090d11ab 100644
--- a/config/waybar/style/[Dark] Purpl.css
+++ b/config/waybar/style/[Dark] Purpl.css
@@ -122,6 +122,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -130,6 +131,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -177,6 +179,7 @@ tooltip {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#taskbar button.active {
diff --git a/config/waybar/style/[Dark] Wallust Obsidian Edge.css b/config/waybar/style/[Dark] Wallust Obsidian Edge.css
index 94ad7cac..c5e2fd48 100644
--- a/config/waybar/style/[Dark] Wallust Obsidian Edge.css
+++ b/config/waybar/style/[Dark] Wallust Obsidian Edge.css
@@ -108,6 +108,7 @@ tooltip label {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -116,6 +117,7 @@ tooltip label {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -164,6 +166,7 @@ tooltip label {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#battery.critical:not(.charging) {
diff --git a/config/waybar/style/[Extra] Arrow.css b/config/waybar/style/[Extra] Arrow.css
index 9435d226..84d9ead0 100644
--- a/config/waybar/style/[Extra] Arrow.css
+++ b/config/waybar/style/[Extra] Arrow.css
@@ -84,6 +84,7 @@
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -92,6 +93,7 @@
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
diff --git a/config/waybar/style/[Extra] Crimson.css b/config/waybar/style/[Extra] Crimson.css
index cf9e7db2..52441a19 100644
--- a/config/waybar/style/[Extra] Crimson.css
+++ b/config/waybar/style/[Extra] Crimson.css
@@ -106,6 +106,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -114,6 +115,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -161,6 +163,7 @@ tooltip {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#battery.critical:not(.charging) {
diff --git a/config/waybar/style/[Extra] EverForest.css b/config/waybar/style/[Extra] EverForest.css
index f0014762..cae9b753 100644
--- a/config/waybar/style/[Extra] EverForest.css
+++ b/config/waybar/style/[Extra] EverForest.css
@@ -221,12 +221,14 @@ window#waybar.hidden {
border-radius: 5px;
margin-left: 5px;
background-color: @blue;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
color: @black;
}
/*-----Indicators----*/
#custom-hypridle.notactive,
#idle_inhibitor.activated {
background-color: @fg;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
color: @bg0;
}
@@ -286,6 +288,7 @@ window#waybar.hidden {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -294,6 +297,7 @@ window#waybar.hidden {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
diff --git a/config/waybar/style/[Extra] ML4W starter.css b/config/waybar/style/[Extra] ML4W starter.css
index 8d651da6..42abcdac 100644
--- a/config/waybar/style/[Extra] ML4W starter.css
+++ b/config/waybar/style/[Extra] ML4W starter.css
@@ -155,6 +155,7 @@ window#waybar.empty #window {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -163,6 +164,7 @@ window#waybar.empty #window {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
diff --git a/config/waybar/style/[Extra] Mauve.css b/config/waybar/style/[Extra] Mauve.css
index ec24bec7..1c565375 100644
--- a/config/waybar/style/[Extra] Mauve.css
+++ b/config/waybar/style/[Extra] Mauve.css
@@ -125,6 +125,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -133,6 +134,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -181,6 +183,7 @@ tooltip {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#battery.critical:not(.charging) {
diff --git a/config/waybar/style/[Extra] Modern-Combined - Transparent.css b/config/waybar/style/[Extra] Modern-Combined - Transparent.css
index c4ff7197..b357ea6c 100644
--- a/config/waybar/style/[Extra] Modern-Combined - Transparent.css
+++ b/config/waybar/style/[Extra] Modern-Combined - Transparent.css
@@ -139,6 +139,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -147,6 +148,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -243,6 +245,7 @@ tooltip {
#custom-lock,
#idle_inhibitor {
color: @teal;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#custom-weather,
@@ -265,6 +268,7 @@ tooltip {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#clock {
diff --git a/config/waybar/style/[Extra] Modern-Combined.css b/config/waybar/style/[Extra] Modern-Combined.css
index dbbddf60..ab32852b 100644
--- a/config/waybar/style/[Extra] Modern-Combined.css
+++ b/config/waybar/style/[Extra] Modern-Combined.css
@@ -143,6 +143,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cycle_wall,
#custom-dot_update,
@@ -150,6 +151,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -257,6 +259,7 @@ tooltip {
#custom-lock,
#idle_inhibitor {
color: @teal;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#custom-weather,
@@ -279,6 +282,7 @@ tooltip {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#clock {
diff --git a/config/waybar/style/[Extra] Neon Circuit.css b/config/waybar/style/[Extra] Neon Circuit.css
index 7fbb39a5..413021c9 100644
--- a/config/waybar/style/[Extra] Neon Circuit.css
+++ b/config/waybar/style/[Extra] Neon Circuit.css
@@ -103,6 +103,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -111,6 +112,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
diff --git a/config/waybar/style/[Extra] Prismatic Glow.css b/config/waybar/style/[Extra] Prismatic Glow.css
index 8179352d..367d2076 100644
--- a/config/waybar/style/[Extra] Prismatic Glow.css
+++ b/config/waybar/style/[Extra] Prismatic Glow.css
@@ -150,6 +150,7 @@ window#waybar.empty {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -158,6 +159,7 @@ window#waybar.empty {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
diff --git a/config/waybar/style/[Extra] Rose Pine.css b/config/waybar/style/[Extra] Rose Pine.css
index 023b03a2..86b83655 100644
--- a/config/waybar/style/[Extra] Rose Pine.css
+++ b/config/waybar/style/[Extra] Rose Pine.css
@@ -126,6 +126,7 @@ tooltip {
#window,
#wireplumber,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -134,6 +135,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -181,6 +183,7 @@ tooltip {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 2px;
}
@keyframes blink {
diff --git a/config/waybar/style/[Extra] Simple Pink.css b/config/waybar/style/[Extra] Simple Pink.css
index db63a02f..937a1dc2 100644
--- a/config/waybar/style/[Extra] Simple Pink.css
+++ b/config/waybar/style/[Extra] Simple Pink.css
@@ -118,6 +118,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -126,6 +127,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -174,6 +176,7 @@ tooltip {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#battery.critical:not(.charging) {
diff --git a/config/waybar/style/[Light] Monochrome Contrast.css b/config/waybar/style/[Light] Monochrome Contrast.css
index 95b34fcc..820d9934 100644
--- a/config/waybar/style/[Light] Monochrome Contrast.css
+++ b/config/waybar/style/[Light] Monochrome Contrast.css
@@ -107,6 +107,7 @@ tooltip label{
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -115,6 +116,7 @@ tooltip label{
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -153,6 +155,7 @@ tooltip label{
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#pulseaudio.muted {
diff --git a/config/waybar/style/[Light] Obsidian Glow.css b/config/waybar/style/[Light] Obsidian Glow.css
index 692ce5d5..8de4e888 100644
--- a/config/waybar/style/[Light] Obsidian Glow.css
+++ b/config/waybar/style/[Light] Obsidian Glow.css
@@ -94,6 +94,7 @@ tooltip label {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -102,6 +103,7 @@ tooltip label {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -150,6 +152,7 @@ tooltip label {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#taskbar button.active {
diff --git a/config/waybar/style/[Rainbow] RGB Bordered.css b/config/waybar/style/[Rainbow] RGB Bordered.css
index b38ae40d..e3d996d7 100644
--- a/config/waybar/style/[Rainbow] RGB Bordered.css
+++ b/config/waybar/style/[Rainbow] RGB Bordered.css
@@ -114,6 +114,7 @@ window#waybar.empty #window {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -122,6 +123,7 @@ window#waybar.empty #window {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -157,6 +159,7 @@ window#waybar.empty #window {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#bluetooth,
diff --git a/config/waybar/style/[Retro] Simple Style.css b/config/waybar/style/[Retro] Simple Style.css
index 8a601487..6b14e221 100644
--- a/config/waybar/style/[Retro] Simple Style.css
+++ b/config/waybar/style/[Retro] Simple Style.css
@@ -68,6 +68,7 @@ window#waybar {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -76,6 +77,7 @@ window#waybar {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -135,6 +137,7 @@ window#waybar {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 3px solid yellow;
}
#battery.critical,
diff --git a/config/waybar/style/[Transparent] Crystal Clear.css b/config/waybar/style/[Transparent] Crystal Clear.css
index b355c176..6f4ec33f 100644
--- a/config/waybar/style/[Transparent] Crystal Clear.css
+++ b/config/waybar/style/[Transparent] Crystal Clear.css
@@ -89,6 +89,7 @@ window#waybar.empty #window {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -97,6 +98,7 @@ window#waybar.empty #window {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -143,6 +145,7 @@ window#waybar.empty #window {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#taskbar button:hover {
diff --git a/config/waybar/style/[VERTICAL] [Catpuccin] Mocha.css b/config/waybar/style/[VERTICAL] [Catpuccin] Mocha.css
index d265506c..df1fe00e 100644
--- a/config/waybar/style/[VERTICAL] [Catpuccin] Mocha.css
+++ b/config/waybar/style/[VERTICAL] [Catpuccin] Mocha.css
@@ -89,6 +89,7 @@ tooltip label {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -97,6 +98,7 @@ tooltip label {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -132,6 +134,7 @@ tooltip label {
#idle_inhibitor {
color: @pink;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#mpris {
diff --git a/config/waybar/style/[WALLUST] ML4W-modern-mixed.css b/config/waybar/style/[WALLUST] ML4W-modern-mixed.css
index f1b64745..ce4faff8 100644
--- a/config/waybar/style/[WALLUST] ML4W-modern-mixed.css
+++ b/config/waybar/style/[WALLUST] ML4W-modern-mixed.css
@@ -4,14 +4,14 @@
@import '../../.config/waybar/wallust/colors-waybar.css';
@define-color backgroundlight @color12;
-@define-color backgrounddark #FFFFFF;
+@define-color backgrounddark @background;
@define-color workspacesbackground1 @color12;
-@define-color workspacesbackground2 #FFFFFF;
+@define-color workspacesbackground2 @background;
@define-color bordercolor @color11;
-@define-color textcolor1 @color12;
-@define-color textcolor2 #FFFFFF;
-@define-color textcolor3 #FFFFFF;
-@define-color iconcolor #FFFFFF;
+@define-color textcolor1 @foreground;
+@define-color textcolor2 @background;
+@define-color textcolor3 @foreground;
+@define-color iconcolor @foreground;
* {
font-family: "JetBrainsMono Nerd Font";
@@ -25,7 +25,7 @@
window#waybar {
background-color: rgba(0,0,0,0.8);
- border-bottom: 0px solid #ffffff;
+border-bottom: 0px solid @foreground;
/* color: #FFFFFF; */
background: transparent;
transition-property: background-color;
@@ -139,6 +139,7 @@ window#waybar.empty #window {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -147,6 +148,7 @@ window#waybar.empty #window {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -191,6 +193,7 @@ window#waybar.empty #window {
font-weight: bold;
opacity: 0.8;
color: @iconcolor;
+ border-bottom: 0px solid @foreground;
}
#idle_inhibitor.activated {
@@ -199,6 +202,7 @@ window#waybar.empty #window {
font-weight: bold;
opacity: 0.8;
color: #dc2f2f;
+ border-bottom: 0px solid @foreground;
}
#custom-menu {
@@ -241,12 +245,12 @@ window#waybar.empty #window {
}
#custom-updates.yellow {
- background-color: #ff9a3c;
- color: #FFFFFF;
+background-color: @color11;
+color: @foreground;
}
#custom-updates.red {
- background-color: #dc2f2f;
+background-color: @color13;
color: #FFFFFF;
}
@@ -344,7 +348,7 @@ window#waybar.empty #window {
}
#battery.critical:not(.charging) {
- background-color: #f53c3c;
+background-color: @color13;
color: @textcolor3;
animation-name: blink;
animation-duration: 3.0s;
diff --git a/config/waybar/style/[WALLUST] ML4W-modern.css b/config/waybar/style/[WALLUST] ML4W-modern.css
index 048f972b..437e4e21 100644
--- a/config/waybar/style/[WALLUST] ML4W-modern.css
+++ b/config/waybar/style/[WALLUST] ML4W-modern.css
@@ -25,7 +25,7 @@
window#waybar {
background-color: rgba(0,0,0,0.8);
- border-bottom: 0px solid #ffffff;
+border-bottom: 0px solid @foreground;
/* color: #FFFFFF; */
background: transparent;
transition-property: background-color;
@@ -146,6 +146,7 @@ window#waybar.empty #window {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -154,6 +155,7 @@ window#waybar.empty #window {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -195,13 +197,15 @@ window#waybar.empty #window {
font-size: 102%;
font-weight: bold;
color: @iconcolor;
+ border-bottom: 0px solid @foreground;
}
#idle_inhibitor.activated {
margin-right: 15px;
font-size: 100%;
font-weight: bold;
- color: #dc2f2f;
+color: @color13;
+ border-bottom: 0px solid @foreground;
}
#custom-menu {
@@ -240,12 +244,12 @@ window#waybar.empty #window {
}
#custom-updates.yellow {
- background-color: #ff9a3c;
+background-color: @color11;
color: #FFFFFF;
}
#custom-updates.red {
- background-color: #dc2f2f;
+background-color: @color13;
color: #FFFFFF;
}
@@ -337,7 +341,7 @@ window#waybar.empty #window {
}
#battery.critical:not(.charging) {
- background-color: #f53c3c;
+background-color: @color13;
color: @textcolor3;
animation-name: blink;
animation-duration: 3.0s;
diff --git a/config/waybar/style/[Wallust Bordered] Chroma Fusion Edge.css b/config/waybar/style/[Wallust Bordered] Chroma Fusion Edge.css
index 812dbf6f..01ac8069 100644
--- a/config/waybar/style/[Wallust Bordered] Chroma Fusion Edge.css
+++ b/config/waybar/style/[Wallust Bordered] Chroma Fusion Edge.css
@@ -78,6 +78,7 @@ tooltip {
#window,
#wireplumber,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -86,6 +87,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -129,6 +131,7 @@ tooltip {
padding: 0px 2px 0px 6px;
}
#custom-light_dark,
+#custom-nightlight,
#custom-menu{
color: @flamingo;
padding: 0px 8px 0px 4px;
@@ -181,12 +184,14 @@ tooltip {
#custom-hypridle,
#idle_inhibitor {
color: @teal;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
/*-----Indicators----*/
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#custom-cava_mviz{
diff --git a/config/waybar/style/[Wallust Bordered] Chroma Simple.css b/config/waybar/style/[Wallust Bordered] Chroma Simple.css
index 3bf56789..eda7664a 100644
--- a/config/waybar/style/[Wallust Bordered] Chroma Simple.css
+++ b/config/waybar/style/[Wallust Bordered] Chroma Simple.css
@@ -103,6 +103,7 @@ tooltip {
#window,
#wireplumber,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -111,6 +112,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -242,6 +244,7 @@ tooltip {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#battery.good {
diff --git a/config/waybar/style/[Wallust Transparent] Crystal Clear.css b/config/waybar/style/[Wallust Transparent] Crystal Clear.css
index cddee7e7..461d4c56 100644
--- a/config/waybar/style/[Wallust Transparent] Crystal Clear.css
+++ b/config/waybar/style/[Wallust Transparent] Crystal Clear.css
@@ -122,6 +122,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -130,6 +131,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -176,6 +178,7 @@ tooltip {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#battery.critical:not(.charging) {
diff --git a/config/waybar/style/[Wallust] Box type.css b/config/waybar/style/[Wallust] Box type.css
index 84c85cf6..38ed2a1a 100644
--- a/config/waybar/style/[Wallust] Box type.css
+++ b/config/waybar/style/[Wallust] Box type.css
@@ -1,83 +1,81 @@
/* ---- 💫 https://github.com/JaKooLit 💫 ---- */
/* Wallust - Box type */
-@import '../../.config/waybar/wallust/colors-waybar.css';
+@import "../../.config/waybar/wallust/colors-waybar.css";
* {
-font-family: "JetBrainsMono Nerd Font";
-font-weight: bold;
-min-height: 0;
-/* set font-size to 100% if font scaling is set to 1.00 using nwg-look */
-font-size: 97%;
-font-feature-settings: '"zero", "ss01", "ss02", "ss03", "ss04", "ss05", "cv31"';
+ font-family: "JetBrainsMono Nerd Font";
+ font-weight: bold;
+ min-height: 0;
+ /* set font-size to 100% if font scaling is set to 1.00 using nwg-look */
+ font-size: 97%;
+ font-feature-settings: '"zero", "ss01", "ss02", "ss03", "ss04", "ss05", "cv31"';
}
-
window#waybar {
- background: transparent;
+ background: transparent;
}
window#waybar.hidden {
- opacity: 0.2;
+ opacity: 0.2;
}
-
window#waybar.empty,
window#waybar.empty #window {
- background-color: transparent;
- padding: 0px;
- border: 0px;
+ background-color: transparent;
+ padding: 0px;
+ border: 0px;
}
#window {
- padding-left: 10px;
- padding-right: 10px;
- border-radius: 10px;
- transition: none;
- color: transparent;
- background: transparent;
+ padding-left: 10px;
+ padding-right: 10px;
+ border-radius: 10px;
+ transition: none;
+ color: transparent;
+ background: transparent;
}
#taskbar button,
#workspaces button {
- color: @foreground;
- box-shadow: none;
- text-shadow: none;
- padding: 0px;
- border-radius: 9px;
- padding-left: 4px;
- padding-right: 4px;
- animation: gradient_f 20s ease-in infinite;
- transition: all 0.5s cubic-bezier(.55,-0.68,.48,1.682);
+ color: @foreground;
+ box-shadow: none;
+ text-shadow: none;
+ padding: 0px;
+ border-radius: 9px;
+ padding-left: 4px;
+ padding-right: 4px;
+ animation: gradient_f 20s ease-in infinite;
+ transition: all 0.5s cubic-bezier(0.55, -0.68, 0.48, 1.682);
}
#taskbar button.active,
#workspaces button.active {
- color: @color12;
- background-color: @foreground;
- padding-left: 4px;
- padding-right: 8px;
- animation: gradient_f 20s ease-in infinite;
- transition: all 0.3s cubic-bezier(.55,-0.68,.48,1.682);
+ color: @color12;
+ background-color: @foreground;
+ padding-left: 4px;
+ padding-right: 8px;
+ animation: gradient_f 20s ease-in infinite;
+ transition: all 0.3s cubic-bezier(0.55, -0.68, 0.48, 1.682);
}
#taskbar button.focused,
#workspaces button.focused {
- color: @color4;
+ color: @color4;
}
#workspaces button.urgent {
- color: #11111b;
- border-radius: 10px;
+ color: #11111b;
+ border-radius: 10px;
}
#taskbar button:hover,
#workspaces button:hover {
- color: @color4;
- padding-left: 2px;
- padding-right: 8px;
- animation: gradient_f 20s ease-in infinite;
- transition: all 0.3s cubic-bezier(.55,-0.68,.48,1.682);
+ color: @color4;
+ padding-left: 2px;
+ padding-right: 8px;
+ animation: gradient_f 20s ease-in infinite;
+ transition: all 0.3s cubic-bezier(0.55, -0.68, 0.48, 1.682);
}
#backlight,
@@ -95,7 +93,7 @@ window#waybar.empty #window {
#network,
#power-profiles-daemon,
#pulseaudio,
-#pulseaudio-slider,
+#pulseaudio-slider,
#taskbar,
#temperature,
#tray,
@@ -103,6 +101,7 @@ window#waybar.empty #window {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -111,6 +110,7 @@ window#waybar.empty #window {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -130,91 +130,94 @@ window#waybar.empty #window {
#custom-weather.clearNight,
#custom-weather.cloudyFoggyDay,
#custom-weather.cloudyFoggyNight,
-#custom-weather.default,
+#custom-weather.default,
#custom-weather.rainyDay,
#custom-weather.rainyNight,
#custom-weather.severe,
#custom-weather.showyIcyDay,
#custom-weather.snowyIcyNight,
-#custom-weather.sunnyDay{
- padding-top: 4px;
- padding-bottom: 4px;
- padding-left: 8px;
- padding-right: 10px;
- border-radius: 10px;
- transition: none;
- color: @foreground;
- background: @color0;
- border-bottom-width: 5px;
- border-bottom-color: @color12;
- border-bottom-style: solid;
+#custom-weather.sunnyDay {
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 8px;
+ padding-right: 10px;
+ border-radius: 10px;
+ transition: none;
+ color: @foreground;
+ background: @color0;
+ border-bottom-width: 5px;
+ border-bottom-color: @color12;
+ border-bottom-style: solid;
}
#custom-power {
- padding-right: 2px;
+ padding-right: 2px;
}
/*-----Indicators----*/
#custom-hypridle.notactive,
#idle_inhibitor.activated {
- color: #39FF14;
+ color: #39ff14;
+ border-bottom-width: 5px;
+ border-bottom-color: @color12;
+ border-bottom-style: solid;
}
#network {
- padding-right: 12px;
+ padding-right: 12px;
}
#temperature.critical {
- background-color: red;
- color: black;
+ background-color: red;
+ color: black;
}
#mpris {
- padding-right: 2px;
- padding-left: 8px;
+ padding-right: 2px;
+ padding-left: 8px;
}
#backlight {
- padding-right: 2px;
+ padding-right: 2px;
}
#battery.critical:not(.charging) {
- background-color: #ffffff;
- color: #000000;
- animation-name: blink;
- animation-duration: 3.0s;
- animation-timing-function: steps(12);
- animation-iteration-count: infinite;
- animation-direction: alternate;
- border-bottom-width: 5px;
- border-bottom-color: @color12;
- border-bottom-style: solid;
+ background-color: #ffffff;
+ color: #000000;
+ animation-name: blink;
+ animation-duration: 3s;
+ animation-timing-function: steps(12);
+ animation-iteration-count: infinite;
+ animation-direction: alternate;
+ border-bottom-width: 5px;
+ border-bottom-color: @color12;
+ border-bottom-style: solid;
}
@keyframes blink {
- to {
- background-color: #ffffff;
- color: #000000;
- }
+ to {
+ background-color: #ffffff;
+ color: #000000;
+ }
}
#backlight-slider slider,
#pulseaudio-slider slider {
- min-width: 0px;
- min-height: 0px;
- opacity: 10;
- background-image: none;
- border: none;
- box-shadow: @color12;
+ min-width: 0px;
+ min-height: 0px;
+ opacity: 10;
+ background-image: none;
+ border: none;
+ box-shadow: @color12;
}
#backlight-slider trough,
#pulseaudio-slider trough {
- min-width: 80px;
- min-height: 5px;
- border-radius: 5px;
+ min-width: 80px;
+ min-height: 5px;
+ border-radius: 5px;
}
#backlight-slider highlight,
#pulseaudio-slider highlight {
- min-height: 10px;
- border-radius: 5px;
+ min-height: 10px;
+ border-radius: 5px;
}
diff --git a/config/waybar/style/[Wallust] Chroma Edge.css b/config/waybar/style/[Wallust] Chroma Edge.css
index 3530c3af..719c89c9 100644
--- a/config/waybar/style/[Wallust] Chroma Edge.css
+++ b/config/waybar/style/[Wallust] Chroma Edge.css
@@ -106,6 +106,7 @@ tooltip label{
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -114,6 +115,7 @@ tooltip label{
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -322,13 +324,15 @@ label:focus {
}
#idle_inhibitor {
- /*background-color: #2d3436;*/
+ /*background-color: #2d3436;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);*/
}
/*-----Indicators----*/
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#temperature {
diff --git a/config/waybar/style/[Wallust] Chroma Fusion.css b/config/waybar/style/[Wallust] Chroma Fusion.css
index d740c78f..6830d55b 100644
--- a/config/waybar/style/[Wallust] Chroma Fusion.css
+++ b/config/waybar/style/[Wallust] Chroma Fusion.css
@@ -79,6 +79,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -87,6 +88,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -131,6 +133,7 @@ tooltip {
opacity:1.0;
}
#custom-light_dark,
+#custom-nightlight,
#custom-menu{
color: @flamingo;
padding: 0px 8px 0px 4px;
@@ -183,12 +186,14 @@ tooltip {
#custom-hypridle,
#idle_inhibitor {
color: @teal;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
/*-----Indicators----*/
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#workspaces {
diff --git a/config/waybar/style/[Wallust] Chroma Tally V2.css b/config/waybar/style/[Wallust] Chroma Tally V2.css
index 8082331b..305dcc4e 100644
--- a/config/waybar/style/[Wallust] Chroma Tally V2.css
+++ b/config/waybar/style/[Wallust] Chroma Tally V2.css
@@ -91,6 +91,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -99,6 +100,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -199,6 +201,7 @@ tooltip {
}
#custom-light_dark,
+#custom-nightlight,
#temperature {
color: @color6; /* Lighter */
}
@@ -211,12 +214,14 @@ tooltip {
#custom-hypridle,
#idle_inhibitor {
color: @color5; /* Lighter */
+ border-bottom: 2px;
}
/*-----Indicators----*/
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: @color4; /* Slightly lighter */
+ border-bottom: 2px;
}
#tray {
diff --git a/config/waybar/style/[Wallust] Chroma Tally.css b/config/waybar/style/[Wallust] Chroma Tally.css
index a6fd1ee9..3a7679d2 100644
--- a/config/waybar/style/[Wallust] Chroma Tally.css
+++ b/config/waybar/style/[Wallust] Chroma Tally.css
@@ -90,6 +90,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -98,6 +99,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -202,6 +204,7 @@ tooltip {
}
#custom-light_dark,
+#custom-nightlight,
#temperature {
color: #7287fd;
}
@@ -214,12 +217,14 @@ tooltip {
#custom-hypridle,
#idle_inhibitor {
color: #ebcb8b;
+ border-bottom: 2px;
}
/*-----Indicators----*/
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 2px;
}
#tray {
diff --git a/config/waybar/style/[Wallust] Colored.css b/config/waybar/style/[Wallust] Colored.css
index 435f3651..c95429da 100644
--- a/config/waybar/style/[Wallust] Colored.css
+++ b/config/waybar/style/[Wallust] Colored.css
@@ -131,6 +131,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -139,6 +140,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -186,6 +188,7 @@ tooltip {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#battery.critical:not(.charging) {
diff --git a/config/waybar/style/[Wallust] Simple.css b/config/waybar/style/[Wallust] Simple.css
index c2206c10..0eec7ba7 100644
--- a/config/waybar/style/[Wallust] Simple.css
+++ b/config/waybar/style/[Wallust] Simple.css
@@ -110,6 +110,7 @@ tooltip {
#wireplumber,
#workspaces,
#custom-backlight,
+#custom-nightlight,
#custom-browser,
#custom-cava_mviz,
#custom-cycle_wall,
@@ -118,6 +119,7 @@ tooltip {
#custom-keybinds,
#custom-keyboard,
#custom-light_dark,
+#custom-nightlight,
#custom-lock,
#custom-hint,
#custom-hypridle,
@@ -164,6 +166,7 @@ tooltip {
#custom-hypridle.notactive,
#idle_inhibitor.activated {
color: #39FF14;
+ border-bottom: 8px solid rgba(0, 0, 0, 0.2);
}
#pulseaudio.muted {
diff --git a/config/waybar/wallust/colors-waybar.css b/config/waybar/wallust/colors-waybar.css
index b2afbce4..8a470b1a 100644
--- a/config/waybar/wallust/colors-waybar.css
+++ b/config/waybar/wallust/colors-waybar.css
@@ -1,11 +1,11 @@
-/* ---- 💫 https://github.com/JaKooLit 💫 ---- */
+/* ---- 💫 https://github.com/JaKooLit 💫 ---- */
/* wallust template - colors-waybar */
@define-color foreground #F9E3DF;
@define-color background #151316;
@define-color background-alt rgba(21,19,22,0.25);
@define-color cursor #F9E3DF;
-
+
@define-color color0 #3D3A3E;
@define-color color1 #190E1E;
@define-color color2 #191F64;
@@ -21,4 +21,4 @@
@define-color color12 #7F4EA2;
@define-color color13 #A0536C;
@define-color color14 #EDAEA4;
- @define-color color15 #EECEC9; \ No newline at end of file
+ @define-color color15 #EECEC9;
diff --git a/config/wezterm/wezterm.lua b/config/wezterm/wezterm.lua
new file mode 100644
index 00000000..8740cbcf
--- /dev/null
+++ b/config/wezterm/wezterm.lua
@@ -0,0 +1,115 @@
+-- Config from Drew @justaguylinux small mods
+
+local wezterm = require("wezterm")
+
+local config = wezterm.config_builder()
+
+config.enable_wayland = true
+
+-- Enable if starship prompt won't start
+-- config.default_prog = { "/usr/bin/env zsh" }
+
+-- General appearance and visuals
+config.hide_tab_bar_if_only_one_tab = true
+-- Set primary font with fallbacks
+
+config.font = wezterm.font_with_fallback({
+ { family = "Fira Code", weight = 250, stretch = "Normal", style = "Normal" }, -- Thin variant
+ "Fira Code",
+ "JetBrains Mono",
+ "Hack",
+})
+
+-- Previous font config
+-- font = wezterm.font("Maple Mono NF")
+font_size = 14
+
+config.colors = {
+ tab_bar = {
+
+ active_tab = {
+ bg_color = "#80bfff", -- col_gray2 (selected tab in bright blue)
+ fg_color = "#00141d", -- contrast text on active tab
+ },
+
+ inactive_tab = {
+ bg_color = "#1a1a1a", -- col_gray4 (dark background for inactive tabs)
+ fg_color = "#FFFFFF", -- col_gray3 (white text on inactive tabs)
+ },
+
+ new_tab = {
+ bg_color = "#1a1a1a", -- same as inactive
+ fg_color = "#4fc3f7", -- col_barbie (for the "+" button)
+ },
+ },
+}
+
+config.window_background_opacity = 1.0
+-- config.color_scheme = "nightfox"
+-- config.color_scheme = 'AdventureTime'
+-- config.color_scheme = 'Advark Blue'
+config.color_scheme = "Catppuccin Mocha"
+-- config.color_scheme = 'Dracula'
+config.font_size = 12
+config.font = wezterm.font("FiraCode", { weight = "Regular", italic = false })
+
+config.window_padding = {
+ left = 10,
+ right = 10,
+ top = 10,
+ bottom = 10,
+}
+
+config.use_fancy_tab_bar = true
+config.window_frame = {
+ -- font = wezterm.font({ family = "FiraCode Nerd Font Mono", weight = "Regular" }),
+ font = wezterm.font({ family = "JetBrainsMono Nerd Font Mono", weight = "Regular" }),
+}
+
+config.default_cursor_style = "BlinkingUnderline"
+config.cursor_blink_rate = 500
+config.term = "xterm-256color"
+config.bold_brightens_ansi_colors = false
+config.max_fps = 120
+config.animation_fps = 30
+
+-- Keybindings using ALT for tabs & splits
+config.keys = {
+ -- Tab management
+ { key = "t", mods = "ALT", action = wezterm.action.SpawnTab("CurrentPaneDomain") },
+ { key = "w", mods = "ALT", action = wezterm.action.CloseCurrentTab({ confirm = false }) },
+ { key = "n", mods = "ALT", action = wezterm.action.ActivateTabRelative(1) },
+ { key = "p", mods = "ALT", action = wezterm.action.ActivateTabRelative(-1) },
+
+ -- Pane management
+ { key = "v", mods = "ALT", action = wezterm.action.SplitVertical({ domain = "CurrentPaneDomain" }) },
+ { key = "h", mods = "ALT", action = wezterm.action.SplitHorizontal({ domain = "CurrentPaneDomain" }) },
+ { key = "q", mods = "ALT", action = wezterm.action.CloseCurrentPane({ confirm = false }) },
+
+ -- Pane navigation (move between panes with ALT + Arrows)
+ { key = "LeftArrow", mods = "ALT", action = wezterm.action.ActivatePaneDirection("Left") },
+ { key = "RightArrow", mods = "ALT", action = wezterm.action.ActivatePaneDirection("Right") },
+ { key = "UpArrow", mods = "ALT", action = wezterm.action.ActivatePaneDirection("Up") },
+ { key = "DownArrow", mods = "ALT", action = wezterm.action.ActivatePaneDirection("Down") },
+}
+
+-- Disable missing glyph warnings, since we have fallback fonts now
+config.warn_about_missing_glyphs = false
+
+-- function for nvidia_gpu
+local function is_nvidia_gpu()
+ local handle = io.popen("lspci | grep -i nvidia")
+ local result = handle:read("*a")
+ handle:close()
+ return result ~= ""
+end
+
+-- NVIDIA optimization settings
+-- config.enable_wayland = not is_nvidia_gpu() -- Disable Wayland if NVIDIA GPU is detected
+-- config.front_end = "OpenGL" -- More stable than WebGPU with NVIDIA
+-- config.webgpu_power_preference = "HighPerformance"
+-- config.prefer_egl = true
+-- config.freetype_load_target = "Light"
+-- config.freetype_render_target = "HorizontalLcd"
+
+return config
diff --git a/copy.sh b/copy.sh
index 5b3d17cd..b061f4ac 100755
--- a/copy.sh
+++ b/copy.sh
@@ -1,5 +1,33 @@
#!/usr/bin/env bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
+# Purpose:
+# Orchestrates copying/upgrading JaKooLit's Hyprland dotfiles into ~/.config.
+# Handles interactive prompts, backups/restores, per-app tweaks, and express mode.
+#
+# Layout (high-level; future modularization targets):
+# - Constants/colors, helper sourcing (copy_menu.sh, lib_backup.sh, lib_detect.sh, lib_prompts.sh, lib_apps.sh, lib_copy.sh).
+# - New update helper (lib_update.sh) provides menu-driven repo update: verifies Hyprland-Dots root, stashes changes, git pull, logs, summarizes, waits for keypress.
+# - Version helpers and CLI parsing (install/upgrade/express).
+# - Safety checks (non-root), banners/notices.
+# - Environment/distro checks and warnings.
+# - GPU/VM/NixOS detection tweaks (lib_detect.sh).
+# - Input prompts (keyboard, resolution, clock format, animations) (lib_prompts.sh).
+# - Workflow selection effects (express vs standard).
+# - Backup/restore helpers (in scripts/lib_backup.sh).
+# - App enablement/editor selection (lib_apps.sh).
+# - Copy phases (lib_copy.sh):
+# * Part 1: fastfetch/kitty/rofi/swaync (prompted replace).
+# * Waybar special handling (symlinks, configs/styles restore).
+# * Part 2: other configs (btop, cava, hypr, etc.) + ghostty/wezterm installs.
+# - UserConfigs/UserScripts and hypr file restores.
+# - Wallpaper handling (default + optional 1GB pack).
+# - Backup cleanup (auto in express).
+# - Final symlinks (waybar) and wallust init.
+#
+# Next modular steps:
+# - Restore logic has been moved into lib_copy helpers; review for further
+# consolidation or tests.
+# - Consider modularizing remaining app-specific tweaks/prompts.
clear
wallpaper=$HOME/.config/hypr/wallpaper_effects/.wallpaper_current
@@ -22,6 +50,177 @@ GREEN="$(tput setaf 2)"
BLUE="$(tput setaf 4)"
SKY_BLUE="$(tput setaf 6)"
RESET="$(tput sgr0)"
+MIN_EXPRESS_VERSION="2.3.18"
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+MENU_HELPER="$SCRIPT_DIR/scripts/copy_menu.sh"
+BACKUP_HELPER="$SCRIPT_DIR/scripts/lib_backup.sh"
+DETECT_HELPER="$SCRIPT_DIR/scripts/lib_detect.sh"
+PROMPTS_HELPER="$SCRIPT_DIR/scripts/lib_prompts.sh"
+APPS_HELPER="$SCRIPT_DIR/scripts/lib_apps.sh"
+COPY_HELPER="$SCRIPT_DIR/scripts/lib_copy.sh"
+UPDATE_HELPER="$SCRIPT_DIR/scripts/lib_update.sh"
+if [ -f "$MENU_HELPER" ]; then
+ # shellcheck source=./scripts/copy_menu.sh
+ . "$MENU_HELPER"
+fi
+if [ -f "$BACKUP_HELPER" ]; then
+ # shellcheck source=./scripts/lib_backup.sh
+ . "$BACKUP_HELPER"
+else
+ echo "${ERROR} Backup helper not found at $BACKUP_HELPER. Exiting."
+ exit 1
+fi
+if [ -f "$DETECT_HELPER" ]; then
+ # shellcheck source=./scripts/lib_detect.sh
+ . "$DETECT_HELPER"
+else
+ echo "${ERROR} Detect helper not found at $DETECT_HELPER. Exiting."
+ exit 1
+fi
+if [ -f "$PROMPTS_HELPER" ]; then
+ # shellcheck source=./scripts/lib_prompts.sh
+ . "$PROMPTS_HELPER"
+else
+ echo "${ERROR} Prompts helper not found at $PROMPTS_HELPER. Exiting."
+ exit 1
+fi
+if [ -f "$APPS_HELPER" ]; then
+ # shellcheck source=./scripts/lib_apps.sh
+ . "$APPS_HELPER"
+else
+ echo "${ERROR} Apps helper not found at $APPS_HELPER. Exiting."
+ exit 1
+fi
+if [ -f "$COPY_HELPER" ]; then
+ # shellcheck source=./scripts/lib_copy.sh
+ . "$COPY_HELPER"
+else
+ echo "${ERROR} Copy helper not found at $COPY_HELPER. Exiting."
+ exit 1
+fi
+if [ -f "$UPDATE_HELPER" ]; then
+ # shellcheck source=./scripts/lib_update.sh
+ . "$UPDATE_HELPER"
+else
+ echo "${ERROR} Update helper not found at $UPDATE_HELPER. Exiting."
+ exit 1
+fi
+
+version_gte() {
+ [ "$1" = "$(echo -e "$1\n$2" | sort -V | tail -n1)" ]
+}
+
+get_installed_dotfiles_version() {
+ local hypr_dir="$HOME/.config/hypr"
+ if [ -d "$hypr_dir" ]; then
+ # Pick the highest semantic version among files named vX.Y.Z
+ find "$hypr_dir" -maxdepth 1 -type f -name 'v*.*.*' -printf '%f\n' 2>/dev/null \
+ | sed 's/^v//' \
+ | sort -V \
+ | tail -n1
+ fi
+}
+
+express_supported() {
+ local current_version
+ current_version=$(get_installed_dotfiles_version)
+ if [ -z "$current_version" ]; then
+ return 1
+ fi
+ version_gte "$current_version" "$MIN_EXPRESS_VERSION"
+}
+print_usage() {
+ cat <<'EOF'
+Usage: copy.sh [--upgrade] [--express-upgrade] [--help]
+
+Options:
+ --upgrade Run the script in upgrade mode (can still prompt for express).
+ --express-upgrade Upgrade with express behavior (no restore prompts, trims backups).
+ -h, --help Show this help message and exit.
+EOF
+}
+
+UPGRADE_MODE=0
+EXPRESS_MODE=0
+RUN_MODE=""
+
+while [[ $# -gt 0 ]]; do
+ case "$1" in
+ --upgrade)
+ UPGRADE_MODE=1
+ RUN_MODE="upgrade"
+ ;;
+ --express-upgrade)
+ UPGRADE_MODE=1
+ EXPRESS_MODE=1
+ RUN_MODE="express"
+ ;;
+ -h | --help)
+ print_usage
+ exit 0
+ ;;
+ *)
+ echo "${ERROR} Unknown option: $1"
+ print_usage
+ exit 1
+ ;;
+ esac
+ shift
+done
+EXPRESS_SUPPORTED=0
+if express_supported; then
+ EXPRESS_SUPPORTED=1
+fi
+if [ "$EXPRESS_MODE" -eq 1 ] && [ "$EXPRESS_SUPPORTED" -eq 0 ]; then
+ echo "${WARN} Express upgrade requires installed dotfiles v${MIN_EXPRESS_VERSION} or newer. Falling back to standard upgrade."
+ EXPRESS_MODE=0
+ RUN_MODE="upgrade"
+fi
+
+if [ -z "$RUN_MODE" ]; then
+ if declare -f show_copy_menu >/dev/null 2>&1; then
+ while [ -z "$RUN_MODE" ]; do
+ show_copy_menu "$EXPRESS_SUPPORTED"
+ choice_lower=$(echo "$COPY_MENU_CHOICE" | tr '[:upper:]' '[:lower:]')
+ case "$choice_lower" in
+ install)
+ RUN_MODE="install"
+ UPGRADE_MODE=0
+ EXPRESS_MODE=0
+ ;;
+ upgrade)
+ RUN_MODE="upgrade"
+ UPGRADE_MODE=1
+ EXPRESS_MODE=0
+ ;;
+ express)
+ if [ "$EXPRESS_SUPPORTED" -eq 0 ]; then
+ echo "${WARN} Express mode requires installed dotfiles v${MIN_EXPRESS_VERSION} or newer. Please choose another option."
+ continue
+ fi
+ RUN_MODE="express"
+ UPGRADE_MODE=1
+ EXPRESS_MODE=1
+ ;;
+ update)
+ run_repo_update "$SCRIPT_DIR"
+ # After update, continue showing the menu without exiting
+ continue
+ ;;
+ quit)
+ echo "${NOTE} Exiting per user selection."
+ exit 0
+ ;;
+ *)
+ echo "${WARN} Invalid selection."
+ ;;
+ esac
+ done
+ else
+ echo "${NOTE} Menu helper not found; defaulting to install workflow."
+ RUN_MODE="install"
+ fi
+fi
# Check if running as root. If root, script will exit
if [[ $EUID -eq 0 ]]; then
@@ -32,7 +231,8 @@ fi
# Function to print colorful text
print_color() {
- printf "%b%s%b\n" "$1" "$2" "$RESET"
+ # Use %b for the message to interpret backslash escapes like \n, \t, etc.
+ printf "%b%b%b\n" "$1" "$2" "$RESET"
}
# Check /etc/os-release for Ubuntu or Debian and warn about Hyprland version requirement
@@ -84,43 +284,17 @@ LOG="Copy-Logs/install-$(date +%d-%H%M%S)_dotfiles.log"
# update home directories
xdg-user-dirs-update 2>&1 | tee -a "$LOG" || true
-
-# setting up for NVIDIA
-if lspci -k | grep -A 2 -E "(VGA|3D)" | grep -iq nvidia; then
- echo "${INFO} Nvidia GPU detected. Setting up proper env's and configs" 2>&1 | tee -a "$LOG" || true
- sed -i '/env = LIBVA_DRIVER_NAME,nvidia/s/^#//' config/hypr/configs/ENVariables.conf
- sed -i '/env = __GLX_VENDOR_LIBRARY_NAME,nvidia/s/^#//' config/hypr/configs/ENVariables.conf
- sed -i '/env = NVD_BACKEND,direct/s/^#//' config/hypr/configs/ENVariables.conf
- sed -i '/env = GSK_RENDERER,ngl/s/^#//' config/hypr/configs/ENVariables.conf
-
- # no hardware cursors if nvidia detected
- sed -i 's/^\([[:space:]]*no_hardware_cursors[[:space:]]*=[[:space:]]*\)2/\1 1/' config/hypr/configs/SystemSettings.conf
+echo "${INFO} Selected workflow: ${RUN_MODE}" 2>&1 | tee -a "$LOG"
+if [ "$UPGRADE_MODE" -eq 1 ]; then
+ echo "${INFO} Upgrade mode enabled." 2>&1 | tee -a "$LOG"
fi
-
-# uncommenting WLR_RENDERER_ALLOW_SOFTWARE,1 if running in a VM is detected
-if hostnamectl | grep -q 'Chassis: vm'; then
- echo "${INFO} System is running in a virtual machine. Setting up proper env's and configs" 2>&1 | tee -a "$LOG" || true
- sed -i 's/^\([[:space:]]*no_hardware_cursors[[:space:]]*=[[:space:]]*\)2/\1 1/' config/hypr/configs/SystemSettings.conf
- # enabling proper ENV's for Virtual Environment which should help
- sed -i '/env = WLR_RENDERER_ALLOW_SOFTWARE,1/s/^#//' config/hypr/configs/ENVariables.conf
- sed -i '/monitor = Virtual-1, 1920x1080@60,auto,1/s/^#//' config/hypr/monitors.conf
+if [ "$EXPRESS_MODE" -eq 1 ]; then
+ echo "${INFO} Express mode enabled. Optional restore prompts will be skipped." 2>&1 | tee -a "$LOG"
fi
-# Proper Polkit for NixOS
-if hostnamectl | grep -q 'Operating System: NixOS'; then
- echo "${INFO} NixOS Distro Detected. Setting up proper env's and configs." 2>&1 | tee -a "$LOG" || true
- # Ensure NixOS polkit is enabled via overlay and default polkit is disabled via disable list
- OVERLAY_SA="config/hypr/configs/Startup_Apps.conf"
- DISABLE_SA="config/hypr/configs/Startup_Apps.disable"
- mkdir -p "$(dirname "$OVERLAY_SA")"
- touch "$OVERLAY_SA" "$DISABLE_SA"
- if ! grep -qx 'exec-once = $scriptsDir/Polkit-NixOS.sh' "$OVERLAY_SA"; then
- echo 'exec-once = $scriptsDir/Polkit-NixOS.sh' >>"$OVERLAY_SA"
- fi
- if ! grep -qx '\$scriptsDir/Polkit.sh' "$DISABLE_SA"; then
- echo '$scriptsDir/Polkit.sh' >>"$DISABLE_SA"
- fi
-fi
+detect_nvidia_adjust "$LOG"
+detect_vm_adjust "$LOG"
+detect_nixos_adjust "$LOG"
# activating hyprcursor on env by checking if the directory ~/.icons/Bibata-Modern-Ice/hyprcursors exists
if [ -d "$HOME/.icons/Bibata-Modern-Ice/hyprcursors" ]; then
@@ -132,229 +306,32 @@ fi
printf "\n%.0s" {1..1}
-# Function to detect keyboard layout using localectl or setxkbmap
-detect_layout() {
- if command -v localectl >/dev/null 2>&1; then
- layout=$(localectl status --no-pager | awk '/X11 Layout/ {print $3}')
- if [ -n "$layout" ]; then
- echo "$layout"
- fi
- elif command -v setxkbmap >/dev/null 2>&1; then
- layout=$(setxkbmap -query | grep layout | awk '{print $2}')
- if [ -n "$layout" ]; then
- echo "$layout"
- fi
- fi
-}
-
-# Detect the current keyboard layout
-layout=$(detect_layout)
-
-if [ "$layout" = "(unset)" ]; then
- while true; do
- printf "\n%.0s" {1..1}
- print_color $WARNING "
- █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
- STOP AND READ
- █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
-
- !!! IMPORTANT WARNING !!!
-
-The Default Keyboard Layout could not be detected
-You need to set it Manually
-
- !!! WARNING !!!
-
-Setting a wrong Keyboard Layout will cause Hyprland to crash
-If you are not sure, just type ${YELLOW}us${RESET}
-${SKYBLUE}You can change later in ~/.config/hypr/UserConfigs/UserSettings.conf${RESET}
-
-${MAGENTA} NOTE:${RESET}
-• You can also set more than 2 keyboard layouts
-• For example: ${YELLOW}us, kr, gb, ru${RESET}
-"
- printf "\n%.0s" {1..1}
-
- echo -n "${CAT} - Please enter the correct keyboard layout: "
- read new_layout
-
- if [ -n "$new_layout" ]; then
- layout="$new_layout"
- break
- else
- echo "${CAT} Please enter a keyboard layout."
- fi
- done
-fi
-
-printf "${NOTE} Detecting keyboard layout to prepare proper Hyprland Settings\n"
-
-# Prompt the user to confirm whether the detected layout is correct
-while true; do
- printf "${INFO} Current keyboard layout is ${MAGENTA}$layout${RESET}\n"
- echo -n "${CAT} Is this correct? [y/n] "
- read keyboard_layout
-
- case $keyboard_layout in
- [yY])
- awk -v layout="$layout" '/kb_layout/ {$0 = " kb_layout = " layout} 1' config/hypr/configs/SystemSettings.conf >temp.conf
- mv temp.conf config/hypr/configs/SystemSettings.conf
-
- echo "${NOTE} kb_layout ${MAGENTA}$layout${RESET} configured in settings." 2>&1 | tee -a "$LOG"
- break
- ;;
- [nN])
- printf "\n%.0s" {1..2}
- print_color $WARNING "
- █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
- STOP AND READ
- █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
-
- !!! IMPORTANT WARNING !!!
-
-The Default Keyboard Layout could not be detected
-You need to set it Manually
-
- !!! WARNING !!!
-
-Setting a wrong Keyboard Layout will cause Hyprland to crash
-If you are not sure, just type ${YELLOW}us${RESET}
-${SKYBLUE}You can change later in ~/.config/hypr/UserConfigs/UserSettings.conf${RESET}
-
-${MAGENTA} NOTE:${RESET}
-• You can also set more than 2 keyboard layouts
-• For example: ${YELLOW}us, kr, gb, ru${RESET}
-"
- printf "\n%.0s" {1..1}
-
- echo -n "${CAT} - Please enter the correct keyboard layout: "
- read new_layout
-
- awk -v new_layout="$new_layout" '/kb_layout/ {$0 = " kb_layout = " new_layout} 1' config/hypr/configs/SystemSettings.conf >temp.conf
- mv temp.conf config/hypr/configs/SystemSettings.conf
- echo "${OK} kb_layout $new_layout configured in settings." 2>&1 | tee -a "$LOG"
- break
- ;;
- *)
- echo "${ERROR} Please enter either 'y' or 'n'."
- ;;
- esac
-done
-
-# Check if asusctl is installed and add rog-control-center on Startup
-if command -v asusctl >/dev/null 2>&1; then
- OVERLAY_SA="config/hypr/configs/Startup_Apps.conf"
- mkdir -p "$(dirname "$OVERLAY_SA")"
- touch "$OVERLAY_SA"
- grep -qx 'exec-once = rog-control-center' "$OVERLAY_SA" || echo 'exec-once = rog-control-center' >>"$OVERLAY_SA"
-fi
-
-# Check if blueman-applet is installed and add blueman-applet on Startup
-if command -v blueman-applet >/dev/null 2>&1; then
- OVERLAY_SA="config/hypr/configs/Startup_Apps.conf"
- mkdir -p "$(dirname "$OVERLAY_SA")"
- touch "$OVERLAY_SA"
- grep -qx 'exec-once = blueman-applet' "$OVERLAY_SA" || echo 'exec-once = blueman-applet' >>"$OVERLAY_SA"
-fi
-
-# Check if ags is installed and enable it
-if command -v ags >/dev/null 2>&1; then
- echo "${INFO} AGS detected - enabling in startup and refresh scripts" 2>&1 | tee -a "$LOG"
- OVERLAY_SA="config/hypr/configs/Startup_Apps.conf"
- mkdir -p "$(dirname "$OVERLAY_SA")"
- touch "$OVERLAY_SA"
- grep -qx 'exec-once = ags' "$OVERLAY_SA" || echo 'exec-once = ags' >>"$OVERLAY_SA"
- sed -i '/#ags -q && ags &/s/^#//' config/hypr/scripts/RefreshNoWaybar.sh
- sed -i '/#ags -q && ags &/s/^#//' config/hypr/scripts/Refresh.sh
-fi
-
-# Check if quickshell is installed and enable it
-if command -v qs >/dev/null 2>&1; then
- echo "${INFO} Quickshell detected - enabling in startup and refresh scripts" 2>&1 | tee -a "$LOG"
- OVERLAY_SA="config/hypr/configs/Startup_Apps.conf"
- mkdir -p "$(dirname "$OVERLAY_SA")"
- touch "$OVERLAY_SA"
- grep -qx 'exec-once = qs' "$OVERLAY_SA" || echo 'exec-once = qs' >>"$OVERLAY_SA"
- sed -i '/#pkill qs && qs &/s/^#//' config/hypr/scripts/RefreshNoWaybar.sh
- sed -i '/#pkill qs && qs &/s/^#//' config/hypr/scripts/Refresh.sh
-fi
+layout=$(prompt_detect_layout)
+prompt_keyboard_layout "$layout" "$LOG"
-# Ensure layout-aware keybinds init runs on startup (adds to user overlay so it survives composes)
-OVERLAY_SA="config/hypr/configs/Startup_Apps.conf"
-mkdir -p "$(dirname "$OVERLAY_SA")"
-if ! grep -qx 'exec-once = \$scriptsDir/KeybindsLayoutInit.sh' "$OVERLAY_SA"; then
- echo 'exec-once = $scriptsDir/KeybindsLayoutInit.sh' >>"$OVERLAY_SA"
- echo "${INFO} Added KeybindsLayoutInit.sh to user Startup_Apps overlay" 2>&1 | tee -a "$LOG"
-fi
+enable_asusctl "$LOG"
+enable_blueman "$LOG"
+enable_ags "$LOG"
+enable_quickshell "$LOG"
+ensure_keybinds_init "$LOG"
printf "\n%.0s" {1..1}
-# Checking if neovim or vim is installed and offer user if they want to make as default editor
-# Function to modify the ENVariables.conf file
-update_editor() {
- local editor=$1
- sed -i "s/#env = EDITOR,.*/env = EDITOR,$editor #default editor/" config/hypr/UserConfigs/01-UserDefaults.conf
- echo "${OK} Default editor set to ${MAGENTA}$editor${RESET}." 2>&1 | tee -a "$LOG"
-}
-
-EDITOR_SET=0
-# Check for neovim if installed
-if command -v nvim &>/dev/null; then
- printf "${INFO} ${MAGENTA}neovim${RESET} is detected as installed\n"
- echo -n "${CAT} Do you want to make ${MAGENTA}neovim${RESET} the default editor? (y/N): "
- read EDITOR_CHOICE
- if [[ "$EDITOR_CHOICE" == "y" || "$EDITOR_CHOICE" == "Y" ]]; then
- update_editor "nvim"
- EDITOR_SET=1
- fi
-fi
-
-printf "\n"
-
-# Check for vim if installed, but only if neovim wasn't chosen
-if [[ "$EDITOR_SET" -eq 0 ]] && command -v vim &>/dev/null; then
- printf "${INFO} ${MAGENTA}vim${RESET} is detected as installed\n"
- echo -n "${CAT} Do you want to make ${MAGENTA}vim${RESET} the default editor? (y/N): "
- read EDITOR_CHOICE
- if [[ "$EDITOR_CHOICE" == "y" || "$EDITOR_CHOICE" == "Y" ]]; then
- update_editor "vim"
- EDITOR_SET=1
- fi
-fi
-
-printf "\n"
-
-# Action to do for better appearance
+choose_default_editor "$LOG"
+resolution=""
while true; do
- echo "${NOTE} ${SKY_BLUE} By default, KooL's Dots are configured for 1440p or 2k."
- echo "${WARN} If you dont select proper resolution, Hyprlock will look FUNKY!"
- echo "${INFO} If you are not sure what is your resolution, choose 1 here!"
- echo "${MAGENTA}Select monitor resolution to properly configure appearance and fonts:"
- echo "$YELLOW -- Enter 1. for monitor resolution less than 1440p (< 1440p)"
- echo "$YELLOW -- Enter 2. for monitor resolution equal to or higher than 1440p (≥ 1440p)"
-
- echo -n "$CAT Enter the number of your choice (1 or 2): "
- read res_choice
-
- case $res_choice in
- 1)
- resolution="< 1440p"
- break
- ;;
- 2)
- resolution="≥ 1440p"
- break
- ;;
- *)
- echo "${ERROR} Invalid choice. Please enter 1 for < 1440p or 2 for ≥ 1440p."
- ;;
+ echo "${INFO} Select monitor resolution for scaling:"
+ echo " 1) < 1440p (lower DPI; smaller displays)"
+ echo " 2) ≥ 1440p (default; 1440p/2k/4k)"
+ echo -n "${CAT} Enter the number of your choice (1 or 2): "
+ read -r choice
+ case "$choice" in
+ 1) resolution="< 1440p"; break ;;
+ 2) resolution="≥ 1440p"; break ;;
+ *) echo "${ERROR} Invalid choice. Please enter 1 or 2.";;
esac
done
-
-# Use the selected resolution in your existing script
echo "${OK} You have chosen $resolution resolution." 2>&1 | tee -a "$LOG"
-
-# actions if < 1440p is chosen
if [ "$resolution" == "< 1440p" ]; then
# kitty font size
sed -i 's/font_size 16.0/font_size 14.0/' config/kitty/kitty.conf
@@ -376,131 +353,13 @@ if [ "$resolution" == "< 1440p" ]; then
fi
printf "\n%.0s" {1..1}
-
-# Ask whether to change to 12hr format
-while true; do
- echo -e "${NOTE} ${SKY_BLUE} By default, KooL's Dots are configured in 24H clock format."
- echo -n "$CAT Do you want to change to 12H (AM/PM) clock format? (y/n): "
- read answer
-
- # Convert the answer to lowercase for comparison
- answer=$(echo "$answer" | tr '[:upper:]' '[:lower:]')
-
- # Check if the answer is valid
- if [[ "$answer" == "y" ]]; then
- # Modify waybar clock modules if 12hr is selected
- # Clock 1
- sed -i 's#^\(\s*\)//\("format": " {:%I:%M %p}",\) #\1\2 #g' config/waybar/Modules 2>&1 | tee -a "$LOG"
- sed -i 's#^\(\s*\)\("format": " {:%H:%M:%S}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
-
- # Clock 2
- sed -i 's#^\(\s*\)\("format": " {:%H:%M}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
-
- # Clock 3
- sed -i 's#^\(\s*\)//\("format": "{:%I:%M %p - %d/%b}",\) #\1\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
- sed -i 's#^\(\s*\)\("format": "{:%H:%M - %d/%b}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
-
- # Clock 4
- sed -i 's#^\(\s*\)//\("format": "{:%B | %a %d, %Y | %I:%M %p}",\) #\1\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
- sed -i 's#^\(\s*\)\("format": "{:%B | %a %d, %Y | %H:%M}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
-
- # Clock 5
- sed -i 's#^\(\s*\)//\("format": "{:%A, %I:%M %P}",\) #\1\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
- sed -i 's#^\(\s*\)\("format": "{:%a %d | %H:%M}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG"
-
- # for hyprlock
- HYPRLOCK_FILE="config/hypr/hyprlock.conf"
- if [ ! -f "$HYPRLOCK_FILE" ] && [ -f "config/hypr/hyprlock-1080p.conf" ]; then
- HYPRLOCK_FILE="config/hypr/hyprlock-1080p.conf"
- fi
- if [ -f "$HYPRLOCK_FILE" ]; then
- sed -i 's/^\s*text = cmd\[update:1000\] echo "\$(date +"%H")"/# &/' "$HYPRLOCK_FILE" 2>&1 | tee -a "$LOG"
- sed -i 's/^\(\s*\)# *text = cmd\[update:1000\] echo "\$(date +"%I")" #AM\/PM/\1 text = cmd\[update:1000\] echo "\$(date +"%I")" #AM\/PM/' "$HYPRLOCK_FILE" 2>&1 | tee -a "$LOG"
-
- sed -i 's/^\s*text = cmd\[update:1000\] echo "\$(date +"%S")"/# &/' "$HYPRLOCK_FILE" 2>&1 | tee -a "$LOG"
- sed -i 's/^\(\s*\)# *text = cmd\[update:1000\] echo "\$(date +"%S %p")" #AM\/PM/\1 text = cmd\[update:1000\] echo "\$(date +"%S %p")" #AM\/PM/' "$HYPRLOCK_FILE" 2>&1 | tee -a "$LOG"
- else
- echo "${WARN} hyprlock template not found; skipping 12H lock format edits" 2>&1 | tee -a "$LOG"
- fi
-
- echo "${OK} 12H format set on waybar clocks succesfully." 2>&1 | tee -a "$LOG"
-
- # Function to apply 12H format to SDDM themes
- apply_sddm_12h_format() {
- local sddm_directory=$1
-
- # Check if the directory exists
- if [ -d "$sddm_directory" ]; then
- echo "Editing ${SKY_BLUE}$sddm_directory${RESET} to 12H format" 2>&1 | tee -a "$LOG"
-
- sudo sed -i 's|^## HourFormat="hh:mm AP"|HourFormat="hh:mm AP"|' "$sddm_directory/theme.conf" 2>&1 | tee -a "$LOG" || true
- sudo sed -i 's|^HourFormat="HH:mm"|## HourFormat="HH:mm"|' "$sddm_directory/theme.conf" 2>&1 | tee -a "$LOG" || true
- fi
- }
-
- # Applying to different SDDM themes
- apply_sddm_12h_format "/usr/share/sddm/themes/simple-sddm"
- apply_sddm_12h_format "/usr/share/sddm/themes/simple_sddm_2"
-
- # For SDDM (sequoia_2)
- sddm_directory_3="/usr/share/sddm/themes/sequoia_2"
- if [ -d "$sddm_directory_3" ]; then
- echo "${YELLOW}sddm sequoia_2${RESET} theme exists. Editing to 12H format" 2>&1 | tee -a "$LOG"
-
- # Comment out the existing clockFormat="HH:mm" line
- sudo sed -i 's|^clockFormat="HH:mm"|## clockFormat="HH:mm"|' "$sddm_directory_3/theme.conf" 2>&1 | tee -a "$LOG" || true
-
- # Insert the new clockFormat="hh:mm AP" line if it's not already present
- if ! grep -q 'clockFormat="hh:mm AP"' "$sddm_directory_3/theme.conf"; then
- sudo sed -i '/^clockFormat=/a clockFormat="hh:mm AP"' "$sddm_directory_3/theme.conf" 2>&1 | tee -a "$LOG" || true
- fi
-
- echo "${OK} 12H format set to SDDM successfully." 2>&1 | tee -a "$LOG"
- fi
-
- break
-
- elif [[ "$answer" == "n" ]]; then
- echo "${NOTE} You chose not to change to 12H format." 2>&1 | tee -a "$LOG"
- break # Exit the loop if the user chooses "n"
- else
- echo "${ERROR} Invalid choice. Please enter y for yes or n for no."
- fi
-done
+prompt_clock_12h "$LOG"
printf "\n%.0s" {1..1}
-
-# Check if the user wants to disable Rainbow borders
-echo "${NOTE} ${SKY_BLUE}By default, Rainbow Borders animation is enabled"
-echo "${WARN} However, this uses a bit more CPU and Memory resources."
-
-# Ask whether to disable Rainbow Borders animation
-echo -n "${CAT} Do you want to disable Rainbow Borders animation? (y/N): "
-read border_choice
-
-# Check user's choice
-if [[ "$border_choice" =~ ^[Yy]$ ]]; then
- # Disable Rainbow Borders
- mv config/hypr/UserScripts/RainbowBorders.sh config/hypr/UserScripts/RainbowBorders.bak.sh
-
- # Comment out the exec-once and animation lines
- sed -i '/exec-once = \$UserScripts\/RainbowBorders.sh/s/^/#/' config/hypr/configs/Startup_Apps.conf
- sed -i '/^[[:space:]]*animation = borderangle, 1, 180, liner, loop/s/^/#/' config/hypr/configs/UserAnimations.conf
-
- echo "${OK} Rainbow borders are now disabled." 2>&1 | tee -a "$LOG"
-else
- echo "${NOTE} No changes made. Rainbow borders remain enabled." 2>&1 | tee -a "$LOG"
-fi
printf "\n%.0s" {1..1}
+prompt_express_upgrade "$EXPRESS_SUPPORTED" "$LOG"
set -e
-# Function to create a unique backup directory name with month, day, hours, and minutes
-get_backup_dirname() {
- local timestamp
- timestamp=$(date +"%m%d_%H%M")
- echo "back-up_${timestamp}"
-}
-
# Check if the ~/.config/ directory exists
if [ ! -d "$HOME/.config" ]; then
echo "${ERROR} - $HOME/.config directory does not exist. Creating it now."
@@ -508,215 +367,13 @@ if [ ! -d "$HOME/.config" ]; then
fi
printf "${INFO} - copying dotfiles ${SKY_BLUE}first${RESET} part\n"
-# Config directories which will ask the user whether to replace or not
-DIRS="fastfetch kitty rofi swaync"
-
-for DIR2 in $DIRS; do
- DIRPATH="$HOME/.config/$DIR2"
-
- if [ -d "$DIRPATH" ]; then
- while true; do
- printf "\n${INFO} Found ${YELLOW}$DIR2${RESET} config found in ~/.config/\n"
- echo -n "${CAT} Do you want to replace ${YELLOW}$DIR2${RESET} config? (y/n): "
- read DIR1_CHOICE
-
- case "$DIR1_CHOICE" in
- [Yy]*)
- BACKUP_DIR=$(get_backup_dirname)
- # Backup the existing directory
- mv "$DIRPATH" "$DIRPATH-backup-$BACKUP_DIR" 2>&1 | tee -a "$LOG"
- echo -e "${NOTE} - Backed up $DIR2 to $DIRPATH-backup-$BACKUP_DIR." 2>&1 | tee -a "$LOG"
-
- # Copy the new config
- cp -r "config/$DIR2" "$HOME/.config/$DIR2" 2>&1 | tee -a "$LOG"
- echo -e "${OK} - Replaced $DIR2 with new configuration." 2>&1 | tee -a "$LOG"
-
- # Restoring rofi themes directory unique themes
- if [ "$DIR2" = "rofi" ]; then
- if [ -d "$DIRPATH-backup-$BACKUP_DIR/themes" ]; then
- for file in "$DIRPATH-backup-$BACKUP_DIR/themes"/*; do
- [ -e "$file" ] || continue # Skip if no files are found
- echo "Copying $file to $HOME/.config/rofi/themes/" >>"$LOG"
- cp -n "$file" "$HOME/.config/rofi/themes/" >>"$LOG" 2>&1
- done || true
- fi
-
- # restoring global 0-shared-fonts.rasi
- if [ -f "$DIRPATH-backup-$BACKUP_DIR/0-shared-fonts.rasi" ]; then
- echo "Restoring $DIRPATH-backup-$BACKUP_DIR/0-shared-fonts.rasi to $HOME/.config/rofi/" >>"$LOG"
- cp "$DIRPATH-backup-$BACKUP_DIR/0-shared-fonts.rasi" "$HOME/.config/rofi/0-shared-fonts.rasi" >>"$LOG" 2>&1
- fi
-
- fi
-
- break
- ;;
- [Nn]*)
- echo -e "${NOTE} - Skipping ${YELLOW}$DIR2${RESET}" 2>&1 | tee -a "$LOG"
- break
- ;;
- *)
- echo -e "${WARN} - Invalid choice. Please enter Y or N."
- ;;
- esac
- done
- else
- # Copy new config if directory does not exist
- cp -r "config/$DIR2" "$HOME/.config/$DIR2" 2>&1 | tee -a "$LOG"
- echo -e "${OK} - Copy completed for ${YELLOW}$DIR2${RESET}" 2>&1 | tee -a "$LOG"
- fi
-done
-
+copy_phase1 "$LOG"
printf "\n%.0s" {1..1}
-
-# for waybar special part since it contains symlink
-DIRW="waybar"
-DIRPATHw="$HOME/.config/$DIRW"
-if [ -d "$DIRPATHw" ]; then
- while true; do
- echo -n "${CAT} Do you want to replace ${YELLOW}$DIRW${RESET} config? (y/n): "
- read DIR1_CHOICE
-
- case "$DIR1_CHOICE" in
- [Yy]*)
- BACKUP_DIR=$(get_backup_dirname)
- cp -r "$DIRPATHw" "$DIRPATHw-backup-$BACKUP_DIR" 2>&1 | tee -a "$LOG"
- echo -e "${NOTE} - Backed up $DIRW to $DIRPATHw-backup-$BACKUP_DIR." 2>&1 | tee -a "$LOG"
-
- # Remove the old $DIRPATHw and copy the new one
- rm -rf "$DIRPATHw" && cp -r "config/$DIRW" "$DIRPATHw" 2>&1 | tee -a "$LOG"
-
- # Step 1: Handle waybar symlinks
- for file in "config" "style.css"; do
- symlink="$DIRPATHw-backup-$BACKUP_DIR/$file"
- target_file="$DIRPATHw/$file"
-
- if [ -L "$symlink" ]; then
- symlink_target=$(readlink "$symlink")
- if [ -f "$symlink_target" ]; then
- rm -f "$target_file" && cp -f "$symlink_target" "$target_file"
- echo -e "${NOTE} - Copied $file as a regular file."
- else
- echo -e "${WARN} - Symlink target for $file does not exist."
- fi
- fi
- done
-
- # Step 2: Copy non-existing directories and files under waybar/configs
- for dir in "$DIRPATHw-backup-$BACKUP_DIR/configs"/*; do
- [ -e "$dir" ] || continue # Skip if no files are found
- if [ -d "$dir" ]; then
- target_dir="$HOME/.config/waybar/configs/$(basename "$dir")"
- if [ ! -d "$target_dir" ]; then
- echo "Copying directory $dir to $HOME/.config/waybar/configs/" >>"$LOG"
- cp -r "$dir" "$HOME/.config/waybar/configs/"
- else
- echo "Directory $target_dir already exists. Skipping." >>"$LOG"
- fi
- fi
- done
-
- for file in "$DIRPATHw-backup-$BACKUP_DIR/configs"/*; do
- [ -e "$file" ] || continue
- target_file="$HOME/.config/waybar/configs/$(basename "$file")"
- if [ ! -e "$target_file" ]; then
- echo "Copying $file to $HOME/.config/waybar/configs/" >>"$LOG"
- cp "$file" "$HOME/.config/waybar/configs/"
- else
- echo "File $target_file already exists. Skipping." >>"$LOG"
- fi
- done || true
-
- # Step 3: Copy unique files in waybar/style
- for file in "$DIRPATHw-backup-$BACKUP_DIR/style"/*; do
- [ -e "$file" ] || continue
-
- if [ -d "$file" ]; then
- target_dir="$HOME/.config/waybar/style/$(basename "$file")"
- if [ ! -d "$target_dir" ]; then
- echo "Copying directory $file to $HOME/.config/waybar/style/" >>"$LOG"
- cp -r "$file" "$HOME/.config/waybar/style/"
- else
- echo "Directory $target_dir already exists. Skipping." >>"$LOG"
- fi
- else
- target_file="$HOME/.config/waybar/style/$(basename "$file")"
- if [ ! -e "$target_file" ]; then
- echo "Copying file $file to $HOME/.config/waybar/style/" >>"$LOG"
- cp "$file" "$HOME/.config/waybar/style/"
- else
- echo "File $target_file already exists. Skipping." >>"$LOG"
- fi
- fi
- done || true
-
- # Step 4: restore Modules_Extras
- BACKUP_FILEw="$DIRPATHw-backup-$BACKUP_DIR/UserModules"
- if [ -f "$BACKUP_FILEw" ]; then
- cp -f "$BACKUP_FILEw" "$DIRPATHw/UserModules"
- fi
-
- break
- ;;
- [Nn]*)
- echo -e "${NOTE} - Skipping ${YELLOW}$DIRW${RESET} config replacement." 2>&1 | tee -a "$LOG"
- break
- ;;
- *)
- echo -e "${WARN} - Invalid choice. Please enter Y or N."
- ;;
- esac
- done
-else
- cp -r "config/$DIRW" "$DIRPATHw" 2>&1 | tee -a "$LOG"
- echo -e "${OK} - Copy completed for ${YELLOW}$DIRW${RESET}" 2>&1 | tee -a "$LOG"
-fi
-
+copy_waybar "$LOG"
printf "\n%.0s" {1..1}
-
printf "${INFO} - Copying dotfiles ${SKY_BLUE}second${RESET} part\n"
-
-# Check if the config directory exists
-if [ ! -d "config" ]; then
- echo "${ERROR} - The 'config' directory does not exist."
- exit 1
-fi
-
-DIR="btop cava hypr Kvantum qt5ct qt6ct swappy wallust wlogout"
-
-for DIR_NAME in $DIR; do
- DIRPATH="$HOME/.config/$DIR_NAME"
-
- # Backup the existing directory if it exists
- if [ -d "$DIRPATH" ]; then
- echo -e "\n${NOTE} - Config for ${YELLOW}$DIR_NAME${RESET} found, attempting to back up."
- BACKUP_DIR=$(get_backup_dirname)
-
- # Backup the existing directory
- mv "$DIRPATH" "$DIRPATH-backup-$BACKUP_DIR" 2>&1 | tee -a "$LOG"
- if [ $? -eq 0 ]; then
- echo -e "${NOTE} - Backed up $DIR_NAME to $DIRPATH-backup-$BACKUP_DIR."
- else
- echo "${ERROR} - Failed to back up $DIR_NAME."
- exit 1
- fi
- fi
-
- # Copy the new config
- if [ -d "config/$DIR_NAME" ]; then
- cp -r "config/$DIR_NAME/" "$HOME/.config/$DIR_NAME" 2>&1 | tee -a "$LOG"
- if [ $? -eq 0 ]; then
- echo "${OK} - Copy of config for ${YELLOW}$DIR_NAME${RESET} completed!"
- else
- echo "${ERROR} - Failed to copy $DIR_NAME."
- exit 1
- fi
- else
- echo "${ERROR} - Directory config/$DIR_NAME does not exist to copy."
- fi
-done
-
-printf "\n%.0s" {1..1}
+copy_phase2 "$LOG"
+printf "\\n%.0s" {1..1}
# ags config
# Check if ags is installed
@@ -819,252 +476,17 @@ if command -v qs >/dev/null 2>&1; then
fi
printf "\n%.0s" {1..1}
-# Restore automatically Animations and Monitor-Profiles
-# including monitors.conf and workspaces.conf
-HYPR_DIR="$HOME/.config/hypr"
-BACKUP_DIR=$(get_backup_dirname)
-BACKUP_HYPR_PATH="$HYPR_DIR-backup-$BACKUP_DIR"
-
-if [ -d "$BACKUP_HYPR_PATH" ]; then
- echo -e "\n${NOTE} Restoring ${SKY_BLUE}Animations & Monitor Profiles${RESET} directories into ${YELLOW}$HYPR_DIR${RESET}..."
-
- DIR_B=("Monitor_Profiles" "animations" "wallpaper_effects")
- # Restore directories automatically
- for DIR_RESTORE in "${DIR_B[@]}"; do
- BACKUP_SUBDIR="$BACKUP_HYPR_PATH/$DIR_RESTORE"
- if [ -d "$BACKUP_SUBDIR" ]; then
- cp -r "$BACKUP_SUBDIR" "$HYPR_DIR/"
- echo "${OK} - Restored directory: ${MAGENTA}$DIR_RESTORE${RESET}" 2>&1 | tee -a "$LOG"
- fi
- done
-
- # Restore files automatically
- FILE_B=("monitors.conf" "workspaces.conf")
- for FILE_RESTORE in "${FILE_B[@]}"; do
- BACKUP_FILE="$BACKUP_HYPR_PATH/$FILE_RESTORE"
-
- if [ -f "$BACKUP_FILE" ]; then
- cp "$BACKUP_FILE" "$HYPR_DIR/$FILE_RESTORE"
- echo "${OK} - Restored file: ${MAGENTA}$FILE_RESTORE${RESET}" 2>&1 | tee -a "$LOG"
- fi
- done
-fi
-
+restore_hypr_assets "$LOG" "$EXPRESS_MODE"
printf "\n%.0s" {1..1}
-# Restoring UserConfigs and UserScripts
-# Helper to extract overlay (additions) and optional disables from a previous user file compared to vendor base
-compose_overlay_from_backup() {
- local type="$1" # startup|windowrules
- local base_file="$2"
- local old_user_file="$3"
- local new_user_file="$4"
- local disable_file="$5"
-
- mkdir -p "$(dirname "$new_user_file")"
- : >"$new_user_file"
- : >"$disable_file"
-
- if [ "$type" = "startup" ]; then
- # additions: exec-once lines present in old user but not in base
- grep -E '^\s*exec-once\s*=' "$old_user_file" | sed -E 's/^\s+//;s/\s+$//' | sort -u >"$old_user_file.tmp.exec"
- grep -E '^\s*exec-once\s*=' "$base_file" | sed -E 's/^\s+//;s/\s+$//' | sort -u >"$base_file.tmp.exec"
- comm -23 "$old_user_file.tmp.exec" "$base_file.tmp.exec" >"$new_user_file"
- # treat commented exec-once in old user as disables
- grep -E '^\s*#\s*exec-once\s*=' "$old_user_file" |
- sed -E 's/^\s*#\s*exec-once\s*=\s*//' |
- sed -E 's/^\s+//;s/\s+$//' |
- grep -Ev '^\$scriptsDir/KeybindsLayoutInit\.sh$' |
- sort -u >"$disable_file"
- rm -f "$old_user_file.tmp.exec" "$base_file.tmp.exec"
- elif [ "$type" = "windowrules" ]; then
- # additions
- grep -E '^(windowrule|layerrule)\s*=' "$old_user_file" | sed -E 's/^\s+//;s/\s+$//' | sort -u >"$old_user_file.tmp.rules"
- grep -E '^(windowrule|layerrule)\s*=' "$base_file" | sed -E 's/^\s+//;s/\s+$//' | sort -u >"$base_file.tmp.rules"
- comm -23 "$old_user_file.tmp.rules" "$base_file.tmp.rules" >"$new_user_file"
- # disables: lines commented in old user
- grep -E '^\s*#\s*(windowrule|layerrule)\s*=' "$old_user_file" | sed -E 's/^\s*#\s*//' | sed -E 's/^\s+//;s/\s+$//' | sort -u >"$disable_file"
- rm -f "$old_user_file.tmp.rules" "$base_file.tmp.rules"
- fi
-}
-
-# Function to compare versions
-version_gte() {
- # Returns 0 if $1 >= $2, 1 otherwise
- [ "$1" = "$(echo -e "$1\n$2" | sort -V | tail -n1)" ]
-}
-
-DIRH="hypr"
-DIRPATH="$HOME/.config/$DIRH"
-BACKUP_DIR=$(get_backup_dirname)
-BACKUP_DIR_PATH="$DIRPATH-backup-$BACKUP_DIR/UserConfigs"
-
-if [ -z "$BACKUP_DIR" ]; then
- echo "${ERROR} - Backup directory name is empty. Exiting."
- exit 1
-fi
-
-if [ -d "$BACKUP_DIR_PATH" ]; then
- # Detect version
- VERSION_FILE=$(find "$DIRPATH" -maxdepth 1 -name "v*.*.*" | head -n 1)
- CURRENT_VERSION="999.9.9"
- if [ -n "$VERSION_FILE" ]; then
- CURRENT_VERSION=$(basename "$VERSION_FILE" | sed 's/^v//')
- fi
-
- TARGET_VERSION="2.3.19"
-
- echo -e "${NOTE} Restoring previous ${MAGENTA}User-Configs${RESET}... "
- print_color $WARNING "
- █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
- NOTES for RESTORING PREVIOUS CONFIGS
- █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
-
- The 'UserConfigs' directory is for all your personal settings.
- Files in this directory will override the default configurations,
- so your customizations are not lost when you update.
- "
-
- if version_gte "$CURRENT_VERSION" "$TARGET_VERSION"; then
- # NEW BEHAVIOR (>= 2.3.19) - Bulk Restore
- echo -n "${CAT} Do you want to restore your previous UserConfigs directory? (Y/n): "
- read -r restore_userconfigs_dir
-
- if [[ "$restore_userconfigs_dir" != [Nn]* ]]; then
- echo "${NOTE} Restoring UserConfigs directory..." 2>&1 | tee -a "$LOG"
- # Use rsync to copy contents, overwriting existing files.
- rsync -a "$BACKUP_DIR_PATH/" "$DIRPATH/UserConfigs/" 2>&1 | tee -a "$LOG"
- echo "${OK} - UserConfigs directory restored." 2>&1 | tee -a "$LOG"
- else
- echo "${NOTE} - Skipped restoring UserConfigs." 2>&1 | tee -a "$LOG"
- fi
-
- else
- # OLD BEHAVIOR (<= 2.3.18) - Selective Restore
- echo -e "${NOTE} Detected version ${YELLOW}v$CURRENT_VERSION${RESET} (older than v$TARGET_VERSION). Using legacy restoration mode."
-
- FILES_TO_RESTORE=(
- "01-UserDefaults.conf"
- "ENVariables.conf"
- "LaptopDisplay.conf"
- "Laptops.conf"
- "Startup_Apps.conf"
- "UserDecorations.conf"
- "UserAnimations.conf"
- "UserKeybinds.conf"
- "UserSettings.conf"
- "WindowRules.conf"
- )
-
- for FILE_NAME in "${FILES_TO_RESTORE[@]}"; do
- BACKUP_FILE="$BACKUP_DIR_PATH/$FILE_NAME"
- if [ -f "$BACKUP_FILE" ]; then
- # Special handling for Startup_Apps.conf and WindowRules.conf
- if [ "$FILE_NAME" = "Startup_Apps.conf" ]; then
- compose_overlay_from_backup "startup" "$DIRPATH/configs/Startup_Apps.conf" "$BACKUP_FILE" "$DIRPATH/UserConfigs/Startup_Apps.conf" "$DIRPATH/UserConfigs/Startup_Apps.disable"
- echo "${OK} - Migrated overlay for ${YELLOW}$FILE_NAME${RESET}" 2>&1 | tee -a "$LOG"
- continue
- fi
- if [ "$FILE_NAME" = "WindowRules.conf" ]; then
- compose_overlay_from_backup "windowrules" "$DIRPATH/configs/WindowRules.conf" "$BACKUP_FILE" "$DIRPATH/UserConfigs/WindowRules.conf" "$DIRPATH/UserConfigs/WindowRules.disable"
- echo "${OK} - Migrated overlay for ${YELLOW}$FILE_NAME${RESET}" 2>&1 | tee -a "$LOG"
- continue
- fi
-
- printf "\n${INFO} Found ${YELLOW}$FILE_NAME${RESET} in hypr backup...\n"
- echo -n "${CAT} Do you want to restore ${YELLOW}$FILE_NAME${RESET} from backup? (Y/n): "
- read file_restore
-
- if [[ "$file_restore" != [Nn]* ]]; then
- if cp "$BACKUP_FILE" "$DIRPATH/UserConfigs/$FILE_NAME"; then
- echo "${OK} - $FILE_NAME restored!" 2>&1 | tee -a "$LOG"
- else
- echo "${ERROR} - Failed to restore $FILE_NAME!" 2>&1 | tee -a "$LOG"
- fi
- else
- echo "${NOTE} - Skipped restoring $FILE_NAME." 2>&1 | tee -a "$LOG"
- fi
- fi
- done
- fi
-fi
-
+restore_user_configs "$LOG" "$EXPRESS_MODE"
printf "\n%.0s" {1..1}
-# Restoring previous UserScripts
-DIRSH="hypr"
-SCRIPTS_TO_RESTORE=(
- "RofiBeats.sh"
- "Weather.py"
- "Weather.sh"
-)
-
-DIRSHPATH="$HOME/.config/$DIRSH"
-BACKUP_DIR_PATH_S="$DIRSHPATH-backup-$BACKUP_DIR/UserScripts"
-
-if [ -d "$BACKUP_DIR_PATH_S" ]; then
- echo -e "${NOTE} Restoring previous ${MAGENTA}User-Scripts${RESET}..."
-
- for SCRIPT_NAME in "${SCRIPTS_TO_RESTORE[@]}"; do
- BACKUP_SCRIPT="$BACKUP_DIR_PATH_S/$SCRIPT_NAME"
-
- if [ -f "$BACKUP_SCRIPT" ]; then
- printf "\n${INFO} Found ${YELLOW}$SCRIPT_NAME${RESET} in hypr backup...\n"
- echo -n "${CAT} Do you want to restore ${YELLOW}$SCRIPT_NAME${RESET} from backup? (y/N): "
- read script_restore
-
- if [[ "$script_restore" == [Yy]* ]]; then
- if cp "$BACKUP_SCRIPT" "$DIRSHPATH/UserScripts/$SCRIPT_NAME"; then
- echo "${OK} - $SCRIPT_NAME restored!" 2>&1 | tee -a "$LOG"
- else
- echo "${ERROR} - Failed to restore $SCRIPT_NAME!" 2>&1 | tee -a "$LOG"
- fi
- else
- echo "${NOTE} - Skipped restoring $SCRIPT_NAME." 2>&1 | tee -a "$LOG"
- fi
- fi
- done
-fi
-
+restore_user_scripts "$LOG" "$EXPRESS_MODE"
printf "\n%.0s" {1..1}
-# restoring some files in ~/.config/hypr
-DIR_H="hypr"
-FILES_2_RESTORE=(
- "hyprlock.conf"
- "hypridle.conf"
-)
-
-DIRPATH="$HOME/.config/$DIR_H"
-BACKUP_DIR=$(get_backup_dirname)
-BACKUP_DIR_PATH_F="$DIRPATH-backup-$BACKUP_DIR"
-
-if [ -d "$BACKUP_DIR_PATH_F" ]; then
- echo -e "${NOTE} Restoring some files in ${MAGENTA}$HOME/.config/hypr directory${RESET}..."
-
- for FILE_RESTORE in "${FILES_2_RESTORE[@]}"; do
- BACKUP_FILE="$BACKUP_DIR_PATH_F/$FILE_RESTORE"
-
- if [ -f "$BACKUP_FILE" ]; then
- echo -e "\n${INFO} Found ${YELLOW}$FILE_RESTORE${RESET} in hypr backup..."
- echo -n "${CAT} Do you want to restore ${YELLOW}$FILE_RESTORE${RESET} from backup? (y/N): "
- read file2restore
-
- if [[ "$file2restore" == [Yy]* ]]; then
- if cp "$BACKUP_FILE" "$DIRPATH/$FILE_RESTORE"; then
- echo "${OK} - $FILE_RESTORE restored!" 2>&1 | tee -a "$LOG"
- else
- echo "${ERROR} - Failed to restore $FILE_RESTORE!" 2>&1 | tee -a "$LOG"
- fi
- else
- echo "${NOTE} - Skipped restoring $FILE_RESTORE." 2>&1 | tee -a "$LOG"
- fi
- else
- echo "${ERROR} - Backup file $BACKUP_FILE does not exist."
- fi
- done
-fi
-
+restore_hypr_files "$LOG" "$EXPRESS_MODE"
+printf "\n%.0s" {1..1}
printf "\n%.0s" {1..1}
# Define the target directory for rofi themes
@@ -1087,8 +509,9 @@ fi
printf "\n%.0s" {1..1}
# wallpaper stuff
-mkdir -p $HOME/Pictures/wallpapers
-if cp -r wallpapers $HOME/Pictures/; then
+PICTURES_DIR="$(xdg-user-dir PICTURES 2>/dev/null || echo "$HOME/Pictures")"
+mkdir -p "$PICTURES_DIR/wallpapers"
+if cp -r wallpapers "$PICTURES_DIR/"; then
echo "${OK} Some ${MAGENTA}wallpapers${RESET} copied successfully!" | tee -a "$LOG"
else
echo "${ERROR} Failed to copy some ${YELLOW}wallpapers${RESET}" | tee -a "$LOG"
@@ -1100,8 +523,8 @@ chmod +x "$HOME/.config/hypr/UserScripts/"* 2>&1 | tee -a "$LOG"
# Set executable for initial-boot.sh
chmod +x "$HOME/.config/hypr/initial-boot.sh" 2>&1 | tee -a "$LOG"
-# Waybar config to symlink & retain based on machine type
-if hostnamectl | grep -q 'Chassis: desktop'; then
+chassis_type=$(detect_waybar_config)
+if [ "$chassis_type" = "desktop" ]; then
config_file="$waybar_config"
config_remove=" Laptop"
else
@@ -1126,7 +549,9 @@ printf "\n%.0s" {1..1}
# for SDDM (simple_sddm_2)
sddm_simple_sddm_2="/usr/share/sddm/themes/simple_sddm_2"
-if [ -d "$sddm_simple_sddm_2" ]; then
+if [ -d "$sddm_simple_sddm_2" ] && [ "$EXPRESS_MODE" -eq 1 ]; then
+ echo "${NOTE} Express mode: skipping SDDM wallpaper prompt." 2>&1 | tee -a "$LOG"
+elif [ -d "$sddm_simple_sddm_2" ]; then
while true; do
echo -n "${CAT} SDDM simple_sddm_2 theme detected! Apply current wallpaper as SDDM background? (y/n): "
read SDDM_WALL
@@ -1137,7 +562,7 @@ if [ -d "$sddm_simple_sddm_2" ]; then
case $SDDM_WALL in
[Yy])
# Copy the wallpaper, ignore errors if the file exists or fails
- sudo cp -r "config/hypr/wallpaper_effects/.wallpaper_current" "/usr/share/sddm/themes/simple_sddm_2/Backgrounds/default" || true
+ sudo -n cp -r "config/hypr/wallpaper_effects/.wallpaper_current" "/usr/share/sddm/themes/simple_sddm_2/Backgrounds/default" || true
echo "${NOTE} Current wallpaper applied as default SDDM background" 2>&1 | tee -a "$LOG"
break
;;
@@ -1156,98 +581,54 @@ fi
printf "\n%.0s" {1..1}
echo "${MAGENTA}By default only a few wallpapers are copied${RESET}..."
-while true; do
- echo "${NOTE} A number of these wallpapers are AI generated or enhanced. Select (N/n) if this is an issue for you. "
- echo -n "${CAT} Would you like to download additional wallpapers? ${WARN} This is 1GB in size (y/n): "
- read WALL
-
- case $WALL in
- [Yy])
- echo "${NOTE} Downloading additional wallpapers..."
- if git clone "https://github.com/JaKooLit/Wallpaper-Bank.git"; then
- echo "${OK} Wallpapers downloaded successfully." 2>&1 | tee -a "$LOG"
-
- # Check if wallpapers directory exists and create it if not
- if [ ! -d "$HOME/Pictures/wallpapers" ]; then
- mkdir -p "$HOME/Pictures/wallpapers"
- echo "${OK} Created wallpapers directory." 2>&1 | tee -a "$LOG"
- fi
-
- if cp -R Wallpaper-Bank/wallpapers/* "$HOME/Pictures/wallpapers/" >>"$LOG" 2>&1; then
- echo "${OK} Wallpapers copied successfully." 2>&1 | tee -a "$LOG"
- rm -rf Wallpaper-Bank 2>&1 # Remove cloned repository after copying wallpapers
- break
- else
- echo "${ERROR} Copying wallpapers failed" 2>&1 | tee -a "$LOG"
- fi
- else
- echo "${ERROR} Downloading additional wallpapers failed" 2>&1 | tee -a "$LOG"
- fi
- ;;
- [Nn])
- echo "${NOTE} You chose not to download additional wallpapers." 2>&1 | tee -a "$LOG"
- break
- ;;
- *)
- echo "Please enter 'y' or 'n' to proceed."
- ;;
- esac
-done
-
-# CLeaning up of ~/.config/ backups
-cleanup_backups() {
- CONFIG_DIR="$HOME/.config"
- BACKUP_PREFIX="-backup"
+if [ "$EXPRESS_MODE" -eq 1 ]; then
+ echo "${NOTE} Express mode: skipping additional wallpaper download prompt." 2>&1 | tee -a "$LOG"
+else
+ while true; do
+ echo "${NOTE} A number of these wallpapers are AI generated or enhanced. Select (N/n) if this is an issue for you. "
+ echo -n "${CAT} Would you like to download additional wallpapers? ${WARN} This is 1GB in size (y/n): "
+ read WALL
- # Loop through directories in $HOME/.config
- for DIR in "$CONFIG_DIR"/*; do
- if [ -d "$DIR" ]; then
- BACKUP_DIRS=()
+ case $WALL in
+ [Yy])
+ echo "${NOTE} Downloading additional wallpapers..."
+ if git clone "https://github.com/JaKooLit/Wallpaper-Bank.git"; then
+ echo "${OK} Wallpapers downloaded successfully." 2>&1 | tee -a "$LOG"
- # Check for backup directories
- for BACKUP in "$DIR"$BACKUP_PREFIX*; do
- if [ -d "$BACKUP" ]; then
- BACKUP_DIRS+=("$BACKUP")
+ # Check if wallpapers directory exists and create it if not
+ if [ ! -d "$PICTURES_DIR/wallpapers" ]; then
+ mkdir -p "$PICTURES_DIR/wallpapers"
+ echo "${OK} Created wallpapers directory." 2>&1 | tee -a "$LOG"
fi
- done
-
- # If more than one backup found
- if [ ${#BACKUP_DIRS[@]} -gt 1 ]; then
- printf "\n%.0s" {1..2}
- echo -e "${INFO} Found ${MAGENTA}multiple backups${RESET} for: ${YELLOW}${DIR##*/}${RESET}"
- echo "${YELLOW}Backups: ${RESET}"
-
- # List the backups
- for BACKUP in "${BACKUP_DIRS[@]}"; do
- echo " - ${BACKUP##*/}"
- done
- echo -n "${CAT} Do you want to delete the older backups of ${YELLOW}${DIR##*/}${RESET} and keep the latest backup only? (y/N): "
- read back_choice
-
- if [[ "$back_choice" == [Yy]* ]]; then
- # Sort backups by modification time
- latest_backup="${BACKUP_DIRS[0]}"
- for BACKUP in "${BACKUP_DIRS[@]}"; do
- if [ "$BACKUP" -nt "$latest_backup" ]; then
- latest_backup="$BACKUP"
- fi
- done
-
- for BACKUP in "${BACKUP_DIRS[@]}"; do
- if [ "$BACKUP" != "$latest_backup" ]; then
- echo "Deleting: ${BACKUP##*/}"
- rm -rf "$BACKUP"
- fi
- done
- echo "Old backups of ${YELLOW}${DIR##*/}${RESET} deleted, keeping: ${MAGENTA}${latest_backup##*/}${RESET}"
+ if cp -R Wallpaper-Bank/wallpapers/* "$PICTURES_DIR/wallpapers/" >>"$LOG" 2>&1; then
+ echo "${OK} Wallpapers copied successfully." 2>&1 | tee -a "$LOG"
+ rm -rf Wallpaper-Bank 2>&1 # Remove cloned repository after copying wallpapers
+ break
+ else
+ echo "${ERROR} Copying wallpapers failed" 2>&1 | tee -a "$LOG"
fi
+ else
+ echo "${ERROR} Downloading additional wallpapers failed" 2>&1 | tee -a "$LOG"
fi
- fi
+ ;;
+ [Nn])
+ echo "${NOTE} You chose not to download additional wallpapers." 2>&1 | tee -a "$LOG"
+ break
+ ;;
+ *)
+ echo "Please enter 'y' or 'n' to proceed."
+ ;;
+ esac
done
-}
+fi
+
# Execute the cleanup function
-cleanup_backups
+if [ "$EXPRESS_MODE" -eq 1 ]; then
+ cleanup_backups auto "$LOG"
+else
+ cleanup_backups prompt "$LOG"
+fi
# Check if ~/.config/waybar/style.css does not exist or is a symlink
if [ ! -e "$HOME/.config/waybar/style.css" ] || [ -L "$HOME/.config/waybar/style.css" ]; then
diff --git a/scripts/copy_menu.sh b/scripts/copy_menu.sh
new file mode 100755
index 00000000..87f9301f
--- /dev/null
+++ b/scripts/copy_menu.sh
@@ -0,0 +1,82 @@
+#!/usr/bin/env bash
+
+# show_copy_menu
+# Arguments:
+# $1 - express_supported flag (1 if available, 0 otherwise)
+# Sets global COPY_MENU_CHOICE to one of: install, upgrade, express, quit
+show_copy_menu() {
+ local express_supported="${1:-0}"
+ local menu_title=" KooL's Hyprland Dotfiles "
+ local prompt="Select what you would like to do:"
+
+ local install_tag="Install"
+ local upgrade_tag="Upgrade"
+ local express_tag="Express"
+ local update_tag="Update"
+ local quit_tag="Quit"
+
+ local install_desc="Fresh copy"
+ local upgrade_desc="Backups + prompts"
+ local express_desc="Skips restores & wallpapers"
+ local update_desc="Stash + git pull"
+ local quit_desc="Exit without changes"
+
+ local choice=""
+ run_basic_menu() {
+ while true; do
+ printf "\n%s\n" "$menu_title"
+ printf "%s\n" "$prompt"
+ printf " 1) Install - %s\n" "$install_desc"
+ printf " 2) Upgrade - %s\n" "$upgrade_desc"
+ if [ "$express_supported" -eq 1 ]; then
+ printf " 3) Express - %s\n" "$express_desc"
+ else
+ printf " 3) Express - %s (disabled)\n" "$express_desc"
+ fi
+ printf " 4) Update - %s\n" "$update_desc"
+ printf " 5) Quit - %s\n" "$quit_desc"
+ printf "Enter choice [1-5]: "
+ read -r text_choice
+ case "$text_choice" in
+ 1) choice="$install_tag"; break ;;
+ 2) choice="$upgrade_tag"; break ;;
+ 3)
+ if [ "$express_supported" -eq 1 ]; then
+ choice="$express_tag"
+ break
+ else
+ echo "Express is disabled on this system."
+ fi
+ ;;
+ 4) choice="$update_tag"; break ;;
+ 5) choice="$quit_tag"; break ;;
+ *) echo "Invalid selection. Please choose 1-5." ;;
+ esac
+ done
+ }
+
+ if [ "$COPY_TUI_BACKEND" = "basic" ]; then
+ run_basic_menu
+ COPY_MENU_CHOICE="$choice"
+ return 0
+ fi
+
+ # Fallback to whiptail if present
+ if command -v whiptail >/dev/null 2>&1; then
+ if ! choice=$(whiptail --title "$menu_title" --menu "$prompt" 17 60 8 \
+ "$install_tag" "$install_desc" \
+ "$upgrade_tag" "$upgrade_desc" \
+ "$express_tag" "$express_desc" \
+ "$update_tag" "$update_desc" \
+ "$quit_tag" "$quit_desc" 3>&1 1>&2 2>&3); then
+ COPY_MENU_CHOICE="quit"
+ return 1
+ fi
+ else
+ # Plain-text fallback
+ run_basic_menu
+ fi
+
+ # shellcheck disable=SC2034 # used by parent script after sourcing this file
+ COPY_MENU_CHOICE="$choice"
+}
diff --git a/scripts/lib_apps.sh b/scripts/lib_apps.sh
new file mode 100644
index 00000000..562e5c5b
--- /dev/null
+++ b/scripts/lib_apps.sh
@@ -0,0 +1,116 @@
+#!/usr/bin/env bash
+# App enablement and editor selection helpers.
+
+enable_asusctl() {
+ local log="$1"
+ if command -v asusctl >/dev/null 2>&1; then
+ local OVERLAY_SA="config/hypr/configs/Startup_Apps.conf"
+ mkdir -p "$(dirname "$OVERLAY_SA")"
+ touch "$OVERLAY_SA"
+ grep -qx 'exec-once = rog-control-center' "$OVERLAY_SA" || echo 'exec-once = rog-control-center' >>"$OVERLAY_SA"
+ fi
+}
+
+enable_blueman() {
+ local log="$1"
+ if command -v blueman-applet >/dev/null 2>&1; then
+ local OVERLAY_SA="config/hypr/configs/Startup_Apps.conf"
+ mkdir -p "$(dirname "$OVERLAY_SA")"
+ touch "$OVERLAY_SA"
+ grep -qx 'exec-once = blueman-applet' "$OVERLAY_SA" || echo 'exec-once = blueman-applet' >>"$OVERLAY_SA"
+ fi
+}
+
+enable_ags() {
+ local log="$1"
+ if command -v ags >/dev/null 2>&1; then
+ echo "${INFO:-[INFO]} AGS detected - enabling in startup and refresh scripts" 2>&1 | tee -a "$log"
+ local OVERLAY_SA="config/hypr/configs/Startup_Apps.conf"
+ mkdir -p "$(dirname "$OVERLAY_SA")"
+ touch "$OVERLAY_SA"
+ grep -qx 'exec-once = ags' "$OVERLAY_SA" || echo 'exec-once = ags' >>"$OVERLAY_SA"
+ sed -i '/#ags -q && ags &/s/^#//' config/hypr/scripts/RefreshNoWaybar.sh
+ sed -i '/#ags -q && ags &/s/^#//' config/hypr/scripts/Refresh.sh
+ fi
+}
+
+enable_quickshell() {
+ local log="$1"
+ if command -v qs >/dev/null 2>&1; then
+ echo "${INFO:-[INFO]} Quickshell detected - enabling in startup and refresh scripts" 2>&1 | tee -a "$log"
+ local OVERLAY_SA="config/hypr/configs/Startup_Apps.conf"
+ mkdir -p "$(dirname "$OVERLAY_SA")"
+ touch "$OVERLAY_SA"
+ grep -qx 'exec-once = qs' "$OVERLAY_SA" || echo 'exec-once = qs' >>"$OVERLAY_SA"
+ sed -i '/#pkill qs && qs &/s/^#//' config/hypr/scripts/RefreshNoWaybar.sh
+ sed -i '/#pkill qs && qs &/s/^#//' config/hypr/scripts/Refresh.sh
+ fi
+}
+
+ensure_keybinds_init() {
+ local log="$1"
+ local OVERLAY_SA="config/hypr/configs/Startup_Apps.conf"
+ mkdir -p "$(dirname "$OVERLAY_SA")"
+ if ! grep -qx 'exec-once = \$scriptsDir/KeybindsLayoutInit.sh' "$OVERLAY_SA"; then
+ echo 'exec-once = $scriptsDir/KeybindsLayoutInit.sh' >>"$OVERLAY_SA"
+ echo "${INFO:-[INFO]} Added KeybindsLayoutInit.sh to user Startup_Apps overlay" 2>&1 | tee -a "$log"
+ fi
+}
+
+install_terminal_configs() {
+ local log="$1"
+
+ # Ghostty
+ local GHOSTTY_SRC="config/ghostty/ghostty.config"
+ local GHOSTTY_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/ghostty"
+ local GHOSTTY_DEST="$GHOSTTY_DIR/config"
+ if [ -f "$GHOSTTY_SRC" ]; then
+ mkdir -p "$GHOSTTY_DIR"
+ install -m 0644 "$GHOSTTY_SRC" "$GHOSTTY_DEST" 2>&1 | tee -a "$log"
+ if [ -f "$GHOSTTY_DIR/wallust.conf" ]; then
+ sed -i -E 's/^(\\s*palette\\s*=\\s*)([0-9]{1,2}):/\\1\\2=/' "$GHOSTTY_DIR/wallust.conf" 2>&1 | tee -a "$log" || true
+ fi
+ else
+ echo "${ERROR:-[ERROR]} - $GHOSTTY_SRC not found; skipping Ghostty config install." 2>&1 | tee -a "$log"
+ fi
+
+ # WezTerm
+ local WEZTERM_SRC="config/wezterm/wezterm.lua"
+ local WEZTERM_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/wezterm"
+ local WEZTERM_DEST="$WEZTERM_DIR/wezterm.lua"
+ if [ -f "$WEZTERM_SRC" ]; then
+ mkdir -p "$WEZTERM_DIR"
+ install -m 0644 "$WEZTERM_SRC" "$WEZTERM_DEST" 2>&1 | tee -a "$log"
+ else
+ echo "${ERROR:-[ERROR]} - $WEZTERM_SRC not found; skipping WezTerm config install." 2>&1 | tee -a "$log"
+ fi
+}
+
+choose_default_editor() {
+ local log="$1"
+ local editor_set=0
+ update_editor() {
+ local editor=$1
+ sed -i "s/#env = EDITOR,.*/env = EDITOR,$editor #default editor/" config/hypr/UserConfigs/01-UserDefaults.conf
+ echo "${OK:-[OK]} Default editor set to ${MAGENTA:-}$editor${RESET:-}." 2>&1 | tee -a "$log"
+ }
+ if command -v nvim &>/dev/null; then
+ printf "${INFO:-[INFO]} ${MAGENTA:-}neovim${RESET:-} is detected as installed\n"
+ if ! read -r -p "${CAT:-[ACTION]} Do you want to make ${MAGENTA:-}neovim${RESET:-} the default editor? (y/N): " EDITOR_CHOICE </dev/tty; then
+ :
+ elif [[ "$EDITOR_CHOICE" == "y" || "$EDITOR_CHOICE" == "Y" ]]; then
+ update_editor "nvim"
+ editor_set=1
+ fi
+ fi
+ printf "\n"
+ if [[ "$editor_set" -eq 0 ]] && command -v vim &>/dev/null; then
+ printf "${INFO:-[INFO]} ${MAGENTA:-}vim${RESET:-} is detected as installed\n"
+ if read -r -p "${CAT:-[ACTION]} Do you want to make ${MAGENTA:-}vim${RESET:-} the default editor? (y/N): " EDITOR_CHOICE </dev/tty; then
+ if [[ "$EDITOR_CHOICE" == "y" || "$EDITOR_CHOICE" == "Y" ]]; then
+ update_editor "vim"
+ editor_set=1
+ fi
+ fi
+ fi
+}
diff --git a/scripts/lib_backup.sh b/scripts/lib_backup.sh
new file mode 100644
index 00000000..6867fb6d
--- /dev/null
+++ b/scripts/lib_backup.sh
@@ -0,0 +1,72 @@
+#!/usr/bin/env bash
+# Backup helper utilities shared by copy.sh (and future scripts).
+
+# Create a unique backup directory name with month, day, hours, and minutes.
+get_backup_dirname() {
+ echo "back-up_$(date +"%m%d_%H%M")"
+}
+
+# Move a directory to a timestamped backup alongside the original.
+# Usage: backup_dir "/path/to/dir" [logfile]
+backup_dir() {
+ local dir="$1"
+ local log="${2:-/dev/null}"
+ local backup_suffix
+
+ [ -z "$dir" ] && return 1
+ backup_suffix=$(get_backup_dirname)
+ mv "$dir" "${dir}-backup-${backup_suffix}" 2>&1 | tee -a "$log"
+}
+
+# Cleanup old backups under ~/.config, keeping the newest for each base dir.
+# mode: "auto" (no prompts) or "prompt" (asks before delete); log optional.
+cleanup_backups() {
+ local mode="${1:-prompt}"
+ local log="${2:-/dev/null}"
+ local CONFIG_DIR="$HOME/.config"
+ local BACKUP_PREFIX="-backup"
+
+ for DIR in "$CONFIG_DIR"/*; do
+ [ -d "$DIR" ] || continue
+ local BACKUP_DIRS=()
+
+ for BACKUP in "$DIR"$BACKUP_PREFIX*; do
+ [ -d "$BACKUP" ] && BACKUP_DIRS+=("$BACKUP")
+ done
+
+ [ ${#BACKUP_DIRS[@]} -gt 1 ] || continue
+
+ # Determine latest backup by mtime
+ local latest_backup="${BACKUP_DIRS[0]}"
+ for BACKUP in "${BACKUP_DIRS[@]}"; do
+ [ "$BACKUP" -nt "$latest_backup" ] && latest_backup="$BACKUP"
+ done
+
+ if [ "$mode" = "auto" ]; then
+ for BACKUP in "${BACKUP_DIRS[@]}"; do
+ if [ "$BACKUP" != "$latest_backup" ]; then
+ rm -rf "$BACKUP"
+ fi
+ done
+ echo "${INFO:-[INFO]} Express mode: trimmed backups for ${YELLOW:-}${DIR##*/}${RESET:-}, keeping ${MAGENTA:-}${latest_backup##*/}${RESET:-}." 2>&1 | tee -a "$log"
+ continue
+ fi
+
+ printf "\n%s Found multiple backups for: %s\n" "${INFO:-[INFO]}" "${DIR##*/}"
+ echo "${YELLOW:-}Backups:${RESET:-}"
+ for BACKUP in "${BACKUP_DIRS[@]}"; do
+ echo " - ${BACKUP##*/}"
+ done
+ echo -n "${CAT:-[ACTION]} Delete older backups and keep only the latest? (y/N): "
+ read back_choice
+ if [[ "$back_choice" == [Yy]* ]]; then
+ for BACKUP in "${BACKUP_DIRS[@]}"; do
+ if [ "$BACKUP" != "$latest_backup" ]; then
+ rm -rf "$BACKUP"
+ echo "Deleted: ${BACKUP##*/}"
+ fi
+ done
+ echo "Kept: ${latest_backup##*/}"
+ fi
+ done
+}
diff --git a/scripts/lib_copy.sh b/scripts/lib_copy.sh
new file mode 100644
index 00000000..fa1231c5
--- /dev/null
+++ b/scripts/lib_copy.sh
@@ -0,0 +1,362 @@
+#!/usr/bin/env bash
+# Copy helpers split into phases to keep copy.sh lean.
+
+copy_phase1() {
+ local log="$1"
+ local dirs="fastfetch kitty rofi swaync"
+ for DIR2 in $dirs; do
+ local DIRPATH="$HOME/.config/$DIR2"
+ if [ -d "$DIRPATH" ]; then
+ while true; do
+ printf "\n${INFO:-[INFO]} Found ${YELLOW:-}$DIR2${RESET:-} config found in ~/.config/\n"
+ echo -n "${CAT:-[ACTION]} Do you want to replace ${YELLOW:-}$DIR2${RESET:-} config? (y/n): "
+ read DIR1_CHOICE
+ case "$DIR1_CHOICE" in
+ [Yy]*) BACKUP_DIR=$(get_backup_dirname)
+ mv "$DIRPATH" "$DIRPATH-backup-$BACKUP_DIR" 2>&1 | tee -a "$log"
+ echo -e "${NOTE:-[NOTE]} - Backed up $DIR2 to $DIRPATH-backup-$BACKUP_DIR." 2>&1 | tee -a "$log"
+ cp -r "config/$DIR2" "$HOME/.config/$DIR2" 2>&1 | tee -a "$log"
+ echo -e "${OK:-[OK]} - Replaced $DIR2 with new configuration." 2>&1 | tee -a "$log"
+ if [ "$DIR2" = "rofi" ]; then
+ if [ -d "$DIRPATH-backup-$BACKUP_DIR/themes" ]; then
+ for file in "$DIRPATH-backup-$BACKUP_DIR/themes"/*; do
+ [ -e "$file" ] || continue
+ cp -n "$file" "$HOME/.config/rofi/themes/" >>"$log" 2>&1 || true
+ done || true
+ fi
+ if [ -f "$DIRPATH-backup-$BACKUP_DIR/0-shared-fonts.rasi" ]; then
+ cp "$DIRPATH-backup-$BACKUP_DIR/0-shared-fonts.rasi" "$HOME/.config/rofi/0-shared-fonts.rasi" >>"$log" 2>&1
+ fi
+ fi
+ break ;;
+ [Nn]*) echo -e "${NOTE:-[NOTE]} - Skipping ${YELLOW:-}$DIR2${RESET:-}" 2>&1 | tee -a "$log"; break ;;
+ *) echo -e "${WARN:-[WARN]} - Invalid choice. Please enter Y or N." ;;
+ esac
+ done
+ else
+ cp -r "config/$DIR2" "$HOME/.config/$DIR2" 2>&1 | tee -a "$log"
+ echo -e "${OK:-[OK]} - Copy completed for ${YELLOW:-}$DIR2${RESET:-}" 2>&1 | tee -a "$log"
+ fi
+ done
+}
+
+copy_waybar() {
+ local log="$1"
+ local DIRW="waybar"
+ local DIRPATHw="$HOME/.config/$DIRW"
+ if [ -d "$DIRPATHw" ]; then
+ while true; do
+ echo -n "${CAT:-[ACTION]} Do you want to replace ${YELLOW:-}$DIRW${RESET:-} config? (y/n): "
+ read DIR1_CHOICE
+ case "$DIR1_CHOICE" in
+ [Yy]*) BACKUP_DIR=$(get_backup_dirname)
+ cp -r "$DIRPATHw" "$DIRPATHw-backup-$BACKUP_DIR" 2>&1 | tee -a "$log"
+ echo -e "${NOTE:-[NOTE]} - Backed up $DIRW to $DIRPATHw-backup-$BACKUP_DIR." 2>&1 | tee -a "$log"
+ rm -rf "$DIRPATHw" && cp -r "config/$DIRW" "$DIRPATHw" 2>&1 | tee -a "$log"
+ for file in "config" "style.css"; do
+ symlink="$DIRPATHw-backup-$BACKUP_DIR/$file"
+ target_file="$DIRPATHw/$file"
+ if [ -L "$symlink" ]; then
+ symlink_target=$(readlink "$symlink")
+ if [ -f "$symlink_target" ]; then
+ rm -f "$target_file" && cp -f "$symlink_target" "$target_file"
+ fi
+ fi
+ done
+ for dir in "$DIRPATHw-backup-$BACKUP_DIR/configs"/*; do
+ [ -e "$dir" ] || continue
+ if [ -d "$dir" ]; then
+ target_dir="$HOME/.config/waybar/configs/$(basename "$dir")"
+ [ -d "$target_dir" ] || cp -r "$dir" "$HOME/.config/waybar/configs/"
+ fi
+ done
+ for file in "$DIRPATHw-backup-$BACKUP_DIR/configs"/*; do
+ [ -e "$file" ] || continue
+ target_file="$HOME/.config/waybar/configs/$(basename "$file")"
+ [ -e "$target_file" ] || cp "$file" "$HOME/.config/waybar/configs/"
+ done || true
+ for file in "$DIRPATHw-backup-$BACKUP_DIR/style"/*; do
+ [ -e "$file" ] || continue
+ if [ -d "$file" ]; then
+ target_dir="$HOME/.config/waybar/style/$(basename "$file")"
+ [ -d "$target_dir" ] || cp -r "$file" "$HOME/.config/waybar/style/"
+ else
+ target_file="$HOME/.config/waybar/style/$(basename "$file")"
+ [ -e "$target_file" ] || cp "$file" "$HOME/.config/waybar/style/"
+ fi
+ done || true
+ BACKUP_FILEw="$DIRPATHw-backup-$BACKUP_DIR/UserModules"
+ [ -f "$BACKUP_FILEw" ] && cp -f "$BACKUP_FILEw" "$DIRPATHw/UserModules"
+ break ;;
+ [Nn]*) echo -e "${NOTE:-[NOTE]} - Skipping ${YELLOW:-}$DIRW${RESET:-} config replacement." 2>&1 | tee -a "$log"; break ;;
+ *) echo -e "${WARN:-[WARN]} - Invalid choice. Please enter Y or N." ;;
+ esac
+ done
+ else
+ cp -r "config/$DIRW" "$DIRPATHw" 2>&1 | tee -a "$log"
+ echo -e "${OK:-[OK]} - Copy completed for ${YELLOW:-}$DIRW${RESET:-}" 2>&1 | tee -a "$log"
+ fi
+}
+
+copy_phase2() {
+ local log="$1"
+ local DIR="btop cava hypr Kvantum qt5ct qt6ct swappy wallust wlogout"
+ for DIR_NAME in $DIR; do
+ local DIRPATH="$HOME/.config/$DIR_NAME"
+ if [ -d "$DIRPATH" ]; then
+ echo -e "\n${NOTE:-[NOTE]} - Config for ${YELLOW:-}$DIR_NAME${RESET:-} found, attempting to back up."
+ BACKUP_DIR=$(get_backup_dirname)
+ mv "$DIRPATH" "$DIRPATH-backup-$BACKUP_DIR" 2>&1 | tee -a "$log"
+ fi
+ if [ -d "config/$DIR_NAME" ]; then
+ cp -r "config/$DIR_NAME/" "$HOME/.config/$DIR_NAME" 2>&1 | tee -a "$log"
+ echo "${OK:-[OK]} - Copy of config for ${YELLOW:-}$DIR_NAME${RESET:-} completed!" 2>&1 | tee -a "$log"
+ else
+ echo "${ERROR:-[ERROR]} - Directory config/$DIR_NAME does not exist to copy." 2>&1 | tee -a "$log"
+ fi
+ done
+ install_terminal_configs "$log"
+}
+
+# Restore Animations and Monitor Profiles plus key hypr files from backup
+restore_hypr_assets() {
+ local log="$1"
+ local express_mode="$2"
+
+ local HYPR_DIR="$HOME/.config/hypr"
+ local BACKUP_DIR
+ BACKUP_DIR=$(get_backup_dirname)
+ local BACKUP_HYPR_PATH="$HYPR_DIR-backup-$BACKUP_DIR"
+
+ if [ -d "$BACKUP_HYPR_PATH" ]; then
+ if [ "$express_mode" -eq 1 ]; then
+ echo "${NOTE:-[NOTE]} Express mode: skipping automatic restoration of animations and monitor profiles." 2>&1 | tee -a "$log"
+ return
+ fi
+
+ echo -e "\n${NOTE:-[NOTE]} Restoring ${SKY_BLUE:-}Animations & Monitor Profiles${RESET:-} into ${YELLOW:-}$HYPR_DIR${RESET:-}..."
+
+ local DIR_B=("Monitor_Profiles" "animations" "wallpaper_effects")
+ for DIR_RESTORE in "${DIR_B[@]}"; do
+ local BACKUP_SUBDIR="$BACKUP_HYPR_PATH/$DIR_RESTORE"
+ if [ -d "$BACKUP_SUBDIR" ]; then
+ cp -r "$BACKUP_SUBDIR" "$HYPR_DIR/" 2>&1 | tee -a "$log"
+ echo "${OK:-[OK]} - Restored directory: ${MAGENTA:-}$DIR_RESTORE${RESET:-}" 2>&1 | tee -a "$log"
+ fi
+ done
+
+ local FILE_B=("monitors.conf" "workspaces.conf")
+ for FILE_RESTORE in "${FILE_B[@]}"; do
+ local BACKUP_FILE="$BACKUP_HYPR_PATH/$FILE_RESTORE"
+ if [ -f "$BACKUP_FILE" ]; then
+ cp "$BACKUP_FILE" "$HYPR_DIR/$FILE_RESTORE" 2>&1 | tee -a "$log"
+ echo "${OK:-[OK]} - Restored file: ${MAGENTA:-}$FILE_RESTORE${RESET:-}" 2>&1 | tee -a "$log"
+ fi
+ done
+ fi
+}
+
+# Helper to extract overlay additions/disables from previous user file vs base
+compose_overlay_from_backup() {
+ local type="$1" # startup|windowrules
+ local base_file="$2"
+ local old_user_file="$3"
+ local new_user_file="$4"
+ local disable_file="$5"
+
+ mkdir -p "$(dirname "$new_user_file")"
+ : >"$new_user_file"
+ : >"$disable_file"
+
+ if [ "$type" = "startup" ]; then
+ grep -E '^\s*exec-once\s*=' "$old_user_file" | sed -E 's/^\s+//;s/\s+$//' | sort -u >"$old_user_file.tmp.exec"
+ grep -E '^\s*exec-once\s*=' "$base_file" | sed -E 's/^\s+//;s/\s+$//' | sort -u >"$base_file.tmp.exec"
+ comm -23 "$old_user_file.tmp.exec" "$base_file.tmp.exec" >"$new_user_file"
+ grep -E '^\s*#\s*exec-once\s*=' "$old_user_file" |
+ sed -E 's/^\s*#\s*exec-once\s*=\s*//' |
+ sed -E 's/^\s+//;s/\s+$//' |
+ grep -Ev '^\$scriptsDir/KeybindsLayoutInit\.sh$' |
+ sort -u >"$disable_file"
+ rm -f "$old_user_file.tmp.exec" "$base_file.tmp.exec"
+ elif [ "$type" = "windowrules" ]; then
+ grep -E '^(windowrule|layerrule)\s*=' "$old_user_file" | sed -E 's/^\s+//;s/\s+$//' | sort -u >"$old_user_file.tmp.rules"
+ grep -E '^(windowrule|layerrule)\s*=' "$base_file" | sed -E 's/^\s+//;s/\s+$//' | sort -u >"$base_file.tmp.rules"
+ comm -23 "$old_user_file.tmp.rules" "$base_file.tmp.rules" >"$new_user_file"
+ grep -E '^\s*#\s*(windowrule|layerrule)\s*=' "$old_user_file" | sed -E 's/^\s*#\s*//' | sed -E 's/^\s+//;s/\s+$//' | sort -u >"$disable_file"
+ rm -f "$old_user_file.tmp.rules" "$base_file.tmp.rules"
+ fi
+}
+
+restore_user_configs() {
+ local log="$1"
+ local express_mode="$2"
+
+ local DIRPATH="$HOME/.config/hypr"
+ local BACKUP_DIR
+ BACKUP_DIR=$(get_backup_dirname)
+ local BACKUP_DIR_PATH="$DIRPATH-backup-$BACKUP_DIR/UserConfigs"
+
+ if [ -z "$BACKUP_DIR" ]; then
+ echo "${ERROR:-[ERROR]} - Backup directory name is empty. Exiting." 2>&1 | tee -a "$log"
+ exit 1
+ fi
+
+ if [ -d "$BACKUP_DIR_PATH" ] && [ "$express_mode" -eq 1 ]; then
+ echo "${NOTE:-[NOTE]} Express mode: skipping UserConfigs restoration prompts." 2>&1 | tee -a "$log"
+ return
+ fi
+
+ if [ -d "$BACKUP_DIR_PATH" ] && [ "$express_mode" -eq 0 ]; then
+ local VERSION_FILE
+ VERSION_FILE=$(find "$DIRPATH" -maxdepth 1 -name "v*.*.*" | head -n 1)
+ local CURRENT_VERSION="999.9.9"
+ if [ -n "$VERSION_FILE" ]; then
+ CURRENT_VERSION=$(basename "$VERSION_FILE" | sed 's/^v//')
+ fi
+
+ local TARGET_VERSION="2.3.19"
+
+ echo -e "${NOTE:-[NOTE]} Restoring previous ${MAGENTA:-}User-Configs${RESET:-}... " 2>&1 | tee -a "$log"
+ printf "${WARNING:-}\
+ █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█\n\
+ NOTES for RESTORING PREVIOUS CONFIGS\n\
+ █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█\n\n\
+ The 'UserConfigs' directory is for all your personal settings.\n\
+ Files in this directory will override the default configurations,\n\
+ so your customizations are not lost when you update.\n\
+" >&2
+
+ if version_gte "$CURRENT_VERSION" "$TARGET_VERSION"; then
+ read -r -p "${CAT:-[ACTION]} Do you want to restore your previous UserConfigs directory? (Y/n): " restore_userconfigs_dir
+ if [[ "$restore_userconfigs_dir" != [Nn]* ]]; then
+ echo "${NOTE:-[NOTE]} Restoring UserConfigs directory..." 2>&1 | tee -a "$log"
+ rsync -a "$BACKUP_DIR_PATH/" "$DIRPATH/UserConfigs/" 2>&1 | tee -a "$log"
+ echo "${OK:-[OK]} - UserConfigs directory restored." 2>&1 | tee -a "$log"
+ else
+ echo "${NOTE:-[NOTE]} - Skipped restoring UserConfigs." 2>&1 | tee -a "$log"
+ fi
+ else
+ echo -e "${NOTE:-[NOTE]} Detected version ${YELLOW:-}v$CURRENT_VERSION${RESET:-} (older than v$TARGET_VERSION). Using legacy restoration mode." 2>&1 | tee -a "$log"
+
+ local FILES_TO_RESTORE=(
+ "01-UserDefaults.conf"
+ "ENVariables.conf"
+ "LaptopDisplay.conf"
+ "Laptops.conf"
+ "Startup_Apps.conf"
+ "UserDecorations.conf"
+ "UserAnimations.conf"
+ "UserKeybinds.conf"
+ "UserSettings.conf"
+ "WindowRules.conf"
+ )
+
+ for FILE_NAME in "${FILES_TO_RESTORE[@]}"; do
+ local BACKUP_FILE="$BACKUP_DIR_PATH/$FILE_NAME"
+ if [ -f "$BACKUP_FILE" ]; then
+ if [ "$FILE_NAME" = "Startup_Apps.conf" ]; then
+ compose_overlay_from_backup "startup" "$DIRPATH/configs/Startup_Apps.conf" "$BACKUP_FILE" "$DIRPATH/UserConfigs/Startup_Apps.conf" "$DIRPATH/UserConfigs/Startup_Apps.disable"
+ echo "${OK:-[OK]} - Migrated overlay for ${YELLOW:-}$FILE_NAME${RESET:-}" 2>&1 | tee -a "$log"
+ continue
+ fi
+ if [ "$FILE_NAME" = "WindowRules.conf" ]; then
+ compose_overlay_from_backup "windowrules" "$DIRPATH/configs/WindowRules.conf" "$BACKUP_FILE" "$DIRPATH/UserConfigs/WindowRules.conf" "$DIRPATH/UserConfigs/WindowRules.disable"
+ echo "${OK:-[OK]} - Migrated overlay for ${YELLOW:-}$FILE_NAME${RESET:-}" 2>&1 | tee -a "$log"
+ continue
+ fi
+
+ printf "\n${INFO:-[INFO]} Found ${YELLOW:-}$FILE_NAME${RESET:-} in hypr backup...\n"
+ read -r -p "${CAT:-[ACTION]} Do you want to restore ${YELLOW:-}$FILE_NAME${RESET:-} from backup? (Y/n): " file_restore
+
+ if [[ "$file_restore" != [Nn]* ]]; then
+ if cp "$BACKUP_FILE" "$DIRPATH/UserConfigs/$FILE_NAME"; then
+ echo "${OK:-[OK]} - $FILE_NAME restored!" 2>&1 | tee -a "$log"
+ else
+ echo "${ERROR:-[ERROR]} - Failed to restore $FILE_NAME!" 2>&1 | tee -a "$log"
+ fi
+ else
+ echo "${NOTE:-[NOTE]} - Skipped restoring $FILE_NAME." 2>&1 | tee -a "$log"
+ fi
+ fi
+ done
+ fi
+ fi
+}
+
+restore_user_scripts() {
+ local log="$1"
+ local express_mode="$2"
+
+ local DIRSHPATH="$HOME/.config/hypr"
+ local BACKUP_DIR
+ BACKUP_DIR=$(get_backup_dirname)
+ local BACKUP_DIR_PATH_S="$DIRSHPATH-backup-$BACKUP_DIR/UserScripts"
+ local SCRIPTS_TO_RESTORE=("RofiBeats.sh" "Weather.py" "Weather.sh")
+
+ if [ -d "$BACKUP_DIR_PATH_S" ] && [ "$express_mode" -eq 1 ]; then
+ echo "${NOTE:-[NOTE]} Express mode: skipping UserScripts restoration prompts." 2>&1 | tee -a "$log"
+ return
+ fi
+
+ if [ -d "$BACKUP_DIR_PATH_S" ] && [ "$express_mode" -eq 0 ]; then
+ echo -e "${NOTE:-[NOTE]} Restoring previous ${MAGENTA:-}User-Scripts${RESET:-}..." 2>&1 | tee -a "$log"
+
+ for SCRIPT_NAME in "${SCRIPTS_TO_RESTORE[@]}"; do
+ local BACKUP_SCRIPT="$BACKUP_DIR_PATH_S/$SCRIPT_NAME"
+ if [ -f "$BACKUP_SCRIPT" ]; then
+ printf "\n${INFO:-[INFO]} Found ${YELLOW:-}$SCRIPT_NAME${RESET:-} in hypr backup...\n"
+ read -r -p "${CAT:-[ACTION]} Do you want to restore ${YELLOW:-}$SCRIPT_NAME${RESET:-} from backup? (y/N): " script_restore
+
+ if [[ "$script_restore" == [Yy]* ]]; then
+ if cp "$BACKUP_SCRIPT" "$DIRSHPATH/UserScripts/$SCRIPT_NAME"; then
+ echo "${OK:-[OK]} - $SCRIPT_NAME restored!" 2>&1 | tee -a "$log"
+ else
+ echo "${ERROR:-[ERROR]} - Failed to restore $SCRIPT_NAME!" 2>&1 | tee -a "$log"
+ fi
+ else
+ echo "${NOTE:-[NOTE]} - Skipped restoring $SCRIPT_NAME." 2>&1 | tee -a "$log"
+ fi
+ fi
+ done
+ fi
+}
+
+restore_hypr_files() {
+ local log="$1"
+ local express_mode="$2"
+
+ local DIRPATH="$HOME/.config/hypr"
+ local BACKUP_DIR
+ BACKUP_DIR=$(get_backup_dirname)
+ local BACKUP_DIR_PATH_F="$DIRPATH-backup-$BACKUP_DIR"
+ local FILES_2_RESTORE=("hyprlock.conf" "hypridle.conf")
+
+ if [ -d "$BACKUP_DIR_PATH_F" ] && [ "$express_mode" -eq 1 ]; then
+ echo "${NOTE:-[NOTE]} Express mode: skipping individual hypr file restoration prompts." 2>&1 | tee -a "$log"
+ return
+ fi
+
+ if [ -d "$BACKUP_DIR_PATH_F" ] && [ "$express_mode" -eq 0 ]; then
+ echo -e "${NOTE:-[NOTE]} Restoring some files in ${MAGENTA:-}$HOME/.config/hypr directory${RESET:-}..." 2>&1 | tee -a "$log"
+
+ for FILE_RESTORE in "${FILES_2_RESTORE[@]}"; do
+ local BACKUP_FILE="$BACKUP_DIR_PATH_F/$FILE_RESTORE"
+ if [ -f "$BACKUP_FILE" ]; then
+ echo -e "\n${INFO:-[INFO]} Found ${YELLOW:-}$FILE_RESTORE${RESET:-} in hypr backup..."
+ read -r -p "${CAT:-[ACTION]} Do you want to restore ${YELLOW:-}$FILE_RESTORE${RESET:-} from backup? (y/N): " file2restore
+
+ if [[ "$file2restore" == [Yy]* ]]; then
+ if cp "$BACKUP_FILE" "$DIRPATH/$FILE_RESTORE"; then
+ echo "${OK:-[OK]} - $FILE_RESTORE restored!" 2>&1 | tee -a "$log"
+ else
+ echo "${ERROR:-[ERROR]} - Failed to restore $FILE_RESTORE!" 2>&1 | tee -a "$log"
+ fi
+ else
+ echo "${NOTE:-[NOTE]} - Skipped restoring $FILE_RESTORE." 2>&1 | tee -a "$log"
+ fi
+ else
+ echo "${ERROR:-[ERROR]} - Backup file $BACKUP_FILE does not exist." 2>&1 | tee -a "$log"
+ fi
+ done
+ fi
+}
diff --git a/scripts/lib_detect.sh b/scripts/lib_detect.sh
new file mode 100644
index 00000000..5cb26c1b
--- /dev/null
+++ b/scripts/lib_detect.sh
@@ -0,0 +1,49 @@
+#!/usr/bin/env bash
+# Detection and environment adjustment helpers shared by copy.sh.
+
+# Nvidia tweaks: uncomments envs and adjusts hardware cursor setting.
+detect_nvidia_adjust() {
+ local log="$1"
+ if lspci -k | grep -A 2 -E "(VGA|3D)" | grep -iq nvidia; then
+ echo "${INFO:-[INFO]} Nvidia GPU detected. Setting up proper env's and configs" 2>&1 | tee -a "$log" || true
+ sed -i '/env = LIBVA_DRIVER_NAME,nvidia/s/^#//' config/hypr/configs/ENVariables.conf
+ sed -i '/env = __GLX_VENDOR_LIBRARY_NAME,nvidia/s/^#//' config/hypr/configs/ENVariables.conf
+ sed -i '/env = NVD_BACKEND,direct/s/^#//' config/hypr/configs/ENVariables.conf
+ sed -i '/env = GSK_RENDERER,ngl/s/^#//' config/hypr/configs/ENVariables.conf
+ sed -i 's/^\([[:space:]]*no_hardware_cursors[[:space:]]*=[[:space:]]*\)2/\1 1/' config/hypr/configs/SystemSettings.conf
+ fi
+}
+
+# VM tweaks: enable software renderer envs and virtual monitor defaults.
+detect_vm_adjust() {
+ local log="$1"
+ if hostnamectl | grep -q 'Chassis: vm'; then
+ echo "${INFO:-[INFO]} System is running in a virtual machine. Setting up proper env's and configs" 2>&1 | tee -a "$log" || true
+ sed -i 's/^\([[:space:]]*no_hardware_cursors[[:space:]]*=[[:space:]]*\)2/\1 1/' config/hypr/configs/SystemSettings.conf
+ sed -i '/env = WLR_RENDERER_ALLOW_SOFTWARE,1/s/^#//' config/hypr/configs/ENVariables.conf
+ sed -i '/monitor = Virtual-1, 1920x1080@60,auto,1/s/^#//' config/hypr/monitors.conf
+ fi
+}
+
+# NixOS tweaks: ensure polkit overlay is enabled and default disabled.
+detect_nixos_adjust() {
+ local log="$1"
+ if hostnamectl | grep -q 'Operating System: NixOS'; then
+ echo "${INFO:-[INFO]} NixOS Distro Detected. Setting up proper env's and configs." 2>&1 | tee -a "$log" || true
+ local OVERLAY_SA="config/hypr/configs/Startup_Apps.conf"
+ local DISABLE_SA="config/hypr/configs/Startup_Apps.disable"
+ mkdir -p "$(dirname "$OVERLAY_SA")"
+ touch "$OVERLAY_SA" "$DISABLE_SA"
+ grep -qx 'exec-once = $scriptsDir/Polkit-NixOS.sh' "$OVERLAY_SA" || echo 'exec-once = $scriptsDir/Polkit-NixOS.sh' >>"$OVERLAY_SA"
+ grep -qx '\$scriptsDir/Polkit.sh' "$DISABLE_SA" || echo '$scriptsDir/Polkit.sh' >>"$DISABLE_SA"
+ fi
+}
+
+# Decide waybar config/style based on chassis type. Echoes chosen config path.
+detect_waybar_config() {
+ if hostnamectl | grep -q 'Chassis: desktop'; then
+ echo "desktop"
+ else
+ echo "laptop"
+ fi
+}
diff --git a/scripts/lib_prompts.sh b/scripts/lib_prompts.sh
new file mode 100644
index 00000000..bf6fafd7
--- /dev/null
+++ b/scripts/lib_prompts.sh
@@ -0,0 +1,249 @@
+#!/usr/bin/env bash
+# User interaction helpers extracted from copy.sh. Each helper echoes state or sets
+# globals deliberately to minimize side effects.
+
+# Detect keyboard layout via localectl or setxkbmap.
+prompt_detect_layout() {
+ if command -v localectl >/dev/null 2>&1; then
+ local layout
+ layout=$(localectl status --no-pager | awk '/X11 Layout/ {print $3}')
+ [ -n "$layout" ] && { echo "$layout"; return; }
+ fi
+ if command -v setxkbmap >/dev/null 2>&1; then
+ local layout
+ layout=$(setxkbmap -query | awk '/layout/ {print $2}')
+ [ -n "$layout" ] && { echo "$layout"; return; }
+ fi
+ echo "(unset)"
+}
+
+# Confirm or set keyboard layout; writes to SystemSettings.conf.
+prompt_keyboard_layout() {
+ local layout="$1"
+ local log="$2"
+
+ if [ "$layout" = "(unset)" ]; then
+ while true; do
+ printf "\n%.0s" {1..1}
+ print_color $WARNING "\n █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
+ STOP AND READ
+ █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
+
+ !!! IMPORTANT WARNING !!!
+
+The Default Keyboard Layout could not be detected
+You need to set it Manually
+
+ !!! WARNING !!!
+
+Setting a wrong Keyboard Layout will cause Hyprland to crash
+If you are not sure, just type ${YELLOW}us${RESET}
+${SKYBLUE}You can change later in ~/.config/hypr/UserConfigs/UserSettings.conf${RESET}
+
+${MAGENTA} NOTE:${RESET}
+• You can also set more than 2 keyboard layouts
+• For example: ${YELLOW}us, kr, gb, ru${RESET}
+"
+ printf "\n%.0s" {1..1}
+
+ echo -n "${CAT} - Please enter the correct keyboard layout: "
+ read new_layout
+
+ if [ -n "$new_layout" ]; then
+ layout="$new_layout"
+ break
+ else
+ echo "${CAT} Please enter a keyboard layout."
+ fi
+ done
+ fi
+
+ printf "${NOTE} Detecting keyboard layout to prepare proper Hyprland Settings\n"
+ while true; do
+ printf "${INFO} Current keyboard layout is ${MAGENTA}$layout${RESET}\n"
+ echo -n "${CAT} Is this correct? [y/n] "
+ read keyboard_layout
+ case $keyboard_layout in
+ [yY])
+ awk -v layout="$layout" '/kb_layout/ {$0 = " kb_layout = " layout} 1' config/hypr/configs/SystemSettings.conf >temp.conf
+ mv temp.conf config/hypr/configs/SystemSettings.conf
+ echo "${NOTE} kb_layout ${MAGENTA}$layout${RESET} configured in settings." 2>&1 | tee -a "$log"
+ break
+ ;;
+ [nN])
+ printf "\n%.0s" {1..2}
+ print_color $WARNING "
+ █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
+ STOP AND READ
+ █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
+
+ !!! IMPORTANT WARNING !!!
+
+The Default Keyboard Layout could not be detected
+You need to set it Manually
+
+ !!! WARNING !!!
+
+Setting a wrong Keyboard Layout will cause Hyprland to crash
+If you are not sure, just type ${YELLOW}us${RESET}
+${SKYBLUE}You can change later in ~/.config/hypr/UserConfigs/UserSettings.conf${RESET}
+
+${MAGENTA} NOTE:${RESET}
+• You can also set more than 2 keyboard layouts
+• For example: ${YELLOW}us, kr, gb, ru${RESET}
+"
+ printf "\n%.0s" {1..1}
+ echo -n "${CAT} - Please enter the correct keyboard layout: "
+ read new_layout
+ awk -v new_layout="$new_layout" '/kb_layout/ {$0 = " kb_layout = " new_layout} 1' config/hypr/configs/SystemSettings.conf >temp.conf
+ mv temp.conf config/hypr/configs/SystemSettings.conf
+ echo "${OK} kb_layout $new_layout configured in settings." 2>&1 | tee -a "$log"
+ break
+ ;;
+ *)
+ echo "${ERROR} Please enter either 'y' or 'n'."
+ ;;
+ esac
+ done
+}
+
+# Prompt for resolution choice; echoes "< 1440p" or "≥ 1440p".
+prompt_resolution_choice() {
+ local choice
+ while true; do
+ echo "${INFO:-[INFO]} Select monitor resolution for scaling:"
+ echo " 1) < 1440p (lower DPI; smaller displays)"
+ echo " 2) ≥ 1440p (default; 1440p/2k/4k)"
+
+ if ! read -r -p "${CAT} Enter the number of your choice (1 or 2): " choice </dev/tty; then
+ echo "${ERROR} Unable to read input (tty unavailable)."
+ continue
+ fi
+ echo "${INFO:-[INFO]} You entered: '$choice'"
+ case "$choice" in
+ 1) echo "< 1440p"; return ;;
+ 2) echo "≥ 1440p"; return ;;
+ *) echo "${ERROR} Invalid choice. Please enter 1 for < 1440p or 2 for ≥ 1440p." ;;
+ esac
+ done
+}
+
+# Prompt for 12H clock; sets waybar/hyprlock/SDDM changes when accepted.
+prompt_clock_12h() {
+ local log="$1"
+ while true; do
+ echo -e "${NOTE} ${SKY_BLUE} By default, KooL's Dots are configured in 24H clock format."
+ echo -n "$CAT Do you want to change to 12H (AM/PM) clock format? (y/n): "
+ read answer
+ answer=$(echo "$answer" | tr '[:upper:]' '[:lower:]')
+ if [[ "$answer" == "y" ]]; then
+ # waybar clocks
+ sed -i 's#^\(\s*\)//\("format": " {:%I:%M %p}",\) #\1\2 #g' config/waybar/Modules 2>&1 | tee -a "$log"
+ sed -i 's#^\(\s*\)\("format": " {:%H:%M:%S}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$log"
+ sed -i 's#^\(\s*\)\("format": " {:%H:%M}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$log"
+ sed -i 's#^\(\s*\)//\("format": "{:%I:%M %p - %d/%b}",\) #\1\2#g' config/waybar/Modules 2>&1 | tee -a "$log"
+ sed -i 's#^\(\s*\)\("format": "{:%H:%M - %d/%b}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$log"
+ sed -i 's#^\(\s*\)//\("format": "{:%B | %a %d, %Y | %I:%M %p}",\) #\1\2#g' config/waybar/Modules 2>&1 | tee -a "$log"
+ sed -i 's#^\(\s*\)\("format": "{:%B | %a %d, %Y | %H:%M}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$log"
+ sed -i 's#^\(\s*\)//\("format": "{:%A, %I:%M %P}",\) #\1\2#g' config/waybar/Modules 2>&1 | tee -a "$log"
+ sed -i 's#^\(\s*\)\("format": "{:%a %d | %H:%M}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$log"
+
+ # hyprlock
+ local HYPRLOCK_FILE="config/hypr/hyprlock.conf"
+ if [ ! -f "$HYPRLOCK_FILE" ] && [ -f "config/hypr/hyprlock-1080p.conf" ]; then
+ HYPRLOCK_FILE="config/hypr/hyprlock-1080p.conf"
+ fi
+ if [ -f "$HYPRLOCK_FILE" ]; then
+ sed -i 's/^\s*text = cmd\[update:1000\] echo \"\$(date +\"%H\")\"/# &/' "$HYPRLOCK_FILE" 2>&1 | tee -a "$log"
+ sed -i 's/^\(\s*\)# *text = cmd\[update:1000\] echo \"\$(date +\"%I\")\" #AM\/PM/\1 text = cmd\[update:1000\] echo \"\$(date +\"%I\")\" #AM\/PM/' "$HYPRLOCK_FILE" 2>&1 | tee -a "$log"
+ sed -i 's/^\s*text = cmd\[update:1000\] echo \"\$(date +\"%S\")\"/# &/' "$HYPRLOCK_FILE" 2>&1 | tee -a "$log"
+ sed -i 's/^\(\s*\)# *text = cmd\[update:1000\] echo \"\$(date +\"%S %p\")\" #AM\/PM/\1 text = cmd\[update:1000\] echo \"\$(date +\"%S %p\")\" #AM\/PM/' "$HYPRLOCK_FILE" 2>&1 | tee -a "$log"
+ else
+ echo "${WARN} hyprlock template not found; skipping 12H lock format edits" 2>&1 | tee -a "$log"
+ fi
+
+ if [ "${EXPRESS_MODE:-0}" -eq 0 ]; then
+ apply_sddm_12h_format "/usr/share/sddm/themes/simple-sddm" "$log"
+ apply_sddm_12h_format "/usr/share/sddm/themes/simple_sddm_2" "$log"
+ apply_sddm_12h_format_sequoia "/usr/share/sddm/themes/sequoia_2" "$log"
+ else
+ echo "${NOTE:-[NOTE]} Express mode: skipping SDDM 12H edits to avoid sudo prompts." 2>&1 | tee -a "$log"
+ fi
+ echo "${OK} 12H format set on waybar clocks succesfully." 2>&1 | tee -a "$log"
+ return
+ elif [[ "$answer" == "n" ]]; then
+ echo "${NOTE} You chose not to change to 12H format." 2>&1 | tee -a "$log"
+ return
+ else
+ echo "${ERROR} Invalid choice. Please enter y for yes or n for no."
+ fi
+ done
+}
+
+apply_sddm_12h_format() {
+ local sddm_directory="$1"
+ local log="$2"
+ if [ -d "$sddm_directory" ]; then
+ echo "Editing ${SKY_BLUE}$sddm_directory${RESET} to 12H format" 2>&1 | tee -a "$log"
+ if ! sudo -n sed -i 's|^## HourFormat="hh:mm AP"|HourFormat="hh:mm AP"|' "$sddm_directory/theme.conf" 2>&1 | tee -a "$log"; then
+ echo "${WARN:-[WARN]} Skipping SDDM 12H edit (sudo password required)." 2>&1 | tee -a "$log"
+ return
+ fi
+ sudo -n sed -i 's|^HourFormat="HH:mm"|## HourFormat="HH:mm"|' "$sddm_directory/theme.conf" 2>&1 | tee -a "$log" || true
+ fi
+}
+
+apply_sddm_12h_format_sequoia() {
+ local sddm_directory="$1"
+ local log="$2"
+ if [ -d "$sddm_directory" ]; then
+ echo "${YELLOW}sddm sequoia_2${RESET} theme exists. Editing to 12H format" 2>&1 | tee -a "$log"
+ if ! sudo -n sed -i 's|^clockFormat="HH:mm"|## clockFormat="HH:mm"|' "$sddm_directory/theme.conf" 2>&1 | tee -a "$log"; then
+ echo "${WARN:-[WARN]} Skipping sequoia SDDM 12H edit (sudo password required)." 2>&1 | tee -a "$log"
+ return
+ fi
+ if ! grep -q 'clockFormat="hh:mm AP"' "$sddm_directory/theme.conf"; then
+ sudo -n sed -i '/^clockFormat=/a clockFormat="hh:mm AP"' "$sddm_directory/theme.conf" 2>&1 | tee -a "$log" || true
+ fi
+ echo "${OK} 12H format set to SDDM successfully." 2>&1 | tee -a "$log"
+ fi
+}
+
+
+# Express upgrade confirmation; may set EXPRESS_MODE=1.
+prompt_express_upgrade() {
+ local express_supported="$1"
+ local log="$2"
+ if [ "$EXPRESS_MODE" -eq 1 ] && [ "$express_supported" -eq 0 ]; then
+ echo "${NOTE} Express mode requires installed dotfiles v${MIN_EXPRESS_VERSION} or newer. Continuing with standard upgrade prompts." 2>&1 | tee -a "$log"
+ EXPRESS_MODE=0
+ return
+ fi
+ if [ "$UPGRADE_MODE" -eq 1 ] && [ "$EXPRESS_MODE" -eq 0 ]; then
+ if [ "$express_supported" -eq 0 ]; then
+ echo "${NOTE} Express mode requires installed dotfiles v${MIN_EXPRESS_VERSION} or newer. Continuing with standard upgrade prompts." 2>&1 | tee -a "$log"
+ else
+ while true; do
+ echo "${NOTE} Express mode skips config restore prompts, SDDM/background questions, and trims old backups."
+ if ! read -r -p "${CAT} Do you want to continue with EXPRESS upgrade mode? (y/N): " express_choice </dev/tty; then
+ echo "${ERROR} Unable to read input for express choice; defaulting to standard prompts." 2>&1 | tee -a "$log"
+ break
+ fi
+ case "$express_choice" in
+ [Yy])
+ EXPRESS_MODE=1
+ echo "${INFO} Express mode enabled for this upgrade." 2>&1 | tee -a "$log"
+ break
+ ;;
+ [Nn] | "")
+ echo "${NOTE} Continuing with standard upgrade prompts." 2>&1 | tee -a "$log"
+ break
+ ;;
+ *)
+ echo "${WARN} Please answer y or n."
+ ;;
+ esac
+ done
+ fi
+ fi
+}
diff --git a/scripts/lib_update.sh b/scripts/lib_update.sh
new file mode 100644
index 00000000..0a70dff0
--- /dev/null
+++ b/scripts/lib_update.sh
@@ -0,0 +1,84 @@
+#!/usr/bin/env bash
+
+# run_repo_update
+# Arguments:
+# $1 - expected repository root (typically SCRIPT_DIR from copy.sh)
+# Behavior:
+# * Verifies the script is executed from Hyprland-Dots root.
+# * Stashes local changes (including untracked), pulls latest changes.
+# * Shows progress, reports errors, and summarizes results.
+# * Waits for user input before returning control to caller.
+run_repo_update() {
+ local repo_dir="${1:-$(pwd)}"
+ local expected_name="Hyprland-Dots"
+ local log_dir="$repo_dir/Copy-Logs"
+ local log_file="$log_dir/update-$(date +%d-%H%M%S)_git.log"
+
+ mkdir -p "$log_dir"
+
+ echo "${INFO} Starting repository update..." | tee -a "$log_file"
+
+ if [ ! -d "$repo_dir" ] || [ "$(basename "$repo_dir")" != "$expected_name" ]; then
+ echo "${ERROR} This helper must be run from the $expected_name directory. Current: $(pwd)" | tee -a "$log_file"
+ read -n1 -s -r -p "Press any key to return to the menu..."
+ echo
+ return 1
+ fi
+
+ if [ "$PWD" != "$repo_dir" ]; then
+ echo "${INFO} Changing directory to $repo_dir" | tee -a "$log_file"
+ cd "$repo_dir" || {
+ echo "${ERROR} Failed to change directory to $repo_dir" | tee -a "$log_file"
+ read -n1 -s -r -p "Press any key to return to the menu..."
+ echo
+ return 1
+ }
+ fi
+
+ local head_before stash_msg pull_status=0
+ head_before=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
+
+ echo "${INFO} Checking working tree..." | tee -a "$log_file"
+ if git diff --quiet && git diff --cached --quiet; then
+ stash_msg="No local changes; no stash created."
+ echo "${NOTE} $stash_msg" | tee -a "$log_file"
+ else
+ echo "${INFO} Stashing local changes (tracked + untracked)..." | tee -a "$log_file"
+ if stash_output=$(git stash push -u 2>&1); then
+ stash_msg="Created stash: $(echo "$stash_output" | head -n1)"
+ echo "${OK} $stash_msg" | tee -a "$log_file"
+ else
+ echo "${ERROR} git stash failed. Details:" | tee -a "$log_file"
+ echo "$stash_output" | tee -a "$log_file"
+ read -n1 -s -r -p "Press any key to return to the menu..."
+ echo
+ return 1
+ fi
+ fi
+
+ echo "${INFO} Pulling latest changes..." | tee -a "$log_file"
+ if git pull --ff-only 2>&1 | tee -a "$log_file"; then
+ pull_status=0
+ echo "${OK} Repository updated successfully." | tee -a "$log_file"
+ else
+ pull_status=$?
+ echo "${ERROR} git pull failed (exit $pull_status)." | tee -a "$log_file"
+ fi
+
+ local head_after
+ head_after=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
+
+ echo "----------------------------------------" | tee -a "$log_file"
+ echo "Summary:" | tee -a "$log_file"
+ echo " Repo : $repo_dir" | tee -a "$log_file"
+ echo " HEAD before : $head_before" | tee -a "$log_file"
+ echo " HEAD after : $head_after" | tee -a "$log_file"
+ echo " Stash : $stash_msg" | tee -a "$log_file"
+ echo " Pull status : $( [ $pull_status -eq 0 ] && echo success || echo failure )" | tee -a "$log_file"
+ echo "----------------------------------------" | tee -a "$log_file"
+
+ read -n1 -s -r -p "Press any key to return to the main menu..."
+ echo
+
+ return $pull_status
+}
diff --git a/update-dots.sh b/update-dots.sh
new file mode 100755
index 00000000..84bd7611
--- /dev/null
+++ b/update-dots.sh
@@ -0,0 +1,81 @@
+#!/usr/bin/env bash
+set -euo pipefail
+IFS=$'\n\t'
+
+if [[ -t 1 ]]; then
+ BOLD="$(tput bold || true)"
+ DIM="$(tput dim || true)"
+ RED="$(tput setaf 1 || true)"
+ GREEN="$(tput setaf 2 || true)"
+ YELLOW="$(tput setaf 3 || true)"
+ BLUE="$(tput setaf 4 || true)"
+ RESET="$(tput sgr0 || true)"
+else
+ BOLD=""; DIM=""; RED=""; GREEN=""; YELLOW=""; BLUE=""; RESET=""
+fi
+
+log() { printf "%b\n" "${BLUE}==>${RESET} $*"; }
+ok() { printf "%b\n" "${GREEN}✔${RESET} $*"; }
+warn() { printf "%b\n" "${YELLOW}⚠${RESET} $*"; }
+err() { printf "%b\n" "${RED}✖${RESET} $*"; }
+
+log "${BOLD}Hyprland-Dots updater${RESET}"
+
+if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
+ err "Not inside a git repository."
+ exit 1
+fi
+
+branch="$(git rev-parse --abbrev-ref HEAD)"
+if [[ "$branch" == "HEAD" ]]; then
+ warn "Detached HEAD state detected."
+fi
+
+log "Fetching remote updates..."
+git fetch --tags --quiet
+
+upstream=""
+if git rev-parse --abbrev-ref --symbolic-full-name "@{u}" >/dev/null 2>&1; then
+ upstream="$(git rev-parse --abbrev-ref --symbolic-full-name "@{u}")"
+else
+ if git show-ref --verify --quiet "refs/remotes/origin/${branch}"; then
+ upstream="origin/${branch}"
+ fi
+fi
+
+if [[ -z "$upstream" ]]; then
+ err "No upstream found for branch '${branch}'."
+ exit 1
+fi
+
+log "Current branch: ${BOLD}${branch}${RESET}"
+log "Upstream: ${BOLD}${upstream}${RESET}"
+
+behind_count="$(git rev-list --count "HEAD..${upstream}")"
+ahead_count="$(git rev-list --count "${upstream}..HEAD")"
+
+if [[ "$behind_count" -eq 0 ]]; then
+ ok "Already up to date with ${upstream}."
+ if [[ "$ahead_count" -gt 0 ]]; then
+ warn "Local branch is ahead by ${ahead_count} commit(s)."
+ fi
+ exit 0
+fi
+
+warn "Updates available: behind by ${behind_count} commit(s)."
+read -r -p "Update now? [y/N] " reply
+case "${reply:-}" in
+ y|Y|yes|YES)
+ log "Stashing local changes..."
+ git stash -u
+
+ log "Pulling latest changes from ${upstream}..."
+ git pull
+
+ ok "Update complete."
+ printf "%b\n" "${DIM}Next: run ./copy.sh to upgrade the Hyprland dotfiles.${RESET}"
+ ;;
+ *)
+ warn "Update cancelled."
+ ;;
+esac
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage