70

The linux commandline tool wmctrl allows you to list all windows, or all desktops, among other things. In the desktop-listing mode, the current desktop is marked with an asterisk.

I need a tool that can figure out the currently active window's title. Unfortunately, wmctrl doesn't have a helper that does this - despite it knowing which window is currently active (see :ACTIVE: marker).

Is there another commandline tool that can give me the window id and/or window title of the current window?

6 Answers 6

76

Install xdotool, then run

xdotool getwindowfocus getwindowname

It will give e.g. for the current webpage opened in Firefox :

linux - Detecting currently active window - Super User - Mozilla Firefox
3
  • Powerful tool! Apart from getting current active window, it also has lots of other useful functionalities.
    – Searene
    Oct 10, 2014 at 1:25
  • Compared to Jim Paris's answer, this has the disadvantage of a dependency to install, but it seems to run faster, particularly if xdotool is already in the disk cache.
    – mc0e
    Jan 8, 2015 at 7:52
  • 1
    If you want to manipulate the current window with wmctrl, you could do: wmctrl -i -r `xdotool getwindowfocus` -e 0,10,10,-1,-1, where -i tells wmctrl to expect the window id rather than the window title.
    – fiedl
    Jan 21, 2015 at 1:29
44

This is more direct and only uses xprop and cut:

xprop -id $(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2) _NET_WM_NAME

These commands are just an extraction of properties from the root window and the application window, but per Lorenzo von Matterhorn's request:

  • First,

    xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW
    

    Extracts the _NET_ACTIVE_WINDOW property from the root, which gives you the XID of the active window. The 32x '\t$0' tells xprop to format the output in a way that cut can easily parse later.

  • Then, extract just the XID from the output with cut -f 2

  • Then, pass the XID in as a parameter to

    xprop -id XID _NET_WM_NAME
    

Which prints the name of that window.

1
  • 1
    hi there, can you please explain the arguments and a bit of the syntax? it may be helpful for the QA and future readers. Jan 12, 2013 at 21:34
11

There is, but no short answer or solution.

$ wmctrl -lp | grep $(xprop -root | grep _NET_ACTIVE_WINDOW | head -1 | \
    awk '{print $5}' | sed 's/,//' | sed 's/^0x/0x0/')

result:

0x03800004  0 16459  xxxxxxxxxx /bin/bash

In use:

$ for x in $(seq 1 10); do sleep 5; wmctrl -lp | grep $(xprop -root | \
    grep _NET_ACTIVE_WINDOW | head -1 | awk '{print $5}' | sed 's/,//' | \
    sed 's/^0x/0x0/'); done

0x03800004  0 16459  xxxxxxxxxx /bin/bash
0x020000a4  0 13524  xxxxxxxxxx linux - Detecting currently active window - Super User - Mozilla Firefox (Build 20120129142219)
2
  • 1
    This looks like a good solution, didn't know about the xprop utility. In the meantime, I've patched wmctrl to provide such an option and sent it to the author. Unfortunately, I didn't get a response yet.
    – Dave Vogt
    Feb 22, 2012 at 9:15
  • 1
    +1 for effectiveness and "simplicity" on the code Jan 12, 2013 at 21:51
5

This is what worked for me:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME

Gives:

WM_NAME(STRING) = "~"

So maybe you'd do a little sed ugliness to get the name all by itself:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | sed -e 's/.*"\(.*\)".*/\1/'

Gives:

~

Which is my currently focussed window name, all by itself.

Or, avoid sed with the slightly less ugly:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | awk -F '"' '{print $2}'

1
  • 1
    Or since cut has laready been introduced, you could use that again: xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | cut -d '"' -f 2
    – mc0e
    Jan 8, 2015 at 7:50
5

Relatively short, and handles window names containing quotes correctly:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | 
sed -nr 's/.*= "(.*)"$/\1/p'
2

Why not just use wmctrl to name your active window? This will provide the additional benefit of avoiding confusing situations where windows have duplicate names.

Just name the active window using:

wmctrl -r ':ACTIVE:' -N "your_unique_window_name"

And access it by the unique window name you've assigned it above.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .