#!/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