148 lines
3.6 KiB
Bash
Executable File
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
|
|
|