2025-08-21 22:43:09 +10:00

148 lines
3.6 KiB
Bash
Executable File

#!/usr/bin/env bash
wm_list() {
dbus-send --session \
--dest=org.gnome.Shell \
--print-reply=literal \
/org/gnome/Shell/Extensions/Windows \
org.gnome.Shell.Extensions.Windows.List | jq
}
wm_details() {
local win="$1"
dbus-send --session \
--dest=org.gnome.Shell \
--print-reply=literal \
/org/gnome/Shell/Extensions/Windows \
org.gnome.Shell.Extensions.Windows.Details uint32:$win | jq
}
wm_title() {
local win="$1"
dbus-send --session \
--dest=org.gnome.Shell \
--print-reply=literal \
/org/gnome/Shell/Extensions/Windows \
org.gnome.Shell.Extensions.Windows.GetTitle uint32:$win | jq
}
wm_frame() {
local win="$1"
dbus-send --session \
--dest=org.gnome.Shell \
--print-reply=literal \
/org/gnome/Shell/Extensions/Windows \
org.gnome.Shell.Extensions.Windows.GetFrameBounds uint32:$win | jq
}
wm_resize() {
local win=$1
local x=$2
local y=$3
local width=$4
local height=$5
dbus-send --session \
--dest=org.gnome.Shell \
--print-reply=literal \
/org/gnome/Shell/Extensions/Windows \
org.gnome.Shell.Extensions.Windows.MoveResize \
uint32:$win \
int32:$x \
int32:$y \
uint32:$width \
uint32:$height
}
wm_focused() {
for win in $(wmctrl list | jq '.[] | .id'); do \
wmctrl details $win; \
done \
| jq '.|select(.focus)'
}
wm_current() {
dbus-send --session \
--dest=org.gnome.Shell \
--print-reply=literal \
/org/gnome/Shell/Extensions/Windows \
org.gnome.Shell.Extensions.Windows.List \
| jq -r '.[] | .wm_class' | tail -n 1
}
wm_windows() {
local target="${1}"
dbus-send --session \
--dest=org.gnome.Shell \
--print-reply=literal \
/org/gnome/Shell/Extensions/Windows \
org.gnome.Shell.Extensions.Windows.List \
| jq '.[] | select(.wm_class=="'${target}'") | .id'
}
wm_request() {
local request="${1}"
local exec="${2}"
local strategy=(tail -n 1)
local choices="$(printf '"%s",' $request | sed 's|.$||')"
local filter=(jq '.[] | select(.wm_class as $in | ['$choices'] | index($in)) | .id')
local existing=$(dbus-send --session \
--dest=org.gnome.Shell \
--print-reply=literal \
/org/gnome/Shell/Extensions/Windows \
org.gnome.Shell.Extensions.Windows.List \
| "${filter[@]}" \
| "${strategy[@]}")
[ "$existing" == "" ] && $exec || wm_activate $request
}
wm_activate() {
local target="${1}"
case "$@" in
*${target}*)
local strategy=(head -n 1)
;;
*)
local strategy=(tail -n 1)
;;
esac
local choices="$(printf '"%s",' $@ | sed 's|.$||')"
local filter=(jq '.[] | select(.wm_class as $in | ['$choices'] | index($in)) | .id')
gdbus call --session \
--dest org.gnome.Shell \
--object-path /org/gnome/Shell/Extensions/Windows \
--method org.gnome.Shell.Extensions.Windows.Activate \
$(dbus-send --session \
--dest=org.gnome.Shell \
--print-reply=literal \
/org/gnome/Shell/Extensions/Windows \
org.gnome.Shell.Extensions.Windows.List \
| "${filter[@]}" \
| "${strategy[@]}")
}
case ${1} in
activate)
shift
wm_activate $@
;;
request)
shift
wm_request $@
;;
*)
fn="wm_$1"
shift
eval "$fn" $@
;;
esac