Compare commits

...
Author SHA1 Message Date
Ryan Hughes 350b9a33b3 Fix keybinds display 2026-05-11 10:40:26 -04:00
Ryan Hughes e39206f24d Simplify montor scaling 2026-05-11 10:40:26 -04:00
Ryan Hughes 804571d8e2 Update all hyprland references to new lua ones 2026-05-11 10:40:26 -04:00
Ryan Hughes 82a1a91509 Add conf -> lua migration for Hyprland and update old migrations 2026-05-11 10:39:22 -04:00
Ryan Hughes 59a2619426 Update theme specifics to lua 2026-05-11 10:39:22 -04:00
Ryan Hughes f1bec15325 Update theme and SDDM to lua 2026-05-11 10:39:22 -04:00
Ryan Hughes c7b6a7f8c4 Swap defaults to lua 2026-05-11 10:39:22 -04:00
Ryan Hughes b93650991f Swap configs to lua 2026-05-11 10:39:22 -04:00
Ryan Hughes 7e6403133c Prevent lsp complaining 2026-05-11 10:39:22 -04:00
Mateusz KowalczykandGitHub 1acaa7ba4d Fix brightness indicator glitches caused by hardware-side key auto-repeat (#5760)
* Avoid overlapping brightness change key events.

* Clarify the fix comment
2026-05-11 16:33:58 +02:00
David Heinemeier Hansson dc4e6a6a50 One more weather icon tweak for light drizzle 2026-05-11 16:32:51 +02:00
David Heinemeier Hansson 147cc721f0 Better rain mapping of icons 2026-05-11 16:21:54 +02:00
David Heinemeier Hansson 95531a39c0 How to evolve features that require input and interaction 2026-05-11 15:45:36 +02:00
c6ecdd1000 Add dispatch shortcuts to help menu (#5756)
* feat: dispatch shortcuts from help menu

* Retain uwsm launch wrapping

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-05-11 15:40:04 +02:00
David Heinemeier HanssonandGitHub 5738583319 RetroArch game launcher installer (#5753)
* Agents should use the notification helper

* Turn a single RetroArch game into its own application launcher

* Tweak installer

* Extract selection logic into cli

* Use consistent glyph

* One more
2026-05-11 13:01:45 +02:00
David Heinemeier Hansson fc787cd040 Agents should use the notification helper 2026-05-11 12:13:33 +02:00
David Heinemeier Hansson b2f89061c7 Add hunk for diffing as a lazy-install npx 2026-05-11 11:31:42 +02:00
92f93cb0e5 Persist Bluetooth power state across reboots (#5683)
* Persist Bluetooth power state across reboots

BlueZ defaults to AutoEnable=true, which forces controllers on at boot
regardless of the last user-set state. Setting AutoEnable=false makes
bluetoothd respect the persisted Powered state, so toggling off in
bluetui (or any DBus client) survives a reboot.

Adds the change to the install path and a migration for existing setups.

* Set reboot-required in Bluetooth persistence migration

Per review feedback, the AutoEnable=false change only takes effect on
bluetoothd startup. Without setting reboot-required, omarchy-update-restart
won't prompt the user to reboot, so the fix would only kick in at their
next organic reboot — by which time the bug may appear unfixed.

Matches the convention in migrations/1776346552.sh and similar.

* No need to ask for a reboot when this is available on the next one

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-05-11 10:21:16 +02:00
c4dbf12920 Add pre-refresh-pacman.d hooks for custom repository support (#5681)
Fires after the channel template is copied to /etc/pacman.conf and before
`pacman -Syyuu` runs, letting users layer custom Pacman repositories or
IgnorePkg directives onto the freshly-written config so they're respected
by the upgrade. Useful for users running on overlay distros (CachyOS,
Chaotic-AUR, internal company repos) where a wipe-and-reinstall would
otherwise pull vanilla Arch versions.

Ships with `pre-refresh-pacman.d/add-custom-repo.sample` showing the
pattern.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 10:19:12 +02:00
RenéandGitHub 324c9a4054 Fix fontconfig monospace binding overriding app-specific fonts (#5700)
Change monospace match from mode="assign" binding="strong" to
mode="append" binding="same" so the system font acts as a fallback
instead of overriding explicit app font configs like Ghostty's font-family.

Add migration to fix existing user configs.

Fixes #5675
2026-05-11 10:15:37 +02:00
David Heinemeier Hansson 378ba984ca Checkout the full git so branch switching is still possible
Closes #5701
2026-05-11 10:11:53 +02:00
David Heinemeier Hansson 705e26eb8a Migrate the existing imv configs 2026-05-11 10:00:28 +02:00
Jon KinneyandGitHub cea144bc51 Trash imv deletes; add Ctrl+E to edit in Satty (#5721)
* Trash imv deletes; add Ctrl+E to edit in Satty

Ctrl+X / Ctrl+Shift+X now move the image to the freedesktop trash via
`gio trash` instead of unconditional `rm`, so accidental presses are
recoverable from the file manager's Trash.

Adds Ctrl+E to open the current image in Satty (already in
omarchy-base.packages) and quit imv, mirroring the typical
screenshot → annotate workflow.

* Add -- separator to gio trash invocations

Prevents filenames starting with - from being parsed as options.
2026-05-11 10:00:20 +02:00
46365b7d4d Scope branding image pickers to ~/Pictures, fix About transcode mode (#5733)
* Scope branding image pickers to ~/Pictures, fix About transcode mode

The "Set From Image" path in both Style → About and Style → Screensaver
was scanning all of $HOME for *.svg / *.png and feeding the result into
Walker dmenu. On a populated home directory this can be tens of thousands
of entries, leaving the picker effectively unusable.

Scope the picker to ${XDG_PICTURES_DIR:-$HOME/Pictures}, matching the
pattern already used in omarchy-capture-screenshot.

While here, drop the hardcoded --mode block from omarchy-branding-about
so the About transcode falls back to the default braille mode, matching
what omarchy-branding-screensaver does and what stock about.txt ships
with. The reduced --width 54 stays so the result fits the fastfetch
logo column.

* Explain the scope of the picker

---------

Co-authored-by: Gavin Nugent <245706154+28allday@users.noreply.github.com>
Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-05-11 09:53:07 +02:00
David Heinemeier Hansson 6afb51298c Hide the unused bits 2026-05-10 21:29:58 +02:00
David Heinemeier Hansson cd461059d0 Just a little wider 2026-05-10 20:33:34 +02:00
David Heinemeier Hansson f09743b2e9 libretro-vice is now an explosion of minor pkgs 2026-05-10 16:47:21 +02:00
David Heinemeier Hansson 8788dd2eb2 Fix arg order 2026-05-10 16:44:09 +02:00
David Heinemeier Hansson 0af7cc4a76 Fix overlap 2026-05-10 16:39:01 +02:00
David Heinemeier Hansson f426ae0de8 Lookup code symbols for better keybindings list 2026-05-10 16:31:08 +02:00
642d87d443 Add fine and coarse window resize steps (#5717)
* add additional window resize shortcuts

* add additional window resize shortcuts

* Use bigger difference between the steps

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-05-10 16:26:02 +02:00
afcfaf6b1e Control Waybar position (#5730)
* Waybar positioning and shape

* Reveal weather again on left/right

* Fix indicators moving bar left/right

* Clean it up

* Cleanup

* One step forward, one step backwards

* Fix styles

* More style massage

* More tweaks

* Just position for now

* Fix keys

* No longer needed

* No need to reset

* Simplify

* Reset but protect waybar configs

* Not needed

* Fix glyph

* Not needed

* Cleanup

* Better wording

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-05-10 15:42:26 +02:00
David Heinemeier Hansson f26cc8f157 Send a notification when we switch 2026-05-10 15:22:41 +02:00
David Heinemeier Hansson 566c106ec1 Better wording 2026-05-10 15:11:47 +02:00
David Heinemeier Hansson 5346bc6db1 Only return state when we are toggling
Otherwise we know it!
2026-05-10 15:08:33 +02:00
David Heinemeier Hansson 0075645f0e Set hyprlock corners too 2026-05-10 15:05:34 +02:00
David Heinemeier Hansson f10c945e00 Add Receive as an option to sharing 2026-05-10 14:50:48 +02:00
David Heinemeier Hansson 8a94891e77 Better glyph 2026-05-10 14:34:44 +02:00
David Heinemeier Hansson 2e29714eee Add integrated Style > Corner controls across hyprland, mako, walker 2026-05-10 14:29:51 +02:00
David Heinemeier Hansson 40a20e2a5c Fix glyph for Zen 2026-05-10 14:28:18 +02:00
David Heinemeier Hansson 8a38615f19 Fix for new notification send 2026-05-10 11:50:30 +02:00
David Heinemeier Hansson 887c7e3751 Set mako corners round or sharp 2026-05-10 11:50:19 +02:00
David Heinemeier Hansson e099f47d53 Add toggling of hyprland window rounded corners 2026-05-10 11:31:02 +02:00
David Heinemeier Hansson 26c1f9c546 Refactor toggles and notifications 2026-05-10 11:26:59 +02:00
David Heinemeier Hansson d3a082ef11 Fix upcoming reminders listing
It was comparing NextElapseUSecMonotonic against /proc/uptime, but those
values aren’t in the same monotonic timeline for user timers, so valid
upcoming reminders were being skipped.
2026-05-10 10:52:20 +02:00
David Heinemeier Hansson 2ab639ac0a Latest version from HANCORE 2026-05-10 10:41:34 +02:00
David Heinemeier Hansson 3d42142b88 Fix group coloring 2026-05-09 22:48:23 +02:00
David Heinemeier Hansson aa6b7f2975 Make the border highlight clearer 2026-05-09 22:35:18 +02:00
David Heinemeier Hansson 47a53a18ba Add Solitude theme by HANCORE 2026-05-09 22:33:10 +02:00
David Heinemeier Hansson b2fb238453 Add Last Horizon theme by HANCORE 2026-05-09 22:05:54 +02:00
David Heinemeier Hansson 676a278653 Slim down now that we are auto-detecting GDK_SCALE 2026-05-09 20:13:04 +02:00
David Heinemeier Hansson 890e3fc8c5 Set the initial GDK_SCALE to match the monitor scale 2026-05-09 19:55:15 +02:00
David Heinemeier Hansson 3eca9573ea Make GDK_SCALE change alongside the general monitor scaling 2026-05-09 19:29:22 +02:00
David Heinemeier Hansson 2e0e9af0a9 Use save for screenshot 2026-05-09 12:04:53 +02:00
David Heinemeier Hansson 9a2c53d571 Add save as an option for agents 2026-05-09 12:04:34 +02:00
David Heinemeier Hansson 10c42afcf2 Echo result so agents can use them and keep working with them 2026-05-09 11:40:31 +02:00
David Heinemeier Hansson cd9d6bb54b Screenshot on visual changes 2026-05-09 11:20:36 +02:00
David Heinemeier Hansson b9830069b1 Remove duplicate cliamp .desktop and icon 2026-05-09 08:28:53 +02:00
David Heinemeier Hansson cf9c274ee5 Cliamp now ships with the icon and desktop entry on its own 2026-05-09 08:25:05 +02:00
David Heinemeier Hansson ad2ae30f1e Remove VAAPI GL video feature flags from Chromium-based browser configs to prevent crashing on some machines 2026-05-08 22:31:01 +02:00
David Heinemeier Hansson 1fb412b5df Fix guidance 2026-05-08 22:07:49 +02:00
David Heinemeier Hansson ce60cb81c1 Don't do that 2026-05-08 22:06:18 +02:00
David Heinemeier Hansson fb174bfa70 Fix perms 2026-05-08 22:04:41 +02:00
David Heinemeier Hansson 25e6fe2ef9 Hide cursor like on decryption screen 2026-05-08 22:04:01 +02:00
David Heinemeier Hansson 7b860f4291 Be more forceful about killing waybar
Sometimes it can still get stuck
2026-05-08 21:52:42 +02:00
David Heinemeier Hansson dad2870f58 Check for weather once a minute instead of once every ten
More accurate and deals with the first-boot issue on network too
2026-05-08 21:44:21 +02:00
David Heinemeier Hansson 2594a80cba Use latest package name 2026-05-08 21:34:46 +02:00
David Heinemeier Hansson 4c482769b8 Ensure quotes 2026-05-08 21:28:09 +02:00
a4778a01c0 Delay weather waybar startup to handle network initialization on boot (#5677)
Co-authored-by: jzwnl <jzwnl@users.noreply.github.com>
2026-05-08 21:14:29 +02:00
1537547f91 Use packaged Dell XPS touchpad haptics (#5534)
* Configure Dell XPS haptics directly

* Use packaged Dell XPS touchpad haptics service

* fix: keep one Dell haptics migration

* We already have a dedicated Trigger > Hardware menu

* Name for action

* Moved

* Need to make the package available for offline

* Simplify

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-05-08 21:07:51 +02:00
David Heinemeier Hansson 30f9a8da54 Not worth the extraction 2026-05-08 20:52:29 +02:00
David Heinemeier Hansson df4ffe991f Balance in output 2026-05-08 20:48:36 +02:00
David Heinemeier Hansson 1b5dcdafd2 Ensure this is a full reset 2026-05-08 20:44:07 +02:00
David Heinemeier Hansson e11d20cfba Quiet the warning on reinstall of keyring 2026-05-08 20:41:33 +02:00
David Heinemeier Hansson 37d6e4f92f Order the same as install menu 2026-05-08 16:46:08 +02:00
David Heinemeier HanssonandGitHub 45db959daf Split fido2 and fingerprint setups into setup and remove (#5670)
* Split fido2 and fingerprint setups into setup and remove

Don't make one thing do two things

* Extract helpers and clean up

* No need to hide them

* Don't need these
2026-05-08 16:41:20 +02:00
David Heinemeier Hansson 366b160960 Fix tests 2026-05-08 16:36:46 +02:00
David Heinemeier Hansson fbc177baa8 Simpler 2026-05-08 16:11:20 +02:00
David Heinemeier Hansson 7702e837e1 Add About screen branding and make everything generic and available through cli 2026-05-08 16:07:36 +02:00
David Heinemeier Hansson 8c5fb7abc3 Make sure arg enums can autocomplete too 2026-05-08 16:06:10 +02:00
David Heinemeier Hansson 7b90929129 Don't find hidden files or directories 2026-05-08 16:02:42 +02:00
David Heinemeier Hansson 065b9439cd Launch screensaver after restoring default too 2026-05-08 15:43:14 +02:00
David Heinemeier Hansson 48859c828b Start the screensaver directly after changes rather than needing a preview 2026-05-08 15:41:31 +02:00
David Heinemeier Hansson 8757b2e1a4 Don't look in hidden directories 2026-05-08 15:41:15 +02:00
David Heinemeier Hansson 0e6e292348 Add 4x scaling too
Great for gif feature demos
2026-05-08 14:52:13 +02:00
b10f8116c8 fix(weather): Use local units for temperature and wind (#5660)
* fix(weather): Use local units for temperature and wind

Remove the metric-to-imperial temperature conversion and display
temperature and wind values as returned for the current locale.

* Don't need this comment

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-05-08 14:24:26 +02:00
twagner12andGitHub c7c3ef87af Fix DefaultLimitNOFILE typo so fd-limit raise actually applies (#5661)
`DefaultLimitNOFILESoft` is not a valid systemd configuration key.
systemd silently ignores it and emits this warning on every boot,
for both the system manager (PID 1) and the user manager:

  Unknown key 'DefaultLimitNOFILESoft' in section [Manager], ignoring.

The consequence is that the script's stated goal of raising the soft
fd limit from 1024 to 65536 has not actually been happening: dev
tools (VS Code, Docker, dev servers, databases) continue to run with
systemd's default 1024 soft limit.

The valid key is `DefaultLimitNOFILE`, which accepts either a single
value (sets both soft and hard) or `SOFT:HARD`. Using `65536:524288`
raises the soft limit while preserving systemd's typical 524288
hard-limit default — using the bare `=65536` form would lower the
hard limit, which would be a regression.

After this change and `systemctl daemon-reexec` on both managers,
`systemctl show | grep DefaultLimitNOFILE` reports:

  DefaultLimitNOFILE=524288     (hard)
  DefaultLimitNOFILESoft=65536  (soft, derived display attribute)

and the boot-time "Unknown key" warnings disappear.

(The typo likely originated from someone reading `systemctl show`
output, where `DefaultLimitNOFILESoft=` appears as a read-only
display attribute for the soft component of the parsed limit.
It looks like a config key but isn't.)
2026-05-08 13:22:29 +02:00
David Heinemeier Hansson 99b158cbc1 Back to trigger menu on esc 2026-05-08 12:45:31 +02:00
David Heinemeier Hansson f59e9133e1 Use new helper 2026-05-08 12:44:20 +02:00
David Heinemeier Hansson acb2c37b1f Have transcode flow through walker menus rather than gum prompts 2026-05-08 12:40:54 +02:00
David Heinemeier Hansson cbf4044c70 Omarchy menu helpers
Get more stuff out of the terminal
2026-05-08 12:40:37 +02:00
David Heinemeier HanssonandGitHub 129c39448c Reminders (#5669)
* Extract notification command for using the correct spacing

* Add easy to set reminders

* More human

* Clear and direct hotkeys

* Split

* Bake reminders into the skill
2026-05-08 11:58:12 +02:00
David Heinemeier Hansson 9f187b55da Make sure the Omarchy agent skill is available for all harnesses 2026-05-08 11:56:06 +02:00
David Heinemeier Hansson 5971bab9d1 Extract notification command for using the correct spacing 2026-05-08 09:01:09 +02:00
David Heinemeier Hansson a43c304d21 Add post-boot.d hooks and give daily weather as an example 2026-05-08 08:39:25 +02:00
David Heinemeier Hansson 5c3ca6084b Group duplicate notifications 2026-05-08 08:35:28 +02:00
David Heinemeier Hansson 0c6bd1929f Force metric return units 2026-05-07 19:44:19 +02:00
fa1ed01cd7 Run SwayOSD as a session service (#5656)
* Run SwayOSD as a session service

* Restart SwayOSD after clean exits

* We don't need the input backend (as we manage the hotkeys in Hyprland)

* Ensure we cleanup the old service starter

* Not needed

* Not needed either

* Clean up migration

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-05-07 19:43:27 +02:00
Mateusz KowalczykandGitHub 402da79f54 Install hardware video acceleration for non-X-series Panther Lake Chips (#5655)
* Adjust condition to also match non-X series Panther Lake GPUs.

* Add migration to install GPU acceleration on non-X Panther Lake systems.

* Update comment with Non-Arc Panther Lake GPUs mentioned.

* Simplify conditions in the migration
2026-05-07 19:12:48 +02:00
Ryan Hughes 4f502322bd Update pi package source 2026-05-07 12:21:08 -04:00
David Heinemeier Hansson 2293df2913 This requires a full reboot to work 2026-05-07 17:02:08 +02:00
David Heinemeier Hansson 573f75afeb Fix that zed cli is zeditor 2026-05-07 16:55:54 +02:00
Diego RiosandGitHub 9c3520caf9 Enable Bluetooth A2DP auto-connect in WirePlumber (#5336)
* Enable Bluetooth A2DP auto-connect in WirePlumber

* Harden Bluetooth A2DP migration
2026-05-07 16:48:26 +02:00
David Heinemeier Hansson 4831c883e5 Explain the 152 2026-05-07 16:18:23 +02:00
David Heinemeier Hansson e14c685c7e Quoting 2026-05-07 16:16:01 +02:00
David Heinemeier Hansson b794321cd0 Prevent notification text wrapping 2026-05-07 16:15:04 +02:00
David Heinemeier HanssonandGitHub 95d8125e59 Set default terminal, browser, editor explicitly (#5651)
* Set default terminal, browser, editor explicitly

* Consistent glyphs and setup

* Tweaks

* Always there

* Proper order

* Don't make a browser the default just because it's getting installed
2026-05-07 16:11:48 +02:00
269 changed files with 3788 additions and 1983 deletions
+11
View File
@@ -0,0 +1,11 @@
{
"workspace": {
"library": [
"/usr/share/hypr/stubs"
],
"checkThirdParty": false
},
"diagnostics": {
"globals": ["hl"]
}
}
+9
View File
@@ -82,6 +82,7 @@ Use these instead of raw shell commands:
- `omarchy-cmd-missing` / `omarchy-cmd-present` - check for commands - `omarchy-cmd-missing` / `omarchy-cmd-present` - check for commands
- `omarchy-pkg-missing` / `omarchy-pkg-present` - check for packages - `omarchy-pkg-missing` / `omarchy-pkg-present` - check for packages
- `omarchy-pkg-add` - install packages (handles both pacman and AUR) - `omarchy-pkg-add` - install packages (handles both pacman and AUR)
- `omarchy-notification-send` - send desktop notifications; do not call `notify-send` directly
- `omarchy-hw-asus-rog` - detect ASUS ROG hardware (and similar `hw-*` commands) - `omarchy-hw-asus-rog` - detect ASUS ROG hardware (and similar `hw-*` commands)
Exceptions are allowed for bootstrap, preflight, migration, and package-helper scripts where the helper may not be available yet, where the helper itself is being implemented, or where direct package-manager behavior is required. Exceptions are allowed for bootstrap, preflight, migration, and package-helper scripts where the helper may not be available yet, where the helper itself is being implemented, or where direct package-manager behavior is required.
@@ -92,6 +93,14 @@ Exceptions are allowed for bootstrap, preflight, migration, and package-helper s
- `default/themed/*.tpl` - templates with `{{ variable }}` placeholders for theme colors - `default/themed/*.tpl` - templates with `{{ variable }}` placeholders for theme colors
- `themes/*/colors.toml` - theme color definitions (accent, background, foreground, color0-15) - `themes/*/colors.toml` - theme color definitions (accent, background, foreground, color0-15)
# Visual Changes
When making visual changes, such as Waybar styles or desktop appearance, always take and analyze a screenshot after applying the change to verify the result. Use `omarchy capture screenshot fullscreen save` for fullscreen screenshots.
For interactive UI work, use `wtype` to simulate keyboard input when available. Example: start the UI in the background, wait briefly for focus, then run `wtype -k Right -k Return` to exercise keyboard selection and confirm the resulting command output or state change. Prefer this over manual-only verification when a UI returns a selected value or changes a symlink/config.
When testing layer-shell UI, capture the reference and candidate states as separate screenshots, then compare them visually before further edits. If a launched UI would otherwise remain open, keep track of its PID and stop it after the screenshot; avoid broad process kills unless checking with `ps` first.
# Refresh Pattern # Refresh Pattern
To copy a default config to user config with automatic backup: To copy a default config to user config with automatic backup:
@@ -0,0 +1,2 @@
[Desktop Entry]
Hidden=true
@@ -0,0 +1,2 @@
[Desktop Entry]
Hidden=true
@@ -0,0 +1,2 @@
[Desktop Entry]
Hidden=true
@@ -0,0 +1,2 @@
[Desktop Entry]
Hidden=true
@@ -0,0 +1,2 @@
[Desktop Entry]
Hidden=true
Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

+6
View File
@@ -29,21 +29,25 @@ declare -A GROUP_DESCRIPTIONS
GROUP_DESCRIPTIONS[ac]="AC power detection" GROUP_DESCRIPTIONS[ac]="AC power detection"
GROUP_DESCRIPTIONS[battery]="Battery status helpers" GROUP_DESCRIPTIONS[battery]="Battery status helpers"
GROUP_DESCRIPTIONS[branch]="Omarchy git branch management" GROUP_DESCRIPTIONS[branch]="Omarchy git branch management"
GROUP_DESCRIPTIONS[branding]="About and screensaver branding"
GROUP_DESCRIPTIONS[brightness]="Display and keyboard brightness" GROUP_DESCRIPTIONS[brightness]="Display and keyboard brightness"
GROUP_DESCRIPTIONS[capture]="Screenshots and screen recording" GROUP_DESCRIPTIONS[capture]="Screenshots and screen recording"
GROUP_DESCRIPTIONS[channel]="Omarchy release channel management" GROUP_DESCRIPTIONS[channel]="Omarchy release channel management"
GROUP_DESCRIPTIONS[cmd]="Command and shortcut helpers" GROUP_DESCRIPTIONS[cmd]="Command and shortcut helpers"
GROUP_DESCRIPTIONS[config]="System configuration helpers" GROUP_DESCRIPTIONS[config]="System configuration helpers"
GROUP_DESCRIPTIONS[debug]="Diagnostics and support logs" GROUP_DESCRIPTIONS[debug]="Diagnostics and support logs"
GROUP_DESCRIPTIONS[default]="Default application selection"
GROUP_DESCRIPTIONS[dev]="Omarchy development tools" GROUP_DESCRIPTIONS[dev]="Omarchy development tools"
GROUP_DESCRIPTIONS[drive]="Drive selection and encryption" GROUP_DESCRIPTIONS[drive]="Drive selection and encryption"
GROUP_DESCRIPTIONS[font]="Font management" GROUP_DESCRIPTIONS[font]="Font management"
GROUP_DESCRIPTIONS[games]="Game launchers and helpers"
GROUP_DESCRIPTIONS[hibernation]="Hibernation setup and removal" GROUP_DESCRIPTIONS[hibernation]="Hibernation setup and removal"
GROUP_DESCRIPTIONS[hook]="User hook runner" GROUP_DESCRIPTIONS[hook]="User hook runner"
GROUP_DESCRIPTIONS[hw]="Hardware detection and controls" GROUP_DESCRIPTIONS[hw]="Hardware detection and controls"
GROUP_DESCRIPTIONS[hyprland]="Hyprland window, monitor, and toggle controls" GROUP_DESCRIPTIONS[hyprland]="Hyprland window, monitor, and toggle controls"
GROUP_DESCRIPTIONS[install]="Optional software installers" GROUP_DESCRIPTIONS[install]="Optional software installers"
GROUP_DESCRIPTIONS[launch]="Application launchers" GROUP_DESCRIPTIONS[launch]="Application launchers"
GROUP_DESCRIPTIONS[mako]="Mako notification controls"
GROUP_DESCRIPTIONS[menu]="Omarchy menu commands" GROUP_DESCRIPTIONS[menu]="Omarchy menu commands"
GROUP_DESCRIPTIONS[migrate]="Migration runner" GROUP_DESCRIPTIONS[migrate]="Migration runner"
GROUP_DESCRIPTIONS[notification]="Notification helpers" GROUP_DESCRIPTIONS[notification]="Notification helpers"
@@ -53,11 +57,13 @@ GROUP_DESCRIPTIONS[plymouth]="Plymouth boot theme management"
GROUP_DESCRIPTIONS[powerprofiles]="Power profile management" GROUP_DESCRIPTIONS[powerprofiles]="Power profile management"
GROUP_DESCRIPTIONS[refresh]="Reset config to defaults" GROUP_DESCRIPTIONS[refresh]="Reset config to defaults"
GROUP_DESCRIPTIONS[reinstall]="Reinstall and reset workflows" GROUP_DESCRIPTIONS[reinstall]="Reinstall and reset workflows"
GROUP_DESCRIPTIONS[reminder]="Desktop notification reminders"
GROUP_DESCRIPTIONS[remove]="Removal workflows" GROUP_DESCRIPTIONS[remove]="Removal workflows"
GROUP_DESCRIPTIONS[restart]="Restart Omarchy components" GROUP_DESCRIPTIONS[restart]="Restart Omarchy components"
GROUP_DESCRIPTIONS[setup]="Interactive setup wizards" GROUP_DESCRIPTIONS[setup]="Interactive setup wizards"
GROUP_DESCRIPTIONS[screensaver]="Screensaver branding and animation" GROUP_DESCRIPTIONS[screensaver]="Screensaver branding and animation"
GROUP_DESCRIPTIONS[snapshot]="System snapshots" GROUP_DESCRIPTIONS[snapshot]="System snapshots"
GROUP_DESCRIPTIONS[style]="Global UI style controls"
GROUP_DESCRIPTIONS[sudo]="Sudo configuration helpers" GROUP_DESCRIPTIONS[sudo]="Sudo configuration helpers"
GROUP_DESCRIPTIONS[swayosd]="SwayOSD status display helpers" GROUP_DESCRIPTIONS[swayosd]="SwayOSD status display helpers"
GROUP_DESCRIPTIONS[system]="Reboot, shutdown, logout, and lock" GROUP_DESCRIPTIONS[system]="Reboot, shutdown, logout, and lock"
+30
View File
@@ -0,0 +1,30 @@
#!/bin/bash
# omarchy:summary=Edit, set, or reset About branding
# omarchy:group=branding
# omarchy:name=about
# omarchy:args=<image|text|reset>
# omarchy:examples=omarchy branding about image | omarchy branding about text | omarchy branding about reset
set -euo pipefail
SOURCE_DIR="${XDG_PICTURES_DIR:-$HOME/Pictures}"
case "${1:-}" in
image)
image=$(omarchy-menu-file "Pick png/svg from $SOURCE_DIR" "${SOURCE_DIR}" "svg png")
if [[ -n $image ]] && omarchy-transcode-ascii "$image" ~/.config/omarchy/branding/about.txt --width 54 --height 26; then
omarchy-launch-about >/dev/null 2>&1
fi
;;
text)
omarchy-launch-editor ~/.config/omarchy/branding/about.txt >/dev/null 2>&1 && omarchy-launch-about >/dev/null 2>&1
;;
reset)
cp "$OMARCHY_PATH/icon.txt" ~/.config/omarchy/branding/about.txt && omarchy-launch-about >/dev/null 2>&1
;;
*)
echo "Usage: omarchy-branding-about <image|text|reset>" >&2
exit 1
;;
esac
+30
View File
@@ -0,0 +1,30 @@
#!/bin/bash
# omarchy:summary=Edit, set, or reset screensaver branding
# omarchy:group=branding
# omarchy:name=screensaver
# omarchy:args=<image|text|reset>
# omarchy:examples=omarchy branding screensaver image | omarchy branding screensaver text | omarchy branding screensaver reset
set -euo pipefail
SOURCE_DIR="${XDG_PICTURES_DIR:-$HOME/Pictures}"
case "${1:-}" in
image)
image=$(omarchy-menu-file "Pick png/svg from $SOURCE_DIR" "${SOURCE_DIR}" "svg png")
if [[ -n $image ]] && omarchy-transcode-ascii "$image" ~/.config/omarchy/branding/screensaver.txt; then
omarchy-launch-screensaver force >/dev/null 2>&1
fi
;;
text)
omarchy-launch-editor ~/.config/omarchy/branding/screensaver.txt >/dev/null 2>&1 && omarchy-launch-screensaver force >/dev/null 2>&1
;;
reset)
cp "$OMARCHY_PATH/logo.txt" ~/.config/omarchy/branding/screensaver.txt && omarchy-launch-screensaver force >/dev/null 2>&1
;;
*)
echo "Usage: omarchy-branding-screensaver <image|text|reset>" >&2
exit 1
;;
esac
+15 -7
View File
@@ -6,6 +6,21 @@
step="${1:-+5%}" step="${1:-+5%}"
if [[ $step == "off" ]]; then
hyprctl dispatch 'hl.dsp.dpms({ action = "disable" })' >/dev/null 2>&1 || hyprctl dispatch dpms off >/dev/null 2>&1
exit 0
elif [[ $step == "on" ]]; then
hyprctl dispatch 'hl.dsp.dpms({ action = "enable" })' >/dev/null 2>&1 || hyprctl dispatch dpms on >/dev/null 2>&1
exit 0
fi
runtime_dir="${XDG_RUNTIME_DIR:-/tmp}"
# Drop overlapping brightness key events so concurrent invocations do not race.
# Hardware key repeat present on some devices can otherwise glitch SwayOSD rendering.
exec 9>"$runtime_dir/omarchy-brightness-display.lock"
flock -n 9 || exit 0
# Start with the first possible output, then refine to the most likely given an order heuristic. # Start with the first possible output, then refine to the most likely given an order heuristic.
device="$(ls -1 /sys/class/backlight 2>/dev/null | head -n1)" device="$(ls -1 /sys/class/backlight 2>/dev/null | head -n1)"
for candidate in amdgpu_bl* intel_backlight acpi_video*; do for candidate in amdgpu_bl* intel_backlight acpi_video*; do
@@ -15,13 +30,6 @@ for candidate in amdgpu_bl* intel_backlight acpi_video*; do
fi fi
done done
if [[ $step == "off" ]]; then
hyprctl dispatch dpms off >/dev/null 2>&1
exit 0
elif [[ $step == "on" ]]; then
hyprctl dispatch dpms on >/dev/null 2>&1
exit 0
fi
if omarchy-hyprland-monitor-focused-apple; then if omarchy-hyprland-monitor-focused-apple; then
omarchy-brightness-display-apple "$step" omarchy-brightness-display-apple "$step"
+1
View File
@@ -233,6 +233,7 @@ stop_screenrecording() {
else else
finalize_recording finalize_recording
local filename=$(cat "$RECORDING_FILE" 2>/dev/null) local filename=$(cat "$RECORDING_FILE" 2>/dev/null)
echo "$filename"
local preview="${filename%.mp4}-preview.png" local preview="${filename%.mp4}-preview.png"
# Generate a preview thumbnail from the first frame # Generate a preview thumbnail from the first frame
+19 -11
View File
@@ -2,7 +2,7 @@
# omarchy:summary=Take a screenshot # omarchy:summary=Take a screenshot
# omarchy:group=capture # omarchy:group=capture
# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy] [--editor=<name>] # omarchy:args=[smart|region|windows|fullscreen] [slurp|copy|save] [--editor=<name>]
# omarchy:examples=omarchy screenshot | omarchy capture screenshot region # omarchy:examples=omarchy screenshot | omarchy capture screenshot region
# omarchy:aliases=omarchy screenshot # omarchy:aliases=omarchy screenshot
@@ -126,14 +126,22 @@ esac
FILENAME="screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" FILENAME="screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png"
FILEPATH="$OUTPUT_DIR/$FILENAME" FILEPATH="$OUTPUT_DIR/$FILENAME"
if [[ $PROCESSING == "slurp" ]]; then case "$PROCESSING" in
grim -g "$SELECTION" "$FILEPATH" || exit 1 slurp)
wl-copy <"$FILEPATH" grim -g "$SELECTION" "$FILEPATH" || exit 1
echo "$FILEPATH"
wl-copy <"$FILEPATH"
( (
ACTION=$(notify-send "Screenshot saved to clipboard and file" "Edit with Super + Alt + , (or click this)" -t 10000 -i "$FILEPATH" -A "default=edit") ACTION=$(notify-send "Screenshot saved to clipboard and file" "Edit with Super + Alt + , (or click this)" -t 10000 -i "$FILEPATH" -A "default=edit")
[[ $ACTION == "default" ]] && open_editor "$FILEPATH" [[ $ACTION == "default" ]] && open_editor "$FILEPATH"
) & ) >/dev/null 2>&1 &
else ;;
grim -g "$SELECTION" - | wl-copy copy)
fi grim -g "$SELECTION" - | wl-copy
;;
save)
grim -g "$SELECTION" "$FILEPATH" || exit 1
echo "$FILEPATH"
;;
esac
+40
View File
@@ -0,0 +1,40 @@
#!/bin/bash
# omarchy:summary=Set the default browser for Omarchy and XDG handlers
# omarchy:args=[chromium|chrome|brave|brave-origin|edge|firefox|zen]
# omarchy:examples=omarchy default browser firefox | omarchy default browser brave
if (($# == 0)); then
case "$(xdg-settings get default-web-browser)" in
chromium.desktop) echo "chromium" ;;
google-chrome.desktop) echo "chrome" ;;
brave-browser.desktop) echo "brave" ;;
brave-origin-beta.desktop) echo "brave-origin" ;;
microsoft-edge.desktop) echo "edge" ;;
firefox.desktop) echo "firefox" ;;
zen.desktop) echo "zen" ;;
*) xdg-settings get default-web-browser ;;
esac
exit 0
fi
case "$1" in
chromium) desktop_id="chromium.desktop"; name="Chromium"; glyph="" ;;
chrome) desktop_id="google-chrome.desktop"; name="Chrome"; glyph="󰊯" ;;
brave) desktop_id="brave-browser.desktop"; name="Brave"; glyph="󰖟" ;;
brave-origin) desktop_id="brave-origin-beta.desktop"; name="Brave Origin"; glyph="󰖟" ;;
edge) desktop_id="microsoft-edge.desktop"; name="Edge"; glyph="󰇩" ;;
firefox) desktop_id="firefox.desktop"; name="Firefox"; glyph="󰈹" ;;
zen) desktop_id="zen.desktop"; name="Zen"; glyph="󰖟" ;;
*)
echo "Usage: omarchy-default-browser <chromium|chrome|brave|brave-origin|edge|firefox|zen>"
exit 1
;;
esac
xdg-settings set default-web-browser "$desktop_id"
xdg-mime default "$desktop_id" x-scheme-handler/http
xdg-mime default "$desktop_id" x-scheme-handler/https
xdg-mime default "$desktop_id" text/html
notify-send -u low "$glyph $name is now the default browser"
+30
View File
@@ -0,0 +1,30 @@
#!/bin/bash
# omarchy:summary=Set the default editor for $EDITOR
# omarchy:args=[code|cursor|zed|sublime_text|helix|vim|emacs|nvim]
# omarchy:examples=omarchy default editor | omarchy default editor code | omarchy default editor helix
if (($# == 0)); then
sed -n 's/^export EDITOR=//p' ~/.config/uwsm/default | head -n 1
exit 0
fi
case "$1" in
code) editor="code"; name="VSCode"; glyph="" ;;
cursor) editor="cursor"; name="Cursor"; glyph="" ;;
zed | zeditor) editor="zeditor"; name="Zed"; glyph="" ;;
sublime_text) editor="sublime_text"; name="Sublime Text"; glyph="" ;;
helix) editor="helix"; name="Helix"; glyph="" ;;
vim) editor="vim"; name="Vim"; glyph="" ;;
emacs) editor="emacs"; name="Emacs"; glyph="" ;;
nvim) editor="nvim"; name="Neovim"; glyph="" ;;
*)
echo "Usage: omarchy-default-editor <code|cursor|zed|sublime_text|helix|vim|emacs|nvim>"
exit 1
;;
esac
sed -i "s/^export EDITOR=.*/export EDITOR=$editor/" ~/.config/uwsm/default
export EDITOR="$editor"
notify-send -u low "$glyph $name is now the default editor" " Effective after logging out"
+36
View File
@@ -0,0 +1,36 @@
#!/bin/bash
# omarchy:summary=Set the default terminal used by xdg-terminal-exec
# omarchy:args=[alacritty|foot|ghostty|kitty]
# omarchy:examples=omarchy default terminal ghostty | omarchy default terminal kitty
if (($# == 0)); then
desktop_id=$(grep -vE '^($|#)' ~/.config/xdg-terminals.list 2>/dev/null | head -n 1)
case "$desktop_id" in
Alacritty.desktop) echo "alacritty" ;;
foot.desktop) echo "foot" ;;
com.mitchellh.ghostty.desktop) echo "ghostty" ;;
kitty.desktop) echo "kitty" ;;
*) echo "$desktop_id" ;;
esac
exit 0
fi
case "$1" in
alacritty) desktop_id="Alacritty.desktop"; name="Alacritty"; glyph="" ;;
foot) desktop_id="foot.desktop"; name="Foot"; glyph="" ;;
ghostty) desktop_id="com.mitchellh.ghostty.desktop"; name="Ghostty"; glyph="" ;;
kitty) desktop_id="kitty.desktop"; name="Kitty"; glyph="" ;;
*)
echo "Usage: omarchy-default-terminal <alacritty|foot|ghostty|kitty>"
exit 1
;;
esac
cat >~/.config/xdg-terminals.list <<EOF
# Terminal emulator preference order for xdg-terminal-exec
# The first found and valid terminal will be used
$desktop_id
EOF
notify-send -u low "$glyph $name is now the default terminal"
+2
View File
@@ -16,6 +16,8 @@ if [[ -f $FIRST_RUN_MODE ]]; then
bash "$OMARCHY_PATH/install/first-run/firewall.sh" bash "$OMARCHY_PATH/install/first-run/firewall.sh"
bash "$OMARCHY_PATH/install/first-run/dns-resolver.sh" bash "$OMARCHY_PATH/install/first-run/dns-resolver.sh"
bash "$OMARCHY_PATH/install/first-run/gnome-theme.sh" bash "$OMARCHY_PATH/install/first-run/gnome-theme.sh"
bash "$OMARCHY_PATH/install/first-run/gdk-scale.sh"
bash "$OMARCHY_PATH/install/first-run/swayosd.sh"
bash "$OMARCHY_PATH/install/first-run/gtk-primary-paste.sh" bash "$OMARCHY_PATH/install/first-run/gtk-primary-paste.sh"
bash "$OMARCHY_PATH/install/first-run/elephant.sh" bash "$OMARCHY_PATH/install/first-run/elephant.sh"
omarchy-hook-install post-update "$OMARCHY_PATH/install/first-run/install-voxtype.hook" omarchy-hook-install post-update "$OMARCHY_PATH/install/first-run/install-voxtype.hook"
+39
View File
@@ -0,0 +1,39 @@
#!/bin/bash
# omarchy:summary=List installed RetroArch core names
set -e
core_dir="/usr/lib/libretro"
preferred_cores=(
"Amstrad CPC|cap32"
"Arcade FBNeo|fbneo"
"Arcade MAME|mame"
"Commodore Amiga|puae"
"Commodore C128|vice_x128"
"Commodore C64|vice_x64"
"Commodore VIC-20|vice_xvic"
"Nintendo DS|desmume"
"Nintendo Game Boy / Color|gambatte"
"Nintendo Game Boy Advance|mgba"
"Nintendo GameCube / Wii|dolphin"
"Nintendo NES / Famicom|mesen"
"Nintendo 64|parallel_n64"
"Nintendo SNES / SFC|snes9x"
"NEC PC Engine / TurboGrafx-16|mednafen_pce_fast"
"NEC PC Engine CD / TurboGrafx-CD|mednafen_pce"
"NEC PC Engine SuperGrafx|mednafen_supergrafx"
"Sega Dreamcast|flycast"
"Sega Mega Drive / Master System / Game Gear|genesis_plus_gx"
"Sega Saturn|kronos"
"Sony PlayStation|mednafen_psx_hw"
"Sony PlayStation Portable|ppsspp"
)
[[ -d $core_dir ]] || exit 0
for preferred_core in "${preferred_cores[@]}"; do
label="${preferred_core%%|*}"
core="${preferred_core#*|}"
[[ -f $core_dir/${core}_libretro.so ]] && printf '%s (%s)\n' "$label" "$core"
done
+76
View File
@@ -0,0 +1,76 @@
#!/bin/bash
# omarchy:summary=Create a desktop launcher for a RetroArch game
# omarchy:args=[core path-to-game]
# omarchy:examples=omarchy games retro install snes9x ~/Games/roms/snes/game.sfc | omarchy-games-retro-install /usr/lib/libretro/mgba_libretro.so ~/Games/roms/gba/game.gba
set -e
if (( $# == 0 )); then
mapfile -t cores < <(omarchy-games-retro-cores)
if (( ${#cores[@]} == 0 )); then
omarchy-notification-send -g "󰯉" "No RetroArch cores found" "/usr/lib/libretro"
exit 1
fi
core=$(omarchy-menu-select "RetroArch core" "${cores[@]}") || exit 0
[[ -n $core ]] || exit 0
core="${core##*(}"
core="${core%)}"
game_path=$(omarchy-menu-file "Retro game" "$HOME/Games/roms" "7z bin ccd chd cue dmg elf fds gb gba gbc iso lha m3u md n64 nds nes pbp sfc smc swc zip z64") || exit 0
[[ -n $game_path ]] || exit 0
elif (( $# == 2 )); then
core="$1"
game_path="$2"
else
echo "Usage: omarchy-games-retro-install [core path-to-game]"
echo "Example: omarchy-games-retro-install snes9x ~/Games/roms/snes/game.sfc"
exit 1
fi
if [[ ! -f $game_path ]]; then
echo "Game not found: $game_path"
exit 1
fi
if [[ $core == */* ]]; then
core_path="$core"
else
core_path="/usr/lib/libretro/${core}_libretro.so"
fi
if [[ ! -f $core_path ]]; then
echo "Core not found: $core_path"
exit 1
fi
game_name=$(printf '%s' "${game_path##*/}" | sed 's/\.[^.]*$//; s/[[:space:]]*([^)]*)//g; s/[[:space:]]\+/ /g; s/^ //; s/ $//' | perl -Mopen=locale -pe 's/(^|[[:space:]])([^[:space:]])/$1\U$2/g')
desktop_name="$game_name"
desktop_id=$(printf '%s' "$desktop_name" | tr '[:upper:]' '[:lower:]' | tr -cs '[:alnum:]' '-' | sed 's/^-//; s/-$//')
desktop_dir="$HOME/.local/share/applications"
desktop_file="$desktop_dir/$desktop_id.desktop"
icon_dir="$desktop_dir/icons"
icon_path="$icon_dir/Retro Gaming.png"
mkdir -p "$desktop_dir" "$icon_dir"
[[ -f $icon_path ]] || cp "$HOME/.local/share/omarchy/applications/icons/Retro Gaming.png" "$icon_path"
cat >"$desktop_file" <<EOF
[Desktop Entry]
Version=1.0
Name=$desktop_name
Comment=Play $game_name with RetroArch
Exec=retroarch -L "$core_path" "$game_path"
Terminal=false
Type=Application
Icon=$icon_path
StartupNotify=true
Categories=Game;Emulator;
EOF
chmod +x "$desktop_file"
update-desktop-database "$desktop_dir" &>/dev/null || true
omarchy-notification-send -g "󰯉" "$game_name installed" "Start it with Super + Space"
-96
View File
@@ -1,96 +0,0 @@
#!/usr/bin/env python3
# omarchy:summary=Run the Synaptics touchpad haptic feedback daemon
"""Haptic feedback daemon for Synaptics touchpads with Manual Trigger.
Monitors touchpad button press events and sends haptic pulses via HID
feature reports. Required because the kernel's HID haptic subsystem only
supports Auto Trigger with waveform enumeration, not the simpler Manual
Trigger protocol used by these Synaptics touchpads.
"""
import fcntl, glob, os, struct, sys
VENDOR = "06CB"
REPORT_ID = 0x37
INTENSITY = 40 # 0-100
# input_event: struct timeval (16 bytes on 64-bit) + type(H) + code(H) + value(i)
EVENT_FORMAT = "llHHi"
EVENT_SIZE = struct.calcsize(EVENT_FORMAT)
EV_KEY = 0x01
BTN_LEFT = 272
BTN_RIGHT = 273
BTN_MIDDLE = 274
# ioctl: HIDIOCSFEATURE(len) = _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len)
def HIDIOCSFEATURE(length):
return 0xC0000000 | (length << 16) | (ord("H") << 8) | 0x06
def find_hidraw():
for path in sorted(glob.glob("/sys/class/hidraw/hidraw*")):
uevent = os.path.join(path, "device", "uevent")
try:
with open(uevent) as f:
content = f.read().upper()
if f"0000{VENDOR}" in content:
return os.path.join("/dev", os.path.basename(path))
except OSError:
continue
return None
def find_touchpad_event():
for path in sorted(glob.glob("/sys/class/input/event*/device/name")):
try:
with open(path) as f:
name = f.read().strip().upper()
if VENDOR in name and "TOUCHPAD" in name:
event = path.split("/")[-3]
return os.path.join("/dev/input", event)
except OSError:
continue
return None
def main():
hidraw = find_hidraw()
if not hidraw:
print("No Synaptics haptic touchpad hidraw device found", file=sys.stderr)
sys.exit(1)
event = find_touchpad_event()
if not event:
print("No Synaptics haptic touchpad input device found", file=sys.stderr)
sys.exit(1)
print(f"Haptic touchpad: hidraw={hidraw} input={event} intensity={INTENSITY}", flush=True)
haptic_report = struct.pack("BB", REPORT_ID, INTENSITY)
ioctl_req = HIDIOCSFEATURE(len(haptic_report))
hidraw_fd = os.open(hidraw, os.O_RDWR)
event_fd = os.open(event, os.O_RDONLY)
try:
while True:
data = os.read(event_fd, EVENT_SIZE)
if len(data) < EVENT_SIZE:
continue
_, _, ev_type, code, value = struct.unpack(EVENT_FORMAT, data)
if ev_type == EV_KEY and code in (BTN_LEFT, BTN_RIGHT, BTN_MIDDLE) and value == 1:
try:
fcntl.ioctl(hidraw_fd, ioctl_req, haptic_report)
except OSError:
pass
except KeyboardInterrupt:
pass
finally:
os.close(event_fd)
os.close(hidraw_fd)
if __name__ == "__main__":
main()
+5
View File
@@ -0,0 +1,5 @@
#!/bin/bash
# omarchy:summary=Match Dell XPS systems with the Synaptics haptic touchpad.
omarchy-hw-match "XPS" && [[ -e /sys/bus/i2c/devices/i2c-VEN_06CB:00 ]]
+1 -1
View File
@@ -2,7 +2,7 @@
# omarchy:summary=Clear the internal-monitor-disable toggle if no external display is connected. # omarchy:summary=Clear the internal-monitor-disable toggle if no external display is connected.
TOGGLE="$HOME/.local/state/omarchy/toggles/hypr/internal-monitor-disable.conf" TOGGLE="$HOME/.local/state/omarchy/toggles/hypr/internal-monitor-disable.lua"
if [[ -f $TOGGLE ]] && ! omarchy-hw-external-monitors; then if [[ -f $TOGGLE ]] && ! omarchy-hw-external-monitors; then
rm -f "$TOGGLE" rm -f "$TOGGLE"
+24 -14
View File
@@ -4,40 +4,50 @@
# omarchy:args=<on|off|toggle|recover> # omarchy:args=<on|off|toggle|recover>
TOGGLE="internal-monitor-disable" TOGGLE="internal-monitor-disable"
TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.conf" TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.lua"
MIRROR_TOGGLE="internal-monitor-mirror" MIRROR_TOGGLE="internal-monitor-mirror"
# Get internal monitor name dynamically # Get internal monitor name dynamically
INTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP")).name' | head -n 1) INTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP")).name' | head -n 1)
enable() { on() {
if omarchy-hyprland-toggle-enabled "$TOGGLE"; then if omarchy-hyprland-toggle-enabled $TOGGLE; then
omarchy-hyprland-toggle --disabled-notification "󰍹 Laptop display enabled" "$TOGGLE" omarchy-hyprland-toggle $TOGGLE off
omarchy-notification-send -g 󰍹 "Laptop display enabled"
fi fi
} }
disable() { off() {
if ! omarchy-hw-external-monitors; then if ! omarchy-hw-external-monitors; then
notify-send -u low "󰍹 Can't disable the only active display" omarchy-notification-send -g 󰍹 "Can't disable the only active display"
exit 1 exit 1
fi fi
if omarchy-hyprland-toggle-disabled "$TOGGLE" && omarchy-hyprland-toggle-disabled "$MIRROR_TOGGLE"; then
echo "monitor=$INTERNAL,disable" >"$TOGGLE_FLAG" if omarchy-hyprland-toggle-disabled $TOGGLE && omarchy-hyprland-toggle-disabled $MIRROR_TOGGLE; then
notify-send -u low "󰍹 Laptop display disabled" printf 'hl.monitor({ output = "%s", disabled = true })\n' "$INTERNAL" >"$TOGGLE_FLAG"
omarchy-notification-send -g 󰍹 "Laptop display disabled"
hyprctl reload hyprctl reload
fi fi
} }
recover() { recover() {
if ! omarchy-hw-external-monitors && omarchy-hyprland-toggle-enabled "$TOGGLE"; then if ! omarchy-hw-external-monitors && omarchy-hyprland-toggle-enabled $TOGGLE; then
omarchy-hyprland-toggle "$TOGGLE" omarchy-hyprland-toggle $TOGGLE off
fi
}
toggle() {
if omarchy-hyprland-toggle-enabled $TOGGLE; then
on
else
off
fi fi
} }
case "$1" in case "$1" in
on) enable ;; on) on ;;
off) disable ;; off) off ;;
toggle) if omarchy-hyprland-toggle-enabled "$TOGGLE"; then enable; else disable; fi ;; toggle) toggle ;;
recover) recover ;; recover) recover ;;
*) *)
echo "Usage: $(basename "$0") {on|off|toggle|recover}" >&2 echo "Usage: $(basename "$0") {on|off|toggle|recover}" >&2
+27 -20
View File
@@ -4,7 +4,7 @@
# omarchy:args=<on|off|toggle|recover> # omarchy:args=<on|off|toggle|recover>
TOGGLE="internal-monitor-mirror" TOGGLE="internal-monitor-mirror"
TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.conf" TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.lua"
DISABLE_TOGGLE="internal-monitor-disable" DISABLE_TOGGLE="internal-monitor-disable"
# Get names dynamically # Get names dynamically
@@ -12,44 +12,51 @@ INTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP")).na
# Get the first available external monitor # Get the first available external monitor
EXTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP") | not).name' | head -n 1) EXTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP") | not).name' | head -n 1)
enable() { on() {
if [[ -z "$EXTERNAL" ]]; then if [[ -z $EXTERNAL ]]; then
notify-send -u low "󰍹 No external monitors found for mirror" omarchy-notification-send -g 󰍹 "No external monitors found for mirror"
exit 1 exit 1
fi fi
if [[ -z "$INTERNAL" ]]; then if [[ -z $INTERNAL ]]; then
notify-send -u low "󰍹 No laptop monitor found to mirror" omarchy-notification-send -g 󰍹 "No laptop monitor found to mirror"
exit 1 exit 1
fi fi
if omarchy-hyprland-toggle-enabled "$DISABLE_TOGGLE"; then omarchy-hyprland-toggle $DISABLE_TOGGLE off
omarchy-hyprland-toggle "$DISABLE_TOGGLE"
fi
if omarchy-hyprland-toggle-disabled "$TOGGLE"; then if omarchy-hyprland-toggle-disabled $TOGGLE; then
echo "monitor=$EXTERNAL, preferred, auto, 1, mirror, $INTERNAL" > "$TOGGLE_FLAG" printf 'hl.monitor({ output = "%s", mode = "preferred", position = "auto", scale = 1, mirror = "%s" })\n' "$EXTERNAL" "$INTERNAL" >"$TOGGLE_FLAG"
notify-send -u low "󰍹 Mirroring enabled ($EXTERNAL)" omarchy-notification-send -g 󰍹 "Mirroring enabled ($EXTERNAL)"
hyprctl reload hyprctl reload
fi fi
} }
disable() { off() {
if omarchy-hyprland-toggle-enabled "$TOGGLE"; then if omarchy-hyprland-toggle-enabled $TOGGLE; then
omarchy-hyprland-toggle --disabled-notification "󰍹 Extended mode restored" "$TOGGLE" omarchy-hyprland-toggle $TOGGLE off
omarchy-notification-send -g 󰍹 "Extended mode restored"
fi
}
toggle() {
if omarchy-hyprland-toggle-enabled $TOGGLE; then
off
else
on
fi fi
} }
recover() { recover() {
if ! omarchy-hw-external-monitors && omarchy-hyprland-toggle-enabled "$TOGGLE"; then if ! omarchy-hw-external-monitors && omarchy-hyprland-toggle-enabled $TOGGLE; then
omarchy-hyprland-toggle "$TOGGLE" omarchy-hyprland-toggle $TOGGLE off
fi fi
} }
case "$1" in case "$1" in
on) enable ;; on) on ;;
off) disable ;; off) off ;;
toggle) if omarchy-hyprland-toggle-enabled "$TOGGLE"; then disable; else enable; fi ;; toggle) toggle ;;
recover) recover ;; recover) recover ;;
*) *)
echo "Usage: $(basename "$0") {on|off|toggle|recover}" >&2 echo "Usage: $(basename "$0") {on|off|toggle|recover}" >&2
+5
View File
@@ -0,0 +1,5 @@
#!/bin/bash
# omarchy:summary=Print the monitor scale of the internal monitor or first other monitor
hyprctl monitors -j | jq -r '([.[] | select(.name | contains("eDP"))][0] // .[0]).scale // empty | tonumber | if . == floor then floor else . end'
+20 -13
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# omarchy:summary=Cycle focused Hyprland monitor scaling through 1x, 1.25x, 1.6x, 2x, and 3x # omarchy:summary=Cycle focused Hyprland monitor scaling through 1x, 1.25x, 1.6x, 2x, 3x, and 4x
MONITOR_INFO=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)') MONITOR_INFO=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)')
ACTIVE_MONITOR=$(echo "$MONITOR_INFO" | jq -r '.name') ACTIVE_MONITOR=$(echo "$MONITOR_INFO" | jq -r '.name')
@@ -9,8 +9,9 @@ WIDTH=$(echo "$MONITOR_INFO" | jq -r '.width')
HEIGHT=$(echo "$MONITOR_INFO" | jq -r '.height') HEIGHT=$(echo "$MONITOR_INFO" | jq -r '.height')
REFRESH_RATE=$(echo "$MONITOR_INFO" | jq -r '.refreshRate') REFRESH_RATE=$(echo "$MONITOR_INFO" | jq -r '.refreshRate')
# Cycle through scales: 1 → 1.25 → 1.6 → 2 → 3 → 1 (or reverse with --reverse) # Cycle through monitor/GDK scale pairs: 1 → 1.25 → 1.6 → 2 → 3 → 4 → 1 (or reverse with --reverse)
SCALES=(1 1.25 1.6 2 3) SCALES=(1 1.25 1.6 2 3 4)
GDK_SCALES=(1 1.25 1.75 2 3 4)
# Find the index of the scale closest to the current one (Hyprland may # Find the index of the scale closest to the current one (Hyprland may
# snap fractional scales to nearby values, so we can't match exactly) # snap fractional scales to nearby values, so we can't match exactly)
@@ -24,24 +25,30 @@ CURRENT_IDX=$(awk -v s="$CURRENT_SCALE" -v list="${SCALES[*]}" 'BEGIN {
print best print best
}') }')
if [[ "$1" == "--reverse" ]]; then if [[ $1 == "--reverse" ]]; then
NEW_IDX=$(( (CURRENT_IDX - 1 + ${#SCALES[@]}) % ${#SCALES[@]} )) NEW_IDX=$(( (CURRENT_IDX - 1 + ${#SCALES[@]}) % ${#SCALES[@]} ))
else else
NEW_IDX=$(( (CURRENT_IDX + 1) % ${#SCALES[@]} )) NEW_IDX=$(( (CURRENT_IDX + 1) % ${#SCALES[@]} ))
fi fi
NEW_SCALE=${SCALES[$NEW_IDX]} NEW_SCALE=${SCALES[$NEW_IDX]}
NEW_GDK_SCALE=${GDK_SCALES[$NEW_IDX]}
hyprctl keyword monitor "$ACTIVE_MONITOR,${WIDTH}x${HEIGHT}@${REFRESH_RATE},auto,$NEW_SCALE" hyprctl eval "hl.monitor({ output = \"$ACTIVE_MONITOR\", mode = \"${WIDTH}x${HEIGHT}@${REFRESH_RATE}\", position = \"auto\", scale = $NEW_SCALE })" >/dev/null
# Persist to monitors.conf if the user has a single generic catch-all line # Persist to monitors.lua if the user still has Omarchy's generic catch-all
# (ignoring disabled monitors), so the scale survives reboots. # defaults, so the scale survives reboots.
MONITOR_CONF="$HOME/.config/hypr/monitors.conf" MONITOR_LUA="$HOME/.config/hypr/monitors.lua"
if [[ -f $MONITOR_CONF ]]; then if [[ -f $MONITOR_LUA ]] && grep -q '^local omarchy_monitor_scale = ' "$MONITOR_LUA"; then
mapfile -t ACTIVE_LINES < <(grep -E '^[[:space:]]*monitor=' "$MONITOR_CONF" | grep -vE 'disable[[:space:]]*$') sed -i -E \
if [[ ${#ACTIVE_LINES[@]} -eq 1 ]] && [[ "${ACTIVE_LINES[0]}" =~ ^monitor=,preferred,auto, ]]; then -e "s|^local omarchy_monitor_scale = .*|local omarchy_monitor_scale = ${NEW_SCALE}|" \
sed -i -E "s|^(monitor=,preferred,auto,).*|\\1${NEW_SCALE}|" "$MONITOR_CONF" -e "s|^local omarchy_gdk_scale = .*|local omarchy_gdk_scale = ${NEW_GDK_SCALE}|" \
fi "$MONITOR_LUA"
elif [[ -f $MONITOR_LUA ]] && grep -Eq '^hl\.monitor\(\{ output = "", mode = "preferred", position = "auto", scale = ("auto"|[0-9.]+) \}\)' "$MONITOR_LUA"; then
sed -i -E \
-e "s|^(hl\.monitor\(\{ output = \"\", mode = \"preferred\", position = \"auto\", scale = )([^ ]+)( \}\))|\\1${NEW_SCALE}\\3|" \
-e 's|^hl\.env\("GDK_SCALE", ".*"\)|hl.env("GDK_SCALE", "'"$NEW_GDK_SCALE"'")|' \
"$MONITOR_LUA"
fi fi
notify-send -u low "󰍹 Display scaling set to ${NEW_SCALE}x" notify-send -u low "󰍹 Display scaling set to ${NEW_SCALE}x"
+62 -17
View File
@@ -1,32 +1,77 @@
#!/bin/bash #!/bin/bash
# omarchy:summary=Toggle permanent Hyprland flags by copying them into a directory that's sourced entirely. # omarchy:summary=Toggle permanent Hyprland flags by copying them into a directory that's sourced entirely.
# omarchy:args=[--enabled-notification <text>] [--disabled-notification <text>] <flag-name> # omarchy:args=[--enabled-notification <text>] [--disabled-notification <text>] <flag-name> [on|off|toggle]
ENABLED_NOTIFICATION="" ENABLED_NOTIFICATION=""
DISABLED_NOTIFICATION="" DISABLED_NOTIFICATION=""
while [[ $# -gt 1 ]]; do while (($# > 0)); do
case $1 in case $1 in
--enabled-notification) ENABLED_NOTIFICATION="$2"; shift 2 ;; --enabled-notification)
--disabled-notification) DISABLED_NOTIFICATION="$2"; shift 2 ;; if (($# < 2)); then
echo "Missing value for $1" >&2
exit 1
fi
ENABLED_NOTIFICATION="$2"
shift 2
;;
--disabled-notification)
if (($# < 2)); then
echo "Missing value for $1" >&2
exit 1
fi
DISABLED_NOTIFICATION="$2"
shift 2
;;
*) break ;; *) break ;;
esac esac
done done
FLAG_NAME="$1" if (($# < 1)); then
FLAG="$HOME/.local/state/omarchy/toggles/hypr/$FLAG_NAME.conf" echo "Usage: omarchy-hyprland-toggle [--enabled-notification <text>] [--disabled-notification <text>] <flag-name> [on|off|toggle]" >&2
FLAG_SOURCE="$OMARCHY_PATH/default/hypr/toggles/$FLAG_NAME.conf"
if [[ -f $FLAG ]]; then
rm $FLAG
[[ -n $DISABLED_NOTIFICATION ]] && notify-send -u low "$DISABLED_NOTIFICATION"
elif [[ -f $FLAG_SOURCE ]]; then
cp $FLAG_SOURCE $FLAG
[[ -n $ENABLED_NOTIFICATION ]] && notify-send -u low "$ENABLED_NOTIFICATION"
else
echo "Flag not found: $FLAG_NAME"
exit 1 exit 1
fi fi
hyprctl reload FLAG_NAME="$1"
ACTION="${2:-toggle}"
FLAG_FILE="$HOME/.local/state/omarchy/toggles/hypr/$FLAG_NAME.lua"
FLAG_SOURCE="$OMARCHY_PATH/default/hypr/toggles/$FLAG_NAME.lua"
on() {
if [[ -f $FLAG_SOURCE ]]; then
mkdir -p "$(dirname "$FLAG_FILE")"
cp "$FLAG_SOURCE" "$FLAG_FILE"
[[ -n $ENABLED_NOTIFICATION ]] && notify-send -u low "$ENABLED_NOTIFICATION"
else
echo "Flag not found: $FLAG_NAME" >&2
exit 1
fi
}
off() {
rm -f "$FLAG_FILE"
[[ -n $DISABLED_NOTIFICATION ]] && notify-send -u low "$DISABLED_NOTIFICATION"
}
toggle() {
if [[ -f $FLAG_FILE ]]; then
off
echo "off"
else
on
echo "on"
fi
}
case $ACTION in
on) on ;;
off) off ;;
toggle) toggle ;;
*)
echo "Usage: omarchy-hyprland-toggle [--enabled-notification <text>] [--disabled-notification <text>] <flag-name> [on|off|toggle]" >&2
exit 1
;;
esac
hyprctl reload >/dev/null
+1 -1
View File
@@ -3,4 +3,4 @@
# omarchy:summary=Check if a Hyprland toggle is currently disabled (missing). # omarchy:summary=Check if a Hyprland toggle is currently disabled (missing).
# omarchy:args=<flag-name> # omarchy:args=<flag-name>
[[ ! -f "$HOME/.local/state/omarchy/toggles/hypr/$1.conf" ]] [[ ! -f "$HOME/.local/state/omarchy/toggles/hypr/$1.lua" ]]
+1 -1
View File
@@ -3,4 +3,4 @@
# omarchy:summary=Check if a Hyprland toggle is currently enabled. # omarchy:summary=Check if a Hyprland toggle is currently enabled.
# omarchy:args=<flag-name> # omarchy:args=<flag-name>
[[ -f "$HOME/.local/state/omarchy/toggles/hypr/$1.conf" ]] [[ -f "$HOME/.local/state/omarchy/toggles/hypr/$1.lua" ]]
+4 -2
View File
@@ -4,7 +4,9 @@
hyprctl clients -j | \ hyprctl clients -j | \
jq -r ".[].address" | \ jq -r ".[].address" | \
xargs -I{} hyprctl dispatch closewindow address:{} while read -r addr; do
hyprctl dispatch "hl.dsp.window.close(\"address:$addr\")" >/dev/null 2>&1 || hyprctl dispatch closewindow "address:$addr"
done
# Move to first workspace # Move to first workspace
hyprctl dispatch workspace 1 hyprctl dispatch 'hl.dsp.focus({ workspace = "1" })' >/dev/null 2>&1 || hyprctl dispatch workspace 1
+18 -12
View File
@@ -11,24 +11,30 @@ y=${4:-}
active=$(hyprctl activewindow -j) active=$(hyprctl activewindow -j)
pinned=$(echo "$active" | jq ".pinned") pinned=$(echo "$active" | jq ".pinned")
addr=$(echo "$active" | jq -r ".address") addr=$(echo "$active" | jq -r ".address")
window="address:$addr"
hypr_dispatch() {
local lua="$1"
shift
hyprctl dispatch "$lua" >/dev/null 2>&1 || hyprctl dispatch "$@" >/dev/null
}
if [[ $pinned == "true" ]]; then if [[ $pinned == "true" ]]; then
hyprctl -q --batch \ hypr_dispatch "hl.dsp.window.pin({ window = \"$window\" })" pin "$window"
"dispatch pin address:$addr;" \ hypr_dispatch "hl.dsp.window.float({ window = \"$window\", action = \"toggle\" })" togglefloating "$window"
"dispatch togglefloating address:$addr;" \ hypr_dispatch "hl.dsp.window.tag({ window = \"$window\", tag = \"-pop\" })" tagwindow -pop "$window"
"dispatch tagwindow -pop address:$addr;"
elif [[ -n $addr ]]; then elif [[ -n $addr ]]; then
hyprctl dispatch togglefloating address:$addr hypr_dispatch "hl.dsp.window.float({ window = \"$window\", action = \"toggle\" })" togglefloating "$window"
hyprctl dispatch resizeactive exact $width $height address:$addr hypr_dispatch "hl.dsp.window.resize({ window = \"$window\", x = $width, y = $height })" resizeactive exact "$width" "$height" "$window"
if [[ -n $x && -n $y ]]; then if [[ -n $x && -n $y ]]; then
hyprctl dispatch moveactive $x $y address:$addr hypr_dispatch "hl.dsp.window.move({ window = \"$window\", x = $x, y = $y })" moveactive "$x" "$y" "$window"
else else
hyprctl dispatch centerwindow address:$addr hypr_dispatch "hl.dsp.window.center({ window = \"$window\" })" centerwindow "$window"
fi fi
hyprctl -q --batch \ hypr_dispatch "hl.dsp.window.pin({ window = \"$window\" })" pin "$window"
"dispatch pin address:$addr;" \ hypr_dispatch "hl.dsp.window.alter_zorder({ window = \"$window\", mode = \"top\" })" alterzorder top "$window"
"dispatch alterzorder top address:$addr;" \ hypr_dispatch "hl.dsp.window.tag({ window = \"$window\", tag = \"+pop\" })" tagwindow +pop "$window"
"dispatch tagwindow +pop address:$addr;"
fi fi
@@ -2,7 +2,7 @@
# omarchy:summary=Toggle single-window square aspect ratio. # omarchy:summary=Toggle single-window square aspect ratio.
omarchy-hyprland-toggle \ case $(omarchy-hyprland-toggle single-window-aspect-ratio) in
--enabled-notification "Enable single-window square aspect ratio" \ on) omarchy-notification-send -g  "Enable single-window square aspect ratio" ;;
--disabled-notification "Disable single-window square aspect ratio" \ off) omarchy-notification-send -g  "Disable single-window square aspect ratio" ;;
single-window-aspect-ratio esac
@@ -2,4 +2,6 @@
# omarchy:summary=Toggles transparency for the currently focused window. # omarchy:summary=Toggles transparency for the currently focused window.
hyprctl dispatch setprop "address:$(hyprctl activewindow -j | jq -r '.address')" opaque toggle addr=$(hyprctl activewindow -j | jq -r '.address')
hyprctl dispatch "hl.dsp.window.set_prop({ window = \"address:$addr\", prop = \"opaque\", value = \"toggle\" })" >/dev/null 2>&1 || \
hyprctl dispatch setprop "address:$addr" opaque toggle
+2 -1
View File
@@ -10,5 +10,6 @@ case "$CURRENT_LAYOUT" in
*) NEW_LAYOUT=dwindle ;; *) NEW_LAYOUT=dwindle ;;
esac esac
hyprctl keyword workspace $ACTIVE_WORKSPACE, layout:$NEW_LAYOUT hyprctl eval "hl.workspace_rule({ workspace = \"$ACTIVE_WORKSPACE\", layout = \"$NEW_LAYOUT\" })" >/dev/null 2>&1 || \
hyprctl keyword workspace $ACTIVE_WORKSPACE, layout:$NEW_LAYOUT
notify-send -u low "󱂬 Workspace layout set to $NEW_LAYOUT" notify-send -u low "󱂬 Workspace layout set to $NEW_LAYOUT"
+9 -22
View File
@@ -1,24 +1,17 @@
#!/bin/bash #!/bin/bash
# omarchy:summary=Install a supported browser and make it the default # omarchy:summary=Install a supported browser
# omarchy:args=<chrome|brave|brave-origin|edge|firefox|zen> # omarchy:args=<chrome|brave|brave-origin|edge|firefox|zen>
# omarchy:examples=omarchy install browser firefox | omarchy install browser brave # omarchy:examples=omarchy install browser firefox | omarchy install browser brave
make_default() {
xdg-settings set default-web-browser "$1"
xdg-mime default "$1" x-scheme-handler/http
xdg-mime default "$1" x-scheme-handler/https
xdg-mime default "$1" text/html
}
setup_policy_directory() { setup_policy_directory() {
sudo mkdir -p "$1" sudo mkdir -p "$1"
sudo chmod a+rw "$1" sudo chmod a+rw "$1"
} }
announce_default_browser() { announce_browser_installed() {
echo "" echo ""
echo "$1 is now the default browser. Start it with Super + Shift + Return." echo "$1 browser installed. Make it the default via Setup > Defaults > Browser."
} }
copy_chromium_flags() { copy_chromium_flags() {
@@ -45,9 +38,8 @@ chrome)
setup_policy_directory /etc/opt/chrome/policies/managed setup_policy_directory /etc/opt/chrome/policies/managed
copy_chromium_flags ~/.config/chrome-flags.conf copy_chromium_flags ~/.config/chrome-flags.conf
make_default google-chrome.desktop
omarchy-theme-set-browser omarchy-theme-set-browser
announce_default_browser "Chrome" announce_browser_installed "Chrome"
;; ;;
edge) edge)
echo "Installing Edge..." echo "Installing Edge..."
@@ -55,9 +47,8 @@ edge)
setup_policy_directory /etc/opt/edge/policies/managed setup_policy_directory /etc/opt/edge/policies/managed
copy_chromium_flags ~/.config/microsoft-edge-stable-flags.conf copy_chromium_flags ~/.config/microsoft-edge-stable-flags.conf
make_default microsoft-edge.desktop
omarchy-theme-set-browser omarchy-theme-set-browser
announce_default_browser "Edge" announce_browser_installed "Edge"
;; ;;
brave) brave)
echo "Installing Brave..." echo "Installing Brave..."
@@ -65,9 +56,8 @@ brave)
setup_policy_directory /etc/brave/policies/managed setup_policy_directory /etc/brave/policies/managed
copy_chromium_flags ~/.config/brave-flags.conf copy_chromium_flags ~/.config/brave-flags.conf
make_default brave-browser.desktop
omarchy-theme-set-browser omarchy-theme-set-browser
announce_default_browser "Brave" announce_browser_installed "Brave"
;; ;;
brave-origin) brave-origin)
echo "Installing Brave Origin..." echo "Installing Brave Origin..."
@@ -77,9 +67,8 @@ brave-origin)
mkdir -p ~/.config mkdir -p ~/.config
# FIXME: Use normal chromium flags when Brave Origin wrapper has been fixed # FIXME: Use normal chromium flags when Brave Origin wrapper has been fixed
echo "--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url" > ~/.config/brave-origin-beta-flags.conf echo "--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url" > ~/.config/brave-origin-beta-flags.conf
make_default brave-origin-beta.desktop
omarchy-theme-set-browser omarchy-theme-set-browser
announce_default_browser "Brave Origin" announce_browser_installed "Brave Origin"
;; ;;
firefox) firefox)
echo "Installing Firefox..." echo "Installing Firefox..."
@@ -87,8 +76,7 @@ firefox)
setup_firefox_preferences /usr/lib/firefox/distribution setup_firefox_preferences /usr/lib/firefox/distribution
setup_firefox_wayland setup_firefox_wayland
make_default firefox.desktop announce_browser_installed "Firefox"
announce_default_browser "Firefox"
;; ;;
zen) zen)
echo "Installing Zen..." echo "Installing Zen..."
@@ -96,8 +84,7 @@ zen)
setup_firefox_preferences /opt/zen-browser/distribution setup_firefox_preferences /opt/zen-browser/distribution
setup_firefox_wayland setup_firefox_wayland
make_default zen.desktop announce_browser_installed "Zen"
announce_default_browser "Zen"
;; ;;
*) *)
echo "Usage: omarchy-install-browser <chrome|brave|brave-origin|edge|firefox|zen>" echo "Usage: omarchy-install-browser <chrome|brave|brave-origin|edge|firefox|zen>"
+4 -1
View File
@@ -21,7 +21,10 @@ omarchy-pkg-add \
libretro-parallel-n64 libretro-picodrive libretro-play libretro-ppsspp \ libretro-parallel-n64 libretro-picodrive libretro-play libretro-ppsspp \
libretro-sameboy libretro-scummvm libretro-shaders-slang libretro-snes9x \ libretro-sameboy libretro-scummvm libretro-shaders-slang libretro-snes9x \
libretro-yabause \ libretro-yabause \
libretro-cap32-git libretro-fbneo-git libretro-uae-git libretro-vice-git \ libretro-cap32-git libretro-fbneo-git libretro-uae-git \
libretro-vice-x128-git libretro-vice-x64-git libretro-vice-x64dtv-git libretro-vice-x64sc-git \
libretro-vice-xcbm2-git libretro-vice-xcbm5x0-git libretro-vice-xpet-git \
libretro-vice-xplus4-git libretro-vice-xscpu64-git libretro-vice-xvic-git \
libretro-database-git \ libretro-database-git \
retroarch-joypad-autoconfig-git retroarch-joypad-autoconfig-git
+1 -1
View File
@@ -13,7 +13,7 @@ LAUNCH_COMMAND="${2:-"uwsm-app -- $WINDOW_PATTERN"}"
WINDOW_ADDRESS=$(hyprctl clients -j | jq -r --arg p "$WINDOW_PATTERN" '.[]|select((.class|test("\\b" + $p + "\\b";"i")) or (.title|test("\\b" + $p + "\\b";"i")))|.address' | head -n1) WINDOW_ADDRESS=$(hyprctl clients -j | jq -r --arg p "$WINDOW_PATTERN" '.[]|select((.class|test("\\b" + $p + "\\b";"i")) or (.title|test("\\b" + $p + "\\b";"i")))|.address' | head -n1)
if [[ -n $WINDOW_ADDRESS ]]; then if [[ -n $WINDOW_ADDRESS ]]; then
hyprctl dispatch focuswindow "address:$WINDOW_ADDRESS" hyprctl dispatch "hl.dsp.focus({ window = \"address:$WINDOW_ADDRESS\" })" >/dev/null 2>&1 || hyprctl dispatch focuswindow "address:$WINDOW_ADDRESS"
else else
eval exec setsid $LAUNCH_COMMAND eval exec setsid $LAUNCH_COMMAND
fi fi
+16 -20
View File
@@ -20,35 +20,31 @@ walker -q
focused=$(omarchy-hyprland-monitor-focused) focused=$(omarchy-hyprland-monitor-focused)
terminal=$(xdg-terminal-exec --print-id) terminal=$(xdg-terminal-exec --print-id)
hypr_focus_monitor() {
hyprctl dispatch "hl.dsp.focus({ monitor = \"$1\" })" >/dev/null 2>&1 || hyprctl dispatch focusmonitor "$1" >/dev/null
}
hypr_exec() {
local command="$1"
hyprctl dispatch "hl.dsp.exec_cmd([[$command]])" >/dev/null 2>&1 || hyprctl dispatch exec -- bash -lc "$command" >/dev/null
}
for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do
hyprctl dispatch focusmonitor $m hypr_focus_monitor "$m"
case $terminal in case $terminal in
*Alacritty*) *Alacritty*)
hyprctl dispatch exec -- \ hypr_exec "alacritty --class=org.omarchy.screensaver --config-file ~/.local/share/omarchy/default/alacritty/screensaver.toml -e omarchy-screensaver"
alacritty --class=org.omarchy.screensaver \
--config-file ~/.local/share/omarchy/default/alacritty/screensaver.toml \
-e omarchy-screensaver
;; ;;
*ghostty*) *ghostty*)
hyprctl dispatch exec -- \ hypr_exec "ghostty --class=org.omarchy.screensaver --config-file=~/.local/share/omarchy/default/ghostty/screensaver --font-size=18 -e omarchy-screensaver"
ghostty --class=org.omarchy.screensaver \
--config-file=~/.local/share/omarchy/default/ghostty/screensaver \
--font-size=18 \
-e omarchy-screensaver
;; ;;
*foot*) *foot*)
hyprctl dispatch exec -- \ hypr_exec "foot --app-id=org.omarchy.screensaver --config=\"$OMARCHY_PATH/default/foot/screensaver.ini\" -e omarchy-screensaver"
foot --app-id=org.omarchy.screensaver \
--config="$OMARCHY_PATH/default/foot/screensaver.ini" \
-e omarchy-screensaver
;; ;;
*kitty*) *kitty*)
hyprctl dispatch exec -- \ hypr_exec "kitty --class=org.omarchy.screensaver --override font_size=18 --override window_padding_width=0 -e omarchy-screensaver"
kitty --class=org.omarchy.screensaver \
--override font_size=18 \
--override window_padding_width=0 \
-e omarchy-screensaver
;; ;;
*) *)
notify-send -u low "✋ Screensaver only runs in Alacritty, Foot, Ghostty, or Kitty" notify-send -u low "✋ Screensaver only runs in Alacritty, Foot, Ghostty, or Kitty"
@@ -56,4 +52,4 @@ for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do
esac esac
done done
hyprctl dispatch focusmonitor $focused hypr_focus_monitor "$focused"
+236 -55
View File
@@ -56,6 +56,11 @@ open_in_editor() {
omarchy-launch-editor "$1" omarchy-launch-editor "$1"
} }
hypr_config_file() {
local name="$1"
printf '%s/.config/hypr/%s.lua' "$HOME" "$name"
}
install() { install() {
present_terminal "echo 'Installing $1...'; omarchy-pkg-add $2" present_terminal "echo 'Installing $1...'; omarchy-pkg-add $2"
} }
@@ -93,9 +98,10 @@ show_learn_menu() {
} }
show_trigger_menu() { show_trigger_menu() {
case $(menu "Trigger" " Capture\n󰧸 Transcode\n Share\n󰔎 Toggle\n Hardware") in case $(menu "Trigger" "󰔛 Reminder\n Capture\n󰧸 Transcode\n Share\n󰔎 Toggle\n Hardware") in
*Reminder*) show_reminder_menu ;;
*Capture*) show_capture_menu ;; *Capture*) show_capture_menu ;;
*Transcode*) show_transcode_menu ;; *Transcode*) omarchy-transcode || back_to show_trigger_menu ;;
*Share*) show_share_menu ;; *Share*) show_share_menu ;;
*Toggle*) show_toggle_menu ;; *Toggle*) show_toggle_menu ;;
*Hardware*) show_hardware_menu ;; *Hardware*) show_hardware_menu ;;
@@ -103,6 +109,41 @@ show_trigger_menu() {
esac esac
} }
show_reminder_menu() {
case $(menu "Reminder" "󰔛 Set one\n󰔛 Show all\n󰔛 Clear all") in
*Set*) show_custom_reminder_input ;;
*"Show all"*) omarchy-reminder show ;;
*"Clear all"*) omarchy-reminder clear ;;
*) back_to show_trigger_menu ;;
esac
}
show_custom_reminder_input() {
local minutes
minutes=$(omarchy-menu-input "Remind in minutes")
if [[ $minutes =~ ^[0-9]+$ ]] && ((minutes > 0)); then
show_reminder_message_input "$minutes"
elif [[ -n $minutes ]]; then
omarchy-notification-send -g 󰔛 "Invalid reminder" "Enter the number of minutes" -u critical
show_custom_reminder_input
else
back_to show_reminder_menu
fi
}
show_reminder_message_input() {
local minutes="$1"
local message
message=$(omarchy-menu-input "Reminder message")
if [[ -n $message ]]; then
omarchy-reminder "$minutes" "$message"
else
omarchy-reminder "$minutes"
fi
}
show_capture_menu() { show_capture_menu() {
case $(menu "Capture" " Screenshot\n Screenrecord\n󰴑 Text Extraction\n󰃉 Color") in case $(menu "Capture" " Screenshot\n Screenrecord\n󰴑 Text Extraction\n󰃉 Color") in
*Screenshot*) omarchy-capture-screenshot ;; *Screenshot*) omarchy-capture-screenshot ;;
@@ -159,7 +200,8 @@ show_screenrecord_menu() {
} }
show_share_menu() { show_share_menu() {
case $(menu "Share" " Clipboard\n File \n Folder") in case $(menu "Share" " Clipboard\n File \n Folder\n󰥦 Receive") in
*Receive*) uwsm-app -- localsend ;;
*Clipboard*) omarchy-menu-share clipboard ;; *Clipboard*) omarchy-menu-share clipboard ;;
*File*) terminal bash -c "omarchy-menu-share file" ;; *File*) terminal bash -c "omarchy-menu-share file" ;;
*Folder*) terminal bash -c "omarchy-menu-share folder" ;; *Folder*) terminal bash -c "omarchy-menu-share folder" ;;
@@ -167,14 +209,6 @@ show_share_menu() {
esac esac
} }
show_transcode_menu() {
case $(menu "Transcode" " Picture\n Video") in
*Picture*) present_terminal "omarchy-transcode --path '$HOME/Pictures'" ;;
*Video*) present_terminal "omarchy-transcode --path '$HOME/Videos'" ;;
*) back_to show_trigger_menu ;;
esac
}
show_toggle_menu() { show_toggle_menu() {
local options="󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰂛 Notifications\n󰍜 Top Bar\n󱂬 Workspace Layout\n Window Gaps\n 1-Window Ratio\n󰍹 Monitor Scaling\n Direct Boot\n󰟵 Passwordless Sudo" local options="󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰂛 Notifications\n󰍜 Top Bar\n󱂬 Workspace Layout\n Window Gaps\n 1-Window Ratio\n󰍹 Monitor Scaling\n Direct Boot\n󰟵 Passwordless Sudo"
@@ -205,13 +239,18 @@ show_hardware_menu() {
options="$options\n󰟸 Touchpad" options="$options\n󰟸 Touchpad"
fi fi
if omarchy-hw-dell-xps-haptic-touchpad && omarchy-cmd-present dell-xps-touchpad-haptics; then
options="$options\n󰌌 Touchpad Haptics"
fi
if omarchy-hw-touchscreen; then if omarchy-hw-touchscreen; then
options="$options\n󰆽 Touchscreen" options="$options\n󰆽 Touchscreen"
fi fi
case $(menu "Toggle" "$options") in case $(menu "Toggle" "$options") in
*Laptop*) omarchy-hyprland-monitor-internal toggle ;; *Laptop*) omarchy-hyprland-monitor-internal toggle ;;
*Mirror*) omarchy-hyprland-monitor-internal-mirror toggle;; *Mirror*) omarchy-hyprland-monitor-internal-mirror toggle ;;
*Haptics*) show_hardware_touchpad_haptics_menu ;;
*Touchpad*) omarchy-toggle-touchpad ;; *Touchpad*) omarchy-toggle-touchpad ;;
*Touchscreen*) omarchy-toggle-touchscreen ;; *Touchscreen*) omarchy-toggle-touchscreen ;;
*"Hybrid GPU"*) present_terminal omarchy-toggle-hybrid-gpu ;; *"Hybrid GPU"*) present_terminal omarchy-toggle-hybrid-gpu ;;
@@ -219,41 +258,67 @@ show_hardware_menu() {
esac esac
} }
show_hardware_touchpad_haptics_menu() {
local current=$(dell-xps-touchpad-haptics get)
local selected=$(menu "Touchpad Haptics" "low\nmid\nhigh" "" "$current")
if [[ -n $selected ]]; then
dell-xps-touchpad-haptics set "$selected"
else
back_to show_hardware_menu
fi
}
show_style_menu() { show_style_menu() {
case $(menu "Style" "󰸌 Theme\n󰟵 Unlock\n Font\n Background\n Hyprland\n󱄄 Screensaver\n About") in case $(menu "Style" "󰸌 Theme\n󰟵 Unlock\n Font\n Background\n󰍜 Waybar\n󰘇 Corners\n Hyprland\n󱄄 Screensaver\n About") in
*Theme*) show_theme_menu ;; *Theme*) show_theme_menu ;;
*Unlock*) omarchy-launch-walker -m menus:omarchyunlocks --width 800 --minheight 400 ;; *Unlock*) omarchy-launch-walker -m menus:omarchyunlocks --width 800 --minheight 400 ;;
*Font*) show_font_menu ;; *Font*) show_font_menu ;;
*Background*) show_background_menu ;; *Background*) show_background_menu ;;
*Hyprland*) open_in_editor ~/.config/hypr/looknfeel.conf ;; *Corners*) show_style_corners_menu ;;
*Hyprland*) open_in_editor "$(hypr_config_file looknfeel)" ;;
*Waybar*) show_waybar_position_menu ;;
*Screensaver*) show_screensaver_menu ;; *Screensaver*) show_screensaver_menu ;;
*About*) open_in_editor ~/.config/omarchy/branding/about.txt ;; *About*) show_about_menu ;;
*) show_main_menu ;; *) show_main_menu ;;
esac esac
} }
show_screensaver_menu() { show_style_corners_menu() {
case $(menu "Screensaver" " Edit Text\n Set From Image\n󱄄 Preview\n Restore Default") in case $(omarchy-menu-select "Corners" "󰝣 Sharp" "󰘇 Round") in
*Text*) open_in_editor ~/.config/omarchy/branding/screensaver.txt ;; *Sharp*) omarchy-style-corners sharp ;;
*Image*) set_screensaver_from_image ;; *Round*) omarchy-style-corners round ;;
*Preview*) omarchy-launch-screensaver force ;;
*Default*) terminal bash -lc 'omarchy-screensaver-logo default; echo; read -n 1 -s -r -p "Press any key to close..."' ;;
*) show_style_menu ;; *) show_style_menu ;;
esac esac
} }
set_screensaver_from_image() { show_waybar_position_menu() {
terminal bash -lc ' case $(menu "Waybar Position" "󰁝 Top\n󰁅 Bottom\n󰁍 Left\n󰁔 Right") in
image=$(fd --type file --ignore-case --extension svg --extension png . "$HOME" 2>/dev/null | fzf --prompt "Logo image> ") *Top*) omarchy-style-waybar-position top ;;
if [[ -n $image ]]; then *Bottom*) omarchy-style-waybar-position bottom ;;
if omarchy-screensaver-logo "$image"; then *Left*) omarchy-style-waybar-position left ;;
echo *Right*) omarchy-style-waybar-position right ;;
echo "Preview with: omarchy-launch-screensaver force" *) show_style_menu ;;
fi esac
echo }
read -n 1 -s -r -p "Press any key to close..."
fi show_about_menu() {
' case $(menu "About" " Edit Text\n Set From Image\n Restore Default") in
*Text*) omarchy-branding-about text ;;
*Image*) omarchy-branding-about image ;;
*Default*) omarchy-branding-about reset ;;
*) show_style_menu ;;
esac
}
show_screensaver_menu() {
case $(menu "Screensaver" " Edit Text\n Set From Image\n Restore Default") in
*Text*) omarchy-branding-screensaver text ;;
*Image*) omarchy-branding-screensaver image ;;
*Default*) omarchy-branding-screensaver reset ;;
*) show_style_menu ;;
esac
} }
show_theme_menu() { show_theme_menu() {
@@ -275,9 +340,9 @@ show_font_menu() {
show_setup_menu() { show_setup_menu() {
local options=" Audio\n Wifi\n󰂯 Bluetooth\n󱐋 Power Profile\n System Sleep\n󰍹 Monitors" local options=" Audio\n Wifi\n󰂯 Bluetooth\n󱐋 Power Profile\n System Sleep\n󰍹 Monitors"
[[ -f ~/.config/hypr/bindings.conf ]] && options="$options\n Keybindings" [[ -f ~/.config/hypr/bindings.lua ]] && options="$options\n Keybindings"
[[ -f ~/.config/hypr/input.conf ]] && options="$options\n Input" [[ -f ~/.config/hypr/input.lua ]] && options="$options\n Input"
options="$options\n󰱔 DNS\n Security\n Config" options="$options\n Defaults\n󰱔 DNS\n Security\n Config"
case $(menu "Setup" "$options") in case $(menu "Setup" "$options") in
*Audio*) omarchy-launch-audio ;; *Audio*) omarchy-launch-audio ;;
@@ -285,9 +350,10 @@ show_setup_menu() {
*Bluetooth*) omarchy-launch-bluetooth ;; *Bluetooth*) omarchy-launch-bluetooth ;;
*Power*) show_setup_power_menu ;; *Power*) show_setup_power_menu ;;
*System*) show_setup_system_menu ;; *System*) show_setup_system_menu ;;
*Monitors*) open_in_editor ~/.config/hypr/monitors.conf ;; *Monitors*) open_in_editor "$(hypr_config_file monitors)" ;;
*Keybindings*) open_in_editor ~/.config/hypr/bindings.conf ;; *Keybindings*) open_in_editor "$(hypr_config_file bindings)" ;;
*Input*) open_in_editor ~/.config/hypr/input.conf ;; *Input*) open_in_editor "$(hypr_config_file input)" ;;
*Defaults*) show_setup_default_menu ;;
*DNS*) present_terminal omarchy-setup-dns ;; *DNS*) present_terminal omarchy-setup-dns ;;
*Security*) show_setup_security_menu ;; *Security*) show_setup_security_menu ;;
*Config*) show_setup_config_menu ;; *Config*) show_setup_config_menu ;;
@@ -307,16 +373,121 @@ show_setup_power_menu() {
show_setup_security_menu() { show_setup_security_menu() {
case $(menu "Setup" "󰈷 Fingerprint\n Fido2") in case $(menu "Setup" "󰈷 Fingerprint\n Fido2") in
*Fingerprint*) present_terminal omarchy-setup-fingerprint ;; *Fingerprint*) present_terminal omarchy-setup-security-fingerprint ;;
*Fido2*) present_terminal omarchy-setup-fido2 ;; *Fido2*) present_terminal omarchy-setup-security-fido2 ;;
*) show_setup_menu ;; *) show_setup_menu ;;
esac esac
} }
show_setup_default_menu() {
case $(menu "Default" " Browser\n Terminal\n Editor") in
*Browser*) show_setup_default_browser_menu ;;
*Terminal*) show_setup_default_terminal_menu ;;
*Editor*) show_setup_default_editor_menu ;;
*) show_setup_menu ;;
esac
}
browser_desktop_exists() {
[[ -f ~/.local/share/applications/$1 || -f ~/.nix-profile/share/applications/$1 || -f /usr/share/applications/$1 ]]
}
show_setup_default_browser_menu() {
local options=""
browser_desktop_exists chromium.desktop && options="$options Chromium"
browser_desktop_exists google-chrome.desktop && options="${options:+$options\n}󰊯 Chrome"
browser_desktop_exists brave-browser.desktop && options="${options:+$options\n}󰖟 Brave"
browser_desktop_exists brave-origin-beta.desktop && options="${options:+$options\n}󰖟 Brave Origin"
browser_desktop_exists microsoft-edge.desktop && options="${options:+$options\n}󰇩 Edge"
browser_desktop_exists firefox.desktop && options="${options:+$options\n}󰈹 Firefox"
browser_desktop_exists zen.desktop && options="${options:+$options\n}󰖟 Zen"
local current=""
case "$(omarchy-default-browser)" in
chromium) current=" Chromium" ;;
chrome) current="󰊯 Chrome" ;;
brave) current="󰖟 Brave" ;;
brave-origin) current="󰖟 Brave Origin" ;;
edge) current="󰇩 Edge" ;;
firefox) current="󰈹 Firefox" ;;
zen) current="󰖟 Zen" ;;
esac
case $(menu "Default Browser" "$options" "" "$current") in
*Chromium*) omarchy-default-browser chromium ;;
*Chrome*) omarchy-default-browser chrome ;;
*"Brave Origin"*) omarchy-default-browser brave-origin ;;
*Brave*) omarchy-default-browser brave ;;
*Edge*) omarchy-default-browser edge ;;
*Firefox*) omarchy-default-browser firefox ;;
*Zen*) omarchy-default-browser zen ;;
*) show_setup_default_menu ;;
esac
}
show_setup_default_terminal_menu() {
local options=""
omarchy-cmd-present alacritty && options="$options Alacritty"
omarchy-cmd-present foot && options="${options:+$options\n} Foot"
omarchy-cmd-present ghostty && options="${options:+$options\n} Ghostty"
omarchy-cmd-present kitty && options="${options:+$options\n} Kitty"
local current=""
case "$(omarchy-default-terminal)" in
alacritty) current=" Alacritty" ;;
foot) current=" Foot" ;;
ghostty) current=" Ghostty" ;;
kitty) current=" Kitty" ;;
esac
case $(menu "Default Terminal" "$options" "" "$current") in
*Alacritty*) omarchy-default-terminal alacritty ;;
*Foot*) omarchy-default-terminal foot ;;
*Ghostty*) omarchy-default-terminal ghostty ;;
*Kitty*) omarchy-default-terminal kitty ;;
*) show_setup_default_menu ;;
esac
}
show_setup_default_editor_menu() {
local options=""
omarchy-cmd-present nvim && options="$options Neovim"
omarchy-cmd-present code && options="${options:+$options\n} VSCode"
omarchy-cmd-present cursor && options="${options:+$options\n} Cursor"
omarchy-cmd-present zeditor && options="${options:+$options\n} Zed"
omarchy-cmd-present sublime_text && options="${options:+$options\n} Sublime Text"
omarchy-cmd-present helix && options="${options:+$options\n} Helix"
omarchy-cmd-present vim && options="${options:+$options\n} Vim"
omarchy-cmd-present emacs && options="${options:+$options\n} Emacs"
local current=""
case "$(omarchy-default-editor)" in
nvim) current=" Neovim" ;;
code) current=" VSCode" ;;
cursor) current=" Cursor" ;;
zed | zeditor) current=" Zed" ;;
sublime_text) current=" Sublime Text" ;;
helix) current=" Helix" ;;
vim) current=" Vim" ;;
emacs) current=" Emacs" ;;
esac
case $(menu "Default Editor" "$options" "" "$current") in
*Neovim*) omarchy-default-editor nvim ;;
*VSCode*) omarchy-default-editor code ;;
*Cursor*) omarchy-default-editor cursor ;;
*Zed*) omarchy-default-editor zed ;;
*Sublime*) omarchy-default-editor sublime_text ;;
*Helix*) omarchy-default-editor helix ;;
*Vim*) omarchy-default-editor vim ;;
*Emacs*) omarchy-default-editor emacs ;;
*) show_setup_default_menu ;;
esac
}
show_setup_config_menu() { show_setup_config_menu() {
case $(menu "Setup" " Defaults\n Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar\n󰞅 XCompose") in case $(menu "Setup" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar\n󰞅 XCompose") in
*Defaults*) open_in_editor ~/.config/uwsm/default ;; *Hyprland*) open_in_editor "$(hypr_config_file hyprland)" ;;
*Hyprland*) open_in_editor ~/.config/hypr/hyprland.conf ;;
*Hypridle*) open_in_editor ~/.config/hypr/hypridle.conf && omarchy-restart-hypridle ;; *Hypridle*) open_in_editor ~/.config/hypr/hypridle.conf && omarchy-restart-hypridle ;;
*Hyprlock*) open_in_editor ~/.config/hypr/hyprlock.conf ;; *Hyprlock*) open_in_editor ~/.config/hypr/hyprlock.conf ;;
*Hyprsunset*) open_in_editor ~/.config/hypr/hyprsunset.conf && omarchy-restart-hyprsunset ;; *Hyprsunset*) open_in_editor ~/.config/hypr/hyprsunset.conf && omarchy-restart-hyprsunset ;;
@@ -371,7 +542,7 @@ show_install_menu() {
} }
show_install_browser_menu() { show_install_browser_menu() {
case $(menu "Install" " Chrome\n Edge\n Brave\n Brave Origin\n Firefox\n Zen") in case $(menu "Install" " Chrome\n Edge\n Brave\n Brave Origin\n Firefox\n󰖟 Zen") in
*Chrome*) present_terminal "omarchy-install-browser chrome" ;; *Chrome*) present_terminal "omarchy-install-browser chrome" ;;
*Edge*) present_terminal "omarchy-install-browser edge" ;; *Edge*) present_terminal "omarchy-install-browser edge" ;;
*"Brave Origin"*) present_terminal "omarchy-install-browser brave-origin" ;; *"Brave Origin"*) present_terminal "omarchy-install-browser brave-origin" ;;
@@ -395,12 +566,13 @@ show_install_service_menu() {
} }
show_install_editor_menu() { show_install_editor_menu() {
case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Emacs") in case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Vim\n Emacs") in
*VSCode*) present_terminal omarchy-install-vscode ;; *VSCode*) present_terminal omarchy-install-vscode ;;
*Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;; *Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;;
*Zed*) present_terminal omarchy-install-zed ;; *Zed*) present_terminal omarchy-install-zed ;;
*Sublime*) install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;; *Sublime*) install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;;
*Helix*) present_terminal omarchy-install-helix ;; *Helix*) present_terminal omarchy-install-helix ;;
*Vim*) install "Vim" "vim" ;;
*Emacs*) install "Emacs" "emacs-wayland" && systemctl --user enable --now emacs.service ;; *Emacs*) install "Emacs" "emacs-wayland" && systemctl --user enable --now emacs.service ;;
*) show_install_menu ;; *) show_install_menu ;;
esac esac
@@ -433,8 +605,9 @@ show_install_ai_menu() {
} }
show_install_gaming_menu() { show_install_gaming_menu() {
case $(menu "Install" " Steam\n RetroArch\n󰍳 Minecraft\n󰢹 NVIDIA GeForce NOW\n Xbox Cloud Gaming\n󰖺 Xbox Controller (󰂯)\n󰍹 Moonlight (GameStream)\n Lutris (Battle.net)\n󱓟 Heroic (Epic Games)") in case $(menu "Install" " Steam\n󰯉 RetroArch\n󰍳 Minecraft\n󰢹 NVIDIA GeForce NOW\n Xbox Cloud Gaming\n󰂯 Xbox Controller\n󰍹 Moonlight (GameStream)\n Lutris (Battle.net)\n󱓟 Heroic (Epic Games)\n󰯉 RetroArch Game Launcher") in
*Steam*) present_terminal omarchy-install-gaming-steam ;; *Steam*) present_terminal omarchy-install-gaming-steam ;;
*"RetroArch Game Launcher"*) omarchy-games-retro-install ;;
*RetroArch*) present_terminal omarchy-install-gaming-retroarch ;; *RetroArch*) present_terminal omarchy-install-gaming-retroarch ;;
*Minecraft*) install_and_launch "Minecraft" "minecraft-launcher" "minecraft-launcher" ;; *Minecraft*) install_and_launch "Minecraft" "minecraft-launcher" "minecraft-launcher" ;;
*GeForce*) present_terminal omarchy-install-gaming-geforce-now ;; *GeForce*) present_terminal omarchy-install-gaming-geforce-now ;;
@@ -515,23 +688,30 @@ show_install_elixir_menu() {
} }
show_remove_menu() { show_remove_menu() {
case $(menu "Remove" "󰣇 Package\n Browser\n Web App\n TUI\n󰵮 Development\n Gaming\n󰏓 Preinstalls\n Dictation\n󰸌 Theme\n󰍲 Windows\n󰈷 Fingerprint\n Fido2") in case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰵮 Development\n󰸌 Theme\n Browser\n Dictation\n Gaming\n󰍲 Windows\n󰏓 Preinstalls\n Security") in
*Package*) terminal omarchy-pkg-remove ;; *Package*) terminal omarchy-pkg-remove ;;
*Browser*) show_remove_browser_menu ;;
*Web*) present_terminal omarchy-webapp-remove ;; *Web*) present_terminal omarchy-webapp-remove ;;
*TUI*) present_terminal omarchy-tui-remove ;; *TUI*) present_terminal omarchy-tui-remove ;;
*Development*) show_remove_development_menu ;; *Development*) show_remove_development_menu ;;
*Gaming*) show_remove_gaming_menu ;;
*Preinstalls*) present_terminal omarchy-remove-preinstalls ;;
*Dictation*) present_terminal omarchy-voxtype-remove ;;
*Theme*) present_terminal omarchy-theme-remove ;; *Theme*) present_terminal omarchy-theme-remove ;;
*Browser*) show_remove_browser_menu ;;
*Dictation*) present_terminal omarchy-voxtype-remove ;;
*Gaming*) show_remove_gaming_menu ;;
*Windows*) present_terminal "omarchy-windows-vm remove" ;; *Windows*) present_terminal "omarchy-windows-vm remove" ;;
*Fingerprint*) present_terminal "omarchy-setup-fingerprint --remove" ;; *Preinstalls*) present_terminal omarchy-remove-preinstalls ;;
*Fido2*) present_terminal "omarchy-setup-fido2 --remove" ;; *Security*) show_remove_security_menu ;;
*) show_main_menu ;; *) show_main_menu ;;
esac esac
} }
show_remove_security_menu() {
case $(menu "Remove" "󰈷 Fingerprint\n Fido2") in
*Fingerprint*) present_terminal omarchy-remove-security-fingerprint ;;
*Fido2*) present_terminal omarchy-remove-security-fido2 ;;
*) show_remove_menu ;;
esac
}
show_remove_browser_menu() { show_remove_browser_menu() {
case $(menu "Remove" " Chrome\n Edge\n Brave\n Brave Origin\n Firefox\n Zen") in case $(menu "Remove" " Chrome\n Edge\n Brave\n Brave Origin\n Firefox\n Zen") in
*Chrome*) present_terminal "omarchy-remove-browser chrome" ;; *Chrome*) present_terminal "omarchy-remove-browser chrome" ;;
@@ -708,7 +888,8 @@ go_to_menu() {
*toggle*) show_toggle_menu ;; *toggle*) show_toggle_menu ;;
*hardware*) show_hardware_menu ;; *hardware*) show_hardware_menu ;;
*share*) show_share_menu ;; *share*) show_share_menu ;;
*transcode*) show_transcode_menu ;; *reminder-set*) show_custom_reminder_input ;;
*reminder*) show_reminder_menu ;;
*background*) show_background_menu ;; *background*) show_background_menu ;;
*capture*) show_capture_menu ;; *capture*) show_capture_menu ;;
*style*) show_style_menu ;; *style*) show_style_menu ;;
+48
View File
@@ -0,0 +1,48 @@
#!/bin/bash
# omarchy:summary=Pick a file with Walker
# omarchy:group=menu
# omarchy:name=file
# omarchy:args=label paths formats [walker args...]
# omarchy:examples=omarchy menu file "Select image" "$HOME/Pictures" "jpg png webp"|omarchy-menu-file "Select media" "$HOME/Pictures:$HOME/Videos" "jpg png mp4 mov" --width 800
set -euo pipefail
if (( $# < 3 )); then
echo "Usage: omarchy-menu-file <label> <paths> <formats> [walker args...]" >&2
exit 1
fi
label="$1"
paths_arg="$2"
formats_arg="$3"
shift 3
IFS=: read -r -a paths <<<"$paths_arg"
read -r -a formats <<<"$formats_arg"
if (( ${#paths[@]} == 0 || ${#formats[@]} == 0 )); then
echo "Usage: omarchy-menu-file <label> <paths> <formats> [walker args...]" >&2
exit 1
fi
for path in "${paths[@]}"; do
[[ -e $path ]] || { echo "Path not found: $path" >&2; exit 1; }
done
find_args=("${paths[@]}" "(" -type d -name ".*" ! -name "." -prune ")" -o -type f ! -name ".*" "(")
first_format=true
for format in "${formats[@]}"; do
if [[ $first_format == "true" ]]; then
first_format=false
else
find_args+=(-o)
fi
format="${format#.}"
find_args+=(-iname "*.$format")
done
find_args+=(")" -printf '%T@\t%p\n')
find "${find_args[@]}" 2>/dev/null | sort -rn | cut -f2- |
omarchy-launch-walker --dmenu --width 800 --minheight 1 --maxheight 500 -p "$label…" "$@" 2>/dev/null
+16
View File
@@ -0,0 +1,16 @@
#!/bin/bash
# omarchy:summary=Prompt for text input with Walker
# omarchy:group=menu
# omarchy:name=input
# omarchy:args=prompt [walker args...]
# omarchy:examples=omarchy menu input Reminder|omarchy-menu-input "Reminder in minutes" --width 400
set -euo pipefail
prompt="${1:-Input}"
if (( $# > 0 )); then
shift
fi
omarchy-launch-walker --dmenu --inputonly --width 295 --minheight 1 --maxheight 1 -p "$prompt…" "$@" 2>/dev/null
+219 -39
View File
@@ -3,6 +3,28 @@
# omarchy:summary=Display Hyprland keybindings defined in your configuration using walker for an interactive search menu. # omarchy:summary=Display Hyprland keybindings defined in your configuration using walker for an interactive search menu.
declare -A KEYCODE_SYM_MAP declare -A KEYCODE_SYM_MAP
# Hyprland reports XKB keycodes for code: bindings. Keep a small fallback for
# common keys so the menu remains readable if xkbcli cannot resolve a symbol.
declare -A FALLBACK_KEYCODE_SYM_MAP=(
[10]="1"
[11]="2"
[12]="3"
[13]="4"
[14]="5"
[15]="6"
[16]="7"
[17]="8"
[18]="9"
[19]="0"
[20]="MINUS"
[21]="EQUAL"
[61]="SLASH"
)
# Hyprland's Lua config provider currently reports code:... binds from hl.bind()
# as key="" and keycode=0 in `hyprctl -j binds`. Keep a lightweight
# source-derived key cache so the menu can still show those bindings.
declare -A LUA_BIND_KEY_MAP
build_keymap_cache() { build_keymap_cache() {
local keymap local keymap
@@ -37,7 +59,18 @@ build_keymap_cache() {
} }
lookup_keycode_cached() { lookup_keycode_cached() {
printf '%s\n' "${KEYCODE_SYM_MAP[$1]}" local symbol
symbol="${KEYCODE_SYM_MAP[$1]}"
if [[ -z $symbol ]]; then
symbol="${FALLBACK_KEYCODE_SYM_MAP[$1]}"
fi
if [[ -z $symbol ]]; then
symbol="code:$1"
fi
printf '%s\n' "${symbol^^}"
} }
parse_keycodes() { parse_keycodes() {
@@ -80,44 +113,151 @@ parse_keycodes() {
fi fi
} }
# Fetch dynamic keybindings from Hyprland # Supplement `hyprctl -j binds` for Lua-only binds that Hyprland currently
# reports without their original key, such as hl.bind("SUPER + code:10", ...).
build_lua_bind_key_cache() {
local modmask description key
omarchy-cmd-present lua || return 0
while IFS=$'\t' read -r modmask description key; do
[[ -z $modmask || -z $description || -z $key ]] && continue
LUA_BIND_KEY_MAP["$modmask,$description"]="$key"
done < <(
lua <<'LUA'
local modifiers = { SHIFT = 1, CTRL = 4, CONTROL = 4, ALT = 8, SUPER = 64 }
local function split_keys(keys)
local modmask = 0
local key = ""
for part in string.gmatch(keys, "[^+]+") do
local value = part:gsub("^%s+", ""):gsub("%s+$", "")
local modifier = modifiers[string.upper(value)]
if modifier then
modmask = modmask + modifier
else
key = value
end
end
return modmask, key
end
local function proxy()
local p = {}
return setmetatable(p, {
__index = function()
return p
end,
__call = function()
return p
end,
})
end
local p = proxy()
hl = setmetatable({
dsp = p,
bind = function(keys, _, opts)
opts = opts or {}
if opts.description and opts.description ~= "" then
local modmask, key = split_keys(keys)
print(modmask .. "\t" .. opts.description .. "\t" .. key)
end
return p
end,
unbind = function() end,
config = function() end,
env = function() end,
monitor = function() end,
window_rule = function() end,
gesture = function() end,
animation = function() end,
curve = function() end,
exec_cmd = function() end,
}, {
__index = function()
return function()
return p
end
end,
})
local config = (os.getenv("HOME") or "") .. "/.config/hypr/hyprland.lua"
local file = io.open(config, "r")
if file then
file:close()
local ok, err = pcall(dofile, config)
if not ok and os.getenv("DEBUG") == "1" then
io.stderr:write("[DEBUG] lua bind scan failed: " .. tostring(err) .. "\n")
end
end
LUA
)
}
modmask_to_text() {
case "$1" in
0) printf '' ;;
1) printf 'SHIFT' ;;
4) printf 'CTRL' ;;
5) printf 'SHIFT CTRL' ;;
8) printf 'ALT' ;;
9) printf 'SHIFT ALT' ;;
12) printf 'CTRL ALT' ;;
13) printf 'SHIFT CTRL ALT' ;;
64) printf 'SUPER' ;;
65) printf 'SUPER SHIFT' ;;
68) printf 'SUPER CTRL' ;;
69) printf 'SUPER SHIFT CTRL' ;;
72) printf 'SUPER ALT' ;;
73) printf 'SUPER SHIFT ALT' ;;
76) printf 'SUPER CTRL ALT' ;;
77) printf 'SUPER SHIFT CTRL ALT' ;;
*) printf '%s' "$1" ;;
esac
}
# Fetch dynamic keybindings from Hyprland.
# #
# Also do some pre-processing: # Also do some pre-processing:
# - Fill missing Lua code:... keys from the Lua source cache
# - Remove standard Omarchy bin path prefix # - Remove standard Omarchy bin path prefix
# - Remove uwsm prefix
# - Map numeric modifier key mask to a textual rendition # - Map numeric modifier key mask to a textual rendition
# - Output comma-separated values that the parser can understand # - Output comma-separated values that the parser can understand
dynamic_bindings() { dynamic_bindings() {
local modmask key keycode description dispatcher arg modifiers
hyprctl -j binds | hyprctl -j binds |
jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | "\(.modmask),\(.key)@\(.keycode),\(.description),\(.dispatcher),\(.arg)"' | jq -r '.[] | [.modmask, (.key // ""), (.keycode // 0), (.description // ""), (.dispatcher // ""), (.arg // "") | tostring] | join("\u001f")' |
sed -r \ while IFS=$'\x1f' read -r modmask key keycode description dispatcher arg; do
-e 's/null//' \ if [[ -z $key && $keycode != "0" ]]; then
-e 's,~/.local/share/omarchy/bin/,,' \ key="code:$keycode"
-e 's,uwsm app -- ,,' \ fi
-e 's,uwsm-app -- ,,' \
-e 's/@0//' \ if [[ -z $key && -n $description ]]; then
-e 's/,@/,code:/' \ key="${LUA_BIND_KEY_MAP["$modmask,$description"]}"
-e 's/^0,/,/' \ fi
-e 's/^1,/SHIFT,/' \
-e 's/^4,/CTRL,/' \ [[ -z $description && $dispatcher == "__lua" ]] && continue
-e 's/^5,/SHIFT CTRL,/' \
-e 's/^8,/ALT,/' \ modifiers=$(modmask_to_text "$modmask")
-e 's/^9,/SHIFT ALT,/' \ arg="${arg//~\/.local\/share\/omarchy\/bin\//}"
-e 's/^12,/CTRL ALT,/' \ arg="${arg//uwsm app -- /}"
-e 's/^13,/SHIFT CTRL ALT,/' \ arg="${arg//uwsm-app -- /}"
-e 's/^64,/SUPER,/' \
-e 's/^65,/SUPER SHIFT,/' \ printf '%s,%s,%s,%s,%s\n' "$modifiers" "$key" "$description" "$dispatcher" "$arg"
-e 's/^68,/SUPER CTRL,/' \ done
-e 's/^69,/SUPER SHIFT CTRL,/' \
-e 's/^72,/SUPER ALT,/' \
-e 's/^73,/SUPER SHIFT ALT,/' \
-e 's/^76,/SUPER CTRL ALT,/' \
-e 's/^77,/SUPER SHIFT CTRL ALT,/'
} }
# Hardcoded bindings, like the copy-url extension and such # Hardcoded bindings, like the copy-url extension and such
static_bindings() { static_bindings() {
echo "SHIFT ALT,L,Copy URL from Web App,extension,copy-url" echo "SHIFT ALT,L,Copy URL from Web App,sendshortcut,SHIFT ALT,L,"
} }
# Parse and format keybindings # Parse and format keybindings
@@ -126,8 +266,8 @@ static_bindings() {
# - Set the field separator to a comma ','. # - Set the field separator to a comma ','.
# - Joins the key combination (e.g., "SUPER + Q"). # - Joins the key combination (e.g., "SUPER + Q").
# - Joins the command that the key executes. # - Joins the command that the key executes.
# - Prints everything in a nicely aligned format. # - Prints display text and dispatch metadata as tab-separated fields.
parse_bindings() { parse_binding_records() {
awk -F, ' awk -F, '
{ {
# Combine the modifier and key (first two fields) # Combine the modifier and key (first two fields)
@@ -139,6 +279,13 @@ parse_bindings() {
# Use description, if set # Use description, if set
action = $3; action = $3;
dispatcher = $4;
# Reconstruct the dispatcher arg from the remaining fields
arg = "";
for (i = 5; i <= NF; i++) {
arg = arg $i (i < NF ? "," : "");
}
if (action == "") { if (action == "") {
# Reconstruct the command from the remaining fields # Reconstruct the command from the remaining fields
@@ -149,6 +296,7 @@ parse_bindings() {
# Clean up trailing commas, remove leading "exec, ", and trim # Clean up trailing commas, remove leading "exec, ", and trim
sub(/,$/, "", action); sub(/,$/, "", action);
gsub(/(^|,)[[:space:]]*exec[[:space:]]*,?/, "", action); gsub(/(^|,)[[:space:]]*exec[[:space:]]*,?/, "", action);
gsub(/(^|[[:space:]])uwsm(-app| app)[[:space:]]+--[[:space:]]+/, "", action);
gsub(/^[ \t]+|[ \t]+$/, "", action); gsub(/^[ \t]+|[ \t]+$/, "", action);
gsub(/[ \t]+/, " ", key_combo); # Collapse multiple spaces to one gsub(/[ \t]+/, " ", key_combo); # Collapse multiple spaces to one
@@ -161,15 +309,15 @@ parse_bindings() {
} }
if (action != "") { if (action != "") {
printf "%-35s → %s\n", key_combo, action; printf "%-35s → %s\t%s\t%s\n", key_combo, action, dispatcher, arg;
} }
}' }'
} }
prioritize_entries() { prioritize_entries() {
awk ' awk -F '\t' '
{ {
line = $0 line = $1
prio = 50 prio = 50
if (match(line, /Terminal/)) prio = 0 if (match(line, /Terminal/)) prio = 0
if (match(line, /Tmux/)) prio = 1 if (match(line, /Tmux/)) prio = 1
@@ -220,15 +368,16 @@ prioritize_entries() {
if (match(line, /Apple Display/)) prio = 98 if (match(line, /Apple Display/)) prio = 98
if (match(line, /XF86/)) prio = 99 if (match(line, /XF86/)) prio = 99
# print "priority<TAB>line" # print "priority<TAB>record"
printf "%d\t%s\n", prio, line printf "%d\t%s\n", prio, $0
}' | }' |
sort -k1,1n -k2,2 | sort -k1,1n -k2,2 |
cut -f2- cut -f2-
} }
output_keybindings() { output_binding_records() {
build_keymap_cache build_keymap_cache
build_lua_bind_key_cache
{ {
dynamic_bindings dynamic_bindings
@@ -236,16 +385,47 @@ output_keybindings() {
} | } |
sort -u | sort -u |
parse_keycodes | parse_keycodes |
parse_bindings | parse_binding_records |
prioritize_entries prioritize_entries
} }
output_keybindings() {
output_binding_records | cut -f1
}
dispatch_binding() {
local dispatcher="$1"
local arg="$2"
case "$dispatcher" in
exec)
[[ -n $arg ]] && hyprctl dispatch exec "$arg"
;;
"") return 1 ;;
*)
if [[ -n $arg ]]; then
hyprctl dispatch "$dispatcher" "$arg"
else
hyprctl dispatch "$dispatcher"
fi
;;
esac
}
if [[ $1 == "--print" || $1 == "-p" ]]; then if [[ $1 == "--print" || $1 == "-p" ]]; then
output_keybindings output_keybindings
else else
records=$(output_binding_records)
monitor_height=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .height') monitor_height=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .height')
menu_height=$((monitor_height * 40 / 100)) menu_height=$((monitor_height * 40 / 100))
selection=$(cut -f1 <<<"$records" |
walker --dmenu -p 'Keybindings' --width 800 --height "$menu_height")
output_keybindings | if [[ -n $selection ]]; then
walker --dmenu -p 'Keybindings' --width 800 --height "$menu_height" record=$(awk -F '\t' -v selection="$selection" '$1 == selection { print; exit }' <<<"$records")
dispatcher=$(cut -f2 <<<"$record")
arg=$(cut -f3- <<<"$record")
dispatch_binding "$dispatcher" "$arg"
fi
fi fi
+38
View File
@@ -0,0 +1,38 @@
#!/bin/bash
# omarchy:summary=Pick one option with Walker
# omarchy:group=menu
# omarchy:name=select
# omarchy:args=prompt option... [-- walker args...]
# omarchy:examples=omarchy menu select Format jpg png|omarchy-menu-select Resolution 4k 1080p 720p -- --width 400
set -euo pipefail
if (( $# < 2 )); then
echo "Usage: omarchy-menu-select <prompt> <option>... [-- walker args...]" >&2
exit 1
fi
prompt="$1"
shift
options=()
walker_args=()
while (( $# > 0 )); do
if [[ $1 == "--" ]]; then
shift
walker_args=("$@")
break
fi
options+=("$1")
shift
done
if (( ${#options[@]} == 0 )); then
echo "Usage: omarchy-menu-select <prompt> <option>... [-- walker args...]" >&2
exit 1
fi
printf '%s\n' "${options[@]}" | omarchy-launch-walker --dmenu --width 295 --minheight 1 --maxheight 300 -p "$prompt…" "${walker_args[@]}" 2>/dev/null
+76
View File
@@ -0,0 +1,76 @@
#!/bin/bash
# omarchy:summary=Send a desktop notification with Omarchy glyph and body spacing
# omarchy:args=<headline> [description] [-g <glyph>] [-u <low|normal|critical>] [notify-send options]
# omarchy:examples=omarchy notification send "Reminder" "5 minutes are up" -g 󰔛 -u critical
set -euo pipefail
headline=""
description=""
glyph=""
urgency="low"
args=()
parse_omarchy_option() {
case $1 in
-g | --glyph)
if (($# < 2)); then
echo "Missing value for $1" >&2
exit 1
fi
glyph="$2"
return 0
;;
-u | --urgency)
if (($# < 2)); then
echo "Missing value for $1" >&2
exit 1
fi
urgency="$2"
return 0
;;
esac
return 1
}
while (($# > 0)); do
if parse_omarchy_option "$@"; then
shift 2
else
break
fi
done
if (($# < 1)); then
echo "Usage: omarchy-notification-send [-g <glyph>] [-u <low|normal|critical>] <headline> [description] [notify-send options]"
exit 1
fi
headline=$1
shift
if (($# > 0)) && [[ $1 != -* ]]; then
description=$1
shift
fi
while (($# > 0)); do
if parse_omarchy_option "$@"; then
shift 2
else
args+=("$1")
shift
fi
done
summary="$glyph $headline"
args+=("-u" "$urgency")
if [[ -n $description ]]; then
description=$(printf '%b' "$description" | sed 's/^/ /')
notify-send "${args[@]}" "$summary" "$description"
else
notify-send "${args[@]}" "$summary"
fi
+8 -7
View File
@@ -1,11 +1,12 @@
#!/bin/bash #!/bin/bash
# omarchy:summary=Overwrite all the user configs in ~/.config/hypr with the Omarchy defaults. # omarchy:summary=Overwrite all the user Hyprland Lua configs in ~/.config/hypr with the Omarchy defaults.
omarchy-refresh-config hypr/autostart.conf omarchy-refresh-config hypr/.luarc.json
omarchy-refresh-config hypr/bindings.conf omarchy-refresh-config hypr/autostart.lua
omarchy-refresh-config hypr/input.conf omarchy-refresh-config hypr/bindings.lua
omarchy-refresh-config hypr/looknfeel.conf omarchy-refresh-config hypr/input.lua
omarchy-refresh-config hypr/hyprland.conf omarchy-refresh-config hypr/looknfeel.lua
omarchy-refresh-config hypr/monitors.conf omarchy-refresh-config hypr/hyprland.lua
omarchy-refresh-config hypr/monitors.lua
bash "$OMARCHY_PATH/install/config/detect-keyboard-layout.sh" bash "$OMARCHY_PATH/install/config/detect-keyboard-layout.sh"
+3
View File
@@ -19,5 +19,8 @@ echo
sudo cp -f "$OMARCHY_PATH/default/pacman/pacman-$channel.conf" /etc/pacman.conf sudo cp -f "$OMARCHY_PATH/default/pacman/pacman-$channel.conf" /etc/pacman.conf
sudo cp -f "$OMARCHY_PATH/default/pacman/mirrorlist-$channel" /etc/pacman.d/mirrorlist sudo cp -f "$OMARCHY_PATH/default/pacman/mirrorlist-$channel" /etc/pacman.d/mirrorlist
# Allow user customization of /etc/pacman.conf before the upgrade runs
omarchy-hook pre-refresh-pacman
# Reset all package DBs and then update # Reset all package DBs and then update
sudo pacman -Syyuu --noconfirm sudo pacman -Syyuu --noconfirm
+2 -2
View File
@@ -1,11 +1,11 @@
#!/bin/bash #!/bin/bash
# omarchy:summary=Reinstall the Omarchy source directory from git # omarchy:summary=Reinstall the stable Omarchy source directory from git
set -e set -e
# Reinstall the Omarchy configuration directory from the git source. # Reinstall the Omarchy configuration directory from the git source.
git clone --depth=1 "https://github.com/basecamp/omarchy.git" ~/.local/share/omarchy-new >/dev/null git clone "https://github.com/basecamp/omarchy.git" ~/.local/share/omarchy-new >/dev/null
mv $OMARCHY_PATH ~/.local/share/omarchy-old mv $OMARCHY_PATH ~/.local/share/omarchy-old
mv ~/.local/share/omarchy-new $OMARCHY_PATH mv ~/.local/share/omarchy-new $OMARCHY_PATH
+136
View File
@@ -0,0 +1,136 @@
#!/bin/bash
# omarchy:summary=Set and show lightweight desktop notification reminders
# omarchy:args=<minutes> [message] | show | clear
# omarchy:examples=omarchy reminder 5 | omarchy reminder 30 "Check the oven" | omarchy reminder show | omarchy reminder clear
set -euo pipefail
format_remaining() {
local seconds=$1
local minutes=$((seconds / 60))
local remainder=$((seconds % 60))
if ((minutes > 0 && remainder > 0)); then
echo "${minutes}m ${remainder}s"
elif ((minutes > 0)); then
echo "${minutes}m"
else
echo "${remainder}s"
fi
}
parse_systemd_timespan() {
local timespan="$1"
local total=0
local value unit whole
while read -r value unit; do
whole=${value%.*}
case $unit in
d) total=$((total + whole * 86400)) ;;
h) total=$((total + whole * 3600)) ;;
min) total=$((total + whole * 60)) ;;
s) total=$((total + whole)) ;;
ms | us) ;;
esac
done < <(grep -oE '[0-9]+([.][0-9]+)?(d|h|min|s|ms|us)' <<<"$timespan" | sed -E 's/^([0-9.]+)([a-z]+)$/\1 \2/')
echo "$total"
}
show_reminders() {
local timer next remaining body=""
local reminder_dir="${XDG_RUNTIME_DIR:-/tmp}/omarchy-reminders"
local reminder_message=""
local now=$(date +%s)
while IFS=$'\t' read -r timer next; do
[[ -z $timer || -z $next ]] && continue
next=$((next / 1000000))
((next <= now)) && continue
remaining=$((next - now))
reminder=${timer%.timer}
reminder=${reminder#omarchy-reminder-}
set_at=${reminder##*-}
reminder_minutes=${reminder%%m-*}
reminder_message=""
[[ -f $reminder_dir/${timer%.timer}.message ]] && reminder_message=$(<"$reminder_dir/${timer%.timer}.message")
if [[ -n $reminder_message ]]; then
body+="$reminder_message in $(format_remaining $remaining) ($(date -d "@$next" +%-H:%M))"$'\n'
else
body+="${reminder_minutes}-min reminder in $(format_remaining $remaining) ($(date -d "@$next" +%-H:%M))"$'\n'
fi
done < <(systemctl --user list-timers --all --output=json "omarchy-reminder-*.timer" 2>/dev/null | jq -r '.[] | [.unit, .next] | @tsv')
if [[ -z $body ]]; then
omarchy-notification-send -g 󰔛 "Upcoming reminders" "No outstanding reminders"
else
omarchy-notification-send -g 󰔛 "Upcoming reminders" "${body%$'\n'}"
fi
}
clear_reminders() {
local units
local reminder_dir="${XDG_RUNTIME_DIR:-/tmp}/omarchy-reminders"
units=$(systemctl --user list-timers --all --no-legend --no-pager "omarchy-reminder-*.timer" 2>/dev/null | awk '{ print $(NF - 1), $NF }')
if [[ -n $units ]]; then
xargs -r systemctl --user stop <<<"$units" || true
fi
rm -f "$reminder_dir"/omarchy-reminder-*.message 2>/dev/null || true
omarchy-notification-send -g 󰔛 "All reminders have been cleared"
}
case ${1:-} in
show | list)
show_reminders
exit 0
;;
clear)
clear_reminders
exit 0
;;
esac
minutes=${1:-}
shift || true
message="$*"
custom_message="$message"
if [[ -z $minutes ]] || [[ ! $minutes =~ ^[0-9]+$ ]] || ((minutes == 0)); then
echo "Usage: omarchy-reminder <minutes> [message]"
echo " omarchy-reminder show"
echo " omarchy-reminder clear"
exit 1
fi
if [[ -z $message ]]; then
message="Your ${minutes} minutes are up"
fi
set_at=$(date +%s)
remind_at=$(date -d "+${minutes} minutes" +%H:%M)
unit="omarchy-reminder-${minutes}m-$set_at"
reminder_dir="${XDG_RUNTIME_DIR:-/tmp}/omarchy-reminders"
message_file="$reminder_dir/$unit.message"
confirmation="You'll be reminded at $remind_at"
confirmation_title="Reminder set for ${minutes} minutes"
mkdir -p "$reminder_dir"
if [[ -n $custom_message ]]; then
printf "%s" "$custom_message" >"$message_file"
confirmation_title="$custom_message in ${minutes} minutes"
fi
systemd-run --user --quiet --collect --on-active="${minutes}m" --unit="$unit" \
bash -c 'omarchy-notification-send -g 󰔛 "Reminder" "$1" -u critical; rm -f "$2"' bash "$message" "$message_file"
omarchy-notification-send -g 󰔛 "$confirmation_title" "$confirmation"
+4 -1
View File
@@ -21,7 +21,10 @@ omarchy-pkg-drop \
libretro-parallel-n64 libretro-picodrive libretro-play libretro-ppsspp \ libretro-parallel-n64 libretro-picodrive libretro-play libretro-ppsspp \
libretro-sameboy libretro-scummvm libretro-shaders-slang libretro-snes9x \ libretro-sameboy libretro-scummvm libretro-shaders-slang libretro-snes9x \
libretro-yabause \ libretro-yabause \
libretro-cap32-git libretro-fbneo-git libretro-uae-git libretro-vice-git \ libretro-cap32-git libretro-fbneo-git libretro-uae-git \
libretro-vice-x128-git libretro-vice-x64-git libretro-vice-x64dtv-git libretro-vice-x64sc-git \
libretro-vice-xcbm2-git libretro-vice-xcbm5x0-git libretro-vice-xpet-git \
libretro-vice-xplus4-git libretro-vice-xscpu64-git libretro-vice-xvic-git \
retroarch-joypad-autoconfig-git retroarch-joypad-autoconfig-git
rm -rf \ rm -rf \
+2 -2
View File
@@ -8,8 +8,8 @@ if gum confirm "Are you sure you want to remove all preinstalled web apps, TUI w
omarchy-webapp-remove-all omarchy-webapp-remove-all
omarchy-tui-remove-all omarchy-tui-remove-all
cp ~/.config/hypr/bindings.conf ~/.config/hypr/bindings.conf.bak [[ -f ~/.config/hypr/bindings.lua ]] && cp ~/.config/hypr/bindings.lua ~/.config/hypr/bindings.lua.bak
cp "$OMARCHY_PATH/default/hypr/plain-bindings.conf" ~/.config/hypr/bindings.conf cp "$OMARCHY_PATH/default/hypr/plain-bindings.lua" ~/.config/hypr/bindings.lua
hyprctl reload hyprctl reload
# Remove npx stubs # Remove npx stubs
+35
View File
@@ -0,0 +1,35 @@
#!/bin/bash
# omarchy:summary=Remove FIDO2 authentication from sudo and polkit
# omarchy:requires-sudo=true
set -e
remove_pam_config() {
# Remove from sudo
if grep -q pam_u2f.so /etc/pam.d/sudo; then
echo "Removing FIDO2 authentication from sudo..."
sudo sed -i '/pam_u2f\.so/d' /etc/pam.d/sudo
fi
# Remove from polkit
if [[ -f /etc/pam.d/polkit-1 ]] && grep -Fq 'pam_u2f.so' /etc/pam.d/polkit-1; then
echo "Removing FIDO2 authentication from polkit..."
sudo sed -i '/pam_u2f\.so/d' /etc/pam.d/polkit-1
fi
}
echo -e "\e[32mRemoving FIDO2 device from authentication.\n\e[0m"
remove_pam_config
if [[ -d /etc/fido2 ]]; then
echo "Removing FIDO2 configuration..."
sudo rm -rf /etc/fido2
fi
echo "Removing FIDO2 packages..."
omarchy-pkg-drop libfido2 pam-u2f
echo -e "\e[32mFIDO2 authentication has been completely removed.\e[0m"
+37
View File
@@ -0,0 +1,37 @@
#!/bin/bash
# omarchy:summary=Remove fingerprint authentication from sudo, polkit, and lock screen
# omarchy:requires-sudo=true
set -e
remove_pam_config() {
# Remove from sudo
if grep -q pam_fprintd.so /etc/pam.d/sudo; then
echo "Removing fingerprint authentication from sudo..."
sudo sed -i '/pam_fprintd\.so/d' /etc/pam.d/sudo
fi
# Remove from polkit
if [[ -f /etc/pam.d/polkit-1 ]] && grep -Fq 'pam_fprintd.so' /etc/pam.d/polkit-1; then
echo "Removing fingerprint authentication from polkit..."
sudo sed -i '/pam_fprintd\.so/d' /etc/pam.d/polkit-1
fi
}
remove_hyprlock_fingerprint_icon() {
echo "Removing fingerprint icon from hyprlock placeholder text..."
sed -i 's/placeholder_text = .*/placeholder_text = Enter Password/' ~/.config/hypr/hyprlock.conf
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf
}
echo -e "\e[32mRemoving fingerprint scanner from authentication.\n\e[0m"
remove_pam_config
remove_hyprlock_fingerprint_icon
echo "Removing fingerprint packages..."
omarchy-pkg-drop fprintd libfprint-git
echo -e "\e[32mFingerprint authentication has been completely removed.\e[0m"
+6 -2
View File
@@ -2,5 +2,9 @@
# omarchy:summary=Restart the PipeWire audio service to fix audio issues or apply new configuration. # omarchy:summary=Restart the PipeWire audio service to fix audio issues or apply new configuration.
echo -e "Restarting pipewire audio service...\n" echo -e "Restarting PipeWire audio services...\n"
systemctl --user restart pipewire.service systemctl --user restart wireplumber.service pipewire.service
if systemctl --user --quiet is-active pipewire-pulse.service; then
systemctl --user restart pipewire-pulse.service
fi
+5 -1
View File
@@ -2,4 +2,8 @@
# omarchy:summary=Restart the SwayOSD server # omarchy:summary=Restart the SwayOSD server
omarchy-restart-app swayosd-server systemctl --user daemon-reload
systemctl --user stop swayosd-server.service || true
pkill -x swayosd-server || true
systemctl --user reset-failed swayosd-server.service || true
systemctl --user enable --now swayosd-server.service
+2 -1
View File
@@ -3,4 +3,5 @@
# omarchy:summary=Restart Waybar # omarchy:summary=Restart Waybar
# omarchy:examples=omarchy restart waybar # omarchy:examples=omarchy restart waybar
omarchy-restart-app waybar pkill -9 -x waybar
setsid uwsm-app -- waybar >/dev/null 2>&1 &
+2 -2
View File
@@ -7,7 +7,7 @@ screensaver_in_focus() {
} }
exit_screensaver() { exit_screensaver() {
hyprctl keyword cursor:invisible false &>/dev/null || true hyprctl eval 'hl.config({ cursor = { invisible = false } })' &>/dev/null || hyprctl keyword cursor:invisible false &>/dev/null || true
pkill -x tte 2>/dev/null pkill -x tte 2>/dev/null
pkill -f org.omarchy.screensaver 2>/dev/null pkill -f org.omarchy.screensaver 2>/dev/null
exit 0 exit 0
@@ -18,7 +18,7 @@ trap exit_screensaver SIGINT SIGTERM SIGHUP SIGQUIT
printf '\033]11;rgb:00/00/00\007' # Set background color to black printf '\033]11;rgb:00/00/00\007' # Set background color to black
hyprctl keyword cursor:invisible true &>/dev/null hyprctl eval 'hl.config({ cursor = { invisible = true } })' &>/dev/null || hyprctl keyword cursor:invisible true &>/dev/null
tty=$(tty 2>/dev/null) tty=$(tty 2>/dev/null)
-131
View File
@@ -1,131 +0,0 @@
#!/bin/bash
# omarchy:summary=Set up or remove FIDO2 authentication for sudo and polkit
# omarchy:args=[--remove]
# omarchy:requires-sudo=true
set -e
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
print_success() {
echo -e "${GREEN}$1${NC}"
}
print_error() {
echo -e "${RED}$1${NC}"
}
print_info() {
echo -e "${YELLOW}$1${NC}"
}
check_fido2_hardware() {
tokens=$(fido2-token -L 2>/dev/null)
if [[ -z $tokens ]]; then
print_error "\nNo FIDO2 device detected. Please plug it in (you may need to unlock it as well)."
return 1
fi
return 0
}
setup_pam_config() {
# Configure sudo
if ! grep -q pam_u2f.so /etc/pam.d/sudo; then
print_info "Configuring sudo for FIDO2 authentication..."
sudo sed -i '1i auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/sudo
fi
# Configure polkit
if [[ -f /etc/pam.d/polkit-1 ]] && ! grep -q 'pam_u2f.so' /etc/pam.d/polkit-1; then
print_info "Configuring polkit for FIDO2 authentication..."
sudo sed -i '1i auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/polkit-1
elif [[ ! -f /etc/pam.d/polkit-1 ]]; then
print_info "Creating polkit configuration with FIDO2 authentication..."
sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'
auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2
auth required pam_unix.so
account required pam_unix.so
password required pam_unix.so
session required pam_unix.so
EOF
fi
}
remove_pam_config() {
# Remove from sudo
if grep -q pam_u2f.so /etc/pam.d/sudo; then
print_info "Removing FIDO2 authentication from sudo..."
sudo sed -i '/pam_u2f\.so/d' /etc/pam.d/sudo
fi
# Remove from polkit
if [[ -f /etc/pam.d/polkit-1 ]] && grep -Fq 'pam_u2f.so' /etc/pam.d/polkit-1; then
print_info "Removing FIDO2 authentication from polkit..."
sudo sed -i '/pam_u2f\.so/d' /etc/pam.d/polkit-1
fi
}
if [[ "--remove" == $1 ]]; then
print_success "Removing FIDO2 device from authentication.\n"
# Remove PAM configuration
remove_pam_config
# Remove FIDO2 configuration
if [[ -d /etc/fido2 ]]; then
print_info "Removing FIDO2 configuration..."
sudo rm -rf /etc/fido2
fi
# Uninstall packages
print_info "Removing FIDO2 packages..."
sudo pacman -Rns --noconfirm libfido2 pam-u2f
print_success "FIDO2 authentication has been completely removed."
else
print_success "Setting up FIDO2 device for authentication.\n"
# Install required packages
print_info "Installing required packages..."
omarchy-pkg-add libfido2 pam-u2f
if ! check_fido2_hardware; then
exit 1
fi
# Create the pamu2fcfg file
if [[ ! -f /etc/fido2/fido2 ]]; then
sudo mkdir -p /etc/fido2
print_success "\nLet's setup your device by confirming on the device now."
print_info "Touch your FIDO2 key when it lights up...\n"
if pamu2fcfg >/tmp/fido2; then
sudo mv /tmp/fido2 /etc/fido2/fido2
print_success "FIDO2 device registered successfully!"
else
print_error "\nFIDO2 registration failed. Please try again."
exit 1
fi
else
print_info "FIDO2 device already registered."
fi
# Configure PAM
setup_pam_config
# Test with sudo
print_info "\nTesting FIDO2 authentication with sudo..."
print_info "Touch your FIDO2 key when prompted.\n"
if sudo echo "FIDO2 authentication test successful"; then
print_success "\nPerfect! FIDO2 authentication is now configured."
print_info "You can use your FIDO2 key for sudo and polkit authentication."
else
print_error "\nVerification failed. You may want to check your configuration."
fi
fi
-161
View File
@@ -1,161 +0,0 @@
#!/bin/bash
# omarchy:summary=Set up or remove fingerprint authentication for sudo, polkit, and lock screen
# omarchy:args=[--remove]
# omarchy:requires-sudo=true
set -e
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
print_success() {
echo -e "${GREEN}$1${NC}"
}
print_error() {
echo -e "${RED}$1${NC}"
}
print_info() {
echo -e "${YELLOW}$1${NC}"
}
check_fingerprint_hardware() {
# Get fingerprint devices for the user
devices=$(fprintd-list "$USER" 2>/dev/null)
# Exit if no devices found
if [[ -z $devices ]]; then
print_error "\nNo fingerprint sensor detected."
return 1
fi
return 0
}
setup_pam_config() {
# Configure sudo
if ! grep -q pam_fprintd.so /etc/pam.d/sudo; then
print_info "Configuring sudo for fingerprint authentication..."
sudo sed -i '1i auth sufficient pam_fprintd.so' /etc/pam.d/sudo
fi
# Configure polkit
if [[ -f /etc/pam.d/polkit-1 ]] && ! grep -q 'pam_fprintd.so' /etc/pam.d/polkit-1; then
print_info "Configuring polkit for fingerprint authentication..."
sudo sed -i '1i auth sufficient pam_fprintd.so' /etc/pam.d/polkit-1
elif [[ ! -f /etc/pam.d/polkit-1 ]]; then
print_info "Creating polkit configuration with fingerprint authentication..."
sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'
auth sufficient pam_fprintd.so
auth required pam_unix.so
account required pam_unix.so
password required pam_unix.so
session required pam_unix.so
EOF
fi
}
add_hyprlock_fingerprint_icon() {
print_info "Adding fingerprint icon to hyprlock placeholder text..."
sed -i 's/placeholder_text = .*/placeholder_text = <span> Enter Password 󰈷 <\/span>/' ~/.config/hypr/hyprlock.conf
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = true/' ~/.config/hypr/hyprlock.conf
}
remove_hyprlock_fingerprint_icon() {
print_info "Removing fingerprint icon from hyprlock placeholder text..."
sed -i 's/placeholder_text = .*/placeholder_text = Enter Password/' ~/.config/hypr/hyprlock.conf
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf
}
remove_pam_config() {
# Remove from sudo
if grep -q pam_fprintd.so /etc/pam.d/sudo; then
print_info "Removing fingerprint authentication from sudo..."
sudo sed -i '/pam_fprintd\.so/d' /etc/pam.d/sudo
fi
# Remove from polkit
if [[ -f /etc/pam.d/polkit-1 ]] && grep -Fq 'pam_fprintd.so' /etc/pam.d/polkit-1; then
print_info "Removing fingerprint authentication from polkit..."
sudo sed -i '/pam_fprintd\.so/d' /etc/pam.d/polkit-1
fi
}
if [[ "--remove" == $1 ]]; then
print_success "Removing fingerprint scanner from authentication.\n"
# Remove PAM configuration
remove_pam_config
# Remove fingerprint icon from hyprlock placeholder text
remove_hyprlock_fingerprint_icon
# Uninstall packages
print_info "Removing fingerprint packages..."
sudo pacman -Rns --noconfirm fprintd
print_success "Fingerprint authentication has been completely removed."
else
print_success "Setting up fingerprint scanner for authentication.\n"
# Install required packages
print_info "Installing required packages..."
# ASUS ExpertBook B9406CAA ships a FocalTech FT9349 ESS reader (USB
# 2808:a97a). Mainline libfprint at 1.94.x lacks the focaltech_moc
# driver (and its 0xa97a id_table entry); OPR ships libfprint-git
# which carries both. Once upstream catches up, this branch is a
# no-op and `libfprint-git` provides=libfprint anyway. Detect via
# /sys to avoid depending on usbutils being installed first.
for v in /sys/bus/usb/devices/*/idVendor; do
[[ "$(cat "$v" 2>/dev/null)" == "2808" ]] || continue
[[ "$(cat "${v%idVendor}idProduct" 2>/dev/null)" == "a97a" ]] || continue
print_info "FocalTech FT9349 detected (B9406CAA) — using libfprint-git from OPR..."
# libfprint-git provides+conflicts libfprint; pacman -S --noconfirm
# defaults the conflict prompt to N and aborts. Pre-remove libfprint
# with -Rdd so the install goes silent. -Rdd (not omarchy-pkg-drop's
# -Rns) is required because fprintd requires libfprint; the dep is
# re-satisfied immediately by libfprint-git's provides=libfprint.
if omarchy-pkg-present libfprint; then
sudo pacman -Rdd --noconfirm libfprint
fi
omarchy-pkg-add libfprint-git
break
done
omarchy-pkg-add fprintd usbutils
if ! check_fingerprint_hardware; then
exit 1
fi
# Configure PAM
setup_pam_config
# Add fingerprint icon to hyprlock placeholder text
add_hyprlock_fingerprint_icon
# Enroll first fingerprint
print_success "\nLet's setup your right index finger as the first fingerprint."
print_info "Keep moving the finger around on sensor until the process completes.\n"
if sudo fprintd-enroll "$USER"; then
print_success "\nFingerprint enrolled successfully!"
# Verify
print_info "\nNow let's verify that it's working correctly.\n"
if fprintd-verify; then
print_success "\nPerfect! Fingerprint authentication is now configured."
print_info "You can use your fingerprint for sudo, polkit, and lock screen (Super + Escape)."
else
print_error "\nVerification failed. You may want to try enrolling again."
fi
else
print_error "\nEnrollment failed. Please try again."
exit 1
fi
fi
+81
View File
@@ -0,0 +1,81 @@
#!/bin/bash
# omarchy:summary=Set up FIDO2 authentication for sudo and polkit
# omarchy:requires-sudo=true
set -e
check_fido2_hardware() {
tokens=$(fido2-token -L 2>/dev/null)
if [[ -z $tokens ]]; then
echo -e "\e[31m\nNo FIDO2 device detected. Please plug it in (you may need to unlock it as well).\e[0m"
return 1
fi
return 0
}
setup_pam_config() {
# Configure sudo
if ! grep -q pam_u2f.so /etc/pam.d/sudo; then
echo "Configuring sudo for FIDO2 authentication..."
sudo sed -i '1i auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/sudo
fi
# Configure polkit
if [[ -f /etc/pam.d/polkit-1 ]] && ! grep -q 'pam_u2f.so' /etc/pam.d/polkit-1; then
echo "Configuring polkit for FIDO2 authentication..."
sudo sed -i '1i auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/polkit-1
elif [[ ! -f /etc/pam.d/polkit-1 ]]; then
echo "Creating polkit configuration with FIDO2 authentication..."
sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'
auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2
auth required pam_unix.so
account required pam_unix.so
password required pam_unix.so
session required pam_unix.so
EOF
fi
}
echo -e "\e[32mSetting up FIDO2 device for authentication.\n\e[0m"
# Install required packages
echo "Installing required packages..."
omarchy-pkg-add libfido2 pam-u2f
if ! check_fido2_hardware; then
exit 1
fi
# Create the pamu2fcfg file
if [[ ! -f /etc/fido2/fido2 ]]; then
sudo mkdir -p /etc/fido2
echo -e "\e[32m\nLet's setup your device by confirming on the device now.\e[0m"
echo -e "Touch your FIDO2 key when it lights up...\n"
if pamu2fcfg >/tmp/fido2; then
sudo mv /tmp/fido2 /etc/fido2/fido2
echo -e "\e[32mFIDO2 device registered successfully!\e[0m"
else
echo -e "\e[31m\nFIDO2 registration failed. Please try again.\e[0m"
exit 1
fi
else
echo "FIDO2 device already registered."
fi
# Configure PAM
setup_pam_config
# Test with sudo
echo -e "\nTesting FIDO2 authentication with sudo..."
echo -e "Touch your FIDO2 key when prompted.\n"
if sudo echo "FIDO2 authentication test successful"; then
echo -e "\e[32m\nPerfect! FIDO2 authentication is now configured.\e[0m"
echo "You can use your FIDO2 key for sudo and polkit authentication."
else
echo -e "\e[31m\nVerification failed. You may want to check your configuration.\e[0m"
fi
+95
View File
@@ -0,0 +1,95 @@
#!/bin/bash
# omarchy:summary=Set up fingerprint authentication for sudo, polkit, and lock screen
# omarchy:requires-sudo=true
set -e
check_fingerprint_hardware() {
# Get fingerprint devices for the user
devices=$(fprintd-list "$USER" 2>/dev/null)
# Exit if no devices found
if [[ -z $devices ]]; then
echo -e "\e[31m\nNo fingerprint sensor detected.\e[0m"
return 1
fi
return 0
}
setup_pam_config() {
# Configure sudo
if ! grep -q pam_fprintd.so /etc/pam.d/sudo; then
echo "Configuring sudo for fingerprint authentication..."
sudo sed -i '1i auth sufficient pam_fprintd.so' /etc/pam.d/sudo
fi
# Configure polkit
if [[ -f /etc/pam.d/polkit-1 ]] && ! grep -q 'pam_fprintd.so' /etc/pam.d/polkit-1; then
echo "Configuring polkit for fingerprint authentication..."
sudo sed -i '1i auth sufficient pam_fprintd.so' /etc/pam.d/polkit-1
elif [[ ! -f /etc/pam.d/polkit-1 ]]; then
echo "Creating polkit configuration with fingerprint authentication..."
sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'
auth sufficient pam_fprintd.so
auth required pam_unix.so
account required pam_unix.so
password required pam_unix.so
session required pam_unix.so
EOF
fi
}
add_hyprlock_fingerprint_icon() {
echo "Adding fingerprint icon to hyprlock placeholder text..."
sed -i 's/placeholder_text = .*/placeholder_text = <span> Enter Password 󰈷 <\/span>/' ~/.config/hypr/hyprlock.conf
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = true/' ~/.config/hypr/hyprlock.conf
}
echo -e "\e[32mSetting up fingerprint scanner for authentication.\n\e[0m"
# Install required packages
echo "Installing required packages..."
# libfprint-git provides+conflicts libfprint; pacman -S --noconfirm
# defaults the conflict prompt to N and aborts. Pre-remove libfprint
# with -Rdd so the install goes silent. -Rdd (not omarchy-pkg-drop's
# -Rns) is required because fprintd requires libfprint; the dep is
# re-satisfied immediately by libfprint-git's provides=libfprint.
if omarchy-pkg-present libfprint; then
sudo pacman -Rdd --noconfirm libfprint
fi
omarchy-pkg-add libfprint-git fprintd usbutils
if ! check_fingerprint_hardware; then
exit 1
fi
# Configure PAM
setup_pam_config
# Add fingerprint icon to hyprlock placeholder text
add_hyprlock_fingerprint_icon
# Enroll first fingerprint
echo -e "\e[32m\nLet's setup your right index finger as the first fingerprint.\e[0m"
echo -e "Keep moving the finger around on sensor until the process completes.\n"
if sudo fprintd-enroll "$USER"; then
echo -e "\e[32m\nFingerprint enrolled successfully!\e[0m"
# Verify
echo -e "\nNow let's verify that it's working correctly.\n"
if fprintd-verify; then
echo -e "\e[32m\nPerfect! Fingerprint authentication is now configured.\e[0m"
echo "You can use your fingerprint for sudo, polkit, and lock screen (Super + Escape)."
else
echo -e "\e[31m\nVerification failed. You may want to try enrolling again.\e[0m"
fi
else
echo -e "\e[31m\nEnrollment failed. Please try again.\e[0m"
exit 1
fi
+20
View File
@@ -0,0 +1,20 @@
#!/bin/bash
# omarchy:summary=Set Hyprland, Hyprlock, Mako, and Walker corners to sharp or round
# omarchy:args=<sharp|round>
# omarchy:examples=omarchy style corners round | omarchy style corners sharp
if [[ $1 != "sharp" && $1 != "round" ]]; then
echo "Usage: omarchy-style-corners <sharp|round>"
exit 1
fi
omarchy-style-corners-hyprland "$1"
omarchy-style-corners-hyprlock "$1"
omarchy-style-corners-mako "$1"
omarchy-style-corners-walker "$1"
case $1 in
sharp) omarchy-notification-send "Sharp corners enabled" -g 󰝣 ;;
round) omarchy-notification-send "Round corners enabled" -g 󰘇 ;;
esac
+17
View File
@@ -0,0 +1,17 @@
#!/bin/bash
# omarchy:summary=Set or toggle shape of Hyprland window corners
# omarchy:args=[toggle|sharp|round]
# omarchy:examples=omarchy style corners hyprland toggle | omarchy style corners hyprland round | omarchy style corners hyprland sharp
case "${1:-toggle}" in
round) set -- on ;;
sharp) set -- off ;;
toggle) ;;
*)
echo "Usage: omarchy-style-corners-hyprland [toggle|sharp|round]"
exit 1
;;
esac
omarchy-hyprland-toggle rounded-corners "$1"
+35
View File
@@ -0,0 +1,35 @@
#!/bin/bash
# omarchy:summary=Set or toggle rounded Hyprlock input field corners
# omarchy:args=[toggle|sharp|round]
# omarchy:examples=omarchy style corners hyprlock toggle | omarchy style corners hyprlock round | omarchy style corners hyprlock sharp
TOGGLES_CONFIG="$HOME/.local/state/omarchy/toggles/hyprlock.conf"
set_rounding() {
local radius="$1"
mkdir -p "$(dirname "$TOGGLES_CONFIG")"
cat >"$TOGGLES_CONFIG" <<EOF
input-field {
rounding = $radius
}
EOF
}
case "${1:-toggle}" in
round) set_rounding 6 ;;
sharp) set_rounding 0 ;;
toggle)
if [[ -f $TOGGLES_CONFIG ]] && grep -q '^ rounding = 6$' "$TOGGLES_CONFIG"; then
set_rounding 0
else
set_rounding 6
fi
;;
*)
echo "Usage: omarchy-style-corners-hyprlock [toggle|sharp|round]"
exit 1
;;
esac
+38
View File
@@ -0,0 +1,38 @@
#!/bin/bash
# omarchy:summary=Set or toggle rounded Mako notification corners
# omarchy:args=[toggle|sharp|round]
# omarchy:examples=omarchy style corners mako toggle | omarchy style corners mako round | omarchy style corners mako sharp
TOGGLES_CONFIG="$HOME/.local/state/omarchy/toggles/mako.ini"
set_radius() {
local radius="$1"
mkdir -p "$(dirname "$TOGGLES_CONFIG")"
touch "$TOGGLES_CONFIG"
if grep -q '^border-radius=' "$TOGGLES_CONFIG"; then
sed -i "s/^border-radius=.*/border-radius=$radius/" "$TOGGLES_CONFIG"
else
echo "border-radius=$radius" >>"$TOGGLES_CONFIG"
fi
}
case "${1:-toggle}" in
round) set_radius 6 ;;
sharp) set_radius 0 ;;
toggle)
if [[ -f $TOGGLES_CONFIG ]] && grep -q '^border-radius=6$' "$TOGGLES_CONFIG"; then
set_radius 0
else
set_radius 6
fi
;;
*)
echo "Usage: omarchy-style-corners-mako [toggle|sharp|round]"
exit 1
;;
esac
makoctl reload
+40
View File
@@ -0,0 +1,40 @@
#!/bin/bash
# omarchy:summary=Set or toggle rounded Walker corners
# omarchy:args=[toggle|sharp|round]
# omarchy:examples=omarchy style corners walker toggle | omarchy style corners walker round | omarchy style corners walker sharp
TOGGLES_CSS="$HOME/.local/state/omarchy/toggles/walker.css"
set_radius() {
local radius="$1"
mkdir -p "$(dirname "$TOGGLES_CSS")"
touch "$TOGGLES_CSS"
if grep -q '^ border-radius:' "$TOGGLES_CSS"; then
sed -i "s/^ border-radius:.*/ border-radius: ${radius}px;/" "$TOGGLES_CSS"
elif grep -q '^border-radius:' "$TOGGLES_CSS"; then
sed -i "s/^border-radius:.*/border-radius: ${radius}px;/" "$TOGGLES_CSS"
else
echo ".box-wrapper { border-radius: ${radius}px; }" >>"$TOGGLES_CSS"
fi
}
case "${1:-toggle}" in
round) set_radius 6 ;;
sharp) set_radius 0 ;;
toggle)
if [[ -f $TOGGLES_CSS ]] && grep -q 'border-radius: 6px;' "$TOGGLES_CSS"; then
set_radius 0
else
set_radius 6
fi
;;
*)
echo "Usage: omarchy-style-corners-walker [toggle|sharp|round]"
exit 1
;;
esac
omarchy-restart-walker
+45
View File
@@ -0,0 +1,45 @@
#!/bin/bash
# omarchy:summary=Set Waybar position
# omarchy:args=<top|bottom|left|right>
# omarchy:examples=omarchy-style-waybar-position top | omarchy style waybar-position bottom
set -e
WAYBAR_CONFIG="$HOME/.config/waybar/config.jsonc"
position=$1
if [[ ! $position =~ ^(top|bottom|left|right)$ ]]; then
echo "Usage: omarchy-style-waybar-position top|bottom|left|right" >&2
exit 1
fi
# Reset config and styles before making adjustments
omarchy-refresh-config waybar/config.jsonc
omarchy-refresh-config waybar/style.css
if [[ $position == "left" || $position == "right" ]]; then
height=0
width=28
horizontal=false
else
height=26
width=0
horizontal=true
fi
# Change position
sed -i -E "s/(\"position\"[[:space:]]*:[[:space:]]*\")[a-z]+(\")/\\1${position}\\2/" "$WAYBAR_CONFIG"
# Change height/width
sed -i -E "s/(\"height\"[[:space:]]*:[[:space:]]*)[0-9]+/\\1${height}/; s/(\"width\"[[:space:]]*:[[:space:]]*)[0-9]+/\\1${width}/" "$WAYBAR_CONFIG"
# Change the clock format
if [[ $horizontal == true ]]; then
sed -i -E '/"clock"[[:space:]]*:[[:space:]]*\{/,/\}/ s/"format"[[:space:]]*:[[:space:]]*"[^"]*"/"format": "{:L%A %H:%M}"/' "$WAYBAR_CONFIG"
else
sed -i -E '/"clock"[[:space:]]*:[[:space:]]*\{/,/\}/ s/"format"[[:space:]]*:[[:space:]]*"[^"]*"/"format": "{:%H\\n —\\n%M}"/' "$WAYBAR_CONFIG"
fi
omarchy-restart-waybar
+7 -7
View File
@@ -3,7 +3,7 @@
# omarchy:summary=Enable, disable, or toggle the touchpad # omarchy:summary=Enable, disable, or toggle the touchpad
# omarchy:args=[on|off|toggle] # omarchy:args=[on|off|toggle]
STATE_CONF="$HOME/.local/state/omarchy/toggles/hypr/touchpad-disabled.conf" STATE_FILE="$HOME/.local/state/omarchy/toggles/hypr/touchpad-disabled.lua"
device="$(omarchy-hw-touchpad)" device="$(omarchy-hw-touchpad)"
@@ -13,20 +13,20 @@ if [[ -z $device ]]; then
fi fi
enable() { enable() {
hyprctl keyword "device[$device]:enabled" true >/dev/null hyprctl eval "hl.device({ name = \"$device\", enabled = true })" >/dev/null
rm -f "$STATE_CONF" rm -f "$STATE_FILE"
omarchy-swayosd-client --custom-icon input-touchpad-symbolic --custom-message "Touchpad enabled" omarchy-swayosd-client --custom-icon input-touchpad-symbolic --custom-message "Touchpad enabled"
} }
disable() { disable() {
hyprctl keyword "device[$device]:enabled" false >/dev/null hyprctl eval "hl.device({ name = \"$device\", enabled = false })" >/dev/null
mkdir -p "$(dirname "$STATE_CONF")" mkdir -p "$(dirname "$STATE_FILE")"
printf 'device {\n name = %s\n enabled = false\n}\n' "$device" > "$STATE_CONF" printf 'hl.device({ name = "%s", enabled = false })\n' "$device" >"$STATE_FILE"
omarchy-swayosd-client --custom-icon touchpad-disabled-symbolic --custom-message "Touchpad disabled" omarchy-swayosd-client --custom-icon touchpad-disabled-symbolic --custom-message "Touchpad disabled"
} }
case "${1:-toggle}" in case "${1:-toggle}" in
on) enable ;; on) enable ;;
off) disable ;; off) disable ;;
toggle) if [[ -f $STATE_CONF ]]; then enable; else disable; fi ;; toggle) if [[ -f $STATE_FILE ]]; then enable; else disable; fi ;;
esac esac
+7 -7
View File
@@ -3,7 +3,7 @@
# omarchy:summary=Enable, disable, or toggle the touch functionality of the screen # omarchy:summary=Enable, disable, or toggle the touch functionality of the screen
# omarchy:args=[on|off|toggle] # omarchy:args=[on|off|toggle]
STATE_CONF="$HOME/.local/state/omarchy/toggles/hypr/touchscreen-disabled.conf" STATE_FILE="$HOME/.local/state/omarchy/toggles/hypr/touchscreen-disabled.lua"
device="$(omarchy-hw-touchscreen)" device="$(omarchy-hw-touchscreen)"
@@ -13,20 +13,20 @@ if [[ -z $device ]]; then
fi fi
enable() { enable() {
hyprctl keyword "device[$device]:enabled" true >/dev/null hyprctl eval "hl.device({ name = \"$device\", enabled = true })" >/dev/null
rm -f "$STATE_CONF" rm -f "$STATE_FILE"
omarchy-swayosd-client --custom-icon device-support-touch-symbolic --custom-message "Touchscreen enabled" omarchy-swayosd-client --custom-icon device-support-touch-symbolic --custom-message "Touchscreen enabled"
} }
disable() { disable() {
hyprctl keyword "device[$device]:enabled" false >/dev/null hyprctl eval "hl.device({ name = \"$device\", enabled = false })" >/dev/null
mkdir -p "$(dirname "$STATE_CONF")" mkdir -p "$(dirname "$STATE_FILE")"
printf 'device {\n name = %s\n enabled = false\n}\n' "$device" > "$STATE_CONF" printf 'hl.device({ name = "%s", enabled = false })\n' "$device" >"$STATE_FILE"
omarchy-swayosd-client --custom-icon touch-disabled-symbolic --custom-message "Touchscreen disabled" omarchy-swayosd-client --custom-icon touch-disabled-symbolic --custom-message "Touchscreen disabled"
} }
case "${1:-toggle}" in case "${1:-toggle}" in
on) enable ;; on) enable ;;
off) disable ;; off) disable ;;
toggle) if [[ -f $STATE_CONF ]]; then enable; else disable; fi ;; toggle) if [[ -f $STATE_FILE ]]; then enable; else disable; fi ;;
esac esac
+15 -39
View File
@@ -13,7 +13,7 @@ usage() {
Usage: Usage:
omarchy transcode [--path path] [input] [format] [resolution] omarchy transcode [--path path] [input] [format] [resolution]
With no input, fuzzy-pick a picture or video from ~/Pictures and ~/Videos, With no input, pick a picture or video with Walker from ~/Pictures and ~/Videos,
or only from --path when provided. Then pick the output format and resolution. or only from --path when provided. Then pick the output format and resolution.
Options: Options:
@@ -29,30 +29,6 @@ Resolutions:
EOF EOF
} }
pick_file() {
local search_path="$1"
local paths=()
if [[ -n $search_path ]]; then
[[ -e $search_path ]] || { echo "Path not found: $search_path" >&2; return 1; }
paths=("$search_path")
else
paths=("$HOME/Pictures" "$HOME/Videos")
fi
find "${paths[@]}" -type f \
\( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.webp' -o -iname '*.gif' -o -iname '*.heic' -o -iname '*.avif' \
-o -iname '*.mp4' -o -iname '*.mov' -o -iname '*.m4v' -o -iname '*.mkv' -o -iname '*.webm' -o -iname '*.avi' \) \
-printf '%T@\t%p\n' 2>/dev/null | sort -rn | cut -f2- | fzf --layout=reverse-list --prompt="Transcode file> "
}
pick_option() {
local prompt="$1"
shift
gum choose --header "$prompt" "$@"
}
media_type() { media_type() {
local mime local mime
mime=$(file -b --mime-type "$1") mime=$(file -b --mime-type "$1")
@@ -187,9 +163,10 @@ main() {
input="${positional[0]:-}" input="${positional[0]:-}"
format="${positional[1]:-}" format="${positional[1]:-}"
resolution="${positional[2]:-}" resolution="${positional[2]:-}"
search_path="${search_path:-$HOME/Pictures:$HOME/Videos}"
if [[ -z $input ]]; then if [[ -z $input ]]; then
input=$(pick_file "$search_path") input=$(omarchy-menu-file "Transcode picture or video" "$search_path" "jpg jpeg png webp gif heic avif mp4 mov m4v mkv webm avi")
fi fi
[[ -n $input ]] || return 1 [[ -n $input ]] || return 1
@@ -199,33 +176,32 @@ main() {
if [[ -z $format ]]; then if [[ -z $format ]]; then
if [[ $type == "picture" ]]; then if [[ $type == "picture" ]]; then
format=$(pick_option "Select format..." jpg png) format=$(omarchy-menu-select "Select format" jpg png)
else else
format=$(pick_option "Select format..." mp4 gif) format=$(omarchy-menu-select "Select format" mp4 gif)
fi fi
fi fi
if [[ -z $resolution ]]; then if [[ -z $resolution ]]; then
if [[ $type == "picture" ]]; then if [[ $type == "picture" ]]; then
resolution=$(pick_option "Select resolution..." high medium low) resolution=$(omarchy-menu-select "Select resolution" high medium low)
else else
resolution=$(pick_option "Select resolution..." 4k 1080p 720p) resolution=$(omarchy-menu-select "Select resolution" 4k 1080p 720p)
fi fi
fi fi
output=$(output_path "$input" "$format" "$resolution") output=$(output_path "$input" "$format" "$resolution")
if [[ $type == "picture" ]]; then if [[ $type == "video" ]]; then
transcode_picture "$input" "$format" "$resolution" "$output" omarchy-notification-send -g  "Transcoding video…" "$(basename -- "$input") to $format ($resolution)"
else
transcode_video "$input" "$format" "$resolution" "$output" transcode_video "$input" "$format" "$resolution" "$output"
echo "" copy_to_clipboard "$output"
omarchy-notification-send -g  "Transcoded to $resolution $format" "Saved and copied to clipboard."
else
transcode_picture "$input" "$format" "$resolution" "$output"
copy_to_clipboard "$output"
omarchy-notification-send -g  "Transcoded to $resolution $format" "Saved and copied to clipboard."
fi fi
copy_to_clipboard "$output"
echo "Your $type has been transcoded into $format as $resolution. It's on your clipboard."
echo ""
echo "It's also in $output"
} }
main "$@" main "$@"
@@ -1,18 +1,18 @@
#!/bin/bash #!/bin/bash
# omarchy:summary=Set the screensaver logo text from an SVG/PNG or the default # omarchy:summary=Transcode an image into ASCII/Unicode art text
# omarchy:args=<default|path-to-logo.svg|png> [--width <columns>] [--height <rows>] [--mode <braille|block>] [--threshold <percent>] [--invert] [--stdout] # omarchy:group=transcode
# omarchy:examples=omarchy screensaver logo ~/logo.svg | omarchy screensaver logo default | omarchy screensaver logo ~/logo.png --width 80 --mode block --stdout # omarchy:name=ascii
# omarchy:args=<input-image.svg|png> <output-path> [--width <columns>] [--height <rows>] [--mode <braille|block>] [--threshold <percent>] [--invert]
# omarchy:examples=omarchy transcode ascii ~/logo.svg /tmp/logo.txt | omarchy transcode ascii ~/logo.png ~/.config/omarchy/branding/screensaver.txt --width 80
set -o pipefail set -o pipefail
usage() { usage() {
cat <<'EOF' cat <<'EOF'
Usage: omarchy-screensaver-logo <default|path-to-logo.svg|png> [options] Usage: omarchy-transcode-ascii <input-image.svg|png> <output-path> [options]
Sets the screensaver logo text from an image. Transcodes an image into ASCII/Unicode art text.
Pass "default" instead of an image path to restore the Omarchy default.
By default, writes to ~/.config/omarchy/branding/screensaver.txt.
Options: Options:
-w, --width <columns> Maximum output width in terminal columns (default: 80) -w, --width <columns> Maximum output width in terminal columns (default: 80)
@@ -21,7 +21,6 @@ Options:
-t, --threshold <percent> Pixel threshold from 0-100 (default: 50) -t, --threshold <percent> Pixel threshold from 0-100 (default: 50)
--invert Treat light pixels as the logo instead of dark pixels --invert Treat light pixels as the logo instead of dark pixels
--no-trim Preserve surrounding whitespace/background --no-trim Preserve surrounding whitespace/background
--stdout Print converted text instead of writing the screensaver file
--help Show this help --help Show this help
EOF EOF
} }
@@ -32,9 +31,8 @@ mode=braille
threshold=50 threshold=50
invert=false invert=false
trim=true trim=true
output_path="$HOME/.config/omarchy/branding/screensaver.txt"
image_path="" image_path=""
reset_default=false output_path=""
while (($# > 0)); do while (($# > 0)); do
case "$1" in case "$1" in
@@ -98,9 +96,6 @@ while (($# > 0)); do
--no-trim) --no-trim)
trim=false trim=false
;; ;;
--stdout)
output_path="-"
;;
--) --)
shift shift
break break
@@ -111,10 +106,10 @@ while (($# > 0)); do
exit 1 exit 1
;; ;;
*) *)
if [[ $1 == "default" && -z $image_path ]]; then if [[ -z $image_path ]]; then
reset_default=true
elif [[ -z $image_path ]]; then
image_path="$1" image_path="$1"
elif [[ -z $output_path ]]; then
output_path="$1"
else else
echo "Unexpected argument: $1" >&2 echo "Unexpected argument: $1" >&2
usage >&2 usage >&2
@@ -127,10 +122,10 @@ done
if (($# > 0)); then if (($# > 0)); then
while (($# > 0)); do while (($# > 0)); do
if [[ $1 == "default" && -z $image_path ]]; then if [[ -z $image_path ]]; then
reset_default=true
elif [[ -z $image_path ]]; then
image_path="$1" image_path="$1"
elif [[ -z $output_path ]]; then
output_path="$1"
else else
echo "Unexpected argument: $1" >&2 echo "Unexpected argument: $1" >&2
usage >&2 usage >&2
@@ -140,29 +135,7 @@ if (($# > 0)); then
done done
fi fi
if [[ $reset_default == "true" ]]; then if [[ -z $image_path || -z $output_path ]]; then
if [[ -n $image_path ]]; then
echo "default does not accept an image path" >&2
exit 1
fi
default_path="${OMARCHY_PATH:-$HOME/.local/share/omarchy}/logo.txt"
if [[ ! -f $default_path ]]; then
echo "Default screensaver logo text not found: $default_path" >&2
exit 1
fi
if [[ $output_path == "-" ]]; then
cat "$default_path"
else
mkdir -p "$(dirname "$output_path")"
cp "$default_path" "$output_path"
echo "Restored default screensaver logo text to $output_path"
fi
exit 0
fi
if [[ -z $image_path ]]; then
usage >&2 usage >&2
exit 1 exit 1
fi fi
@@ -375,10 +348,6 @@ if [[ ! -s $tmp_output ]]; then
exit 1 exit 1
fi fi
if [[ $output_path == "-" ]]; then mkdir -p "$(dirname "$output_path")"
cat "$tmp_output" cp "$tmp_output" "$output_path"
else echo "Wrote ASCII art to $output_path"
mkdir -p "$(dirname "$output_path")"
cp "$tmp_output" "$output_path"
echo "Wrote screensaver logo text to $output_path"
fi
+1 -1
View File
@@ -9,7 +9,7 @@ echo -e "\e[32mUpdate Omarchy\e[0m"
omarchy-update-time omarchy-update-time
# Suppress Hyprland config errors while git updates default config files mid-pull # Suppress Hyprland config errors while git updates default config files mid-pull
hyprctl keyword debug:suppress_errors true &>/dev/null || true hyprctl eval 'hl.config({ debug = { suppress_errors = true } })' &>/dev/null || hyprctl keyword debug:suppress_errors true &>/dev/null || true
git -C $OMARCHY_PATH pull --autostash git -C $OMARCHY_PATH pull --autostash
git -C $OMARCHY_PATH --no-pager diff --check || git -C $OMARCHY_PATH reset --merge git -C $OMARCHY_PATH --no-pager diff --check || git -C $OMARCHY_PATH reset --merge
+4 -2
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# omarchy:summary=Ensure the Omarchy keyring package is installed and populated # omarchy:summary=Ensure the Omarchy and Arch keyring packages are installed and populated
# omarchy:requires-sudo=true # omarchy:requires-sudo=true
if omarchy-pkg-missing omarchy-keyring || ! sudo pacman-key --list-keys 40DFB630FF42BCFFB047046CF0134EE680CAC571 &>/dev/null; then if omarchy-pkg-missing omarchy-keyring || ! sudo pacman-key --list-keys 40DFB630FF42BCFFB047046CF0134EE680CAC571 &>/dev/null; then
@@ -16,5 +16,7 @@ if omarchy-pkg-missing omarchy-keyring || ! sudo pacman-key --list-keys 40DFB630
fi fi
# Ensure we have the latest archlinux-keyring, maintainer keys might have changed # Ensure we have the latest archlinux-keyring, maintainer keys might have changed
# Always reinstall, as the keyring can be updated without a package version bump.
echo -e "\e[32m\nUpdate Arch signing keys\e[0m" echo -e "\e[32m\nUpdate Arch signing keys\e[0m"
sudo pacman -Sy --noconfirm archlinux-keyring >/dev/null sudo pacman -Sy --noconfirm archlinux-keyring >/dev/null 2> >(grep -vE '^warning: archlinux-keyring-[^ ]+ is up to date -- reinstalling$' >&2)
echo "Keys are correct"
+2 -2
View File
@@ -6,7 +6,7 @@
set -e set -e
# Ensure screensaver/sleep doesn't set in during updates # Ensure screensaver/sleep doesn't set in during updates
hyprctl dispatch tagwindow +noidle &>/dev/null || true hyprctl dispatch 'hl.dsp.window.tag({ tag = "+noidle" })' &>/dev/null || hyprctl dispatch tagwindow +noidle &>/dev/null || true
# Perform all update steps # Perform all update steps
omarchy-update-keyring omarchy-update-keyring
@@ -22,4 +22,4 @@ omarchy-update-analyze-logs
omarchy-update-restart omarchy-update-restart
# Re-enable screensaver/sleep after updates # Re-enable screensaver/sleep after updates
hyprctl dispatch tagwindow -- -noidle &>/dev/null || true hyprctl dispatch 'hl.dsp.window.tag({ tag = "-noidle" })' &>/dev/null || hyprctl dispatch tagwindow -- -noidle &>/dev/null || true
+2 -2
View File
@@ -24,11 +24,11 @@ case $weather_code in
116) [[ $night == "true" ]] && icon="" || icon="" ;; 116) [[ $night == "true" ]] && icon="" || icon="" ;;
119|122) icon="" ;; 119|122) icon="" ;;
143|248|260) icon="" ;; 143|248|260) icon="" ;;
176|263|266|293|296|353) [[ $night == "true" ]] && icon="" || icon="" ;; 176|263|353) [[ $night == "true" ]] && icon="" || icon="" ;;
179|227|230|323|326|368) [[ $night == "true" ]] && icon="" || icon="" ;; 179|227|230|323|326|368) [[ $night == "true" ]] && icon="" || icon="" ;;
182|185|281|284|311|314|317|320|350|362|365|374|377) icon="" ;; 182|185|281|284|311|314|317|320|350|362|365|374|377) icon="" ;;
200|386|389|392|395) icon="" ;; 200|386|389|392|395) icon="" ;;
299|302|305|308|356|359) icon="" ;; 266|293|296|299|302|305|308|356|359) icon="" ;;
329|332|335|338|371) icon="" ;; 329|332|335|338|371) icon="" ;;
*) icon="" ;; *) icon="" ;;
esac esac
+2 -11
View File
@@ -12,15 +12,6 @@ fi
IFS='|' read -r place temperature wind <<< "$weather" IFS='|' read -r place temperature wind <<< "$weather"
place=${place%%,*} place=${place%%,*}
place=${place^} place=${place^}
format_temperature() { temperature=${temperature#+}
local celsius=${1#+}
celsius=${celsius//°/}
celsius=${celsius%C}
echo "${celsius}°c / $((celsius * 9 / 5 + 32))°f" echo "$(omarchy-weather-icon) $place · Temp $temperature · Wind $wind"
}
temperature=$(format_temperature "$temperature")
wind=${wind//km\// km/}
echo "$(omarchy-weather-icon) $place · Temperature $temperature · Wind $wind"
+1 -1
View File
@@ -1,4 +1,4 @@
--ozone-platform=wayland --ozone-platform=wayland
--ozone-platform-hint=wayland --ozone-platform-hint=wayland
--enable-features=TouchpadOverscrollHistoryNavigation,VaapiVideoDecodeLinuxGL,VaapiVideoEncoder --enable-features=TouchpadOverscrollHistoryNavigation
--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url --load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url
+1 -1
View File
@@ -1 +1 @@
command = 'wl-copy && hyprctl dispatch sendshortcut "SHIFT, Insert,"' command = 'wl-copy && (hyprctl dispatch "hl.dsp.send_shortcut({ mods = \"SHIFT\", key = \"Insert\" })" || hyprctl dispatch sendshortcut "SHIFT, Insert,")'
+1 -1
View File
@@ -23,7 +23,7 @@
<test name="family" qual="any"> <test name="family" qual="any">
<string>monospace</string> <string>monospace</string>
</test> </test>
<edit name="family" mode="assign" binding="strong"> <edit name="family" mode="append" binding="same">
<string>JetBrainsMono Nerd Font</string> <string>JetBrainsMono Nerd Font</string>
</edit> </edit>
</match> </match>
+11
View File
@@ -0,0 +1,11 @@
{
"workspace": {
"library": [
"/usr/share/hypr/stubs"
],
"checkThirdParty": false
},
"diagnostics": {
"globals": ["hl"]
}
}
-2
View File
@@ -1,2 +0,0 @@
# Extra autostart processes
# exec-once = uwsm-app -- my-service
+4
View File
@@ -0,0 +1,4 @@
-- Extra autostart processes.
-- hl.on("hyprland.start", function()
-- hl.exec_cmd("uwsm-app -- my-service")
-- end)
-40
View File
@@ -1,40 +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 ALT, M, Music TUI, exec, omarchy-launch-or-focus-tui cliamp
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"
bindd = SUPER SHIFT, W, Typora, exec, uwsm-app -- typora --enable-wayland-ime
bindd = SUPER SHIFT, SLASH, Passwords, exec, uwsm-app -- 1password
# If your web app url contains #, type it as ## to prevent hyprland treating it as a comment
bindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com"
bindd = SUPER SHIFT ALT, A, Grok, exec, omarchy-launch-webapp "https://grok.com"
bindd = SUPER SHIFT, C, Calendar, exec, omarchy-launch-webapp "https://app.hey.com/calendar/weeks/"
bindd = SUPER SHIFT, E, Email, exec, omarchy-launch-webapp "https://app.hey.com"
bindd = SUPER SHIFT, Y, YouTube, exec, omarchy-launch-webapp "https://youtube.com/"
bindd = SUPER SHIFT ALT, G, WhatsApp, exec, omarchy-launch-or-focus-webapp WhatsApp "https://web.whatsapp.com/"
bindd = SUPER SHIFT CTRL, G, Google Messages, exec, omarchy-launch-or-focus-webapp "Google Messages" "https://messages.google.com/web/conversations"
bindd = SUPER SHIFT, P, Google Photos, exec, omarchy-launch-or-focus-webapp "Google Photos" "https://photos.google.com/"
bindd = SUPER SHIFT, X, X, exec, omarchy-launch-webapp "https://x.com/"
bindd = SUPER SHIFT ALT, X, X Post, exec, omarchy-launch-webapp "https://x.com/compose/post"
# Add extra bindings
# bind = SUPER SHIFT, R, exec, alacritty -e ssh your-server
# Overwrite existing bindings, like putting Omarchy Menu on Super + Space
# unbind = SUPER, SPACE
# bindd = SUPER, SPACE, Omarchy menu, exec, omarchy-menu
# Logitech MX Keys
# bind = SUPER SHIFT, S, exec, omarchy-capture-screenshot # Print Screen Button
# bind = SUPER, H, exec, voxtype record toggle # Dictation Button
# bind = SUPER, PERIOD, exec, omarchy-launch-walker -m symbols # Emoji Button
+40
View File
@@ -0,0 +1,40 @@
-- Application bindings.
hl.bind("SUPER + RETURN", hl.dsp.exec_cmd([[uwsm-app -- xdg-terminal-exec --dir="$(omarchy-cmd-terminal-cwd)"]]), { description = "Terminal" })
hl.bind("SUPER + ALT + RETURN", hl.dsp.exec_cmd([[uwsm-app -- xdg-terminal-exec --dir="$(omarchy-cmd-terminal-cwd)" bash -c "tmux attach || tmux new -s Work"]]), { description = "Tmux" })
hl.bind("SUPER + SHIFT + RETURN", hl.dsp.exec_cmd("omarchy-launch-browser"), { description = "Browser" })
hl.bind("SUPER + SHIFT + F", hl.dsp.exec_cmd("uwsm-app -- nautilus --new-window"), { description = "File manager" })
hl.bind("SUPER + ALT + SHIFT + F", hl.dsp.exec_cmd([[uwsm-app -- nautilus --new-window "$(omarchy-cmd-terminal-cwd)"]]), { description = "File manager (cwd)" })
hl.bind("SUPER + SHIFT + B", hl.dsp.exec_cmd("omarchy-launch-browser"), { description = "Browser" })
hl.bind("SUPER + SHIFT + ALT + B", hl.dsp.exec_cmd("omarchy-launch-browser --private"), { description = "Browser (private)" })
hl.bind("SUPER + SHIFT + M", hl.dsp.exec_cmd("omarchy-launch-or-focus spotify"), { description = "Music" })
hl.bind("SUPER + SHIFT + ALT + M", hl.dsp.exec_cmd("omarchy-launch-or-focus-tui cliamp"), { description = "Music TUI" })
hl.bind("SUPER + SHIFT + N", hl.dsp.exec_cmd("omarchy-launch-editor"), { description = "Editor" })
hl.bind("SUPER + SHIFT + D", hl.dsp.exec_cmd("omarchy-launch-tui lazydocker"), { description = "Docker" })
hl.bind("SUPER + SHIFT + G", hl.dsp.exec_cmd([[omarchy-launch-or-focus ^signal$ "uwsm-app -- signal-desktop"]]), { description = "Signal" })
hl.bind("SUPER + SHIFT + O", hl.dsp.exec_cmd([[omarchy-launch-or-focus ^obsidian$ "uwsm-app -- obsidian"]]), { description = "Obsidian" })
hl.bind("SUPER + SHIFT + W", hl.dsp.exec_cmd("uwsm-app -- typora --enable-wayland-ime"), { description = "Typora" })
hl.bind("SUPER + SHIFT + SLASH", hl.dsp.exec_cmd("uwsm-app -- 1password"), { description = "Passwords" })
-- Web app bindings.
hl.bind("SUPER + SHIFT + A", hl.dsp.exec_cmd([[omarchy-launch-webapp "https://chatgpt.com"]]), { description = "ChatGPT" })
hl.bind("SUPER + SHIFT + ALT + A", hl.dsp.exec_cmd([[omarchy-launch-webapp "https://grok.com"]]), { description = "Grok" })
hl.bind("SUPER + SHIFT + C", hl.dsp.exec_cmd([[omarchy-launch-webapp "https://app.hey.com/calendar/weeks/"]]), { description = "Calendar" })
hl.bind("SUPER + SHIFT + E", hl.dsp.exec_cmd([[omarchy-launch-webapp "https://app.hey.com"]]), { description = "Email" })
hl.bind("SUPER + SHIFT + Y", hl.dsp.exec_cmd([[omarchy-launch-webapp "https://youtube.com/"]]), { description = "YouTube" })
hl.bind("SUPER + SHIFT + ALT + G", hl.dsp.exec_cmd([[omarchy-launch-or-focus-webapp WhatsApp "https://web.whatsapp.com/"]]), { description = "WhatsApp" })
hl.bind("SUPER + SHIFT + CTRL + G", hl.dsp.exec_cmd([[omarchy-launch-or-focus-webapp "Google Messages" "https://messages.google.com/web/conversations"]]), { description = "Google Messages" })
hl.bind("SUPER + SHIFT + P", hl.dsp.exec_cmd([[omarchy-launch-or-focus-webapp "Google Photos" "https://photos.google.com/"]]), { description = "Google Photos" })
hl.bind("SUPER + SHIFT + X", hl.dsp.exec_cmd([[omarchy-launch-webapp "https://x.com/"]]), { description = "X" })
hl.bind("SUPER + SHIFT + ALT + X", hl.dsp.exec_cmd([[omarchy-launch-webapp "https://x.com/compose/post"]]), { description = "X Post" })
-- Add extra bindings below.
-- hl.bind("SUPER + SHIFT + R", hl.dsp.exec_cmd("alacritty -e ssh your-server"), { description = "SSH" })
-- Overwrite existing bindings with hl.unbind() first if needed.
-- hl.unbind("SUPER + SPACE")
-- hl.bind("SUPER + SPACE", hl.dsp.exec_cmd("omarchy-menu"), { description = "Omarchy menu" })
-- Logitech MX Keys examples:
-- hl.bind("SUPER + SHIFT + S", hl.dsp.exec_cmd("omarchy-capture-screenshot"))
-- hl.bind("SUPER + H", hl.dsp.exec_cmd("voxtype record toggle"))
-- hl.bind("SUPER + PERIOD", hl.dsp.exec_cmd("omarchy-launch-walker -m symbols"))
+1 -1
View File
@@ -11,7 +11,7 @@ listener {
on-timeout = pidof hyprlock || omarchy-launch-screensaver on-timeout = pidof hyprlock || omarchy-launch-screensaver
} }
# Lock system after 5 minutes # Lock system after 5 minutes (screensaver resets idle timer, so have to just do half + 2s margin)
listener { listener {
timeout = 152 timeout = 152
on-timeout = omarchy-system-lock on-timeout = omarchy-system-lock
-26
View File
@@ -1,26 +0,0 @@
# Learn how to configure Hyprland: https://wiki.hypr.land/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
source = ~/.local/state/omarchy/toggles/hypr/*.conf
# Add any other personal Hyprland configuration below
# windowrule = workspace 5, match:class qemu
+42
View File
@@ -0,0 +1,42 @@
-- Learn how to configure Hyprland: https://wiki.hypr.land/Configuring/Start/
local home = os.getenv("HOME") or ""
-- Hyprland recommends require() for split Lua configs. These two roots let us
-- load user modules from ~/.config and Omarchy defaults from $OMARCHY_PATH.
package.path = home .. "/.config/?.lua;" .. (os.getenv("OMARCHY_PATH") or (home .. "/.local/share/omarchy")) .. "/?.lua;" .. package.path
local paths = require("default.hypr.paths")
-- Use Omarchy defaults, but don't edit these directly.
require("default.hypr.autostart")
require("default.hypr.bindings.media")
require("default.hypr.bindings.clipboard")
require("default.hypr.bindings.tiling-v2")
require("default.hypr.bindings.utilities")
require("default.hypr.envs")
require("default.hypr.looknfeel")
require("default.hypr.input")
require("default.hypr.windows")
-- Current theme overrides.
do
local theme = io.open(paths.config_home .. "/omarchy/current/theme/hyprland.lua", "r")
if theme then
theme:close()
require("omarchy.current.theme.hyprland")
end
end
-- Change your own setup in these files and override defaults.
require("hypr.monitors")
require("hypr.input")
require("hypr.bindings")
require("hypr.looknfeel")
require("hypr.autostart")
-- Toggle config flags dynamically.
require("default.hypr.toggles")
-- Add any other personal Hyprland configuration below.
-- hl.window_rule({ match = { class = "qemu" }, workspace = "5" })
+2
View File
@@ -41,3 +41,5 @@ input-field {
auth { auth {
fingerprint:enabled = false fingerprint:enabled = false
} }
source = ~/.local/state/omarchy/toggles/hyprlock.conf
-53
View File
@@ -1,53 +0,0 @@
# Control your input devices
# See https://wiki.hypr.land/Configuring/Basics/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_options = compose:caps # ,grp:alts_toggle
# Change speed of keyboard repeat
repeat_rate = 40
repeat_delay = 250
# 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: adaptive)
# accel_profile = flat
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|foot), scroll_touchpad 1.5
windowrule = match:class com.mitchellh.ghostty, scroll_touchpad 0.2
# Enable touchpad gestures for changing workspaces
# See https://wiki.hypr.land/Configuring/Advanced-and-Cool/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
+55
View File
@@ -0,0 +1,55 @@
-- Control your input devices.
-- See https://wiki.hypr.land/Configuring/Basics/Variables/#input
hl.config({
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_options = "compose:caps", -- ,grp:alts_toggle
-- Change speed of keyboard repeat.
repeat_rate = 40,
repeat_delay = 250,
-- 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: adaptive).
-- accel_profile = "flat",
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.
hl.window_rule({ match = { class = "(Alacritty|kitty|foot)" }, scroll_touchpad = 1.5 })
hl.window_rule({ match = { class = "com.mitchellh.ghostty" }, scroll_touchpad = 0.2 })
-- Enable touchpad gestures for changing workspaces.
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Gestures/
-- hl.gesture({ fingers = 3, direction = "horizontal", action = "workspace" })
-- Enable touchpad gestures for moving focus (helpful on scrolling layout).
-- hl.gesture({ fingers = 3, direction = "left", action = function() hl.dispatch(hl.dsp.focus({ direction = "l" })) end })
-- hl.gesture({ fingers = 3, direction = "right", action = function() hl.dispatch(hl.dsp.focus({ direction = "r" })) end })
-40
View File
@@ -1,40 +0,0 @@
# Change the default Omarchy look'n'feel
# https://wiki.hypr.land/Configuring/Basics/Variables/#general
general {
# No gaps between windows or borders
# gaps_in = 0
# gaps_out = 0
# border_size = 0
# Change to niri-like side-scrolling layout
# layout = scrolling
}
# https://wiki.hypr.land/Configuring/Basics/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.hypr.land/Configuring/Basics/Variables/#animations
animations {
# Disable all animations
# enabled = no
}
# https://wiki.hypr.land/Configuring/Basics/Variables/#layout
layout {
# Avoid overly wide single-window layouts on wide screens
# single_window_aspect_ratio = 1 1
}
# https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/
scrolling {
# See only one column per screen instead of two
# column_width = 0.97
}
+50
View File
@@ -0,0 +1,50 @@
-- Change the default Omarchy look'n'feel.
-- https://wiki.hypr.land/Configuring/Basics/Variables/#general
-- hl.config({
-- general = {
-- -- No gaps between windows or borders.
-- gaps_in = 0,
-- gaps_out = 0,
-- border_size = 0,
--
-- -- Change to niri-like side-scrolling layout.
-- layout = "scrolling",
-- },
-- })
-- https://wiki.hypr.land/Configuring/Basics/Variables/#decoration
-- hl.config({
-- 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.hypr.land/Configuring/Basics/Variables/#animations
-- hl.config({
-- animations = {
-- -- Disable all animations.
-- enabled = false,
-- },
-- })
-- https://wiki.hypr.land/Configuring/Basics/Variables/#layout
-- hl.config({
-- layout = {
-- -- Avoid overly wide single-window layouts on wide screens.
-- single_window_aspect_ratio = { 1, 1 },
-- },
-- })
-- https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/
-- hl.config({
-- scrolling = {
-- -- See only one column per screen instead of two.
-- column_width = 0.97,
-- },
-- })
-26
View File
@@ -1,26 +0,0 @@
# See https://wiki.hypr.land/Configuring/Basics/Monitors/
# List current monitors and resolutions possible: hyprctl monitors
# Format: monitor = [port], resolution, position, scale
# Optimized for retina-class 2x displays, like 13" 2.8K, 27" 5K, 32" 6K.
env = GDK_SCALE,2
monitor=,preferred,auto,auto
# Good compromise for 27" or 32" 4K monitors (but fractional!)
# env = GDK_SCALE,1.75
# monitor=,preferred,auto,1.6
# Straight 1x setup for low-resolution displays like 1080p or 1440p
# Or for ultrawide monitors like 34" 3440x1440 or 49" 5120x1440
# env = GDK_SCALE,1
# monitor=,preferred,auto,1
# Portrait/rotated secondary monitor (transform: 1 = 90°, 3 = 270°)
# monitor = DP-2, preferred, auto, 1, transform, 1
# Example for Framework 13 w/ 6K XDR Apple display
# monitor = DP-5, 6016x3384@60, auto, 2
# monitor = eDP-1, 2880x1920@120, auto, 2
# Disable the second ghost monitor on an Apple 6K XDR over Thunderbolt
# monitor=DP-2,disable
+30
View File
@@ -0,0 +1,30 @@
-- See https://wiki.hypr.land/Configuring/Basics/Monitors/
-- List current monitors and resolutions possible: hyprctl monitors all
local omarchy_gdk_scale = 2
local omarchy_monitor_scale = "auto"
-- Optimized for retina-class 2x displays, like 13" 2.8K, 27" 5K, 32" 6K.
-- local omarchy_gdk_scale = 2
-- local omarchy_monitor_scale = "auto"
-- Good compromise for 27" or 32" 4K monitors (but fractional!): monitor scale 1.6, GDK scale 1.75.
-- local omarchy_gdk_scale = 1.75
-- local omarchy_monitor_scale = 1.6
-- Straight 1x setup for low-resolution displays like 1080p, 1440p, or ultrawides: both 1.
-- local omarchy_gdk_scale = 1
-- local omarchy_monitor_scale = 1
hl.env("GDK_SCALE", tostring(omarchy_gdk_scale))
hl.monitor({ output = "", mode = "preferred", position = "auto", scale = omarchy_monitor_scale })
-- Portrait/rotated secondary monitor (transform: 1 = 90°, 3 = 270°)
-- hl.monitor({ output = "DP-2", mode = "preferred", position = "auto", scale = 1, transform = 1 })
-- Example for Framework 13 w/ 6K XDR Apple display.
-- hl.monitor({ output = "DP-5", mode = "6016x3384@60", position = "auto", scale = 2 })
-- hl.monitor({ output = "eDP-1", mode = "2880x1920@120", position = "auto", scale = 2 })
-- Disable the second ghost monitor on an Apple 6K XDR over Thunderbolt.
-- hl.monitor({ output = "DP-2", disabled = true })
+7 -4
View File
@@ -3,11 +3,14 @@
# Print the current image file # Print the current image file
<Ctrl+p> = exec lp "$imv_current_file" <Ctrl+p> = exec lp "$imv_current_file"
# Delete the current image and quit the viewer # Trash the current image and quit the viewer (recoverable from Trash)
<Ctrl+x> = exec rm "$imv_current_file"; quit <Ctrl+x> = exec gio trash -- "$imv_current_file"; quit
# Delete the current image and move to the next one # Trash the current image and move to the next one
<Ctrl+Shift+X> = exec rm "$imv_current_file"; close <Ctrl+Shift+X> = exec gio trash -- "$imv_current_file"; close
# Rotate the currently open image by 90 degrees # Rotate the currently open image by 90 degrees
<Ctrl+r> = exec mogrify -rotate 90 "$imv_current_file" <Ctrl+r> = exec mogrify -rotate 90 "$imv_current_file"
# Edit the current image in Satty and quit the viewer
<Ctrl+e> = exec satty --filename "$imv_current_file" & ; quit
@@ -0,0 +1,10 @@
#!/bin/bash
# Show the weather status notification after Omarchy has started.
# To put it into use, remove .sample from this file name.
weather=$(omarchy-weather-status 2>/dev/null) || true
if [[ -n $weather && $weather != "Weather unavailable" ]]; then
notify-send -u low "$weather"
fi
@@ -0,0 +1,24 @@
#!/bin/bash
# This hook is called by `omarchy refresh pacman` AFTER the channel template
# is copied to /etc/pacman.conf and BEFORE `pacman -Syyuu` runs. Use it to
# layer customizations onto the freshly-written pacman.conf so they're
# respected by the upgrade — common cases are adding a custom repository
# (e.g. CachyOS, Chaotic-AUR, an internal company repo) or extra IgnorePkg
# lines.
#
# The hook runs as the invoking user with a warm sudo cache.
#
# To put it into use, remove .sample from this file name.
# Example: add an Include line above [core] for a custom repo.
# Maintain the repo entries in /etc/pacman.d/custom-repos.conf yourself.
CONF=/etc/pacman.conf
SNIPPET=/etc/pacman.d/custom-repos.conf
MARKER="Include = $SNIPPET"
[[ -r $SNIPPET ]] || exit 0
grep -qxF "$MARKER" "$CONF" && exit 0
sudo sed -i "0,/^\[core\]/s||$MARKER\n\n[core]|" "$CONF"
@@ -1,7 +1,7 @@
[Unit] [Unit]
Description=Recover the internal monitor toggle when no external display is connected Description=Recover the internal monitor toggle when no external display is connected
Before=graphical-session-pre.target Before=graphical-session-pre.target
ConditionPathExists=%h/.local/state/omarchy/toggles/hypr/internal-monitor-disable.conf ConditionPathExists=%h/.local/state/omarchy/toggles/hypr/internal-monitor-disable.lua
[Service] [Service]
Type=oneshot Type=oneshot
@@ -0,0 +1,13 @@
[Unit]
Description=SwayOSD server
PartOf=graphical-session.target
After=graphical-session.target
[Service]
Type=simple
ExecStart=/usr/bin/swayosd-server
Restart=always
RestartSec=2
[Install]
WantedBy=graphical-session.target

Some files were not shown because too many files have changed in this diff Show More