diff --git a/bin/omarchy-hyprland-share-picker b/bin/omarchy-hyprland-share-picker new file mode 100755 index 0000000000..a9d07e61ed --- /dev/null +++ b/bin/omarchy-hyprland-share-picker @@ -0,0 +1,91 @@ +#!/bin/bash + +ALLOW_TOKEN=false +[[ "$1" == "--allow-token" ]] && ALLOW_TOKEN=true + +output_selection() { + local type="$1" + local value="$2" + + echo -n "[SELECTION]" + [[ "$ALLOW_TOKEN" == "true" ]] && echo -n "r" + echo "/${type}:${value}" + exit 0 +} + +show_screen_tab() { + local options=() + local connectors=() + + while IFS='|' read -r connector desc width height; do + local friendly_name=$(sed -E 's/ (0x[0-9A-F]+|[A-Z0-9]{10,})$//' <<<"$desc") + options+=("$friendly_name (${width}x${height}) - $connector") + connectors+=("$connector") + done < <(hyprctl monitors -j 2>/dev/null | jq -r '.[] | "\(.name)|\(.description)|\(.width)|\(.height)"' 2>/dev/null) + + local selected=$(printf '%s\n' "${options[@]}" | walker --dmenu -w 350 -p "Share Screen…" 2>/dev/null) + + for i in "${!options[@]}"; do + [[ "${options[$i]}" == "$selected" ]] && output_selection "screen" "${connectors[$i]}" + done + + exit 1 +} + +show_window_tab() { + [[ -z "$XDPH_WINDOW_SHARING_LIST" ]] && exit 1 + + local options=() + local ids=() + local rolling="$XDPH_WINDOW_SHARING_LIST" + + while [[ -n "$rolling" && "$rolling" == *"[HC>]"* ]]; do + local id="${rolling%%\[HC>\]*}" + rolling="${rolling#*\[HC>\]}" + + local class="${rolling%%\[HT>\]*}" + rolling="${rolling#*\[HT>\]}" + + local title="${rolling%%\[HE>\]*}" + rolling="${rolling#*\[HE>\]}" + + rolling="${rolling#*\[HA>\]}" + + if [[ -n "$id" && -n "$title" ]]; then + options+=("$title") + ids+=("$id") + fi + done + + local selected=$(printf '%s\n' "${options[@]}" | walker --dmenu -w 350 -p "Share Window…" 2>/dev/null) + + for i in "${!options[@]}"; do + [[ "${options[$i]}" == "$selected" ]] && output_selection "window" "${ids[$i]}" + done + + exit 1 +} + +show_region_tab() { + local geometry=$(slurp -f "%o %x %y %w %h" 2>/dev/null) + + if [[ -n "$geometry" ]]; then + read -r output x y w h <<<"$geometry" + output_selection "region" "${output}@${x},${y},${w},${h}" + fi + + exit 1 +} + +main_menu() { + local choice=$(printf "Screen\nWindow\nRegion" | walker --dmenu --theme dmenu_250 -p "Share…" 2>/dev/null) + + case "$choice" in + Screen) show_screen_tab ;; + Window) show_window_tab ;; + Region) show_region_tab ;; + *) exit 1 ;; + esac +} + +main_menu diff --git a/default/hypr/xdph.conf b/default/hypr/xdph.conf new file mode 100644 index 0000000000..9c2156e290 --- /dev/null +++ b/default/hypr/xdph.conf @@ -0,0 +1,3 @@ +screencopy { + custom_picker_binary = ~/.local/share/omarchy/bin/omarchy-hyprland-share-picker +} diff --git a/migrations/1759852695.sh b/migrations/1759852695.sh new file mode 100644 index 0000000000..468ff3f3b5 --- /dev/null +++ b/migrations/1759852695.sh @@ -0,0 +1,3 @@ +echo "Install custom share picker" + +cp -f $OMARCHY_PATH/default/hypr/xdph.conf ~/.config/hypr/xdph.conf