Ask Ubuntu is a question and answer site for Ubuntu users and developers. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I rely on wmctrl a lot to switch between windows, basically to avoid typing alt-tab many times. I've always used one workspace but now I want to begin using more than one.

I was wondering if it is possible to modify the context of wmctrl so that when I type wmctrl -l, only windows from the current workspace are shown, instead of all windows from all workspaces.

For example, assuming I have a Firefox window opened in workspace 1. I have a keyboard shortcut on ctrl+alt+f that executes wmctrl -a firefox, which switches to Firefox. If I open a new Firefox window on workspace 2 and type ctrl+alt+f, it will switch to the window at workspace 1, which is not what I want.

Any suggestions/ideas on how to solve this?

EDIT: I'm using compiz (Unity)

share|improve this question
up vote 4 down vote accepted

If you're using Compiz (run wmctrl -m if not sure), wmctrl only sees 1 desktop (2nd field of wmctrl -l, ie 0) but you can use the geometry (-G) option to know what window is on what virtual desktop. All windows in your current desktop will have an x-position between 0 and your screen's width. Same for the y-position between 0 and your screen's height. So you can use something like that


SCREEN_W=$(xwininfo -root | sed -n 's/^  Width: \(.*\)$/\1/p')
SCREEN_H=$(xwininfo -root | sed -n 's/^  Height: \(.*\)$/\1/p')


wmctrl -xlG | awk -v W="$SCREEN_W" -v H="$SCREEN_H" -v NAME="$NAME" '$7==NAME && $3>=0 && $3<W && $4>=0 && $4<H {print $1}' | while read WINS; do wmctrl -ia "$WINS"; done

exit 0

You can hardcode your screen's width and height if you will, and NAME if you want a one-liner. Im not sure how you want to handle multiple windows matching NAME. That will focus them all.

For metacity, desktop number of windows can be found using wmctrl -l and grepping the 2nd field.

share|improve this answer
The only issue is that, besides my laptop's screen (14"), I use a monitor at the lab and another at home, the three of them having distinct resolutions, so the x-position varies depending on which display I'm using. I guess I could define ranges, mmm. Will try it. I wonder if there are alternatives to make wmctlr know the desktop number on compiz – ivotron Oct 1 '12 at 20:06
That's what the 2 first lines are for. They get your screen resolution (SCREEN_W: width and SCREEN_H: height) and pass them in awk.. You can either use the code abore for all 3 or use 3 different commands for each of them, ae (1440x900): wmctrl -xlG | awk '$7=="Navigator.Firefox" && $3>=0 && $3<1440 && $4>=0 && $4<900 {print $1}' | while read WIN; do wmctrl -ia "$WIN"; done – user55822 Oct 1 '12 at 20:27
i see, cool! that solves my issue then. Thanks! Will work on it and comment back on how it went – ivotron Oct 1 '12 at 22:34

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.