diff --git a/.config/rofi/scripts/rofi-wallpaper.sh b/.config/rofi/scripts/rofi-wallpaper.sh index 0993f05..29b40ed 100755 --- a/.config/rofi/scripts/rofi-wallpaper.sh +++ b/.config/rofi/scripts/rofi-wallpaper.sh @@ -6,8 +6,9 @@ THEME="$HOME/.config/rofi/launchers/type-3/style-4.rasi" DIR="$HOME/Pictures/wallpapers/favorites" SELECTED_WALL=$(cd "$DIR" && for a in *.jpg *.png; do echo -en "$a\0icon\x1f$a\n"; done | rofi -dmenu -i -no-custom -theme "$THEME" -p "Select a wallpaper" -theme-str 'configuration {icon-size: 128; dpi: 96;} window {width: 45%; height: 45%;}') PTH="$(printf "%s" "$DIR/$SELECTED_WALL" | tr -s '/')" -notify-send -a "rofi-wallpaper" "Wallpaper set to" -i "$PTH" "$PTH" hyprctl hyprpaper preload "$PTH" -hyprctl hyprpaper wallpaper "DP-1,$PTH" +hyprctl hyprpaper wallpaper "$PTH" hyprctl hyprpaper unload "$(cat "$HOME/.wallpaper")" +# hyprctl hyprpaper wallpaper "DP-1, $PTH" +notify-send -a "rofi-wallpaper" "Wallpaper set to" -i "$PTH" "$PTH" echo "$PTH" >"$HOME/.wallpaper" diff --git a/projects/scripts/screenshot-anki.sh b/projects/scripts/screenshot-anki.sh index 87a7212..b912f6d 100755 --- a/projects/scripts/screenshot-anki.sh +++ b/projects/scripts/screenshot-anki.sh @@ -10,7 +10,12 @@ PICTURE_FIELD="${PICTURE_FIELD:-Picture}" QUALITY="${QUALITY:-90}" CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/screenshot-anki" ANKI_URL="http://localhost:${ANKI_CONNECT_PORT}" -REQUIREMENTS=(slurp grim wl-copy xdotool curl jq) +HOSTNAME_SHORT="$(hostname -s 2>/dev/null || hostname)" +HYPRLAND_GEOMETRY_FILTER='"\\(.at[0]),\\(.at[1]) \\(.size[0])x\\(.size[1])"' +REQUIREMENTS=(slurp grim wl-copy xdotool curl jq rofi) +ROFI_THEME_STR='listview {columns: 2; lines: 3;} window {width: 45%;}' +ROFI_THEME="$HOME/.config/rofi/launchers/type-2/style-2.rasi" +CAPTURE_MODE="" notify() { if command -v notify-send >/dev/null 2>&1; then @@ -31,6 +36,13 @@ wiggle_mouse() { xdotool mousemove_relative -- -1 -1 } +drain_enter_key() { + # Release lingering Enter press from launching via rofi so it + # doesn't reach the next focused window (e.g., a game). + xdotool keyup Return 2>/dev/null || true + xdotool keyup KP_Enter 2>/dev/null || true +} + capture_region() { local fmt="$1" quality="$2" output="$3" local geometry @@ -46,6 +58,59 @@ capture_region() { fi } +capture_current_window() { + local fmt="$1" quality="$2" output="$3" geometry + + if [[ "$HOSTNAME_SHORT" != "luna" && "$HOSTNAME_SHORT" != "lapis" ]]; then + notify "Window capture unavailable" "Falling back to region selection" + capture_region "$fmt" "$quality" "$output" + return + fi + + geometry=$(hyprctl -j activewindow 2>/dev/null | jq -r "$HYPRLAND_GEOMETRY_FILTER" 2>/dev/null || true) + if [[ -z "$geometry" || "$geometry" == "null" ]]; then + notify "Window capture failed" "Falling back to region selection" + capture_region "$fmt" "$quality" "$output" + return + fi + + if [[ "$fmt" == "jpeg" ]]; then + grim -g "$geometry" -t jpeg -q "$quality" "$output" + else + grim -g "$geometry" -t png "$output" + fi +} + +choose_capture_mode() { + local selection + selection=$(printf "%s\n%s\n" "Region (slurp)" "Current window (Hyprland)" | + rofi -dmenu -i \ + -p "Capture mode" \ + -mesg "Select capture target" \ + -no-custom \ + -no-lazy-grab \ + -location 0 -yoffset 30 -xoffset 30 \ + -theme "$ROFI_THEME" \ + -theme-str "$ROFI_THEME_STR" \ + -window-title "screenshot-anki") + + if [[ -z "$selection" ]]; then + notify "Screenshot cancelled" "No capture mode selected" + exit 0 + fi + + if [[ "$selection" == "Current window (Hyprland)" ]]; then + if [[ "$HOSTNAME_SHORT" != "luna" && "$HOSTNAME_SHORT" != "lapis" ]]; then + notify "Window capture unavailable" "Using region instead (host: $HOSTNAME_SHORT)" + CAPTURE_MODE="region" + else + CAPTURE_MODE="window" + fi + else + CAPTURE_MODE="region" + fi +} + copy_to_clipboard() { local file="$1" if ! wl-copy <"$file"; then @@ -81,7 +146,8 @@ open_note_in_browser() { } main() { - for cmd in "${REQUIREMENTS[@]}"; do + local requirements=("${REQUIREMENTS[@]}") + for cmd in "${requirements[@]}"; do require_cmd "$cmd" done @@ -90,19 +156,31 @@ main() { timestamp=$(date +%s) base="$CACHE_DIR/$timestamp" + drain_enter_key + choose_capture_mode + + if [[ "$CAPTURE_MODE" == "window" ]]; then + require_cmd hyprctl + fi + wiggle_mouse newest_note=$(get_newest_note_id) + local capture_fn="capture_region" + if [[ "$CAPTURE_MODE" == "window" ]]; then + capture_fn="capture_current_window" + fi + if [[ -n "$newest_note" ]]; then image_path="$base.jpg" - capture_region "jpeg" "$QUALITY" "$image_path" + "$capture_fn" "jpeg" "$QUALITY" "$image_path" update_note_with_image "$newest_note" "$image_path" "paste-$timestamp.jpg" open_note_in_browser "$newest_note" notify -i "$image_path" "Screenshot Taken" "Added to Anki note" rm -f "$image_path" else image_path="$base.png" - capture_region "png" "" "$image_path" + "$capture_fn" "png" "" "$image_path" copy_to_clipboard "$image_path" notify -i "$image_path" "Screenshot Taken" "Copied to clipboard" rm -f "$image_path" diff --git a/projects/scripts/songinfo.sh b/projects/scripts/songinfo.sh new file mode 100755 index 0000000..7239765 --- /dev/null +++ b/projects/scripts/songinfo.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +music_dir="/jellyfin/music" +previewdir="$XDG_CONFIG_HOME/ncmpcpp/previews" +filename="$(mpc --format "$music_dir"/%file% current)" +previewname="$previewdir/$(mpc --format %album% current | base64).png" + +[ -e "$previewname" ] || ffmpeg -y -i "$filename" -an -vf scale=128:128 "$previewname" > /dev/null 2>&1 + +notify-send -a "ncmpcpp" "Now Playing" "$(mpc --format '%title% \n%artist% - %album%' current)" -i "$previewname"