I would like to get the size of the current window from a shell script...
Really not much else to say... I would prefer to use wmctrl.
I would like to get the size of the current window from a shell script...
Really not much else to say... I would prefer to use wmctrl.
wmctrl -lG
Will give you something like:
oli@bert:~$ wmctrl -lG
0x0384c0d5 -1 1590 1030 330 170 bert N/A
0x01200023 -1 0 0 3840 1200 bert x-nautilus-desktop
0x01000003 -1 3840 2352 1920 24 bert Bottom Expanded Edge Panel
0x01000028 -1 0 2352 1920 24 bert Bottom Expanded Edge Panel
0x0500003e 0 676 252 1404 1015 bert Chromium
0x02e00021 0 3860 160 1361 1084 bert Liferea
0x02000047 0 6650 940 506 683 bert Social broadcast messages
0x04600004 0 4546 460 1263 833 bert oli@bert: ~
With this you can grep and cut down on these so you are left with the geometry values (columns 3-6).
To quote the man page so you understand exactly what the columns are:
-l
List the windows being managed by the window manager. One line is output for each window, with the line broken up into space separated columns. The first column always contains the window identity as a hexadecimal integer, and the second column always contains the desktop number (a -1 is used to identify a sticky window). If the -p option is specified the next column will contain the PID for the window as a decimal integer. If the -G option is specified then four integer columns will follow: x-offset, y-offset, width and height. The next column always contains the client machine name. The remainder of the line contains the window title (possibly with multiple spaces in the title).
Use xprop or xwininfo. Both come by default, no install necessary
Both commands turn cursor into square/cross to allow selecting a particular window.
$ xprop _NET_WM_OPAQUE_REGION
_NET_WM_OPAQUE_REGION(CARDINAL) = 0, 0, 984, 377
$ xwininfo | awk -F ':' '/Width/ || /Height/{print $2}'
984
377
Alternatively, one can specify window on command line in XID form
$ xprop _NET_WM_OPAQUE_REGION -id 83886090
_NET_WM_OPAQUE_REGION(CARDINAL) = 0, 0, 984, 377
$ xwininfo -id 83886090 | awk -F ':' '/Width/ || /Height/{print $2}'
984
377
In particular, xwininfo, has been actively used by me for scrips , such as on these AskUbuntu questions:
I belive wmctrl does not have any option for finding the active window Id directly.
If someone knows how to do it, I'm interested to know..
That said, here are a couple of scripts which print out the active window's size.
This is: wmctrl + xdotool ...(not using sed).
id=$(xdotool getactivewindow)
wmctrl -lpG | while read -a a; do w=${a[0]}; if (($((16#${w:2}))==id)) ; then echo -n "${a[5]} ${a[6]}"; break; fi; done
This is: xwininfo + xdotool + sed
xwininfo is part of x11-utils
set $(xwininfo -id $(xdotool getactivewindow) \
|sed -n -e "s/^ \+Width: \([0-9]\+\).*/\1/p" \
-e "s/^ \+Height: \([0-9]\+\).*/\1/p")
echo -n "$1 $2"
Got 3 screens, this output 3 lines with the dimensions:
xrandr | grep '*' | cut -d'*' -f1 | cut -d ' ' -f4
/* OUTPUT *
* 3840x2160
* 1920x1080
* 1920x1080
***********/
It is surprisingly easy to do this with xdotool, far more easier than already mentioned solutions (see the last snippet.)
The main command to run is xdotool getactivewindow getwindowgeometry:
user@host:~$ xdotool getactivewindow getwindowgeometry
Window 10485768
Position: 751,289 (screen: 0)
Geometry: 426x501
If this output is not simple enough for parsing with grep and cut, use --shell with them same command and you'll have:
user@host:~$ xdotool getactivewindow getwindowgeometry --shell
WINDOW=44040200
X=751
Y=289
WIDTH=426
HEIGHT=501
SCREEN=0
You can pass this output to eval and have the variables set and ready for use.
So, inside a scrip file:
# If you do this:
eval "$(xdotool getactivewindow getwindowgeometry --shell)";
Then you can do these:
echo $WIDTH; # 426
echo $HEIGHT; # 501
There's another example in xdotool's manual.
Shell scripts do not know or care about windows. At best they run in a terminal ( which may or may not be displayed in a window ). If you want to get the width and height of the terminal in characters, use the stty utility.