Skip to content

Instantly share code, notes, and snippets.

@crispyricepc
Last active April 20, 2024 11:47
Show Gist options
  • Star 16 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save crispyricepc/f313386043395ff06570e02af2d9a8e0 to your computer and use it in GitHub Desktop.
Save crispyricepc/f313386043395ff06570e02af2d9a8e0 to your computer and use it in GitHub Desktop.
wlprop - An xprop clone for wlroots based compositors

Dependencies

Make sure you have installed the following commands:

  • swaymsg
  • jq
  • slurp
  • awk

Installation

curl -L https://gist.github.com/crispyricepc/f313386043395ff06570e02af2d9a8e0/raw/8b06f025a0f34685f5ffc2000fd19a64754c9b29/wlprop.sh > ~/.local/bin/wlprop
chmod +x ~/.local/bin/wlprop

Usage

Type wlprop in a terminal, then click the window you'd like to get the properties of.

Since all wlprop outputs is JSON, you can filter the values you need using jq:

# Get just the name of the window
wlprop | jq -r '.name'
# Get the app_id value (useful for `for_window` configs in sway)
wlprop | jq -r '.app_id'
#!/usr/bin/env sh
# wlprop
#
# Licensed under the MIT license
# Copyright © 2022 bjosephmitchell@gmail.com
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the “Software”), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# Dependencies:
# - swaymsg
# - jq
# - slurp
# - awk
# Get the sway tree and store the output
SWAY_TREE=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?)')
# Invoke slurp to let the user select a window
SELECTION=$(echo $SWAY_TREE | jq -r '.rect | "\(.x),\(.y) \(.width)x\(.height)"' | slurp)
# Extract the X, Y, Width, and Height from the selection
X=$(echo $SELECTION | awk -F'[, x]' '{print $1}')
Y=$(echo $SELECTION | awk -F'[, x]' '{print $2}')
W=$(echo $SELECTION | awk -F'[, x]' '{print $3}')
H=$(echo $SELECTION | awk -F'[, x]' '{print $4}')
# Find the window matching the selection
echo $SWAY_TREE | jq -r --argjson x $X --argjson y $Y --argjson w $W --argjson h $H \
'. | select(.rect.x == $x and .rect.y == $y and .rect.width == $w and .rect.height == $h)'
@NiciTheNici
Copy link

I put this script on the AUR :)

https://aur.archlinux.org/packages/wlprop

@crispyricepc
Copy link
Author

I put this script on the AUR :)

https://aur.archlinux.org/packages/wlprop

Legend. Didn't even know that gists had git URLs but here we are. I'll ping you if I ever move this into a proper repo

@SebTM
Copy link

SebTM commented Nov 25, 2022

Packaged for NixOS - see PR here: NixOS/nixpkgs#202931

@magicmonty
Copy link

magicmonty commented May 5, 2023

you could do the same in hyprland with the following script:

#!/usr/bin/env sh

TREE=$(hyprctl clients -j | jq -r '.[] | select(.hidden==false and .mapped==true)')
SELECTION=$(echo $TREE | jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' | slurp)

X=$(echo $SELECTION | awk -F'[, x]' '{print $1}')
Y=$(echo $SELECTION | awk -F'[, x]' '{print $2}')
W=$(echo $SELECTION | awk -F'[, x]' '{print $3}')
H=$(echo $SELECTION | awk -F'[, x]' '{print $4}')

echo $TREE | jq -r --argjson x $X --argjson y $Y --argjson w $W --argsjon h $H '. | select(.at[0]==$x and .at[1]==$y and .size[0]==$w and.size[1]==$h)'

@SirWrexes
Copy link

@magicmonty Excellent, just what I needed! Thank you very much.
However, there's a small typo at L11:67: you pass --argsjon instead of --argjson. 😉

@ItsTerm1n4l
Copy link

So this would only work with the sway compositor then?

@SirWrexes
Copy link

SirWrexes commented Nov 7, 2023

So this would only work with the sway compositor then?

Check out this reply above that works for Hyprland if that's what you're looking for.

@ItsTerm1n4l
Copy link

No, sorry, I should have been more specific, I was wondering if I could use it with wayfire, but neither of the scripts mentioned above could do that as the use swaymsg and hyperctl. Thank you.
I love your profile description btw.

@iguanajuice
Copy link

Consider changing slurp to slurp -r. That way, it'll still work in case you accidentally drag the cursor while clicking a window.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment