Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

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?

share|improve this question

4 Answers 4

up vote 10 down vote accepted

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
share|improve this answer

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.

share|improve this answer
    
hi there, can you please explain the arguments and a bit of the syntax? it may be helpful for the QA and future readers. –  Lorenzo Von Matterhorn Jan 12 '13 at 21:34

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)
share|improve this answer
    
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 '12 at 9:15
1  
+1 for effectiveness and "simplicity" on the code –  Lorenzo Von Matterhorn Jan 12 '13 at 21:51

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}'

share|improve this answer

Your Answer

 
discard

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.