Wmctrl examples

From Sy

Jump to: navigation, search

wmctrl > examples

See also

Contents

[edit] Introduction

Since wmctrl 'felt' really cool, I had it on a long list of software to try out.

After a couple of false steps I hit upon a way to get it to work. Then I set about to write some documentation for it, and this was the result. See the main wmctrl topic for more notes.

This is a very visible page - for Google, 'wmctrl' places it around the first page and 'wmctrl examples' places it as the first hit. To honour that, if you write me a note on Talk:wmctrl I will gladly update my wmctrl documentation to help you with a usage problem.

I'd love to expand this into a complete HOWTO, but examples alone ought to suffice for most wmctrl users.

-- Sy

[edit] Show information about the window manager and about the environment.

wmctrl -m

Name: Blackbox
Class: N/A
PID: N/A
Window manager's "showing the desktop" mode: N/A

[edit] List windows managed by the window manager.

wmctrl -l

0x0080006a -1 localhost panel
0x0180007c  0 localhost Sy > Wmctrl examples - Mozilla Firefox
0x02600007  3 localhost user@localhost: /home/user - Shell - Konsole
0x00600011  1 localhost KTorrent
0x02200007  0 localhost user@localhost: /home/user - Shell - Konsole
1           2 3         4

The columns:

  1. The window ID. This is used for the -i switch.
  2. The desktop ID. It begins counting at 0. -1 means that window is on all desktops. Used with -d and more.
  3. The client machine
  4. The name (long title) of the window. Used with -r mostly, and can be renamed with -N and -T.

[edit] List desktops.

List desktops. The current desktop is marked with an asterisk.

wmctrl -d

0  * DG: 1920x1200  VP: 0,0  WA: 0,0 1920x1200
1  - DG: 1920x1200  VP: N/A  WA: 0,0 1920x1200
2  - DG: 1920x1200  VP: N/A  WA: 0,0 1920x1200
3  - DG: 1920x1200  VP: N/A  WA: 0,0 1920x1200
1  2 3              4        5

The columns

  1. the desktop number. It begins counting at 0.
  2. '*' means it's the current desktop
  3. geometry
  4. viewport
  5. workarea
  6. title -- the man page describes this, but it's missing from the command.

[edit] Switch to the specified desktop.

# Create two desktops:
wmctrl -n 1
# Switch to desktop 1
wmctrl -s 1
notes
  • The programmer starts counting at 0. So 1 means the second desktop.
  • Your window manager must be configured to provide multiple desktops for this to mean anything.

[edit] Activate a window

Activate the window by switching to its desktop and raising it.

# Create two desktops:
wmctrl -n 1
# Switch to desktop 1:
wmctrl -s 0
# Move the window to another desktop:
wmctrl -r "KTorrent" -t 1
# Activate the window by switching to its desktop and raising it:
wmctrl -a "KTorrent"
notes
  • With a tray-enabled application like KTorrent, activating it while it's minimized as a tray icon is a Bad Idea and won't display it properly. You'd have to 'restore' it from its tray state - by right-clicking its tray icon and selecting 'restore'.
    • todo - explore a wmctrl-only example.

[edit] Close the window gracefully.

wmctrl -c -r "KTorrent"
notes
  • With a tray-enabled application like KTorrent, closing it will minimize it to the tray. If it's already in the tray, then -c won't do anything. wmctrl doesn't have an alternate close or a 'kill' command for this case.
    • todo request this feature.

[edit] Move the window to the current desktop and activate it.

# Create two desktops:
wmctrl -n 1
# Switch to desktop 1:
wmctrl -s 0
# Move the window to another desktop:
wmctrl -r "KTorrent" -t 1
# Switch to that window's desktop and activate that window:
wmctrl -R "KTorrent"
notes
  • With a tray-enabled application like KTorrent, activating it while it's minimized as a tray icon is a Bad Idea and won't display it properly. You'd have to 'restore' it from its tray state - by right-clicking its tray icon and selecting 'restore'.

[edit] Move the window to the specified desktop.

# Create two desktops:
wmctrl -n 1
# Switch to desktop 1:
wmctrl -s 0
# Move the window to another desktop:
wmctrl -r "KTorrent" -t 1
notes
  • Tray-enabled applications like KTorrent won't go anywhere if they're minimized to the tray.

[edit] Resize and move the window around the desktop.

wmctrl -r "KTorrent" -e 1,0,0,800,600
                        1 2 3 4   5

This example will move the window to the top-left of the screen (0,0) and resize it to 800x600 pixels. The five options are: "gravity,X,Y,width,height":

  1. gravity -- I'm not sure what this
    • 0 means 'default' and the coordinates of 0,0 will move the window too high up.
    • 1 seems to look good for me.
  2. X -- The X coordinates. How far from the left the window will begin. Use -1 to leave this value as-is.
  3. Y -- The Y coordinates. How far from the top the window will begin. Use -1 to leave this value as-is.
  4. width -- The new window width in pixels Use -1 to leave this value as-is.
  5. height -- The new window hight in pixels. Use -1 to leave this value as-is.
notes
  • "gravity,X,Y,width,height" follows the EWMH specification
  • width and height are NOT like using the mouse to resize a window. With KTorrent, some of the elements are 'chopped off' because of the resize. A slight adjustment using the mouse corrects this.
  • Tray-enabled applications like KTorrent won't go anywhere or do anything if they're minimized to the tray.

The EWMH specification describe 'gravity' thusly:

win_gravity:      placed at the reference point

StaticGravity     the left top corner of the client window
NorthWestGravity  the left top corner of the frame window
NorthGravity      the center of the frame window's top side
NorthEastGravity  the right top corner of the frame window
EastGravity       the center of the frame window's right side
SouthEastGravity  the right bottom corner of the frame window
SouthGravity      the center of the frame window's bottom side
SouthWestGravity  the left bottom corner of the frame window
WestGravity       the center of the frame window's left side
CenterGravity     the center of the frame window

But wmctrl doesn't seem to respect these. It expects an integer.

[edit] Change the state of the window.

Change the state of the window. Using this option it's possible for example to make the window maximized, minimized or fullscreen.

The EWMH specification defines a _NET_WM_STATE request. wmctrl supports these properties:

  • modal -- doesn't seem to do anything, but I don't really understand it anyway.
  • sticky -- doesn't work
  • maximized_vert -- works
  • maximized_horz -- works
  • shaded -- works
  • skip_taskbar -- works, but I can't add it back. =/
  • skip_pager -- works
  • hidden -- does not work, and really shouldn't since the 'minimize' action would be responsible for setting this. Except wmctrl doesn't have that. =/
  • fullscreen -- works. Removes the window title and border and forces fullscreen.
  • above -- works
  • below -- works
  • demands_attention -- this is defined in the EWMH specs but was not listed in the wmctrl manual and does not appear to be supported.

Examples:

wmctrl -r "KTorrent" -b add,shaded
wmctrl -r "KTorrent" -b remove,shaded
wmctrl -r "KTorrent" -b toggle,shaded

Multiple commands at once are done like this:

wmctrl -r "KTorrent" -b toggle,shaded,maximized_horz

[edit] Set the long title of the window.

Set the name (long title) of the window.

wmctrl -r "KTorrent" -N "something"
wmctrl -r "something" -N "KTorrent"
notes
  • Changing it back doesn't seem to work.
  • Warning: This influences the use of the -r switch!
  • This is great for testing on an xterm shell if your environment automatically changes the title for you. Then you can just change directories to get things restored nicely.
  • For KTorrent after the first time I use this wmctrl feature I have to minimize it to the tray and restore it to view the change.

Their example shows 'zenity' but I prefer kdialog. In an rxvt-type window, do:

title=`kdialog --title "Change window title" \
  --inputbox "New window title"`; \
  wmctrl -r :SELECT: -T "$title"

todo Actually, I prefer dialog, but I don't want to figure that mess out right now.

complex stuff

It would be nice if I could have regular expressions which could match a title. I can partially understand how it could be done, but I don't want to bother implementing the feature myself. =/ Some nonsense like this:

wmtrl -r `wmtrl -l|grep title|othergrep <first 10 characters>` -N "new title"

Where the othergrep thing matches the 10 characters at the beginning of each line. I don't know how to do that though. Something like (^..........) or (^.{10}) I think.

[edit] Set the short title of the window.

Set the icon name (short title) of the window.

wmctrl -r "KTorrent" -I "string"
notes
  • See -N for more info.
  • I'm not sure what this is supposed to do.

[edit] Set both the long and short title of the window.

wmctrl -r "KTorrent" -T "string"
notes
  • See -N for more info.
  • I can't change the title back. This is the same problem as -N.

[edit] Activate or deactivate the window manager's "showing the desktop" mode.

Activate or deactivate window manager's "showing the desktop" mode. Many window managers do not implement this mode.

wmctrl -k on
wmctrl -k off
notes
  • doesn't work for me.

[edit] Change the viewport for the current desktop.

Change the viewport for the current desktop. The X and Y values are separated with a comma. They define the top left corner of the viewport. The window manager may ignore the request.

wmctrl -o 1024,768
notes
  • This is ignored.

[edit] Change the number of desktops.

Change number of desktops. The window manager may ignore the request.

Learn how many desktops you have:

$ wmctrl -d
0  * DG: 1920x1200  VP: 0,0  WA: 0,0 1920x1200
1  - DG: 1920x1200  VP: N/A  WA: 0,0 1920x1200
2  - DG: 1920x1200  VP: N/A  WA: 0,0 1920x1200
3  - DG: 1920x1200  VP: N/A  WA: 0,0 1920x1200
# Create two desktops:
wmctrl -n 1

Now check again:

$ wmctrl -d
0  * DG: 1920x1200  VP: 0,0  WA: 0,0 1920x1200
1  - DG: 1920x1200  VP: N/A  WA: 0,0 1920x1200
notes
  • This programmer begins counting at 0. So '1' means '2 desktops'
  • Blackbox 0.70.1 and bbkeys 0.9.0 won't really honour this. It'll set it so that -d displays the 'correct' number of desktops, but my hotkeys to change desktops will still work. So it looks like bbkeys doesn't respect wmctrl's setting or Blackbox isn't honouring wmctrl's setting.

[edit] Change the geometry of all desktops.

Change geometry (common size) of all desktops. The window manager may ignore the request.

wmctrl -g 1024,768
notes
  • Blackbox ignores this request.

[edit] Print help.

wmctrl -h

(basically prints the man page)

[edit] Options and misc.

--version

[edit] Interpret <WIN> as a numerical window ID.

The -i option may be used to interpret the argument as a numerical window ID

$wmctrl -l
0x00600056 -1 localhost panel
0x02000143  0 localhost Sy > Editing Wmctrl examples (section) - Mozilla Firefox
0x00400007  0 localhost user@localhost: /home/user - Shell - Konsole
0x00e00011  0 localhost KTorrent
wmctrl -i 0x00e00011 -b toggle,shaded
notes
  • This is an alternate to using -r.
  • Defaults to use a decimal number.
  • If it starts with "0x", then it's assumed to be a hexadecimal number.
  • doesn't seem to work consistantly. Perhaps not all options support it or something crazy is going on. It used to work very well for me.
    • todo follow up one day later.

[edit] Include PIDs in the window list.

Include PIDs in the window list. Very few X applications support this feature.

wmctrl -l -p
0x00600056 -1 4302   localhost panel
0x02000143  0 5964   localhost Sy > Wmctrl examples - Mozilla Firefox
0x00400007  0 8639   localhost user@localhost: /home/user - Shell - Konsole
0x00e00011  0 8706   localhost KTorrent
notes
  • blackbox supports this. =)

[edit] Include geometry in the window list.

wmctrl -l -G
0x00600056 -1 0    1174 1920 26   localhost panel
0x02000143  0 649  25   1285 1147 localhost Sy > Wmctrl examples - Mozilla Firefox
0x00400007  0 43   59   1092 481  localhost user@localhost: /home/user - Shell - Konsole
0x00e00011  0 51   653  904  509  localhost KTorrent

[edit] Include WM_CLASS in the window list or interpret <WIN> as the WM_CLASS name.

wmctrl -l -x
0x00600056 -1 panel.fbpanel         localhost panel
0x02000143  0 Gecko.Mozilla-firefox-bin  localhost Sy > Wmctrl examples - Mozilla Firefox
0x00400007  0 Qt-subapplication.    localhost user@localhost: /home/user - Shell - Konsole
0x00e00011  0 ktorrent.Ktorrent     localhost KTorrent
notes
  • todo - describe interpreting <WIN> as the WM_CLASS name. Useful for: -a, -c, -R and -r.

[edit] Override auto-detection and force UTF-8 mode.

wmctrl -u (other switches)

[edit] Match the full window title and be case-sensitive

Modifies the behavior of the window title matching algorithm. It will match only the full window title instead of a substring, when this option is used. Furthermore it makes the matching case sensitive.

wmctrl -F (other switches)

[edit] Be verbose.

Be verbose. Useful for debugging.

wmctrl -l
0x00600056 -1 localhost panel
0x02000143  0 localhost Sy > Wmctrl examples - Mozilla Firefox
0x00400007  0 localhost user@localhost: /home/user - Shell - Konsole
0x00e00011  0 localhost KTorrent
wmctrl -l -v
envir_utf8: 1
0x00600056 -1 localhost panel
0x02000143  0 localhost Sy > Wmctrl examples - Mozilla Firefox
Invalid type of WM_NAME property.
0x00400007  0 localhost user@localhost: /home/user - Shell - Konsole
Invalid type of WM_NAME property.
0x00e00011  0 localhost KTorrent

[edit] Use a workaround.

Use a workaround. The option may appear multiple times

wmctrl -w DESKTOP_TITLES_INVALID_UTF8 (other switches)
list of options as of 1.07
  • DESKTOP_TITLES_INVALID_UTF8 -- Print non-ASCII desktop titles correctly when using Window Maker.

[edit] -r

wmctrl -r is used to specify the window name (long title) to act on. It is used for a number of features:

notes;
  • It's interpreted as a string.
  • It's matched against the window name (long title)
  • Only the first matching window is used.
  • The matching isn't case sensitive
  • The string may appear in any position of the title.
  • If you don't want to use the name of the window, then try the -i switch.

[edit] acting on a mouse-selected window

Select the window by clicking on it.

wmctrl -b toggle,shaded -r :SELECT:

[edit] acting on the current window

Use the currently active window for the action.

wmctrl -b toggle,shaded -r :ACTIVE:

[edit] real-world examples

[edit] force window dimensions when launching an app

A bbkeys hotkey can be set up to use xtoolwait and wmctrl to force a specific size. If a second occurrence is launched, I can relocate that one and resize it.

[Execute] (Mod1-Control-F) {xtoolwait sfm & wmpid=$! && wait $wmpid && wmctrl -F -r "sfm #1" -e 1,0,0,800,1148 && wmctrl -F -r "sfm #0" -e 1,800,0,800,1148}

It's not hard to have this as a simple script like this:

xtoolwait sfm & wmpid=$!
wait $wmpid
wmctrl -F -r "sfm #1" -e 1,0,0,800,1148

I'd bet that anyone decent with bash could whip up something that's nice and reusable too.





















































Personal tools
Navigation
About This Place
communicate