Someone asked on the Ubuntu users mailing list how they could set up a keypress that would resize the currently active window to 75% of its present width. It took a little thought, but eventually the tools were found…
The tools we need are wmctrl
and xdotool
. Depending on how you like to do maths in scripts, you may need to install the appropriate calculator; I used calc
:
sudo apt-get install xdotool wmctrl calc
You will also need the Compiz configuration settings manager:
sudo apt-get install compizconfig-settings-manager
First you need to be able to identify the window to operate on. You can do this via its title, but using its unique window ID number is better. The window ID is usually shorter and it is unique across all windows even if several windows have the exact same title.
This command will retrieve the window ID of the currently active window (i.e. the window that has the focus) and put it into a variable called WIN
:
WIN=$(xdotool getactivewindow)
We can also use xdotool
to retrieve a window’s geometry. By default, the results are displayed for human consumption:
kauer@kt:~$ xdotool getwindowgeometry $WIN Window 102763394 Position: 1028,526 (screen: 0) Geometry: 826x554
If we include the “--shell
” option, the results are helpfully returned in a form suitable for evaluating in a shell:
kauer@kt:~$ xdotool getwindowgeometry --shell $WIN WINDOW=102763394 X=1028 Y=526 WIDTH=826 HEIGHT=554 SCREEN=0
The following command will result in shell variables WINDOW, X, Y, WIDTH, HEIGHT and SCREEN:
eval $(xdotool getwindowgeometry --shell $WIN)
Now we need to figure out a width that is 75% of the current width. I’ve used calc
:
WIDTH=$(calc "int($WIDTH*0.75)")
The next bit is needed because setting the window dimensions is ignored when a window is being displayed maximised. This command un-maximises our chosen window:
wmctrl -i -r $WIN -b remove,maximized_vert,maximized_horz
Thanks to Ralf Mardorf for that trick 🙂
Now we can finally set the new window width that we calculated above. The five parameters to the -e
option are gravity, x position, y position, width and height. Gravity is usually left at zero, meaning “default”. For the other four, passing a value of “-1” means “leave this value unchanged”. Notice how we use WIN
again to specify the window; we could also use WINDOW
:
wmctrl -i -r $WIN -e "0,-1,-1,$WIDTH,-1"
Putting it all together, we get a script (let’s call it “test.sh
“):
#!/bin/bash WIN=$(xdotool getactivewindow) eval $(xdotool getwindowgeometry --shell $WIN) WIDTH=$(calc "int($WIDTH*0.75)") wmctrl -i -r $WIN -b remove,maximized_vert,maximized_horz wmctrl -i -r $WIN -e "0,-1,-1,$WIDTH,-1"
We now need to bind this script to a key combination. We can’t just run this script in a terminal window, because it would just resize the terminal window! We need it to run on whatever window we have currently selected, and for that we need to bind the script to a key combination that we can press in any window.
To do this we use the “Commands” module in Compiz. Start the Compiz configuration settings manager, then:
- Click on “General” in the left hand pane
- Check the box beside the “Commands” module if it is not already checked
- Click the “Commands” button to open the “Commands” module
- In the Commands module, click on the “Commands” tab and enter the full path and name of the new script into one of the command files – for example “Command line 0”.
- Click on the “Key Bindings” tab, and click the “Disabled” button for the command line you chose. You will be prompted to enable the command by checking an “Enable” checkbox.
- Checking the “Enable” checkbox will cause the dialogue to prompt you for a key combination. The simplest way to choose a key combination is to click on the button labelled “Grab key combination”, press the key combination you want, then click OK.
- Finally close the Compiz settings manager.
If you now select any open window, then press your chosen key combination, the window will shrink horizontally to 75% of the its previous size.
I highly recommend reading the wmctrl
and xdotool
man pages thoroughly – you will get lots of interesting ideas!