From 5ddf6c3927e4800e7b755cc320d401a8a8fc6a2a Mon Sep 17 00:00:00 2001 From: Michael Housh Date: Tue, 7 Oct 2025 17:05:46 -0400 Subject: [PATCH] feat: Adds subcommand toggle-floating to windowctl. --- .../hypr/utils/windows/window-toggle-floating | 95 +++++++++++++------ env/.local/scripts/hypr/windowctl | 8 ++ 2 files changed, 75 insertions(+), 28 deletions(-) diff --git a/env/.local/scripts/hypr/utils/windows/window-toggle-floating b/env/.local/scripts/hypr/utils/windows/window-toggle-floating index fd5c254..6bfccfe 100755 --- a/env/.local/scripts/hypr/utils/windows/window-toggle-floating +++ b/env/.local/scripts/hypr/utils/windows/window-toggle-floating @@ -10,65 +10,104 @@ LOG_LABEL=$(basename "$THIS_FILE") THIS=${THIS:-$LOG_LABEL} LOG_FILE=${LOG_FILE:-"/tmp/$LOG_LABEL.log"} +address="" +width="" +height="" + usage() { cat <
FLAGS: - -a | --active: Toggle floating on the currently active window. - -w | --width : Set a width of the floating window. - -h | --height : Set a height of the floating window. + -a | --active: Toggles floating of the active window. + -w | --width : Set a width of the floating window, can be pixels or percent (ex. 80%). + -h | --height : Set a height of the floating window, can be pixels or percent (ex. 80%). --help: Show this help page. EOF } +log() { + logging log --source "$THIS_FILE" "$@" +} + # Suppress output of hyprctl hypr_dispatch() { hyprctl dispatch "$@" >/dev/null 2>&1 && return $? } toggle_floating() { - local address="$1" - hypr_dispatch togglefloating + hypr_dispatch togglefloating "address:$address" +} + +resize_window() { + if [[ -n $width ]] && [[ -n $height ]]; then + log "Resizing window: width: $width, height: $height" + hypr_dispatch resizewindowpixel exact "$width $height,address:$address" + fi + echo "$address" + } center_window() { local address="" read -r address - hypr_dispatch centerwindow - echo "$address" + local activeaddress=$(hyprctl activewindow -j | jq -r '.address') + if [[ $address == $activeaddress ]]; then + log "Centering window..." + hypr_dispatch centerwindow + fi } -# Float's a window, setting it's height and width and centering. +################################################################################ +# MAIN +################################################################################ -# The percentage of the screen size for the floating window. -WIDTH_PERCENT=80 -HEIGHT_PERCENT=40 +# Setup logging +source "$SCRIPTS/hypr/logging" +setup-logging "$LOG_FILE" "$LOG_LABEL" -floating=$(hyprctl activewindow -j | jq '.floating') +while [[ $# -gt 0 ]]; do + if [[ $1 == "--help" ]]; then + usage && exit 0 + elif [[ $1 == "-w" ]] || [[ $1 == "--width" ]]; then + shift + width=$1 + elif [[ $1 == "-h" ]] || [[ $1 == "--height" ]]; then + shift + height=$1 + elif [[ $1 == "-a" ]] || [[ $1 == "--active" ]]; then + address=$(hyprctl activewindow -j | jq -r '.address') + else + address=$1 + fi + shift +done -if [ "$floating" = "true" ]; then - hyprctl dispatch togglefloating -else - monitor=$(hyprctl monitors -j | jq '.[] | select(.focused == true)') - mw=$(echo "$monitor" | jq '.width') - mh=$(echo "$monitor" | jq '.height') - ms=$(echo "$monitor" | jq '.scale') - - echo "scale: $ms" - - neww=$(echo "scale=6; (($mw / $ms) * $WIDTH_PERCENT / 100)" | bc) - newh=$(echo "scale=6; (($mh / $ms) * $HEIGHT_PERCENT / 100)" | bc) - - hyprctl dispatch togglefloating && - hyprctl dispatch resizeactive exact $neww $newh && - hyprctl dispatch centerwindow +if [[ -z $address ]]; then + read -p "Window address: " address +fi + +if [[ -z $address ]]; then + log --error "No address was supplied" && exit 1 +fi + +log "Begin toggling floating for: '$address'" + +floating=$(hyprctl clients -j | jq ".[] | select(.address == \"$address\") | .floating") +log "Is currently floating: $floating" + +toggle_floating + +if [ ! "$floating" == "true" ]; then + resize_window | center_window fi diff --git a/env/.local/scripts/hypr/windowctl b/env/.local/scripts/hypr/windowctl index 3c72137..2375310 100755 --- a/env/.local/scripts/hypr/windowctl +++ b/env/.local/scripts/hypr/windowctl @@ -27,6 +27,7 @@ COMMANDS: focus: Focuses a window, handling special workspaces properly. launch: Launches an interactive picker in a new terminal. picker: Window picker that prompts for an action to perform on the window. + toggle-floating: Toggles floating property of a window. Run "$THIS --help" for more information on a command. @@ -99,6 +100,10 @@ while [[ $# -gt 0 ]]; do shift show_picker "$@" exit $? + elif [[ $1 == "toggle-floating" ]]; then + shift + THIS="$THIS toggle-floating" "$SCRIPTS/hypr/utils/windows/window-toggle-floating" "$@" + exit $? elif [[ $1 == "-h" ]] || [[ $1 == "--help" ]]; then usage && exit 0 else @@ -107,3 +112,6 @@ while [[ $# -gt 0 ]]; do fi shift done + +# If we've reached here then no commands were passed / handled. +usage && exit 1