diff --git a/README.md b/README.md index 236376e..150af3d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Arch Linux Hyprland - Waybar + Omarchy 4 AGS @@ -15,7 +15,7 @@ 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. +- **Omarchy shell:** The Quickshell-based bar, notifications, and lock screen that ships with Omarchy 4, configured through `omarchy/shell.json`. - **[AGS](https://github.com/Aylur/ags):** Aylur's Gtk Shell, used for creating custom, scriptable desktop widgets. - **Dynamic Theming:** Seamlessly integrated with Pywal to extract color palettes from wallpapers and apply them instantly across the entire system (widgets, terminal, status bar). - **[kitty](https://sw.kovidgoyal.net/kitty/):** The terminal, with its own checked-in color theme — see [`kitty/`](kitty/README.md). @@ -23,12 +23,11 @@ My current setup is built around these core components: ### Directory Structure - **`hypr/`**: Hyprland configurations (keybindings, window rules, animations, monitor layout, lid-close display handling, and autostart). See [`hypr/keybinds.md`](hypr/keybinds.md) for custom keybindings. -- **`waybar/`**: Status bar layout, CSS styling, and custom interactive modules. +- **`omarchy/`**: Omarchy 4 configuration — `shell.json` (bar layout and idle/lock timings), `extensions/` (entries added to the Omarchy menu), `hooks/` (event hooks such as retinting AGS on theme change), and `themed/` (extra theme templates). - **`ags/`**: Custom desktop widgets built with TypeScript and GTK — media player, notification hub, quick settings, system monitor, wallpaper picker, and theme picker. - **`scripts/`**: Global utility scripts seamlessly exposed as commands by the installer. See [`commands.md`](commands.md). - **`wallpapers/`**: A collection of local custom wallpapers for dynamic theming. See [`wallpaper-gallery/`](wallpaper-gallery/index.md) for the full gallery (split alphabetically across multiple pages). - **`themes/`**: Drop-in local color themes (one `colors.toml` per theme) that `install.sh` deploys into Omarchy's theme directory. See [`themes/README.md`](themes/README.md). -- **`omarchy/hooks/`**: Event hooks for the Omarchy system (e.g. automatically applying dynamic themes when changing wallpapers). - **`branding/`**: Custom ASCII art and system branding assets. - **`kitty/`**: kitty terminal config and its color theme, applied by hand rather than by `install.sh`. See [`kitty/README.md`](kitty/README.md). @@ -42,7 +41,7 @@ My current setup is built around these core components: ## Installation -An automated installer script (`install.sh`) is provided to safely apply these configurations to your system. It targets Arch — `kitty/` is applied by hand, see [`kitty/README.md`](kitty/README.md). +An automated installer script (`install.sh`) is provided to safely apply these configurations to your system. It targets Arch running Omarchy 4 — `kitty/` is applied by hand, see [`kitty/README.md`](kitty/README.md). ```bash # Run the standard installer diff --git a/ags/widget/Notifications.tsx b/ags/widget/Notifications.tsx index d31fc8f..0c3df14 100644 --- a/ags/widget/Notifications.tsx +++ b/ags/widget/Notifications.tsx @@ -7,44 +7,62 @@ import { sh, shell } from "../lib/utils" export const NOTIFICATION_WINDOW = "notification-center" type Notification = { - id: number + file: string appName: string summary: string body: string + timestamp: number } +const NOTIFICATION_DIR = "$HOME/.local/state/omarchy/notifications" + +const listCommand = + `for file in "${NOTIFICATION_DIR}"/*.json "${NOTIFICATION_DIR}"/history/*.json; do ` + + "[ -f \"$file\" ] || continue; " + + "printf '%s\\t%s\\n' \"$file\" \"$(head -n 1 \"$file\")\"; " + + "done" + function parseNotifications(stdout: string): Notification[] { - try { - const parsed = JSON.parse(stdout) - const group = parsed?.data?.[0] ?? [] - return group.map((item: any) => ({ - id: item.id?.value ?? 0, - appName: item["app-name"]?.value ?? "", - summary: item.summary?.value ?? "", - body: item.body?.value ?? "", - })) - } catch { - return [] - } + return stdout + .split("\n") + .filter((line) => line.includes("\t")) + .map((line) => { + const separator = line.indexOf("\t") + const file = line.slice(0, separator) + try { + const entry = JSON.parse(line.slice(separator + 1)) + return { + file, + appName: String(entry.app ?? ""), + summary: String(entry.summary ?? ""), + body: String(entry.body ?? ""), + timestamp: Number(entry.timestamp ?? 0), + } + } catch { + return null + } + }) + .filter((item): item is Notification => item !== null) + .sort((left, right) => right.timestamp - left.timestamp) } const notifications = createPoll( [], 1000, - shell("makoctl list -j 2>/dev/null || echo '{}'"), + shell(listCommand), (stdout) => parseNotifications(stdout), ) const doNotDisturb = createPoll( false, 1000, - shell("makoctl mode 2>/dev/null"), - (stdout) => stdout.split("\n").includes("do-not-disturb"), + shell("omarchy-shell notifications dndState 2>/dev/null"), + (stdout) => stdout.trim() === "on", ) -const dismiss = (id: number) => sh(`makoctl dismiss -n ${id}`) -const clearAll = () => sh("makoctl dismiss -a") -const toggleDoNotDisturb = () => sh("makoctl mode -t do-not-disturb") +const dismiss = (file: string) => sh(`rm -f '${file.replace(/'/g, "'\\''")}'`) +const clearAll = () => sh("omarchy-shell notifications dismissAll; omarchy-shell notifications clear") +const toggleDoNotDisturb = () => sh("omarchy-shell notifications toggleDnd") function NotificationItem({ item }: { item: Notification }) { return ( @@ -60,7 +78,7 @@ function NotificationItem({ item }: { item: Notification }) { @@ -126,7 +144,7 @@ export default function NotificationCenter() { vscroll={Gtk.PolicyType.AUTOMATIC} > - item.id}> + item.file}> {(item: Notification) => } diff --git a/ags/widget/QuickSettings.tsx b/ags/widget/QuickSettings.tsx index 8800843..97baea5 100644 --- a/ags/widget/QuickSettings.tsx +++ b/ags/widget/QuickSettings.tsx @@ -43,12 +43,12 @@ const [bluetoothOn] = pollBool( ) const [doNotDisturb, setDoNotDisturb] = pollBool( - "makoctl mode 2>/dev/null | grep -qx do-not-disturb && echo on || echo off", + "omarchy-shell notifications dndState 2>/dev/null", 2000, ) const [nightLight, setNightLight] = pollBool( - "pgrep -x hyprsunset >/dev/null && echo on || echo off", + "omarchy-toggle-nightlight --status 2>/dev/null | grep -q '\"enabled\":true' && echo on || echo off", 2000, ) @@ -134,14 +134,14 @@ function Toggles() { return ( - { closePanel(); sh("omarchy-launch-wifi") }} /> + { closePanel(); sh("omarchy-shell shell toggle omarchy.network") }} /> { closePanel() - sh("omarchy-launch-bluetooth") + sh("omarchy-shell shell toggle omarchy.bluetooth") }} /> { setDoNotDisturb(!doNotDisturb.get()) - sh("makoctl mode -t do-not-disturb") + sh("omarchy-shell notifications toggleDnd") }} /> ( const currentThemeName = createPoll( "", 2000, - shell("cat \"$HOME/.config/omarchy/current/theme.name\" 2>/dev/null"), + shell("cat \"$HOME/.local/state/omarchy/current/theme.name\" 2>/dev/null"), (stdout) => stdout.trim(), ) diff --git a/commands.md b/commands.md index 418232e..256ea01 100644 --- a/commands.md +++ b/commands.md @@ -4,9 +4,9 @@ The installer automatically exposes scripts from [`scripts/`](scripts/) as globa | Command | Description | | --- | --- | -| `blob_wallpaper [path]` | Sets your background using Omarchy's background system. If used with an image from `~/wallpapers/` or a valid path, it leverages Pywal to generate a full system color palette into the `blob-dynamic` theme and always updates the desktop background — but only switches your active color theme to it if you're already in dynamic mode (see `blob_theme --mode`), so it won't pull you out of a static theme. With no argument, it opens the AGS wallpaper picker. | -| `blob_theme [name\|--dynamic\|--mode\|--print\|share-link-or-id]` | Manages color themes. With no argument, opens the AGS theme picker. `--dynamic` recolors from the current wallpaper without changing it; `--mode` prints `static` or `dynamic`; `--print` dumps the currently active theme's `colors.toml` to stdout, e.g. `blob_theme --print > themes/my-theme/colors.toml` to save a dynamically-generated palette you like. A `name` applies a local theme (see [`themes/`](themes/README.md)) or, if no local theme matches, falls back to pulling a shared palette from the wall-styles site by link or id (e.g. `blob_theme "https://wall-styles.vercel.app/?id=ab12cd34ef"`). | -| `blob_glass [on\|off\|toggle]` | A quick toggle to enable or disable window transparency on the fly. | +| `blob_wallpaper [path]` | Sets your background using Omarchy's background system. If used with an image from `~/wallpapers/` or a valid path, it leverages Pywal to generate a full system color palette into the `blob-dynamic` theme and always updates the desktop background — but only switches your active color theme to it if you're already in dynamic mode (see `blob_theme --mode`), so it won't pull you out of a static theme. With no argument, it opens the AGS wallpaper picker; `--menu` opens the same list in the Omarchy menu (also reachable from Blob > Wallpaper). | +| `blob_theme [name\|--dynamic\|--mode\|--print\|share-link-or-id]` | Manages color themes. With no argument, opens the AGS theme picker; `--menu` opens the same list in the Omarchy menu (also reachable from Blob > Theme). `--dynamic` recolors from the current wallpaper without changing it; `--mode` prints `static` or `dynamic`; `--print` dumps the currently active theme's `colors.toml` to stdout, e.g. `blob_theme --print > themes/my-theme/colors.toml` to save a dynamically-generated palette you like. A `name` applies a local theme (see [`themes/`](themes/README.md)) or, if no local theme matches, falls back to pulling a shared palette from the wall-styles site by link or id (e.g. `blob_theme "https://wall-styles.vercel.app/?id=ab12cd34ef"`). | +| `blob_glass [on\|off\|toggle]` | A quick toggle to enable or disable window transparency on the fly. It writes a Hyprland flag into `~/.local/state/omarchy/toggles/hypr/`, which Omarchy loads after `hypr/looknfeel.lua`, so no config file is rewritten. | | `blob_boot [path]` | Safely updates your Plymouth boot splash image (defaults to `branding/boot_flash.png`) and rebuilds the `initramfs` (GRUB compatible via `mkinitcpio`). | | `blob_wifi` | A streamlined script to connect to the GMU Eduroam Wi-Fi network using `iwd` and `systemd-resolved` (replaces NetworkManager). | | `blob_key [NAME] [VALUE]` | Stores secrets/env values for widgets and services, e.g. `blob_key set SOME_TOKEN value`. | diff --git a/elephant/menus/blob_background_selector.lua b/elephant/menus/blob_background_selector.lua deleted file mode 100644 index f7b4f17..0000000 --- a/elephant/menus/blob_background_selector.lua +++ /dev/null @@ -1,57 +0,0 @@ -Name = "blobBackgroundSelector" -NamePretty = "Blob's Background Selector" -Cache = false -HideFromProviderlist = true -SearchName = true - -local function ShellEscape(s) - return "'" .. s:gsub("'", "'\\''") .. "'" -end - -function FormatName(filename) - local name = filename:gsub("^%d+", ""):gsub("^%-", "") - name = name:gsub("%.[^%.]+$", "") - name = name:gsub("-", " ") - name = name:gsub("%S+", function(word) - return word:sub(1, 1):upper() .. word:sub(2):lower() - end) - return name -end - -function GetEntries() - local entries = {} - local home = os.getenv("HOME") - - local dirs = { - home .. "/wallpapers", - } - - local seen = {} - - for _, wallpaper_dir in ipairs(dirs) do - local handle = io.popen( - "find " .. ShellEscape(wallpaper_dir) - .. " -maxdepth 1 -type f \\( -name '*.jpg' -o -name '*.jpeg' -o -name '*.png' -o -name '*.gif' -o -name '*.bmp' -o -name '*.webp' \\) 2>/dev/null | sort" - ) - if handle then - for background in handle:lines() do - local filename = background:match("([^/]+)$") - if filename and not seen[filename] then - seen[filename] = true - table.insert(entries, { - Text = FormatName(filename), - Value = filename, - Actions = { - activate = "blob_wallpaper " .. ShellEscape(background), - }, - Preview = background, - PreviewType = "file", - }) - end - end - handle:close() - end - end - - return entries -end \ No newline at end of file diff --git a/elephant/menus/blob_theme_selector.lua b/elephant/menus/blob_theme_selector.lua deleted file mode 100644 index 977e138..0000000 --- a/elephant/menus/blob_theme_selector.lua +++ /dev/null @@ -1,76 +0,0 @@ -Name = "blobThemeSelector" -NamePretty = "Blob's Theme Selector" -Cache = false -HideFromProviderlist = true -SearchName = true - -local function ShellEscape(s) - return "'" .. s:gsub("'", "'\\''") .. "'" -end - -function FormatName(slug) - local name = slug:gsub("-", " ") - name = name:gsub("%S+", function(word) - return word:sub(1, 1):upper() .. word:sub(2):lower() - end) - return name -end - -function GetEntries() - local entries = {} - local home = os.getenv("HOME") - local omarchy_path = os.getenv("OMARCHY_PATH") or "" - - entries[1] = { - Text = "Dynamic (from wallpaper)", - Value = "dynamic", - Actions = { - activate = "blob_theme --dynamic", - }, - } - - local dirs = { - home .. "/.config/omarchy/themes", - omarchy_path .. "/themes", - } - - local seen = { ["blob-dynamic"] = true } - - for _, themes_dir in ipairs(dirs) do - local handle = io.popen( - "find " .. ShellEscape(themes_dir) .. " -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort" - ) - if handle then - for theme_dir in handle:lines() do - local slug = theme_dir:match("([^/]+)$") - if slug and not seen[slug] then - local colors_file = io.open(theme_dir .. "/colors.toml", "r") - if colors_file then - colors_file:close() - seen[slug] = true - - local entry = { - Text = FormatName(slug), - Value = slug, - Actions = { - activate = "blob_theme " .. ShellEscape(slug), - }, - } - - local preview_file = io.open(theme_dir .. "/preview.png", "r") - if preview_file then - preview_file:close() - entry.Preview = theme_dir .. "/preview.png" - entry.PreviewType = "file" - end - - table.insert(entries, entry) - end - end - end - handle:close() - end - end - - return entries -end diff --git a/hypr/autostart.conf b/hypr/autostart.conf deleted file mode 100644 index 1741929..0000000 --- a/hypr/autostart.conf +++ /dev/null @@ -1,3 +0,0 @@ -# Extra autostart processes -# exec-once = uwsm-app -- my-service -exec-once = ags run diff --git a/hypr/autostart.lua b/hypr/autostart.lua new file mode 100644 index 0000000..c2add57 --- /dev/null +++ b/hypr/autostart.lua @@ -0,0 +1,2 @@ +-- Extra autostart processes. +o.launch_on_start("ags run") diff --git a/hypr/bindings.conf b/hypr/bindings.conf deleted file mode 100644 index fffa17c..0000000 --- a/hypr/bindings.conf +++ /dev/null @@ -1,29 +0,0 @@ -# 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" - -# If your web app url contains #, type it as ## to prevent hyprland treating it as a comment -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/" - -# Add extra bindings -bindd = SUPER ALT, W, Wallpaper picker, exec, ags toggle wall-picker -# 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/bindings.lua b/hypr/bindings.lua new file mode 100644 index 0000000..0efd264 --- /dev/null +++ b/hypr/bindings.lua @@ -0,0 +1,4 @@ +-- Personal keybinding overrides on top of Omarchy's defaults. +-- See current bindings and descriptions: omarchy menu keybindings --print + +o.bind("SUPER + ALT + W", "Wallpaper picker", "ags toggle wall-picker") diff --git a/hypr/hypridle.conf b/hypr/hypridle.conf deleted file mode 100644 index 25e6bc4..0000000 --- a/hypr/hypridle.conf +++ /dev/null @@ -1,28 +0,0 @@ -general { - lock_cmd = omarchy-system-lock # 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 = 300 # 5min - on-timeout = pidof hyprlock || omarchy-launch-screensaver # start screensaver (if we haven't locked already) -} - -listener { - timeout = 301 # 5min - on-timeout = loginctl lock-session # lock screen when timeout has passed -} - -listener { - timeout = 480 # 8min - 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 = 480 # 8min - 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 deleted file mode 100644 index a1840af..0000000 --- a/hypr/hyprland.conf +++ /dev/null @@ -1,28 +0,0 @@ -# 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 - -# Toggle config flags dynamically (e.g. the lid-close "disable internal display" -# flag written by omarchy-hyprland-monitor-internal). Without this the lid -# handler's disable never applies and the laptop workspace stays stranded. -source = ~/.local/state/omarchy/toggles/hypr/*.conf - -# Add any other personal Hyprland configuration below -# windowrule = workspace 5, match:class qemu diff --git a/hypr/hyprland.lua b/hypr/hyprland.lua new file mode 100644 index 0000000..72e178f --- /dev/null +++ b/hypr/hyprland.lua @@ -0,0 +1,13 @@ +-- Learn how to configure Hyprland: https://wiki.hypr.land/Configuring/Start/ + +dofile((os.getenv("OMARCHY_PATH") or "/usr/share/omarchy") .. "/default/hypr/bootstrap.lua") + +require("default.hypr.omarchy") + +require("hypr.monitors") +require("hypr.input") +require("hypr.bindings") +require("hypr.looknfeel") +require("hypr.autostart") + +require("default.hypr.toggles") diff --git a/hypr/hyprlock.conf b/hypr/hyprlock.conf deleted file mode 100644 index 1a9ee57..0000000 --- a/hypr/hyprlock.conf +++ /dev/null @@ -1,55 +0,0 @@ -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 index c4d0f8d..a3ba208 100644 --- a/hypr/hyprsunset.conf +++ b/hypr/hyprsunset.conf @@ -5,8 +5,8 @@ profile { identity = true } -# To enable auto switch to nightlight, set in your .config/hypr/autostart: -# exec-once = uwsm app -- hyprsunset +# To enable auto switch to nightlight, add to your .config/hypr/autostart.lua: +# o.launch_on_start("hyprsunset") # and use the following: # profile { # time = 20:00 diff --git a/hypr/input.conf b/hypr/input.conf deleted file mode 100644 index c2b8dfc..0000000 --- a/hypr/input.conf +++ /dev/null @@ -1,54 +0,0 @@ -# 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/input.lua b/hypr/input.lua new file mode 100644 index 0000000..1e4ffab --- /dev/null +++ b/hypr/input.lua @@ -0,0 +1,20 @@ +-- See https://wiki.hypr.land/Configuring/Basics/Variables/#input +hl.config({ + input = { + kb_layout = "us", + kb_options = "compose:caps", + + repeat_rate = 40, + repeat_delay = 600, + + numlock_by_default = true, + + touchpad = { + scroll_factor = 0.4, + }, + }, +}) + +-- Scroll nicely in the terminal. +o.window("(Alacritty|kitty)", { scroll_touchpad = 1.5 }) +o.window("com.mitchellh.ghostty", { scroll_touchpad = 0.2 }) diff --git a/hypr/keybinds.md b/hypr/keybinds.md index a0d9479..41c35d6 100644 --- a/hypr/keybinds.md +++ b/hypr/keybinds.md @@ -1,8 +1,20 @@ -# Custom Keybinds +# Keybinds -Custom bindings on top of Omarchy's defaults, defined in `bindings.conf`. +Hyprland is configured in Lua on Omarchy 4. Personal bindings live in +[`bindings.lua`](bindings.lua); everything else below comes from Omarchy's +own defaults and is no longer redefined here. -## Apps +Print the live list at any time with `omarchy menu keybindings --print`. + +## Custom + +| Keybind | Action | +| --- | --- | +| `Super+Alt+W` | Wallpaper picker (AGS widget) | + +## Omarchy defaults worth remembering + +### Apps | Keybind | Action | | --- | --- | @@ -19,7 +31,7 @@ Custom bindings on top of Omarchy's defaults, defined in `bindings.conf`. | `Super+Shift+G` | Signal | | `Super+Shift+O` | Obsidian | -## Web Apps +### Web Apps | Keybind | Action | | --- | --- | @@ -30,8 +42,15 @@ Custom bindings on top of Omarchy's defaults, defined in `bindings.conf`. | `Super+Shift+Ctrl+G` | Google Messages | | `Super+Shift+P` | Google Photos | -## Extras +### Shell and system | Keybind | Action | | --- | --- | -| `Super+Alt+W` | Wallpaper picker | +| `Super+Space` | Omarchy menu | +| `Super+Ctrl+Space` | Background switcher | +| `Super+Shift+Ctrl+Space` | Theme menu | +| `Super+Shift+Space` | Toggle the top bar | +| `Super+Backspace` | Toggle transparency on the focused window | +| `Super+Ctrl+L` | Lock | +| `Super+Ctrl+I` | Toggle locking on idle | +| `Super+Ctrl+N` | Toggle nightlight | diff --git a/hypr/looknfeel.conf b/hypr/looknfeel.conf deleted file mode 100644 index d0ca8aa..0000000 --- a/hypr/looknfeel.conf +++ /dev/null @@ -1,37 +0,0 @@ -# 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 -} - -# Remove default window transparency -windowrule = opacity 1.0 override 1.0 override, match:tag default-opacity diff --git a/hypr/looknfeel.lua b/hypr/looknfeel.lua new file mode 100644 index 0000000..d677fef --- /dev/null +++ b/hypr/looknfeel.lua @@ -0,0 +1,12 @@ +-- https://wiki.hypr.land/Configuring/Basics/Variables/#general +hl.config({ + general = { + gaps_in = 4, + gaps_out = 4, + }, +}) + +-- Remove default window transparency. Turn it back on with `blob_glass on`, +-- which drops a flag into ~/.local/state/omarchy/toggles/hypr/ that is loaded +-- after this file. +o.window({ tag = "default-opacity" }, { opacity = "1.0 override 1.0 override" }) diff --git a/hypr/monitors.conf b/hypr/monitors.conf deleted file mode 100644 index c01f8c5..0000000 --- a/hypr/monitors.conf +++ /dev/null @@ -1,27 +0,0 @@ -# See https://wiki.hyprland.org/Configuring/Monitors/ -# List current monitors and resolutions possible: hyprctl monitors -# Format: monitor = [port], resolution, position, scale - -# --- Dual external monitor setup (laptop lid closed) --- -# Layout, left -> right: [ 1: C24 / DP-1 ] [ 2: F24 / HDMI-A-1 ] -# eDP-1 sits to the right of the externals and Hyprland automatically -# disables it when the lid is closed (since an external is connected). - -# Monitor 1 - C24 curved, DisplayPort via DP->HDMI adapter. -# NOTE: the DP2HDMI adapter caps this panel at 1920x1080@60 (no 75Hz mode). -monitor = DP-1, 1920x1080@60, 0x0, 1 - -# Monitor 2 - Sceptre F24, HDMI, native 75Hz. -monitor = HDMI-A-1, 1920x1080@75, 1920x0, 1 - -# Laptop panel - only mode is 1920x1200@60. Parked right of the externals; -# auto-off on lid close so no windows get stranded on a closed screen. -monitor = eDP-1, 1920x1200@60, 3840x0, 1.5 - -# Catch-all fallback for any other/unknown display. -monitor = , preferred, auto, 1 - -# GDK_SCALE forced integer scaling is intentionally disabled: the external -# monitors run at 1x, so a global 2x would blow up GTK apps on them. The -# per-monitor scale factors above are enough. -# env = GDK_SCALE,2 diff --git a/hypr/monitors.lua b/hypr/monitors.lua new file mode 100644 index 0000000..083ba86 --- /dev/null +++ b/hypr/monitors.lua @@ -0,0 +1,26 @@ +-- See https://wiki.hypr.land/Configuring/Basics/Monitors/ +-- List current monitors and supported resolutions with: hyprctl monitors all + +-- Dual external monitor setup (laptop lid closed). +-- Layout, left -> right: [ 1: C24 / DP-1 ] [ 2: F24 / HDMI-A-1 ] [ eDP-1 ] +-- eDP-1 sits to the right of the externals and Hyprland automatically +-- disables it when the lid is closed (since an external is connected). + +-- Monitor 1 - C24 curved, DisplayPort via DP->HDMI adapter. +-- NOTE: the DP2HDMI adapter caps this panel at 1920x1080@60 (no 75Hz mode). +hl.monitor({ output = "DP-1", mode = "1920x1080@60", position = "0x0", scale = 1 }) + +-- Monitor 2 - Sceptre F24, HDMI, native 75Hz. +hl.monitor({ output = "HDMI-A-1", mode = "1920x1080@75", position = "1920x0", scale = 1 }) + +-- Laptop panel - only mode is 1920x1200@60. Parked right of the externals; +-- auto-off on lid close so no windows get stranded on a closed screen. +hl.monitor({ output = "eDP-1", mode = "1920x1200@60", position = "3840x0", scale = 1.5 }) + +-- Catch-all fallback for any other/unknown display. +hl.monitor({ output = "", mode = "preferred", position = "auto", scale = 1 }) + +-- GDK_SCALE forced integer scaling is intentionally left unset: the external +-- monitors run at 1x, so a global 2x would blow up GTK apps on them. The +-- per-monitor scale factors above are enough. +-- hl.env("GDK_SCALE", "2") diff --git a/install.sh b/install.sh index 317721d..1b3a9eb 100755 --- a/install.sh +++ b/install.sh @@ -129,6 +129,34 @@ replace_and_copy() { fi } +backup_and_copy_file() { + local src="$1" + local dest="$2" + local name="$3" + + if [ ! -e "$dest" ]; then + echo "[COPY] $name: New file (creating)" + mkdir -p "$(dirname "$dest")" + cp "$src" "$dest" + return + fi + + if [ "$(compute_hash "$src")" = "$(compute_hash "$dest")" ]; then + echo "[SKIP] $name: Up to date" + return + fi + + if [ "$FORCE" = true ]; then + echo "[BACKUP] $name: Backing up..." + cp "$dest" "$dest.bak" + + echo "[COPY] $name: Overwriting (--force)" + cp "$src" "$dest" + else + echo "[SKIP] $name: Has local changes (use --force to overwrite)" + fi +} + install_dependencies() { echo "=== Checking Dependencies ===" local deps_needed=() @@ -141,6 +169,9 @@ install_dependencies() { if ! command -v awww &> /dev/null; then deps_needed+=("awww") fi + if ! command -v playerctl &> /dev/null; then + deps_needed+=("playerctl") + fi if [ ${#deps_needed[@]} -gt 0 ]; then echo "Installing missing dependencies: ${deps_needed[*]}" @@ -162,13 +193,16 @@ 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/monitors.conf" "$HOME_DIR/.config/hypr/monitors.conf" "hypr/monitors.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/hypr/bindings.conf" "$HOME_DIR/.config/hypr/bindings.conf" "hypr/bindings.conf" || check_status=1 -check_file "$SCRIPT_DIR/hypr/hypridle.conf" "$HOME_DIR/.config/hypr/hypridle.conf" "hypr/hypridle.conf" || check_status=1 +check_file "$SCRIPT_DIR/hypr/hyprland.lua" "$HOME_DIR/.config/hypr/hyprland.lua" "hypr/hyprland.lua" || check_status=1 +check_file "$SCRIPT_DIR/hypr/monitors.lua" "$HOME_DIR/.config/hypr/monitors.lua" "hypr/monitors.lua" || check_status=1 +check_file "$SCRIPT_DIR/hypr/input.lua" "$HOME_DIR/.config/hypr/input.lua" "hypr/input.lua" || check_status=1 +check_file "$SCRIPT_DIR/hypr/autostart.lua" "$HOME_DIR/.config/hypr/autostart.lua" "hypr/autostart.lua" || check_status=1 +check_file "$SCRIPT_DIR/hypr/looknfeel.lua" "$HOME_DIR/.config/hypr/looknfeel.lua" "hypr/looknfeel.lua" || check_status=1 +check_file "$SCRIPT_DIR/hypr/bindings.lua" "$HOME_DIR/.config/hypr/bindings.lua" "hypr/bindings.lua" || check_status=1 +check_file "$SCRIPT_DIR/hypr/hyprsunset.conf" "$HOME_DIR/.config/hypr/hyprsunset.conf" "hypr/hyprsunset.conf" || check_status=1 +check_file "$SCRIPT_DIR/hypr/xdph.conf" "$HOME_DIR/.config/hypr/xdph.conf" "hypr/xdph.conf" || check_status=1 +check_file "$SCRIPT_DIR/omarchy/shell.json" "$HOME_DIR/.config/omarchy/shell.json" "omarchy/shell.json" || check_status=1 +check_file "$SCRIPT_DIR/omarchy/extensions/omarchy-menu.jsonc" "$HOME_DIR/.config/omarchy/extensions/omarchy-menu.jsonc" "omarchy/extensions/omarchy-menu.jsonc" || 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/omarchy/themed/zen.css.tpl" "$HOME_DIR/.config/omarchy/themed/zen.css.tpl" "omarchy/themed/zen.css.tpl" || check_status=1 check_file "$SCRIPT_DIR/ags/app.ts" "$HOME_DIR/.config/ags/app.ts" "ags/app.ts" || check_status=1 @@ -184,9 +218,6 @@ check_file "$SCRIPT_DIR/ags/widget/SysMonitor.tsx" "$HOME_DIR/.config/ags/widget check_file "$SCRIPT_DIR/ags/widget/ThemePicker.tsx" "$HOME_DIR/.config/ags/widget/ThemePicker.tsx" "ags/widget/ThemePicker.tsx" || check_status=1 check_file "$SCRIPT_DIR/ags/widget/WallPicker.tsx" "$HOME_DIR/.config/ags/widget/WallPicker.tsx" "ags/widget/WallPicker.tsx" || check_status=1 check_file "$SCRIPT_DIR/ags/widget/WidgetCard.tsx" "$HOME_DIR/.config/ags/widget/WidgetCard.tsx" "ags/widget/WidgetCard.tsx" || check_status=1 -check_file "$SCRIPT_DIR/waybar/style.css" "$HOME_DIR/.config/waybar/style.css" "waybar/style.css" || check_status=1 -check_file "$SCRIPT_DIR/elephant/menus/blob_background_selector.lua" "$HOME_DIR/.config/elephant/menus/blob_background_selector.lua" "elephant/menus/blob_background_selector.lua" || check_status=1 -check_file "$SCRIPT_DIR/elephant/menus/blob_theme_selector.lua" "$HOME_DIR/.config/elephant/menus/blob_theme_selector.lua" "elephant/menus/blob_theme_selector.lua" || check_status=1 check_file "$SCRIPT_DIR/branding/about.txt" "$HOME_DIR/.config/omarchy/branding/about.txt" "branding/about.txt" || check_status=1 check_file "$SCRIPT_DIR/branding/screensaver.txt" "$HOME_DIR/.config/omarchy/branding/screensaver.txt" "branding/screensaver.txt" || check_status=1 @@ -230,13 +261,13 @@ fi echo "=== Applying changes ===" 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/elephant" "$HOME_DIR/.config/elephant" "Elephant configs" backup_and_copy "$SCRIPT_DIR/omarchy/hooks" "$HOME_DIR/.config/omarchy/hooks" "Omarchy hooks" backup_and_copy "$SCRIPT_DIR/omarchy/themed" "$HOME_DIR/.config/omarchy/themed" "Omarchy custom templates" +backup_and_copy "$SCRIPT_DIR/omarchy/extensions" "$HOME_DIR/.config/omarchy/extensions" "Omarchy menu extensions" +backup_and_copy_file "$SCRIPT_DIR/omarchy/shell.json" "$HOME_DIR/.config/omarchy/shell.json" "Omarchy shell config" replace_and_copy "$SCRIPT_DIR/wallpapers" "$HOME_DIR/wallpapers" "Custom wallpapers" if [ -d "$SCRIPT_DIR/themes" ]; then @@ -302,8 +333,8 @@ add_system_path() { add_system_path # Keep the laptop awake with the lid closed while docked / on AC, so the two -# external monitors stay usable. Paired with the lid-switch binds in -# hypr/bindings.conf, which disable eDP-1 on close so no workspace is stranded. +# external monitors stay usable. Omarchy's own lid-switch binds disable eDP-1 +# on close so no workspace is stranded. configure_lid_switch() { local dropin="/etc/systemd/logind.conf.d/10-lid.conf" local content="[Login] @@ -350,11 +381,11 @@ add_path_to_shell "$HOME_DIR/.zshrc" chmod +x "$HOME_DIR/scripts/"*.sh 2>/dev/null || true echo "" -echo "=== Restarting Waybar ===" -if command -v omarchy-restart-waybar &> /dev/null; then - omarchy-restart-waybar +echo "=== Restarting the Omarchy shell ===" +if command -v omarchy-restart-shell &> /dev/null; then + omarchy-restart-shell else - echo "Warning: omarchy-restart-waybar not found. Please restart waybar manually." + echo "Warning: omarchy-restart-shell not found. Please restart the shell manually." fi echo "" @@ -374,18 +405,9 @@ else echo "Warning: hyprctl not found. Please reload Hyprland manually." fi -echo "" -echo "=== Restarting hypridle ===" -if command -v hypridle &> /dev/null; then - pkill -x hypridle 2>/dev/null || true - nohup hypridle >/dev/null 2>&1 & -else - echo "Warning: hypridle not found. Please restart hypridle manually." -fi - echo "" echo "=== Reapplying current theme (to pick up new templates) ===" -current_theme_name=$(cat "$HOME_DIR/.config/omarchy/current/theme.name" 2>/dev/null) +current_theme_name=$(cat "$HOME_DIR/.local/state/omarchy/current/theme.name" 2>/dev/null) if [ -n "$current_theme_name" ] && command -v omarchy-theme-set &> /dev/null; then OMARCHY_THEME_SKIP_BACKGROUND=1 omarchy-theme-set "$current_theme_name" || true else diff --git a/omarchy/extensions/omarchy-menu.jsonc b/omarchy/extensions/omarchy-menu.jsonc new file mode 100644 index 0000000..07013cb --- /dev/null +++ b/omarchy/extensions/omarchy-menu.jsonc @@ -0,0 +1,10 @@ +{ + // Blob entries added to the Quickshell Omarchy menu (Super + Space). + // These replace the walker/elephant menus used before Omarchy 4. + + "blob": { "icon": "", "label": "Blob" }, + "blob.wallpaper": { "icon": "", "label": "Wallpaper", "action": "blob_wallpaper --menu", "description": "Pick a wallpaper from ~/wallpapers" }, + "blob.theme": { "icon": "", "label": "Theme", "action": "blob_theme --menu", "description": "Pick a local or Omarchy color theme" }, + "blob.dynamic": { "icon": "", "label": "Dynamic theme", "action": "blob_theme --dynamic", "description": "Recolor from the current wallpaper" }, + "blob.glass": { "icon": "", "label": "Toggle glass", "action": "blob_glass toggle", "checked": "test -f $HOME/.local/state/omarchy/toggles/hypr/blob-glass.lua" } +} diff --git a/omarchy/hooks/theme-set b/omarchy/hooks/theme-set index 5f2ebb8..dfd9912 100755 --- a/omarchy/hooks/theme-set +++ b/omarchy/hooks/theme-set @@ -3,10 +3,10 @@ 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 +awk -F '=' 'NF==2 { gsub(/"/,"",$2); gsub(/ /,"",$1); gsub(/ /,"",$2); print "@define-color " $1 " " $2 ";" }' ~/.local/state/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 +fi diff --git a/omarchy/shell.json b/omarchy/shell.json new file mode 100644 index 0000000..74ead5d --- /dev/null +++ b/omarchy/shell.json @@ -0,0 +1,66 @@ +{ + "version": 1, + "idle": { + "screensaver": 300, + "lock": 301 + }, + "bar": { + "position": "top", + "transparent": false, + "centerAnchor": "omarchy.clock", + "layout": { + "left": [ + { + "id": "omarchy.menu" + }, + { + "id": "omarchy.workspaces" + } + ], + "center": [ + { + "id": "omarchy.indicators" + }, + { + "id": "omarchy.clock", + "format": "dddd HH:mm", + "formatAlt": "d MMMM 'W'ww yyyy", + "verticalFormat": "HH\n\u2014\nmm" + }, + { + "id": "omarchy.keyboard-layout" + }, + { + "id": "omarchy.weather" + }, + { + "id": "omarchy.system-update" + } + ], + "right": [ + { + "id": "omarchy.tray" + }, + { + "id": "omarchy.agents" + }, + { + "id": "omarchy.bluetooth" + }, + { + "id": "omarchy.network" + }, + { + "id": "omarchy.audio" + }, + { + "id": "omarchy.monitor" + }, + { + "id": "omarchy.power" + } + ] + } + }, + "plugins": [] +} diff --git a/revert.sh b/revert.sh index 8b48949..2ba88c6 100755 --- a/revert.sh +++ b/revert.sh @@ -52,15 +52,29 @@ revert_dir() { fi } +revert_file() { + local dest="$1" + local name="$2" + local bak_file="${dest}.bak" + + if [ -f "$bak_file" ]; then + echo "[REVERT] Restoring $name from $bak_file..." + cp "$bak_file" "$dest" + echo "✓ Restored $name" + else + echo "[SKIP] No backup found for $name at $bak_file" + fi +} + echo "=== Reverting changes ===" echo "" -revert_dir "$HOME_DIR/.config/waybar" "Waybar config" revert_dir "$HOME_DIR/.config/ags" "AGS config" revert_dir "$HOME_DIR/.config/hypr" "Hyprland config" revert_dir "$HOME_DIR/.config/omarchy/branding" "Branding files" -revert_dir "$HOME_DIR/.config/elephant" "Elephant configs" revert_dir "$HOME_DIR/.config/omarchy/hooks" "Omarchy hooks" +revert_dir "$HOME_DIR/.config/omarchy/extensions" "Omarchy menu extensions" +revert_file "$HOME_DIR/.config/omarchy/shell.json" "Omarchy shell config" revert_dir "$HOME_DIR/wallpapers" "Custom wallpapers" revert_dir "$HOME_DIR/scripts" "Custom scripts" @@ -88,11 +102,11 @@ remove_lid_switch() { remove_lid_switch echo "" -echo "=== Restarting Waybar ===" -if command -v omarchy-restart-waybar &> /dev/null; then - omarchy-restart-waybar +echo "=== Restarting the Omarchy shell ===" +if command -v omarchy-restart-shell &> /dev/null; then + omarchy-restart-shell else - echo "Warning: omarchy-restart-waybar not found. Please restart waybar manually." + echo "Warning: omarchy-restart-shell not found. Please restart the shell manually." fi echo "" @@ -112,14 +126,5 @@ else echo "Warning: hyprctl not found. Please reload Hyprland manually." fi -echo "" -echo "=== Restarting hypridle ===" -if command -v hypridle &> /dev/null; then - pkill -x hypridle 2>/dev/null || true - nohup hypridle >/dev/null 2>&1 & -else - echo "Warning: hypridle not found. Please restart hypridle manually." -fi - echo "" echo "=== Revert Complete ===" diff --git a/scripts/blob_glass.sh b/scripts/blob_glass.sh index 9c159a0..5b0b723 100755 --- a/scripts/blob_glass.sh +++ b/scripts/blob_glass.sh @@ -1,13 +1,10 @@ #!/bin/bash -# Configuration files to modify -ACTIVE_CONF="$HOME/.config/hypr/looknfeel.conf" -REPO_CONF="$HOME/Documents/dotfiles/hypr/looknfeel.conf" +# Window transparency toggle. Omarchy's toggles directory is loaded after +# ~/.config/hypr/looknfeel.lua, so dropping a flag file here re-enables the +# default translucency that looknfeel.lua overrides away. -# The rule to enforce solid opacity -OVERRIDE_RULE="windowrule = opacity 1.0 override 1.0 override, match:tag default-opacity" -# A marker comment -MARKER="# Remove default window transparency" +FLAG_FILE="$HOME/.local/state/omarchy/toggles/hypr/blob-glass.lua" ACTION=$1 @@ -16,19 +13,16 @@ if [ -z "$ACTION" ]; then fi enable_glass() { - # Remove the rules - sed -i "/$MARKER/d" "$ACTIVE_CONF" "$REPO_CONF" 2>/dev/null - sed -i "/opacity 1.0 override/d" "$ACTIVE_CONF" "$REPO_CONF" 2>/dev/null + mkdir -p "$(dirname "$FLAG_FILE")" + cat > "$FLAG_FILE" <<'LUA' +o.window({ tag = "default-opacity" }, { opacity = "0.985 0.96" }) +LUA echo "Transparency enabled (glass on)." hyprctl reload >/dev/null } disable_glass() { - # Add the rules if they don't exist - if ! grep -q "opacity 1.0 override" "$ACTIVE_CONF"; then - echo -e "\n$MARKER\n$OVERRIDE_RULE" >> "$ACTIVE_CONF" - echo -e "\n$MARKER\n$OVERRIDE_RULE" >> "$REPO_CONF" - fi + rm -f "$FLAG_FILE" echo "Transparency disabled (glass off)." hyprctl reload >/dev/null } @@ -38,12 +32,12 @@ if [ "$ACTION" == "on" ]; then elif [ "$ACTION" == "off" ]; then disable_glass elif [ "$ACTION" == "toggle" ]; then - if grep -q "opacity 1.0 override" "$ACTIVE_CONF"; then - enable_glass - else + if [ -f "$FLAG_FILE" ]; then disable_glass + else + enable_glass fi else echo "Usage: blob_glass [on|off|toggle]" exit 1 -fi \ No newline at end of file +fi diff --git a/scripts/blob_theme.sh b/scripts/blob_theme.sh old mode 100644 new mode 100755 index 50e1fe1..170c981 --- a/scripts/blob_theme.sh +++ b/scripts/blob_theme.sh @@ -6,7 +6,7 @@ THEME_DIR="$HOME/.config/omarchy/themes/blob-dynamic" USER_THEMES_DIR="$HOME/.config/omarchy/themes" -CURRENT_DIR="$HOME/.config/omarchy/current" +CURRENT_DIR="$HOME/.local/state/omarchy/current" # Used only when a bare id is passed instead of a full share link. # Override with: export BLOB_THEME_URL="https://your-deployment.vercel.app" @@ -16,6 +16,10 @@ slugify() { echo "$1" | tr '[:upper:]' '[:lower:]' | tr ' ' '-' } +prettify() { + echo "$1" | sed -E 's/(^|-)([a-z])/\1\u\2/g; s/-/ /g' +} + current_mode() { local name name=$(cat "$CURRENT_DIR/theme.name" 2>/dev/null) @@ -32,6 +36,30 @@ theme_exists_locally() { [ -d "$USER_THEMES_DIR/$slug" ] || [ -d "$OMARCHY_PATH/themes/$slug" ] } +# Rows for omarchy-menu-select, as "