Wie zählt man die Anzahl der geöffneten aktiven Fenster abgesehen von denen des Fenstermanagers?

Wie zählt man die Anzahl der geöffneten aktiven Fenster abgesehen von denen des Fenstermanagers?

Ich möchte die Anzahl der aktiven Fenster zählen, die außer dem von mir verwendeten Fenstermanager geöffnet sind. Ich bin mir bewusst, dasswmctrlDies gelingt mir jedoch, wenn ich Folgendes mache:

wmctrl -l

Auf meinem Ubuntu 14.04 64-Bit-Desktop mit Unity als Fenstermanager erhalte ich folgende Ausgabe:

0x03c00002  0 stepup XdndCollectionWindowImp
0x03c00005  0 stepup unity-launcher
0x03c00008  0 stepup unity-panel
0x03c0000b  0 stepup unity-dash
0x03c0000c  0 stepup Hud
0x02c0000a  0 stepup Desktop
0x02e000b3  0 stepup How to count the number of active windows open irrespective of window manager? - Unix & Linux Stack Exchange - Mozilla Firefox
0x0340000c  0 stepup Terminal

Ich möchte jedoch die von Unity/Gnome/KDE usw. verwendeten Fenster ignorieren und nur die Fenster zählen, die der Benutzer selbst geöffnet hat. Wie mache ich das?

Antwort1

Es gibt keine formale Definition eines Fensters, das zum Fenstermanager gehört oder „von selbst geöffnet“ wird. Technisch gesehen erfordert die Rolle des Fenstermanagers kein Fenster: Es sind andere Teile der Desktopumgebung (normalerweise Widgets genannt), die Fenster haben. Es gibt kein Attribut für ein Fenster oder eine Anwendung, das besagt: „Dies ist Teil der Desktopumgebung.“

Sie können wmctrl -lxdie Fenster, die Sie nicht interessieren, anhand ihrer Klasse identifizieren. Ich habe nicht überprüft, welche Klassen die verschiedenen gängigen Desktopumgebungen verwenden. Füllen Sie die Liste nach Bedarf aus.

wmctrl -lx | awk '$3 !~ /^(Unity-.*|Kwin|Boringstuff)$/'

Alternativ könnte für Sie auch die Erkennung nicht klebriger Fenster hilfreich sein. Klebrige Fenster sind solche, die in allen Arbeitsbereichen angezeigt werden. Ich weiß nicht, ob dies mit allen Fenstermanagern funktioniert.

for w in $(wmctrl -l | awk '{print $1}'); do
  if ! xprop -id $w _NET_WM_STATE | grep -q _NET_WM_STATE_STICKY; then
    wmctrl -l -i $w
  fi
done

verwandte Informationen