From 53f512c4c4bb63f16f629324f09ccd8130fdaa19 Mon Sep 17 00:00:00 2001 From: SirBlobby Date: Sun, 19 Apr 2026 21:57:22 -0400 Subject: [PATCH] Update configurations: add hyprland, README, and dynamic AGS theming --- README.md | 48 ++++++++++++++++++++++++++++ ags/style.css | 12 ++++--- hypr/autostart.conf | 3 ++ hypr/bindings.conf | 34 ++++++++++++++++++++ hypr/hypridle.conf | 28 ++++++++++++++++ hypr/hyprland.conf | 23 +++++++++++++ hypr/hyprlock.conf | 55 ++++++++++++++++++++++++++++++++ hypr/hyprsunset.conf | 14 ++++++++ hypr/input.conf | 54 +++++++++++++++++++++++++++++++ hypr/looknfeel.conf | 34 ++++++++++++++++++++ hypr/monitors.conf | 23 +++++++++++++ hypr/xdph.conf | 4 +++ install.sh | 6 ++++ omarchy/hooks/battery-low.sample | 10 ++++++ omarchy/hooks/font-set.sample | 7 ++++ omarchy/hooks/post-update.sample | 7 ++++ omarchy/hooks/theme-set | 12 +++++++ omarchy/hooks/theme-set.sample | 7 ++++ 18 files changed, 376 insertions(+), 5 deletions(-) create mode 100644 README.md create mode 100644 hypr/autostart.conf create mode 100644 hypr/bindings.conf create mode 100644 hypr/hypridle.conf create mode 100644 hypr/hyprland.conf create mode 100644 hypr/hyprlock.conf create mode 100644 hypr/hyprsunset.conf create mode 100644 hypr/input.conf create mode 100644 hypr/looknfeel.conf create mode 100644 hypr/monitors.conf create mode 100644 hypr/xdph.conf create mode 100644 omarchy/hooks/battery-low.sample create mode 100644 omarchy/hooks/font-set.sample create mode 100644 omarchy/hooks/post-update.sample create mode 100755 omarchy/hooks/theme-set create mode 100644 omarchy/hooks/theme-set.sample diff --git a/README.md b/README.md new file mode 100644 index 0000000..99817d4 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +
+

Blob's Dotfiles

+

My personal system configurations for a custom Wayland desktop environment.

+ + Arch Linux + Hyprland + Waybar + AGS +
+ +## What's Inside? + +My current setup is built around these core components: + +- **[Hyprland](https://hyprland.org/):** A highly customizable dynamic tiling Wayland compositor. +- **[Waybar](https://github.com/Alexays/Waybar):** A customizable, modular status bar. +- **[AGS](https://github.com/Aylur/ags):** Aylur's Gtk Shell, used for creating custom, scriptable desktop widgets. + +### Directory Structure + +- **`hypr/`**: Hyprland configurations (keybindings, window rules, animations, layout settings, and autostart). +- **`waybar/`**: Status bar layout, CSS styling, and custom interactive modules. +- **`ags/`**: Custom desktop widgets built with TypeScript and GTK. +- **`scripts/`**: Global utility scripts (such as a streamlined GMU Eduroam Wi-Fi connector). +- **`branding/`**: Custom ASCII art and system branding assets. + +## Installation + +An automated installer script (`install.sh`) is provided to safely apply these configurations to your system. + +```bash +# Run the standard installer +./install.sh + +# See what would change without modifying any files (dry run) +./install.sh --check + +# Force overwrite of any existing local changes +./install.sh --force +``` + +### Installer Features + +1. **Safety First:** Computes file hashes to detect local changes. Backs up existing configurations before applying updates. +2. **Auto-Deployment:** Copies the tracked configurations seamlessly into your `~/.config/` directory. +3. **Command Wrapping:** Automatically sets up scripts from the `scripts/` directory as global commands in `~/.local/bin/`. +4. **Shell Integration:** Injects the necessary paths into your `~/.bashrc`, `~/.zshrc`, and system-wide profiles. +5. **Instant Refresh:** Automatically restarts background services like `waybar` and `ags` so changes take effect immediately. \ No newline at end of file diff --git a/ags/style.css b/ags/style.css index a5e1356..ca13324 100644 --- a/ags/style.css +++ b/ags/style.css @@ -1,3 +1,5 @@ +@import "./colors.css"; + * { all: unset; } @@ -7,26 +9,26 @@ } .media-container { - background-color: rgba(30, 30, 46, 0.85); + background-color: alpha(@background, 0.85); border-radius: 8px; - border: 2px solid rgba(137, 180, 250, 0.5); + border: 2px solid alpha(@color4, 0.5); padding: 8px 15px; font-family: "JetBrainsMono Nerd Font", sans-serif; } .media-btn { - color: #cba6f7; + color: @color5; font-size: 16px; padding: 0 5px; transition: all 0.2s; } .media-btn:hover { - color: #89b4fa; + color: @color4; } .media-text { - color: #cdd6f4; + color: @foreground; font-size: 14px; margin-left: 10px; } \ No newline at end of file diff --git a/hypr/autostart.conf b/hypr/autostart.conf new file mode 100644 index 0000000..1741929 --- /dev/null +++ b/hypr/autostart.conf @@ -0,0 +1,3 @@ +# Extra autostart processes +# exec-once = uwsm-app -- my-service +exec-once = ags run diff --git a/hypr/bindings.conf b/hypr/bindings.conf new file mode 100644 index 0000000..62ad87c --- /dev/null +++ b/hypr/bindings.conf @@ -0,0 +1,34 @@ +# Application bindings +bindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec --dir="$(omarchy-cmd-terminal-cwd)" +bindd = SUPER ALT, RETURN, Tmux, exec, uwsm-app -- xdg-terminal-exec --dir="$(omarchy-cmd-terminal-cwd)" bash -c "tmux attach || tmux new -s Work" +bindd = SUPER SHIFT, RETURN, Browser, exec, omarchy-launch-browser +bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window +bindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window "$(omarchy-cmd-terminal-cwd)" +bindd = SUPER SHIFT, B, Browser, exec, omarchy-launch-browser +bindd = SUPER SHIFT ALT, B, Browser (private), exec, omarchy-launch-browser --private +bindd = SUPER SHIFT, M, Music, exec, omarchy-launch-or-focus spotify +bindd = SUPER SHIFT, N, Editor, exec, omarchy-launch-editor +bindd = SUPER SHIFT, D, Docker, exec, omarchy-launch-tui lazydocker +bindd = SUPER SHIFT, G, Signal, exec, omarchy-launch-or-focus ^signal$ "uwsm-app -- signal-desktop" +bindd = SUPER SHIFT, O, Obsidian, exec, omarchy-launch-or-focus ^obsidian$ "uwsm-app -- obsidian -disable-gpu --enable-wayland-ime" +bindd = SUPER SHIFT, W, Typora, exec, uwsm-app -- typora --enable-wayland-ime +bindd = SUPER SHIFT, SLASH, Passwords, exec, uwsm-app -- 1password + +# If your web app url contains #, type it as ## to prevent hyprland treating it as a comment +bindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com" +bindd = SUPER SHIFT ALT, A, Grok, exec, omarchy-launch-webapp "https://grok.com" +bindd = SUPER SHIFT, C, Calendar, exec, omarchy-launch-webapp "https://app.hey.com/calendar/weeks/" +bindd = SUPER SHIFT, E, Email, exec, omarchy-launch-webapp "https://app.hey.com" +bindd = SUPER SHIFT, Y, YouTube, exec, omarchy-launch-webapp "https://youtube.com/" +bindd = SUPER SHIFT ALT, G, WhatsApp, exec, omarchy-launch-or-focus-webapp WhatsApp "https://web.whatsapp.com/" +bindd = SUPER SHIFT CTRL, G, Google Messages, exec, omarchy-launch-or-focus-webapp "Google Messages" "https://messages.google.com/web/conversations" +bindd = SUPER SHIFT, P, Google Photos, exec, omarchy-launch-or-focus-webapp "Google Photos" "https://photos.google.com/" +bindd = SUPER SHIFT, X, X, exec, omarchy-launch-webapp "https://x.com/" +bindd = SUPER SHIFT ALT, X, X Post, exec, omarchy-launch-webapp "https://x.com/compose/post" + +# Add extra bindings +# bind = SUPER SHIFT, R, exec, alacritty -e ssh your-server + +# Overwrite existing bindings, like putting Omarchy Menu on Super + Space +# unbind = SUPER, SPACE +# bindd = SUPER, SPACE, Omarchy menu, exec, omarchy-menu diff --git a/hypr/hypridle.conf b/hypr/hypridle.conf new file mode 100644 index 0000000..b7d1769 --- /dev/null +++ b/hypr/hypridle.conf @@ -0,0 +1,28 @@ +general { + lock_cmd = omarchy-lock-screen # lock screen and 1password + before_sleep_cmd = loginctl lock-session # lock before suspend. + after_sleep_cmd = sleep 1 && hyprctl dispatch dpms on # delay for PAM readiness, then turn on display. + inhibit_sleep = 3 # wait until screen is locked +} + +listener { + timeout = 150 # 2.5min + on-timeout = pidof hyprlock || omarchy-launch-screensaver # start screensaver (if we haven't locked already) +} + +listener { + timeout = 151 # 5min + on-timeout = loginctl lock-session # lock screen when timeout has passed +} + +listener { + timeout = 330 # 5.5min + on-timeout = brightnessctl -sd '*::kbd_backlight' set 0 # save state and turn off keyboard backlight + on-resume = brightnessctl -rd '*::kbd_backlight' # restore keyboard backlight +} + +listener { + timeout = 330 # 5.5min + on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed + on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected +} diff --git a/hypr/hyprland.conf b/hypr/hyprland.conf new file mode 100644 index 0000000..6478d1b --- /dev/null +++ b/hypr/hyprland.conf @@ -0,0 +1,23 @@ +# Learn how to configure Hyprland: https://wiki.hyprland.org/Configuring/ + +# Use defaults Omarchy defaults (but don't edit these directly!) +source = ~/.local/share/omarchy/default/hypr/autostart.conf +source = ~/.local/share/omarchy/default/hypr/bindings/media.conf +source = ~/.local/share/omarchy/default/hypr/bindings/clipboard.conf +source = ~/.local/share/omarchy/default/hypr/bindings/tiling-v2.conf +source = ~/.local/share/omarchy/default/hypr/bindings/utilities.conf +source = ~/.local/share/omarchy/default/hypr/envs.conf +source = ~/.local/share/omarchy/default/hypr/looknfeel.conf +source = ~/.local/share/omarchy/default/hypr/input.conf +source = ~/.local/share/omarchy/default/hypr/windows.conf +source = ~/.config/omarchy/current/theme/hyprland.conf + +# Change your own setup in these files (and overwrite any settings from defaults!) +source = ~/.config/hypr/monitors.conf +source = ~/.config/hypr/input.conf +source = ~/.config/hypr/bindings.conf +source = ~/.config/hypr/looknfeel.conf +source = ~/.config/hypr/autostart.conf + +# Add any other personal Hyprland configuration below +# windowrule = workspace 5, match:class qemu diff --git a/hypr/hyprlock.conf b/hypr/hyprlock.conf new file mode 100644 index 0000000..1a9ee57 --- /dev/null +++ b/hypr/hyprlock.conf @@ -0,0 +1,55 @@ +source = ~/.config/omarchy/current/theme/hyprlock.conf + +general { + ignore_empty_input = true +} + +background { + monitor = + color = $color + path = ~/.config/omarchy/current/background + blur_passes = 3 +} + +animations { + enabled = false +} + +input-field { + monitor = + size = 650, 100 + position = 0, 0 + halign = center + valign = center + + inner_color = $inner_color + outer_color = $outer_color + outline_thickness = 4 + + font_family = JetBrainsMono Nerd Font + font_color = $font_color + + placeholder_text = Enter Password + check_color = $check_color + fail_text = $FAIL ($ATTEMPTS) + + rounding = 0 + shadow_passes = 0 + fade_on_empty = false +} + +auth { + fingerprint:enabled = false +} + +label { + monitor = + text = cmd[update:0] cat ~/.config/omarchy/branding/screensaver.txt + color = $font_color + font_size = 12 + font_family = JetBrainsMono Nerd Font + text_align = left + position = 0, 200 + halign = center + valign = center +} diff --git a/hypr/hyprsunset.conf b/hypr/hyprsunset.conf new file mode 100644 index 0000000..c4d0f8d --- /dev/null +++ b/hypr/hyprsunset.conf @@ -0,0 +1,14 @@ +# Makes hyprsunset do nothing to the screen by default +# Without this, the default applies some tint to the monitor +profile { + time = 07:00 + identity = true +} + +# To enable auto switch to nightlight, set in your .config/hypr/autostart: +# exec-once = uwsm app -- hyprsunset +# and use the following: +# profile { +# time = 20:00 +# temperature = 4000 +# } diff --git a/hypr/input.conf b/hypr/input.conf new file mode 100644 index 0000000..c2b8dfc --- /dev/null +++ b/hypr/input.conf @@ -0,0 +1,54 @@ +# Control your input devices +# See https://wiki.hypr.land/Configuring/Variables/#input +input { + # Use multiple keyboard layouts and switch between them with Left Alt + Right Alt + # kb_layout = us,dk,eu + + # Use a specific keyboard variant if needed (e.g. intl for international keyboards) + # kb_variant = intl + + kb_layout = us + kb_options = compose:caps # ,grp:alts_toggle + + # Change speed of keyboard repeat + repeat_rate = 40 + repeat_delay = 600 + + # Start with numlock on by default + numlock_by_default = true + + # Increase sensitivity for mouse/trackpad (default: 0) + # sensitivity = 0.35 + + # Turn off mouse acceleration (default: false) + # force_no_accel = true + + touchpad { + # Use natural (inverse) scrolling + # natural_scroll = true + + # Use two-finger clicks for right-click instead of lower-right corner + # clickfinger_behavior = true + + # Control the speed of your scrolling + scroll_factor = 0.4 + + # Enable the touchpad while typing + # disable_while_typing = false + + # Left-click-and-drag with three fingers + # drag_3fg = 1 + } +} + +# Scroll nicely in the terminal +windowrule = match:class (Alacritty|kitty), scroll_touchpad 1.5 +windowrule = match:class com.mitchellh.ghostty, scroll_touchpad 0.2 + +# Enable touchpad gestures for changing workspaces +# See https://wiki.hyprland.org/Configuring/Gestures/ +# gesture = 3, horizontal, workspace + +# Enable touchpad gestures for moving focus (helpful on scrolling layout) +# gesture = 3, left, dispatcher, movefocus, l +# gesture = 3, right, dispatcher, movefocus, r diff --git a/hypr/looknfeel.conf b/hypr/looknfeel.conf new file mode 100644 index 0000000..5dc4e59 --- /dev/null +++ b/hypr/looknfeel.conf @@ -0,0 +1,34 @@ +# Change the default Omarchy look'n'feel + +# https://wiki.hyprland.org/Configuring/Variables/#general +general { + # No gaps between windows or borders + gaps_in = 4 + gaps_out = 4 + # border_size = 0 + + # Change to niri-like side-scrolling layout + # layout = scrolling +} + +# https://wiki.hyprland.org/Configuring/Variables/#decoration +decoration { + # Use round window corners + # rounding = 8 + + # Dim unfocused windows (0.0 = no dim, 1.0 = fully dimmed) + # dim_inactive = true + # dim_strength = 0.15 +} + +# https://wiki.hyprland.org/Configuring/Variables/#animations +animations { + # Disable all animations + # enabled = no +} + +# https://wiki.hypr.land/Configuring/Variables/#layout +layout { + # Avoid overly wide single-window layouts on wide screens + # single_window_aspect_ratio = 1 1 +} diff --git a/hypr/monitors.conf b/hypr/monitors.conf new file mode 100644 index 0000000..019bc92 --- /dev/null +++ b/hypr/monitors.conf @@ -0,0 +1,23 @@ +# See https://wiki.hyprland.org/Configuring/Monitors/ +# List current monitors and resolutions possible: hyprctl monitors +# Format: monitor = [port], resolution, position, scale + +# Optimized for retina-class 2x displays, like 13" 2.8K, 27" 5K, 32" 6K. +env = GDK_SCALE,2 +monitor=,preferred,auto,auto,vrr,1 + +# Good compromise for 27" or 32" 4K monitors (but fractional!) +# env = GDK_SCALE,1.75 +# monitor=,preferred,auto,1.6 + +# Straight 1x setup for low-resolution displays like 1080p or 1440p +# Or for ultrawide monitors like 34" 3440x1440 or 49" 5120x1440 +# env = GDK_SCALE,1 +# monitor=,preferred,auto,1 + +# Portrait/rotated secondary monitor (transform: 1 = 90°, 3 = 270°) +# monitor = DP-2, preferred, auto, 1, transform, 1 + +# Example for Framework 13 w/ 6K XDR Apple display +# monitor = DP-5, 6016x3384@60, auto, 2 +# monitor = eDP-1, 2880x1920@120, auto, 2 diff --git a/hypr/xdph.conf b/hypr/xdph.conf new file mode 100644 index 0000000..63b66be --- /dev/null +++ b/hypr/xdph.conf @@ -0,0 +1,4 @@ +screencopy { + allow_token_by_default = true + custom_picker_binary = hyprland-preview-share-picker +} diff --git a/install.sh b/install.sh index d7b77be..4f40219 100755 --- a/install.sh +++ b/install.sh @@ -101,6 +101,10 @@ echo "" check_status=0 check_file "$SCRIPT_DIR/waybar/config.jsonc" "$HOME_DIR/.config/waybar/config.jsonc" "waybar/config.jsonc" || check_status=1 +check_file "$SCRIPT_DIR/hypr/hyprland.conf" "$HOME_DIR/.config/hypr/hyprland.conf" "hypr/hyprland.conf" || check_status=1 +check_file "$SCRIPT_DIR/hypr/autostart.conf" "$HOME_DIR/.config/hypr/autostart.conf" "hypr/autostart.conf" || check_status=1 +check_file "$SCRIPT_DIR/hypr/looknfeel.conf" "$HOME_DIR/.config/hypr/looknfeel.conf" "hypr/looknfeel.conf" || check_status=1 +check_file "$SCRIPT_DIR/omarchy/hooks/theme-set" "$HOME_DIR/.config/omarchy/hooks/theme-set" "omarchy/hooks/theme-set" || check_status=1 check_file "$SCRIPT_DIR/ags/app.ts" "$HOME_DIR/.config/ags/app.ts" "ags/app.ts" || check_status=1 check_file "$SCRIPT_DIR/ags/style.css" "$HOME_DIR/.config/ags/style.css" "ags/style.css" || check_status=1 check_file "$SCRIPT_DIR/ags/widget/Media.tsx" "$HOME_DIR/.config/ags/widget/Media.tsx" "ags/widget/Media.tsx" || check_status=1 @@ -137,7 +141,9 @@ echo "" backup_and_copy "$SCRIPT_DIR/waybar" "$HOME_DIR/.config/waybar" "Waybar config" backup_and_copy "$SCRIPT_DIR/ags" "$HOME_DIR/.config/ags" "AGS config" +backup_and_copy "$SCRIPT_DIR/hypr" "$HOME_DIR/.config/hypr" "Hyprland config" backup_and_copy "$SCRIPT_DIR/branding" "$HOME_DIR/.config/omarchy/branding" "Branding files" +backup_and_copy "$SCRIPT_DIR/omarchy/hooks" "$HOME_DIR/.config/omarchy/hooks" "Omarchy hooks" mkdir -p "$HOME_DIR/scripts" backup_and_copy "$SCRIPT_DIR/scripts" "$HOME_DIR/scripts" "Custom scripts" diff --git a/omarchy/hooks/battery-low.sample b/omarchy/hooks/battery-low.sample new file mode 100644 index 0000000..dc3726a --- /dev/null +++ b/omarchy/hooks/battery-low.sample @@ -0,0 +1,10 @@ +#!/bin/bash + +# This hook is called with the current battery percentage when the low battery +# notification is sent. To put it into use, remove .sample from the name. + +SOUND_FILE="/usr/share/sounds/freedesktop/stereo/dialog-warning.oga" + +if omarchy-cmd-present mpv && [[ -f $SOUND_FILE ]]; then + mpv --no-video "$SOUND_FILE" >/dev/null 2>&1 +fi diff --git a/omarchy/hooks/font-set.sample b/omarchy/hooks/font-set.sample new file mode 100644 index 0000000..3f0109a --- /dev/null +++ b/omarchy/hooks/font-set.sample @@ -0,0 +1,7 @@ +#!/bin/bash + +# This hook is called with the snake-cased name of the font that has just been set. +# To put it into use, remove .sample from the name. + +# Example: Show the name of the theme that was just set. +# notify-send -u low "New font" "Your new font is $1" diff --git a/omarchy/hooks/post-update.sample b/omarchy/hooks/post-update.sample new file mode 100644 index 0000000..f740d5b --- /dev/null +++ b/omarchy/hooks/post-update.sample @@ -0,0 +1,7 @@ +#!/bin/bash + +# This hook is called after an Omarchy system update has been performed. +# To put it into use, remove .sample from the name. + +# Example: Show notification after the system has been updated. +# notify-send -u low "Update Performed" "Your system is now up to date" diff --git a/omarchy/hooks/theme-set b/omarchy/hooks/theme-set new file mode 100755 index 0000000..5f2ebb8 --- /dev/null +++ b/omarchy/hooks/theme-set @@ -0,0 +1,12 @@ +#!/bin/bash +THEME_NAME=$1 +echo "Theme changed to: $THEME_NAME" + +# Generate AGS colors from Omarchy theme colors.toml +awk -F '=' 'NF==2 { gsub(/"/,"",$2); gsub(/ /,"",$1); gsub(/ /,"",$2); print "@define-color " $1 " " $2 ";" }' ~/.config/omarchy/current/theme/colors.toml > ~/.config/ags/colors.css + +# Restart AGS to apply new theme colors +if command -v ags &> /dev/null; then + ags quit || true + nohup ags run -d "$HOME/.config/ags" >/dev/null 2>&1 & +fi \ No newline at end of file diff --git a/omarchy/hooks/theme-set.sample b/omarchy/hooks/theme-set.sample new file mode 100644 index 0000000..2d13287 --- /dev/null +++ b/omarchy/hooks/theme-set.sample @@ -0,0 +1,7 @@ +#!/bin/bash + +# This hook is called with the snake-cased name of the theme that has just been set. +# To put it into use, remove .sample from the name. + +# Example: Show the name of the theme that was just set. +# notify-send -u low "New theme" "Your new theme is $1"