136 lines
3.4 KiB
Bash
Executable file
136 lines
3.4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
CONFIG="$HOME/.config/hypr/monitors.conf"
|
|
|
|
function make_matching_list {
|
|
mons="$(make_name_map)"
|
|
count="$(echo "$mons" | wc -l)"
|
|
while IFS= read -r line; do
|
|
if ! echo "$line" | grep -Eq '^[a-zA-Z0-9_]* *= *{'; then
|
|
continue
|
|
fi
|
|
profile=$(echo "$line" | awk -F' *= *{' '{print $1}')
|
|
|
|
# Get a sorted list of the monitors for the profile
|
|
match=1
|
|
num_listed=0
|
|
while IFS= read -r rule && [ "$rule" != "};" ]; do
|
|
[ -z "$rule" ] && continue # Empty line
|
|
|
|
# Either monitor name in "s or port name
|
|
mon=$(echo "$rule" | awk -F'"' '{print $2}')
|
|
[ -z "$mon" ] && mon=$(echo "$rule" \
|
|
| awk -F ',' '{print $1}' `# First comma separated value`\
|
|
| sed 's/ //g') # Remove whitespace
|
|
|
|
[ -z "$(echo "$mons" | grep "$mon")" ] && match=0 && break
|
|
num_listed=$(($num_listed + 1))
|
|
done
|
|
[ $num_listed -ne $count ] && match=0
|
|
echo "$profile $match"
|
|
done < $CONFIG
|
|
profile_list=$(echo "$profile_list" | awk 'NR>1')
|
|
}
|
|
|
|
function make_name_map {
|
|
echo "$(wlr-randr)" | while IFS= read -r line; do
|
|
desc="$(echo "$line" | awk -F'"' '{print $2}')"
|
|
[ ! -z "$desc" ] && echo "$desc"
|
|
done
|
|
}
|
|
|
|
function name_to_port {
|
|
name_map="$1"
|
|
name="$2"
|
|
echo "$name_map" | grep "$name" | awk -F'[()]' '{print $2}'
|
|
}
|
|
|
|
function make_commands {
|
|
declaration="$(cat $CONFIG \
|
|
| awk "/\\s*$1\\s*=\\s*{/,/};/" \
|
|
| sed '1d;$d')"
|
|
[ -z "$declaration" ] && exit 1
|
|
echo "$declaration" | while IFS= read -r rule; do
|
|
[ -z "$rule" ] && continue # Empty line
|
|
echo "hyprctl keyword monitor ${rule#"${rule%%[![:space:]]*}"}"
|
|
done
|
|
}
|
|
|
|
function handle() {
|
|
monitor=$(echo "$1" | sed 's/.*>>\(.*\)$/\1/')
|
|
case $1 in
|
|
monitoradded*)
|
|
notify-send "Added monitor $monitor"
|
|
;;
|
|
monitorremoved*)
|
|
notify-send "Removed monitor $monitor"
|
|
;;
|
|
esac
|
|
# auto_apply
|
|
}
|
|
|
|
function auto_apply() {
|
|
echo "$(make_matching_list)" | while read -r profile match; do
|
|
if [ $match == 1 ]; then
|
|
apply_profile "$profile"
|
|
exit 0
|
|
fi
|
|
# None found. Falling back to default.
|
|
apply_profile "$default"
|
|
done
|
|
}
|
|
|
|
function apply_profile() {
|
|
eval "$(make_commands "$1")"
|
|
}
|
|
|
|
function list_profiles() {
|
|
count_matched=0
|
|
echo "$(make_matching_list)" | while read -r profile match; do
|
|
echo -n "$profile"
|
|
if [ $match != 0 ]; then
|
|
count_matched=$(($count_matched + 1))
|
|
echo -n " (match $count_matched)"
|
|
fi
|
|
echo
|
|
done
|
|
}
|
|
|
|
case $1 in
|
|
auto)
|
|
auto_apply
|
|
exit 0
|
|
;;
|
|
list)
|
|
list_profiles
|
|
exit 0
|
|
;;
|
|
savemap)
|
|
make_name_map > /tmp/monitormap
|
|
exit 0
|
|
;;
|
|
listen)
|
|
auto_apply
|
|
socat -U - UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock | while read -r line; do handle "$line"; done
|
|
exit 0
|
|
;;
|
|
print)
|
|
echo "$(make_commands "$2")"
|
|
exit 0
|
|
;;
|
|
apply)
|
|
apply_profile "$2"
|
|
exit 0
|
|
;;
|
|
menu)
|
|
choice="$(echo "$(list_profiles)" | fuzzel --dmenu -p "Select layout:" | awk '{print $1}')"
|
|
[ -z "$choice" ] && exit 0
|
|
notify-send "Applied monitor layout $choice"
|
|
apply_profile "$choice"
|
|
exit 0
|
|
;;
|
|
*)
|
|
exit 1
|
|
;;
|
|
esac
|
|
|