#!/bin/env bash

: "${BSPWM_DIR:="${XDG_CONFIG_HOME:-$HOME/.config}/bspwm"}"

status_file="$BSPWM_DIR/tmp/drag_to_float"

[[ "$1" = stop ]] && {
    [[ -e "$status_file" ]] \
        && rm -r -- "$status_file"
    exit
}

[[ -e "$status_file" ]] \
    && exit

< <(bspc query -T -n pointed.window | jq -r '"\(.id) \(.client.state)"') read -r node node_state

[[ -z "$node" ]] \
    && exit

case "$node_state" in
    floating)
        ;;
    tiled|pseudo_tiled)
        node_tiled_rect=($(bspc query -T -n "$node" | jq -r '.client.tiledRectangle[]'))
        bspc node "$node" -t floating
        xdo move   -x "${node_tiled_rect[0]}" -y "${node_tiled_rect[1]}" "$node"
        xdo resize -w "${node_tiled_rect[2]}" -h "${node_tiled_rect[3]}" "$node" ;;
    *) # fullscreen
        exit ;;
esac

eval "$(xdotool getmouselocation --shell)"
x="$X" y="$Y"
touch -- "$status_file"
while [[ -e "$status_file" ]]; do
    eval "$(xdotool getmouselocation --shell)"
    (( X != x || Y != y )) && {
        bspc node "$node" -v "$((X - x))" "$((Y - y))"
        x="$X" y="$Y"
    }
    sleep .01
done

[[ -e "$status_file" ]] \
    && rm -r -- "$status_file"
