Adds first-party omarchy.notifications service plugin that hosts a freedesktop notification server and renders popups + a history popup inside the shell. Uninstalls mako and retargets every helper, keybind, indicator, and migration entry to the new daemon. Plugin (default/quickshell/omarchy-shell/plugins/notifications/): - Service.qml: NotificationServer, popupModel + pendingModel + pastModel (two-tier history, see below), DND via PersistentProperties + cache-file backstop, image cache for /tmp screenshots, IpcHandler with toggleDnd/setDnd/isDnd/showHistory/clear/clearPending/markAllSeen/ dismissAll/dismissOne/invokeLast/dismiss, per-theme override file ~/.config/omarchy/current/theme/notifications.json honoring borderColor/backgroundColor/textColor/countdownColor. - components/NotificationCard.qml: theme-driven card (Color.foreground/ background/border tokens from Commons/Color.qml), 32x32 icon slot, Nerd Font glyph fallback via omarchy-glyph hint, hero image strip for screenshot/image-path notifications, hover-pause progress bar, uses bar.fontFamily so all surfaces share one font. Filtering and DND: - transient hint and CLI-style senders (app_name in notify-send / omarchy-action) bypass history but still pop. - DND only allows omarchy-action toasts and notify-send -u critical through; real-app urgency=critical (Discord, Slack, Vesktop) is silenced and lands in pending instead. - Pending vs past split surfaced via tabs in the bar widget popup; past tab is auto-pruned at the 15-minute mark. - Click-to-jump: notifications without a libnotify default action focus the matching Hyprland window via class lookup. Shell host: - shell.qml: generic first-party service loader (mirrors the existing noctalia-compat path) and an alias for the bar so plugins can read barSize / barHidden / position for anchoring. - Commons/Color.qml: parses the theme's hyprland.conf for $activeBorderColor so notifications match Hyprland window borders; picks the explicit accent= key over the color4= alias. Bar widget rebase (plugins/bar/widgets/notificationCenter.qml): - Drops the chunk-1 stub server, binds count/dnd state to the service, hosts the history popup via PopupCard so it drops down from the notification glyph the same way Quick Settings does. - Pending/Past tabs, dismiss-individual close X, mark-all-as-seen and clear-recent action buttons, theme-driven palette. Quick Settings rework (plugins/bar/widgets/controlCenter.qml): - DND tile binds directly to service.doNotDisturb for instant feedback. - Drops the volume slider (already in audioPanel) and the no-op Theme tile; adds a Bluetooth toggle bound to Quickshell.Bluetooth. - Bigger 44x44 wallet was scaled back to 32x32 for tighter rows. Notification scripts (bin/omarchy-*): - omarchy-notification-send: passes glyph as a custom hint instead of prepending to the summary; adds -a omarchy-action and -u urgency automatically; supports -e/--transient passthrough. - User-action toasts in the capture / toggle / hyprland / default-* scripts and bindings/utilities.lua now tag themselves -a omarchy-action so DND treats them as intent-based bypass. - omarchy-toggle-notification-silencing, omarchy-notification-dismiss, default/waybar/indicators/notification-silencing.sh, and the Hyprland comma-keybinds all route through omarchy-shell-ipc notifications. - omarchy-capture-screenshot / -screenrecording set the image-path hint properly so the hero-image rendering kicks in. Mako removal (migrations/1778743515.sh): - pkill -x mako, systemctl --user stop mako.service, pacman -Rns mako (uninstalling deletes /usr/lib/systemd/user/mako.service so D-Bus activation can't respawn it). Removes ~/.config/mako/ and the legacy toggle file. Restarts quickshell so it claims the bus name. - Drops mako from install/omarchy-base.packages, autostart.lua, install/config/theme.sh + toggles.sh, default/themed/mako.ini.tpl, default/mako/, the omarchy-menu Mako restart row, bin/omarchy GROUP_DESCRIPTIONS, the settings panel catalogue, and the default/omarchy-skill paths table. - Removed scripts: bin/omarchy-restart-mako, bin/omarchy-style-corners-mako. - bin/omarchy-style-corners summary updated; corner radius for the notification card reads ~/.local/state/omarchy/toggles/quickshell-menu.json alongside the rest of the shell.
148 lines
4.3 KiB
Bash
Executable File
148 lines
4.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Take a screenshot
|
|
# omarchy:group=capture
|
|
# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy|save] [--editor=<name>]
|
|
# omarchy:examples=omarchy screenshot | omarchy capture screenshot region
|
|
# omarchy:aliases=omarchy screenshot
|
|
|
|
[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs
|
|
OUTPUT_DIR="${OMARCHY_SCREENSHOT_DIR:-${XDG_PICTURES_DIR:-$HOME/Pictures}}"
|
|
|
|
if [[ ! -d $OUTPUT_DIR ]]; then
|
|
mkdir -p "$OUTPUT_DIR"
|
|
notify-send -a omarchy-action "Created screenshot directory: $OUTPUT_DIR" -u normal -t 2000
|
|
fi
|
|
|
|
pkill slurp && exit 0
|
|
|
|
SCREENSHOT_EDITOR="${OMARCHY_SCREENSHOT_EDITOR:-satty}"
|
|
|
|
# Parse --editor flag from any position
|
|
ARGS=()
|
|
for arg in "$@"; do
|
|
if [[ $arg == --editor=* ]]; then
|
|
SCREENSHOT_EDITOR="${arg#--editor=}"
|
|
else
|
|
ARGS+=("$arg")
|
|
fi
|
|
done
|
|
set -- "${ARGS[@]}"
|
|
|
|
open_editor() {
|
|
local filepath="$1"
|
|
if [[ $SCREENSHOT_EDITOR == "satty" ]]; then
|
|
satty --filename "$filepath" \
|
|
--output-filename "$filepath" \
|
|
--actions-on-enter save-to-clipboard \
|
|
--save-after-copy \
|
|
--copy-command 'wl-copy'
|
|
else
|
|
$SCREENSHOT_EDITOR "$filepath"
|
|
fi
|
|
}
|
|
|
|
MODE="${1:-smart}"
|
|
PROCESSING="${2:-slurp}"
|
|
|
|
# accounting for portrait/transformed displays
|
|
JQ_MONITOR_GEO='
|
|
def format_geo:
|
|
.x as $x | .y as $y |
|
|
(.width / .scale | floor) as $w |
|
|
(.height / .scale | floor) as $h |
|
|
.transform as $t |
|
|
if $t == 1 or $t == 3 then
|
|
"\($x),\($y) \($h)x\($w)"
|
|
else
|
|
"\($x),\($y) \($w)x\($h)"
|
|
end;
|
|
'
|
|
|
|
get_rectangles() {
|
|
local active_workspace=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .activeWorkspace.id')
|
|
hyprctl monitors -j | jq -r --arg ws "$active_workspace" "${JQ_MONITOR_GEO} .[] | select(.activeWorkspace.id == (\$ws | tonumber)) | format_geo"
|
|
hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"'
|
|
}
|
|
|
|
# Keep hyprpicker alive until after grim captures so the screenshot sees the
|
|
# frozen overlay rather than live content shifting during teardown.
|
|
cleanup_freeze() {
|
|
[[ -n $PID ]] && kill $PID 2>/dev/null
|
|
}
|
|
trap cleanup_freeze EXIT
|
|
|
|
# Select based on mode
|
|
case "$MODE" in
|
|
region)
|
|
hyprpicker -r -z >/dev/null 2>&1 &
|
|
PID=$!
|
|
sleep .1
|
|
SELECTION=$(slurp 2>/dev/null)
|
|
;;
|
|
windows)
|
|
hyprpicker -r -z >/dev/null 2>&1 &
|
|
PID=$!
|
|
sleep .1
|
|
SELECTION=$(get_rectangles | slurp -r 2>/dev/null)
|
|
;;
|
|
fullscreen)
|
|
SELECTION=$(hyprctl monitors -j | jq -r "${JQ_MONITOR_GEO} .[] | select(.focused == true) | format_geo")
|
|
;;
|
|
smart | *)
|
|
RECTS=$(get_rectangles)
|
|
hyprpicker -r -z >/dev/null 2>&1 &
|
|
PID=$!
|
|
sleep .1
|
|
SELECTION=$(echo "$RECTS" | slurp 2>/dev/null)
|
|
|
|
# If the selection area is L * W < 20, we'll assume you were trying to select whichever
|
|
# window or output it was inside of to prevent accidental 2px snapshots
|
|
if [[ $SELECTION =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+)$ ]]; then
|
|
if ((${BASH_REMATCH[3]} * ${BASH_REMATCH[4]} < 20)); then
|
|
click_x="${BASH_REMATCH[1]}"
|
|
click_y="${BASH_REMATCH[2]}"
|
|
|
|
while IFS= read -r rect; do
|
|
if [[ $rect =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+) ]]; then
|
|
rect_x="${BASH_REMATCH[1]}"
|
|
rect_y="${BASH_REMATCH[2]}"
|
|
rect_width="${BASH_REMATCH[3]}"
|
|
rect_height="${BASH_REMATCH[4]}"
|
|
|
|
if ((click_x >= rect_x && click_x < rect_x + rect_width && click_y >= rect_y && click_y < rect_y + rect_height)); then
|
|
SELECTION="${rect_x},${rect_y} ${rect_width}x${rect_height}"
|
|
break
|
|
fi
|
|
fi
|
|
done <<<"$RECTS"
|
|
fi
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
[[ -z $SELECTION ]] && exit 0
|
|
|
|
FILENAME="screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png"
|
|
FILEPATH="$OUTPUT_DIR/$FILENAME"
|
|
|
|
case "$PROCESSING" in
|
|
slurp)
|
|
grim -g "$SELECTION" "$FILEPATH" || exit 1
|
|
echo "$FILEPATH"
|
|
wl-copy <"$FILEPATH"
|
|
|
|
(
|
|
ACTION=$(notify-send -a omarchy-action "Screenshot saved to clipboard and file" "Edit with Super + Alt + , (or click this)" -t 10000 --hint="string:image-path:$FILEPATH" -A "default=edit")
|
|
[[ $ACTION == "default" ]] && open_editor "$FILEPATH"
|
|
) >/dev/null 2>&1 &
|
|
;;
|
|
copy)
|
|
grim -g "$SELECTION" - | wl-copy
|
|
;;
|
|
save)
|
|
grim -g "$SELECTION" "$FILEPATH" || exit 1
|
|
echo "$FILEPATH"
|
|
;;
|
|
esac
|