diff options
Diffstat (limited to 'linux/home/.config/bspwm/scripts')
| -rwxr-xr-x | linux/home/.config/bspwm/scripts/bspdragtofloat | 46 | ||||
| -rwxr-xr-x | linux/home/.config/bspwm/scripts/bspswallow | 12 | ||||
| -rwxr-xr-x | linux/home/.config/bspwm/scripts/bspwindows | 14 | ||||
| -rwxr-xr-x | linux/home/.config/bspwm/scripts/bspwm-monitor-setup | 59 | ||||
| -rwxr-xr-x | linux/home/.config/bspwm/scripts/bspwm-toggle-visibility.sh | 23 | ||||
| -rwxr-xr-x | linux/home/.config/bspwm/scripts/close-window | 11 | ||||
| -rwxr-xr-x | linux/home/.config/bspwm/scripts/drag-float | 42 | ||||
| -rwxr-xr-x | linux/home/.config/bspwm/scripts/external_rules.sh | 71 | ||||
| -rwxr-xr-x | linux/home/.config/bspwm/scripts/hide-window | 38 |
9 files changed, 316 insertions, 0 deletions
diff --git a/linux/home/.config/bspwm/scripts/bspdragtofloat b/linux/home/.config/bspwm/scripts/bspdragtofloat new file mode 100755 index 0000000..e2f88a2 --- /dev/null +++ b/linux/home/.config/bspwm/scripts/bspdragtofloat @@ -0,0 +1,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" diff --git a/linux/home/.config/bspwm/scripts/bspswallow b/linux/home/.config/bspwm/scripts/bspswallow new file mode 100755 index 0000000..dea343f --- /dev/null +++ b/linux/home/.config/bspwm/scripts/bspswallow @@ -0,0 +1,12 @@ +#!/bin/bash + +NODE_CURRENT=$(bspc query -N -n focused) +$@ & +PID_COMMAND=$! +WATCH=$(bspc subscribe -c 1 node_add) +NODE_NEW=${WATCH%% *} +bspc node -s $NODE_CURRENT +bspc node $NODE_CURRENT --flag hidden=on +wait $PID_COMMAND +bspc node $NODE_CURRENT --flag hidden=off +bspc node $NODE_CURRENT --focus diff --git a/linux/home/.config/bspwm/scripts/bspwindows b/linux/home/.config/bspwm/scripts/bspwindows new file mode 100755 index 0000000..26deeab --- /dev/null +++ b/linux/home/.config/bspwm/scripts/bspwindows @@ -0,0 +1,14 @@ +#!/bin/sh +# bspwindows +# get targets for drawing borders/whatever on in bspwm + +target="${1:-active}" + +case "$target" in + active) + bspc query -N -n .local.descendant_of.window.leaf.!fullscreen + ;; + inactive) + bspc query -N -n .local.!descendant_of.window.leaf.!fullscreen + ;; +esac diff --git a/linux/home/.config/bspwm/scripts/bspwm-monitor-setup b/linux/home/.config/bspwm/scripts/bspwm-monitor-setup new file mode 100755 index 0000000..6e38bb7 --- /dev/null +++ b/linux/home/.config/bspwm/scripts/bspwm-monitor-setup @@ -0,0 +1,59 @@ +#!/usr/bin/env bash + +INTERNAL_MONITOR="eDP" +EXTERNAL_MONITOR="HDMI-A-0" + +monitor_add() { + # Move first 5 desktops to external monitor + for desktop in $(bspc query -D --names -m "$INTERNAL_MONITOR" | sed 5q); do + bspc desktop "$desktop" --to-monitor "$EXTERNAL_MONITOR" + done + # Remove default desktop created by bspwm + bspc desktop Desktop --remove + # reorder monitors + bspc wm -O "$EXTERNAL_MONITOR" "$INTERNAL_MONITOR" +} + +monitor_remove() { + # Add default temp desktop because a minimum of one desktop is required per monitor + bspc monitor "$EXTERNAL_MONITOR" -a Desktop + + # Move all desktops except the last default desktop to internal monitor + for desktop in $(bspc query -D -m "$EXTERNAL_MONITOR"); do + bspc desktop "$desktop" --to-monitor "$INTERNAL_MONITOR" + done + + # delete default desktops + bspc desktop Desktop --remove + # reorder desktops + bspc monitor "$INTERNAL_MONITOR" -o 1 2 3 4 5 6 7 8 9 10 +} + +if [[ $(xrandr -q | grep "${EXTERNAL_MONITOR} connected") ]]; then + # set xrandr rules for docked setup + xrandr --output "$INTERNAL_MONITOR" --mode 1920x1080 --pos 0x0 --rotate normal --output "$EXTERNAL_MONITOR" --primary --mode 1920x1080 --pos 1920x780 --rotate normal + if [[ $(bspc query -D -m "${EXTERNAL_MONITOR}" | wc -l) -ne 5 ]]; then + monitor_add + fi + bspc wm -O "$EXTERNAL_MONITOR" "$INTERNAL_MONITOR" +else + # set xrandr rules for mobile setup + xrandr --output "$INTERNAL_MONITOR" --primary --mode 1920x1080 --pos 0x0 --rotate normal --output "$EXTERNAL_MONITOR" --off + if [[ $(bspc query -D -m "${INTERNAL_MONITOR}" | wc -l) -ne 10 ]]; then + monitor_remove + fi +fi + +# Set wallpaper +~/.local/bin/setbg.sh & + +# Kill and relaunch polybar +kill -9 $(pgrep -f 'polybar') >/dev/null 2>&1 +polybar-msg cmd quit >/dev/null 2>&1 +while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done +if [[ $(xrandr -q | grep "${EXTERNAL_MONITOR} connected") ]]; then + polybar --reload primary -c ~/.config/polybar/config.ini </dev/null >/var/tmp/polybar-primary.log 2>&1 200>&- & + polybar --reload secondary -c ~/.config/polybar/config.ini </dev/null >/var/tmp/polybar-secondary.log 2>&1 200>&- & +else + polybar --reload primary -c ~/.config/polybar/config.ini </dev/null >/var/tmp/polybar-primary.log 2>&1 200>&- & +fi diff --git a/linux/home/.config/bspwm/scripts/bspwm-toggle-visibility.sh b/linux/home/.config/bspwm/scripts/bspwm-toggle-visibility.sh new file mode 100755 index 0000000..45a4c53 --- /dev/null +++ b/linux/home/.config/bspwm/scripts/bspwm-toggle-visibility.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Created By: srdusr +# Created On: Mon 18 Sep 2023 18:37:21 CAT +# Project: Bspwm script to toggle visibility of initial window and bring focus back to it + +# Get the ID of the currently focused desktop +current_desktop_id=$(bspc query -D -d focused --names) + +# Get the ID of the first hidden window in the current desktop +hidden_window_id=$(bspc query -N -d "$current_desktop_id" -n .hidden | head -n 1) + +# Check if there's a hidden window in the current desktop +if [[ -n "$hidden_window_id" ]]; then + # There's a hidden window, so unhide it + bspc node "$hidden_window_id" -g hidden=off + # Bring focus back to the previously hidden window + bspc node -f "$hidden_window_id" +else + # There's no hidden window in the current desktop, hide the first available window + first_window_id=$(bspc query -N -n focused.window) + bspc node "$first_window_id" -g hidden=on +fi diff --git a/linux/home/.config/bspwm/scripts/close-window b/linux/home/.config/bspwm/scripts/close-window new file mode 100755 index 0000000..8f7f36b --- /dev/null +++ b/linux/home/.config/bspwm/scripts/close-window @@ -0,0 +1,11 @@ +#!/bin/sh +# +# close or kill a bspwm window + +# show wallpaper if last tile +bspc query -N -n .focused.tiled.window &> /dev/null \ + && ! bspc query -N -n .!focused.local.tiled.window &> /dev/null \ + && show-wallpaper -d + +# close focused window +[ "$1" = "kill" ] && bspc node -k || bspc node -c diff --git a/linux/home/.config/bspwm/scripts/drag-float b/linux/home/.config/bspwm/scripts/drag-float new file mode 100755 index 0000000..788e978 --- /dev/null +++ b/linux/home/.config/bspwm/scripts/drag-float @@ -0,0 +1,42 @@ +#!/bin/env bash + +: "${BUTTON:=1}" + +node="$(bspc query -N -n pointed)" + +die() { + jobs -p | xargs -r -n1 -I{} kill {} + exit +} + +trap 'die' USR1 + +{ bspc subscribe node_focus | while read -r _ _ _ wid; do + (( wid != node )) && break; done; kill -USR1 "$$" ;} & +{ while xinput list \ + | sed -nE 's,.*id=([0-9]+).*slave\s+pointer.*,\1,p' \ + | xargs -r -n1 -I{} xinput query-state {} 2> /dev/null \ + | grep -qF "button[${BUTTON}]=down"; do sleep .3; done; kill -USR1 "$$" ;} & + +if bspc node "$node.tiled" -f; then + 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" +elif bspc node "$node.floating" -f; then + : +else + die +fi + +eval "$(xdotool getmouselocation --shell)" +x="$X" y="$Y" +while :; do + eval "$(xdotool getmouselocation --shell)" + (( X != x || Y != y )) && { + bspc node "$node" -v "$((X - x))" "$((Y - y))" + x="$X" y="$Y" + } +done + +wait diff --git a/linux/home/.config/bspwm/scripts/external_rules.sh b/linux/home/.config/bspwm/scripts/external_rules.sh new file mode 100755 index 0000000..7b07ae8 --- /dev/null +++ b/linux/home/.config/bspwm/scripts/external_rules.sh @@ -0,0 +1,71 @@ +#!/bin/env bash +# +# external_rules_command +# +# Absolute path to the command used to retrieve rule consequences. +# The command will receive the following arguments: window ID, class +# name, instance name, and intermediate consequences. The output of +# that command must have the following format: key1=value1 +# key2=value2 ... (the valid key/value pairs are given in the +# description of the rule command). +# +# +# Rule +# General Syntax +# rule COMMANDS +# +# Commands +# -a, --add (<class_name>|*)[:(<instance_name>|*)] [-o|--one-shot] +# [monitor=MONITOR_SEL|desktop=DESKTOP_SEL|node=NODE_SEL] +# [state=STATE] [layer=LAYER] [split_dir=DIR] [split_ratio=RATIO] +# [(hidden|sticky|private|locked|marked|center|follow|manage|focus|border)=(on|off)] +# [rectangle=WxH+X+Y] +# Create a new rule. +# +# -r, --remove +# ^<n>|head|tail|(<class_name>|*)[:(<instance_name>|*)]... +# Remove the given rules. +# +# -l, --list +# List the rules. + +# Programs to specific desktops +wid=$1 +class=$2 +instance=$3 +consequences=$4 + +main() { + case "$class" in + firefox) + if [ "$instance" = "Toolkit" ]; then + echo "state=floating sticky=on" + fi + ;; + Spotify) + echo desktop=^5 follow=on focus=on + ;; + "") + sleep 0.5 + + wm_class=("$(xprop -id "$wid" | grep "WM_CLASS" | grep -Po '"\K[^,"]+')") + + class=${wm_class[-1]} + + [[ ${#wm_class[@]} == "2" ]] && instance=${wm_class[0]} + + [[ -n "$class" ]] && main + ;; + esac +} + +main + +# Allow floating windows over fullscreen +wid="$1" +class="$2" +instance="$3" +eval "$4" + +[[ "$state" = floating ]] && + echo 'layer=above' diff --git a/linux/home/.config/bspwm/scripts/hide-window b/linux/home/.config/bspwm/scripts/hide-window new file mode 100755 index 0000000..c350a0e --- /dev/null +++ b/linux/home/.config/bspwm/scripts/hide-window @@ -0,0 +1,38 @@ +#!/bin/bash + +CMD=${1:-help} +shift + +help() { + echo "Available commands:" + echo " * unhide - select and unhide window" +} + +unhide() { + action=${1:-list} + case $action in + "list") + selection=$(for id in "$(bspc query -N -n .hidden)"; do + title=$(xtitle "$id") + [[ -z "$title" ]] && title="<unnamed>" + echo "$id" "$title" + done | rofi -dmenu -i -p "Hidden windows" | cut -f1 -d' ') + + [[ -z "$selection" ]] && exit 1 + + bspc node "$selection" -g hidden=off + ;; + esac + } + + case $CMD in + "help") + help + ;; + "unhide") + unhide "$1" + ;; + *) + help + ;; + esac |
