Add tablet monitor lock scripts
This commit is contained in:
Executable
+72
@@ -0,0 +1,72 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
STATE_FILE="$HOME/.local/state/omarchy/indicators/tablet-follow-focus"
|
||||||
|
SOCKET="$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock"
|
||||||
|
TABLET_DEVICE="${OMARCHY_TABLET_DEVICE:-hanvon-ugee-6-inch-pentablet-pen}"
|
||||||
|
PIDFILE="${XDG_RUNTIME_DIR:-/tmp}/omarchy-tablet-follow-focus.pid"
|
||||||
|
|
||||||
|
if [ "$(ps -o pgid= -p $$ | tr -d ' ')" != "$$" ]; then
|
||||||
|
exec setsid "$0" "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo $$ >"$PIDFILE"
|
||||||
|
trap 'rm -f "$PIDFILE"' EXIT
|
||||||
|
|
||||||
|
selected_mode() {
|
||||||
|
local mode
|
||||||
|
[ -f "$STATE_FILE" ] || { echo all; return; }
|
||||||
|
mode=$(cat "$STATE_FILE" 2>/dev/null)
|
||||||
|
echo "${mode:-follow}"
|
||||||
|
}
|
||||||
|
|
||||||
|
focused_monitor() {
|
||||||
|
hyprctl monitors -j | jq -r '.[] | select(.focused==true) | .name'
|
||||||
|
}
|
||||||
|
|
||||||
|
monitor_exists() {
|
||||||
|
hyprctl monitors -j | jq -e --arg name "$1" 'any(.[]; .name == $name)' >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
map_to_output() {
|
||||||
|
hyprctl eval "hl.device({ name = \"$TABLET_DEVICE\", output = \"$1\" })" >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
apply_selected_mode() {
|
||||||
|
local mode target
|
||||||
|
mode=$(selected_mode)
|
||||||
|
|
||||||
|
case "$mode" in
|
||||||
|
all)
|
||||||
|
map_to_output ""
|
||||||
|
;;
|
||||||
|
follow)
|
||||||
|
target=$(focused_monitor)
|
||||||
|
[ -n "$target" ] && map_to_output "$target"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if monitor_exists "$mode"; then
|
||||||
|
map_to_output "$mode"
|
||||||
|
else
|
||||||
|
target=$(focused_monitor)
|
||||||
|
[ -n "$target" ] && map_to_output "$target"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
apply_selected_mode
|
||||||
|
|
||||||
|
socat -U - UNIX-CONNECT:"$SOCKET" | while read -r line; do
|
||||||
|
case "$line" in
|
||||||
|
focusedmon\>\>*)
|
||||||
|
[ "$(selected_mode)" = "follow" ] && apply_selected_mode
|
||||||
|
;;
|
||||||
|
monitoradded\>\>*|monitorremoved\>\>*)
|
||||||
|
apply_selected_mode
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
Executable
+147
@@ -0,0 +1,147 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
STATE_DIR="$HOME/.local/state/omarchy/indicators"
|
||||||
|
STATE_FILE="$STATE_DIR/tablet-follow-focus"
|
||||||
|
DAEMON="omarchy-tablet-follow-focus"
|
||||||
|
PIDFILE="${XDG_RUNTIME_DIR:-/tmp}/omarchy-tablet-follow-focus.pid"
|
||||||
|
TABLET_DEVICE="${OMARCHY_TABLET_DEVICE:-hanvon-ugee-6-inch-pentablet-pen}"
|
||||||
|
|
||||||
|
selected_mode() {
|
||||||
|
local mode
|
||||||
|
[ -f "$STATE_FILE" ] || { echo all; return; }
|
||||||
|
mode=$(cat "$STATE_FILE" 2>/dev/null)
|
||||||
|
echo "${mode:-follow}"
|
||||||
|
}
|
||||||
|
|
||||||
|
write_mode() {
|
||||||
|
mkdir -p "$STATE_DIR"
|
||||||
|
printf '%s\n' "$1" >"$STATE_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
daemon_pid() {
|
||||||
|
[ -f "$PIDFILE" ] || return 1
|
||||||
|
local pid
|
||||||
|
pid=$(<"$PIDFILE")
|
||||||
|
[ -n "$pid" ] && kill -0 "$pid" 2>/dev/null && echo "$pid"
|
||||||
|
}
|
||||||
|
|
||||||
|
daemon_running() {
|
||||||
|
daemon_pid >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
start_daemon() {
|
||||||
|
daemon_running && return
|
||||||
|
setsid uwsm-app -- "$DAEMON" >/dev/null 2>&1 &
|
||||||
|
disown
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_daemon() {
|
||||||
|
local pid
|
||||||
|
pid=$(daemon_pid) && kill -- "-$pid" 2>/dev/null
|
||||||
|
rm -f "$PIDFILE"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
map_to_output() {
|
||||||
|
hyprctl eval "hl.device({ name = \"$TABLET_DEVICE\", output = \"$1\" })" >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
focused_monitor() {
|
||||||
|
hyprctl monitors -j | jq -r '.[] | select(.focused==true) | .name'
|
||||||
|
}
|
||||||
|
|
||||||
|
monitor_exists() {
|
||||||
|
hyprctl monitors -j | jq -e --arg name "$1" 'any(.[]; .name == $name)' >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
active_output() {
|
||||||
|
local mode
|
||||||
|
mode=$(selected_mode)
|
||||||
|
case "$mode" in
|
||||||
|
all) echo "" ;;
|
||||||
|
follow) focused_monitor ;;
|
||||||
|
*) echo "$mode" ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
describe_mode() {
|
||||||
|
case "$1" in
|
||||||
|
all) echo "Tablet spans all monitors" ;;
|
||||||
|
follow) echo "Tablet follows focused monitor" ;;
|
||||||
|
*) echo "Tablet locked to $1" ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
select_mode() {
|
||||||
|
local mode="$1"
|
||||||
|
|
||||||
|
case "$mode" in
|
||||||
|
all)
|
||||||
|
write_mode all
|
||||||
|
stop_daemon
|
||||||
|
map_to_output ""
|
||||||
|
;;
|
||||||
|
follow)
|
||||||
|
write_mode follow
|
||||||
|
start_daemon
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if ! monitor_exists "$mode"; then
|
||||||
|
echo "Unknown monitor: $mode" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
write_mode "$mode"
|
||||||
|
start_daemon
|
||||||
|
map_to_output "$mode"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
print_status() {
|
||||||
|
local mode enabled
|
||||||
|
mode=$(selected_mode)
|
||||||
|
if [ "$mode" = "all" ]; then enabled=false; else enabled=true; fi
|
||||||
|
|
||||||
|
jq -nc \
|
||||||
|
--argjson enabled "$enabled" \
|
||||||
|
--arg mode "$mode" \
|
||||||
|
--arg output "$(active_output)" \
|
||||||
|
--arg tooltip "$(describe_mode "$mode")" \
|
||||||
|
'{enabled: $enabled, mode: $mode, output: $output, class: (if $enabled then "enabled" else "disabled" end), tooltip: $tooltip}'
|
||||||
|
}
|
||||||
|
|
||||||
|
print_monitors() {
|
||||||
|
local mode
|
||||||
|
mode=$(selected_mode)
|
||||||
|
hyprctl monitors -j | jq -c --arg mode "$mode" \
|
||||||
|
'[.[] | {name, description, model, focused, selected: (.name == $mode)}]'
|
||||||
|
}
|
||||||
|
|
||||||
|
case "${1:-toggle}" in
|
||||||
|
toggle)
|
||||||
|
if [ "$(selected_mode)" = "all" ]; then select_mode follow; else select_mode all; fi
|
||||||
|
;;
|
||||||
|
on|enable)
|
||||||
|
select_mode follow
|
||||||
|
;;
|
||||||
|
off|disable)
|
||||||
|
select_mode all
|
||||||
|
;;
|
||||||
|
set)
|
||||||
|
[ -n "$2" ] || { echo "Usage: omarchy-toggle-tablet-follow set <monitor|follow|all>" >&2; exit 1; }
|
||||||
|
select_mode "$2"
|
||||||
|
;;
|
||||||
|
status|--status)
|
||||||
|
print_status
|
||||||
|
;;
|
||||||
|
monitors)
|
||||||
|
print_monitors
|
||||||
|
;;
|
||||||
|
autostart)
|
||||||
|
[ "$(selected_mode)" = "all" ] || start_daemon
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: omarchy-toggle-tablet-follow [toggle|on|off|set <monitor|follow|all>|status|monitors|autostart]" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
Reference in New Issue
Block a user