Migrate dotfiles to Omarchy 4
Claude-Session: https://claude.ai/code/session_014ADhvRXuiTvrXSbConxUey
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
|
||||
<img src="https://img.shields.io/badge/Arch_Linux-1793D1?style=for-the-badge&logo=arch-linux&logoColor=white" alt="Arch Linux" />
|
||||
<img src="https://img.shields.io/badge/Hyprland-00A86B?style=for-the-badge&logo=hyprland&logoColor=white" alt="Hyprland" />
|
||||
<img src="https://img.shields.io/badge/Waybar-FF6600?style=for-the-badge&logo=linux&logoColor=white" alt="Waybar" />
|
||||
<img src="https://img.shields.io/badge/Omarchy_4-000000?style=for-the-badge&logo=archlinux&logoColor=white" alt="Omarchy 4" />
|
||||
<img src="https://img.shields.io/badge/AGS-231F20?style=for-the-badge&logo=gnome&logoColor=white" alt="AGS" />
|
||||
</div>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<Notification[]>(
|
||||
[],
|
||||
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 }) {
|
||||
<button
|
||||
class="notification-item-close"
|
||||
halign={Gtk.Align.END}
|
||||
onClicked={() => dismiss(item.id)}
|
||||
onClicked={() => dismiss(item.file)}
|
||||
>
|
||||
<label label={""} />
|
||||
</button>
|
||||
@@ -126,7 +144,7 @@ export default function NotificationCenter() {
|
||||
vscroll={Gtk.PolicyType.AUTOMATIC}
|
||||
>
|
||||
<box vertical spacing={8}>
|
||||
<For each={notifications} id={(item: Notification) => item.id}>
|
||||
<For each={notifications} id={(item: Notification) => item.file}>
|
||||
{(item: Notification) => <NotificationItem item={item} />}
|
||||
</For>
|
||||
</box>
|
||||
|
||||
@@ -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 (
|
||||
<box vertical spacing={8}>
|
||||
<box class="qs-tiles" spacing={8} homogeneous>
|
||||
<Tile icon={""} label="Wi-Fi" onClicked={() => { closePanel(); sh("omarchy-launch-wifi") }} />
|
||||
<Tile icon={""} label="Wi-Fi" onClicked={() => { closePanel(); sh("omarchy-shell shell toggle omarchy.network") }} />
|
||||
<Tile
|
||||
icon={""}
|
||||
label="Bluetooth"
|
||||
active={bluetoothOn}
|
||||
onClicked={() => {
|
||||
closePanel()
|
||||
sh("omarchy-launch-bluetooth")
|
||||
sh("omarchy-shell shell toggle omarchy.bluetooth")
|
||||
}}
|
||||
/>
|
||||
<Tile
|
||||
@@ -160,7 +160,7 @@ function Toggles() {
|
||||
active={doNotDisturb}
|
||||
onClicked={() => {
|
||||
setDoNotDisturb(!doNotDisturb.get())
|
||||
sh("makoctl mode -t do-not-disturb")
|
||||
sh("omarchy-shell notifications toggleDnd")
|
||||
}}
|
||||
/>
|
||||
<Tile
|
||||
|
||||
@@ -39,7 +39,7 @@ const themes = createPoll<Theme[]>(
|
||||
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(),
|
||||
)
|
||||
|
||||
|
||||
+3
-3
@@ -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 <set\|show\|clear\|list> [NAME] [VALUE]` | Stores secrets/env values for widgets and services, e.g. `blob_key set SOME_TOKEN value`. |
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -1,3 +0,0 @@
|
||||
# Extra autostart processes
|
||||
# exec-once = uwsm-app -- my-service
|
||||
exec-once = ags run
|
||||
@@ -0,0 +1,2 @@
|
||||
-- Extra autostart processes.
|
||||
o.launch_on_start("ags run")
|
||||
@@ -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
|
||||
@@ -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")
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
@@ -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")
|
||||
@@ -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 = <i>$FAIL ($ATTEMPTS)</i>
|
||||
|
||||
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
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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 })
|
||||
+25
-6
@@ -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 |
|
||||
|
||||
@@ -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
|
||||
@@ -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" })
|
||||
@@ -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
|
||||
@@ -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")
|
||||
+50
-28
@@ -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
|
||||
|
||||
@@ -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" }
|
||||
}
|
||||
@@ -3,7 +3,7 @@ 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
|
||||
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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 ==="
|
||||
|
||||
+12
-18
@@ -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,10 +32,10 @@ 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]"
|
||||
|
||||
Regular → Executable
+37
-4
@@ -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 "<label><TAB><slug>". The menu returns the
|
||||
# label and the subtext, so the slug comes back as a stable key.
|
||||
list_theme_rows() {
|
||||
printf 'Dynamic (from wallpaper)\tblob-dynamic\n'
|
||||
|
||||
{
|
||||
find "$USER_THEMES_DIR" -mindepth 1 -maxdepth 1 -type d 2>/dev/null
|
||||
find "$OMARCHY_PATH/themes" -mindepth 1 -maxdepth 1 -type d 2>/dev/null
|
||||
} | while read -r theme_dir; do
|
||||
[ -f "$theme_dir/colors.toml" ] || continue
|
||||
slug=$(basename "$theme_dir")
|
||||
[ "$slug" = "blob-dynamic" ] && continue
|
||||
printf '%s\t%s\n' "$(prettify "$slug")" "$slug"
|
||||
done | sort -u -t$'\t' -k2,2
|
||||
}
|
||||
|
||||
select_theme() {
|
||||
local selection slug
|
||||
selection=$(list_theme_rows | omarchy-menu-select "Select Theme" -- --width 800) || return 1
|
||||
slug=$(printf '%s' "$selection" | cut -f2)
|
||||
[ -n "$slug" ] || return 1
|
||||
echo "$slug"
|
||||
}
|
||||
|
||||
apply_static() {
|
||||
local name="$1"
|
||||
# Clean up a lingering gif-animation daemon from a previous dynamic
|
||||
@@ -55,7 +83,12 @@ case "$1" in
|
||||
ags toggle theme-picker
|
||||
;;
|
||||
--menu)
|
||||
omarchy-launch-walker -m menus:blobThemeSelector --width 800 --minheight 400 -p "Select Theme…"
|
||||
selected=$(select_theme) || exit 0
|
||||
if [ "$selected" = "blob-dynamic" ]; then
|
||||
apply_dynamic
|
||||
else
|
||||
apply_static "$selected"
|
||||
fi
|
||||
;;
|
||||
--mode)
|
||||
current_mode
|
||||
@@ -69,7 +102,7 @@ case "$1" in
|
||||
# awk always terminates the last line with a newline, even if the
|
||||
# source file doesn't. Omarchy's template engine reads colors.toml
|
||||
# with a bash `while read` loop, which silently drops a final line
|
||||
# missing its newline (e.g. color15) — some built-in themes are
|
||||
# missing its newline (e.g. color15) - some built-in themes are
|
||||
# missing it too, so this guards every theme saved via --print.
|
||||
awk '1' "$CURRENT_COLORS"
|
||||
;;
|
||||
@@ -124,7 +157,7 @@ return {
|
||||
}
|
||||
EOF
|
||||
|
||||
# Apply the Blob-Dynamic theme (reloads waybar, ags, etc.)
|
||||
# Apply the Blob-Dynamic theme (reloads the Omarchy shell, ags, etc.)
|
||||
omarchy-theme-set "blob-dynamic"
|
||||
|
||||
echo "Applied shared theme to blob-dynamic."
|
||||
|
||||
+33
-16
@@ -2,6 +2,7 @@
|
||||
|
||||
WALLPAPER_DIR="$HOME/wallpapers"
|
||||
THEME_DIR="$HOME/.config/omarchy/themes/blob-dynamic"
|
||||
CURRENT_DIR="$HOME/.local/state/omarchy/current"
|
||||
|
||||
# Create the directory if it doesn't exist
|
||||
mkdir -p "$WALLPAPER_DIR"
|
||||
@@ -15,14 +16,28 @@ mkdir -p "$THEME_DIR/backgrounds"
|
||||
echo "PATH=$PATH"
|
||||
} >> "$HOME/.cache/blob-wallpaper.log"
|
||||
|
||||
# Rows for omarchy-menu-select, as "<label><TAB><path>". The menu returns the
|
||||
# label and the subtext, so the full path comes back as a stable key.
|
||||
list_wallpaper_rows() {
|
||||
find "$WALLPAPER_DIR" -maxdepth 1 -type f \
|
||||
\( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.gif' -o -iname '*.bmp' -o -iname '*.webp' \) \
|
||||
2>/dev/null | sort | while read -r background; do
|
||||
name=$(basename "$background")
|
||||
label=$(echo "${name%.*}" | sed -E 's/^[0-9]+//; s/^[-_]//; s/[-_]/ /g; s/(^| )([a-z])/\1\u\2/g')
|
||||
printf '%s\t%s\n' "$label" "$background"
|
||||
done
|
||||
}
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
# Open the AGS wallpaper selector widget
|
||||
ags toggle wall-picker
|
||||
exit 0
|
||||
elif [ "$1" = "--menu" ]; then
|
||||
# Fallback: walker dmenu selection
|
||||
omarchy-launch-walker -m menus:blobBackgroundSelector --width 800 --minheight 400 -p "Select Wallpaper…"
|
||||
exit 0
|
||||
selection=$(list_wallpaper_rows | omarchy-menu-select "Select Wallpaper" -- --width 800) || exit 0
|
||||
IMAGE_PATH=$(printf '%s' "$selection" | cut -f2)
|
||||
if [ -z "$IMAGE_PATH" ] || [ ! -f "$IMAGE_PATH" ]; then
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
# Check if the argument is a file in the wallpapers directory
|
||||
if [ -f "$WALLPAPER_DIR/$1" ]; then
|
||||
@@ -88,43 +103,45 @@ EOF
|
||||
# Only switch the active color theme to blob-dynamic if you're already
|
||||
# in dynamic mode. The palette above and the background below are kept
|
||||
# up to date regardless, so `blob_theme --dynamic` always reflects the
|
||||
# latest wallpaper — but picking a wallpaper while on a static theme
|
||||
# latest wallpaper - but picking a wallpaper while on a static theme
|
||||
# should change the wallpaper, not silently pull you out of it.
|
||||
#
|
||||
# When it does apply, skip omarchy-theme-set's own background step: it
|
||||
# launches swaybg asynchronously, which races with the gif handling
|
||||
# below and can leave a static swaybg frame on top of an animated gif.
|
||||
CURRENT_THEME_NAME=$(cat "$HOME/.config/omarchy/current/theme.name" 2>/dev/null)
|
||||
# picks a background out of the theme folder and runs its own transition,
|
||||
# which would race with the background handling below.
|
||||
CURRENT_THEME_NAME=$(cat "$CURRENT_DIR/theme.name" 2>/dev/null)
|
||||
if [ "$CURRENT_THEME_NAME" = "blob-dynamic" ]; then
|
||||
OMARCHY_THEME_SKIP_BACKGROUND=1 omarchy-theme-set "blob-dynamic"
|
||||
fi
|
||||
|
||||
CURRENT_BACKGROUND_LINK="$HOME/.config/omarchy/current/background"
|
||||
ln -nsf "$THEME_DIR/backgrounds/$(basename "$IMAGE_PATH")" "$CURRENT_BACKGROUND_LINK"
|
||||
NEW_BACKGROUND="$THEME_DIR/backgrounds/$(basename "$IMAGE_PATH")"
|
||||
|
||||
# Stop whichever daemon was previously rendering the background before
|
||||
# starting the one this wallpaper needs. `awww kill` shuts the daemon down
|
||||
# via its own IPC so it cleans up its socket, unlike a raw `pkill`.
|
||||
pkill -x swaybg 2>/dev/null
|
||||
# Stop a gif daemon left over from a previous wallpaper. `awww kill` shuts the
|
||||
# daemon down via its own IPC so it cleans up its socket, unlike a raw `pkill`.
|
||||
awww kill --all >/dev/null 2>&1
|
||||
pkill -x awww-daemon 2>/dev/null
|
||||
|
||||
# omarchy-theme-bg-set updates ~/.local/state/omarchy/current/background and
|
||||
# tells the running Omarchy shell to repaint, which is what draws the desktop
|
||||
# background in Omarchy 4 (swaybg is no longer involved).
|
||||
omarchy-theme-bg-set "$NEW_BACKGROUND"
|
||||
|
||||
if [[ "${IMAGE_PATH,,}" == *.gif ]]; then
|
||||
# The shell renders a still frame from the symlink above; awww layers the
|
||||
# animation on top of it.
|
||||
echo "GIF detected, using awww for animation..."
|
||||
setsid uwsm-app -- awww-daemon >>"$HOME/.cache/awww-daemon.log" 2>&1 &
|
||||
|
||||
# Poll until the daemon's IPC socket is ready instead of guessing a fixed sleep
|
||||
IMG_ERROR=""
|
||||
for _ in {1..15}; do
|
||||
IMG_ERROR=$(awww img "$CURRENT_BACKGROUND_LINK" 2>&1) && break
|
||||
IMG_ERROR=$(awww img "$NEW_BACKGROUND" 2>&1) && break
|
||||
sleep 0.3
|
||||
done
|
||||
if [[ -n "$IMG_ERROR" ]]; then
|
||||
echo "awww failed to set the wallpaper: $IMG_ERROR"
|
||||
echo "See $HOME/.cache/awww-daemon.log for daemon output."
|
||||
fi
|
||||
else
|
||||
setsid uwsm-app -- swaybg -i "$CURRENT_BACKGROUND_LINK" -m fill >/dev/null 2>&1 &
|
||||
fi
|
||||
|
||||
echo "Wallpaper and dynamic theme applied successfully: $IMAGE_PATH"
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
# Themes
|
||||
|
||||
Drop-in static color themes. Each subdirectory here becomes a theme
|
||||
selectable from `blob_theme`, the theme picker widget, and the walker
|
||||
selectable from `blob_theme`, the theme picker widget, and the Omarchy
|
||||
menu, once `install.sh` copies it into `~/.config/omarchy/themes/`.
|
||||
|
||||
## Adding a theme
|
||||
|
||||
@@ -1,232 +0,0 @@
|
||||
{
|
||||
"reload_style_on_change": true,
|
||||
"layer": "top",
|
||||
"position": "top",
|
||||
"spacing": 0,
|
||||
"height": 30,
|
||||
"modules-left": [
|
||||
"custom/omarchy",
|
||||
"hyprland/workspaces"
|
||||
],
|
||||
"modules-center": [
|
||||
"clock",
|
||||
"custom/update",
|
||||
"custom/voxtype",
|
||||
"custom/screenrecording-indicator",
|
||||
"custom/idle-indicator",
|
||||
"custom/notification-silencing-indicator"
|
||||
],
|
||||
"modules-right": [
|
||||
"group/tray-expander",
|
||||
"bluetooth",
|
||||
"network",
|
||||
"pulseaudio",
|
||||
"cpu",
|
||||
"battery",
|
||||
"custom/notification"
|
||||
],
|
||||
"custom/notification": {
|
||||
"format": "",
|
||||
"tooltip-format": "Notifications",
|
||||
"on-click": "ags toggle notification-center",
|
||||
"on-click-right": "omarchy-toggle-notification-silencing"
|
||||
},
|
||||
"hyprland/workspaces": {
|
||||
"on-click": "activate",
|
||||
"format": "{icon}",
|
||||
"format-icons": {
|
||||
"default": "\uea71",
|
||||
"1": "1",
|
||||
"2": "2",
|
||||
"3": "3",
|
||||
"4": "4",
|
||||
"5": "5",
|
||||
"6": "6",
|
||||
"7": "7",
|
||||
"8": "8",
|
||||
"9": "9",
|
||||
"10": "0",
|
||||
"active": "\udb85\udcfb"
|
||||
},
|
||||
"persistent-workspaces": {
|
||||
"1": [],
|
||||
"2": [],
|
||||
"3": [],
|
||||
"4": [],
|
||||
"5": [],
|
||||
"6": [],
|
||||
"7": [],
|
||||
"8": [],
|
||||
"9": []
|
||||
}
|
||||
},
|
||||
"custom/omarchy": {
|
||||
"format": "<span font='omarchy'>\ue900</span>",
|
||||
"on-click": "omarchy-menu",
|
||||
"on-click-right": "xdg-terminal-exec",
|
||||
"tooltip-format": "Omarchy Menu\n\nSuper + Alt + Space"
|
||||
},
|
||||
"custom/update": {
|
||||
"format": "\uf021",
|
||||
"exec": "omarchy-update-available",
|
||||
"on-click": "omarchy-launch-floating-terminal-with-presentation omarchy-update",
|
||||
"tooltip-format": "Omarchy update available",
|
||||
"signal": 7,
|
||||
"interval": 21600
|
||||
},
|
||||
"cpu": {
|
||||
"interval": 5,
|
||||
"format": "\udb80\udf5b",
|
||||
"on-click": "omarchy-launch-or-focus-tui btop",
|
||||
"on-click-middle": "alacritty",
|
||||
"on-click-right": "ags toggle sys-monitor"
|
||||
},
|
||||
"clock": {
|
||||
"format": "{:L%A %d %B %H:%M}",
|
||||
"tooltip": false,
|
||||
"on-click": "ags toggle quick-settings",
|
||||
"on-click-right": "omarchy-launch-floating-terminal-with-presentation omarchy-tz-select"
|
||||
},
|
||||
"network": {
|
||||
"format-icons": [
|
||||
"\udb82\udd2f",
|
||||
"\udb82\udd1f",
|
||||
"\udb82\udd22",
|
||||
"\udb82\udd25",
|
||||
"\udb82\udd28"
|
||||
],
|
||||
"format": "{icon}",
|
||||
"format-wifi": "{icon}",
|
||||
"format-ethernet": "\udb80\udc02",
|
||||
"format-disconnected": "\udb82\udd2e",
|
||||
"tooltip-format-wifi": "{essid} ({frequency} GHz)",
|
||||
"tooltip-format-ethernet": "Connected",
|
||||
"tooltip-format-disconnected": "Disconnected",
|
||||
"interval": 3,
|
||||
"spacing": 1,
|
||||
"on-click": "omarchy-launch-wifi",
|
||||
"on-click-right": "ags toggle quick-settings"
|
||||
},
|
||||
"battery": {
|
||||
"format": "{capacity}% {icon}",
|
||||
"format-discharging": "{icon}",
|
||||
"format-charging": "{icon}",
|
||||
"format-plugged": "\uf1e6",
|
||||
"format-icons": {
|
||||
"charging": [
|
||||
"\udb82\udc9c",
|
||||
"\udb80\udc86",
|
||||
"\udb80\udc87",
|
||||
"\udb80\udc88",
|
||||
"\udb82\udc9d",
|
||||
"\udb80\udc89",
|
||||
"\udb82\udc9e",
|
||||
"\udb80\udc8a",
|
||||
"\udb80\udc8b",
|
||||
"\udb80\udc85"
|
||||
],
|
||||
"default": [
|
||||
"\udb80\udc7a",
|
||||
"\udb80\udc7b",
|
||||
"\udb80\udc7c",
|
||||
"\udb80\udc7d",
|
||||
"\udb80\udc7e",
|
||||
"\udb80\udc7f",
|
||||
"\udb80\udc80",
|
||||
"\udb80\udc81",
|
||||
"\udb80\udc82",
|
||||
"\udb80\udc79"
|
||||
]
|
||||
},
|
||||
"format-full": "\udb80\udc85",
|
||||
"tooltip-format-discharging": "{power:>1.0f}W\u2193 {capacity}%",
|
||||
"tooltip-format-charging": "{power:>1.0f}W\u2191 {capacity}%",
|
||||
"interval": 5,
|
||||
"on-click": "omarchy-menu power",
|
||||
"states": {
|
||||
"warning": 20,
|
||||
"critical": 10
|
||||
}
|
||||
},
|
||||
"bluetooth": {
|
||||
"format": "\uf294",
|
||||
"format-off": "\udb80\udcb2",
|
||||
"format-disabled": "\udb80\udcb2",
|
||||
"format-connected": "\udb80\udcb1",
|
||||
"format-no-controller": "",
|
||||
"tooltip-format": "Devices connected: {num_connections}",
|
||||
"on-click": "omarchy-launch-bluetooth",
|
||||
"on-click-right": "ags toggle quick-settings"
|
||||
},
|
||||
"pulseaudio": {
|
||||
"format": "{icon}",
|
||||
"on-click": "omarchy-launch-audio",
|
||||
"on-click-right": "pamixer -t",
|
||||
"tooltip-format": "Playing at {volume}%",
|
||||
"scroll-step": 5,
|
||||
"format-muted": "\ueee8",
|
||||
"format-icons": {
|
||||
"headphone": "\uf025",
|
||||
"headset": "\uf025",
|
||||
"default": [
|
||||
"\uf026",
|
||||
"\uf027",
|
||||
"\uf028"
|
||||
]
|
||||
}
|
||||
},
|
||||
"group/tray-expander": {
|
||||
"orientation": "inherit",
|
||||
"drawer": {
|
||||
"transition-duration": 600,
|
||||
"children-class": "tray-group-item"
|
||||
},
|
||||
"modules": [
|
||||
"custom/expand-icon",
|
||||
"tray"
|
||||
]
|
||||
},
|
||||
"custom/expand-icon": {
|
||||
"format": "\uf053",
|
||||
"tooltip": false,
|
||||
"on-scroll-up": "",
|
||||
"on-scroll-down": "",
|
||||
"on-scroll-left": "",
|
||||
"on-scroll-right": ""
|
||||
},
|
||||
"custom/screenrecording-indicator": {
|
||||
"on-click": "omarchy-cmd-screenrecord",
|
||||
"exec": "$OMARCHY_PATH/default/waybar/indicators/screen-recording.sh",
|
||||
"signal": 8,
|
||||
"return-type": "json"
|
||||
},
|
||||
"custom/voxtype": {
|
||||
"exec": "omarchy-voxtype-status",
|
||||
"return-type": "json",
|
||||
"format": "{icon}",
|
||||
"format-icons": {
|
||||
"idle": "",
|
||||
"recording": "\udb80\udf6c",
|
||||
"transcribing": "\udb81\udd1f"
|
||||
},
|
||||
"tooltip": true,
|
||||
"on-click-right": "omarchy-voxtype-config",
|
||||
"on-click": "omarchy-voxtype-model"
|
||||
},
|
||||
"custom/idle-indicator": {
|
||||
"on-click": "omarchy-toggle-idle",
|
||||
"exec": "$OMARCHY_PATH/default/waybar/indicators/idle.sh",
|
||||
"signal": 9,
|
||||
"return-type": "json"
|
||||
},
|
||||
"custom/notification-silencing-indicator": {
|
||||
"on-click": "omarchy-toggle-notification-silencing",
|
||||
"exec": "$OMARCHY_PATH/default/waybar/indicators/notification-silencing.sh",
|
||||
"signal": 10,
|
||||
"return-type": "json"
|
||||
},
|
||||
"tray": {
|
||||
"icon-size": 14,
|
||||
"spacing": 17
|
||||
}
|
||||
}
|
||||
@@ -1,120 +0,0 @@
|
||||
@import "../omarchy/current/theme/waybar.css";
|
||||
|
||||
* {
|
||||
background-color: @background;
|
||||
color: @foreground;
|
||||
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
min-height: 0;
|
||||
font-family: 'JetBrainsMono Nerd Font';
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.modules-left {
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.modules-right {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
#workspaces button {
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
text-shadow: none;
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
padding: 0 6px;
|
||||
margin: 0 1.5px;
|
||||
min-width: 9px;
|
||||
}
|
||||
|
||||
#workspaces button label {
|
||||
color: @foreground;
|
||||
font-family: 'JetBrainsMono Nerd Font';
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#workspaces button.empty {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
#cpu,
|
||||
#memory,
|
||||
#disk,
|
||||
#battery,
|
||||
#pulseaudio,
|
||||
#custom-omarchy,
|
||||
|
||||
#custom-update {
|
||||
min-width: 12px;
|
||||
margin: 0 7.5px;
|
||||
}
|
||||
|
||||
#tray {
|
||||
margin-right: 16px;
|
||||
}
|
||||
|
||||
#bluetooth {
|
||||
margin-right: 17px;
|
||||
}
|
||||
|
||||
#network {
|
||||
margin-right: 13px;
|
||||
}
|
||||
|
||||
#custom-expand-icon {
|
||||
margin-right: 18px;
|
||||
}
|
||||
|
||||
tooltip {
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
#custom-update {
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
#clock {
|
||||
margin-left: 8.75px;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
|
||||
#custom-screenrecording-indicator,
|
||||
#custom-idle-indicator,
|
||||
#custom-notification-silencing-indicator {
|
||||
min-width: 12px;
|
||||
margin-left: 5px;
|
||||
margin-right: 0;
|
||||
font-size: 10px;
|
||||
padding-bottom: 1px;
|
||||
}
|
||||
|
||||
#custom-screenrecording-indicator.active {
|
||||
color: #a55555;
|
||||
}
|
||||
|
||||
#custom-voxtype {
|
||||
min-width: 12px;
|
||||
margin: 0 0 0 7.5px;
|
||||
}
|
||||
|
||||
#custom-voxtype.recording {
|
||||
color: #a55555;
|
||||
}
|
||||
|
||||
#custom-idle-indicator.active,
|
||||
#custom-notification-silencing-indicator.active {
|
||||
color: #a55555;
|
||||
}
|
||||
|
||||
#custom-notification {
|
||||
min-width: 16px;
|
||||
margin-left: 7.5px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
/* Import the active Omarchy theme's colors (regenerated from colors.toml
|
||||
on every theme change - static, dynamic, or shared - by
|
||||
omarchy-theme-set-templates via omarchy/themed/zen.css.tpl) */
|
||||
@import url("file:///home/blob/.config/omarchy/current/theme/zen.css");
|
||||
@import url("file:///home/blob/.local/state/omarchy/current/theme/zen.css");
|
||||
|
||||
:root {
|
||||
/* Map Omarchy colors to Zen variables */
|
||||
|
||||
Reference in New Issue
Block a user