aboutsummaryrefslogtreecommitdiff
path: root/.config/bspwm/scripts/bspdragtofloat
blob: e2f88a2341926f49e277327bf7fceee8426d9d8e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/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"