获取在Linux中打开的应用程序窗口的数量

我想要检测由窗口pipe理器pipe理的特定应用程序有多less个实例被打开。 目前,我有这个:

#!/bin/bash # wmctrl required pids=$(pidof $1) IFS=' ' read -a pid_arr <<< "$pids" matches=0 for pid in "${pid_arr[@]}" do matching_lines=$(wmctrl -l -p | egrep -c "^.+\b.+\b$pid\b") matches=$((matches + $matching_lines)) done echo $matches 

说我有firefox打开三次,我传递firefox作为参数,function将只返回正确的数字,如果没有“子窗口”(如偏好窗口)打开。 否则,函数也会计算这些窗口。

我想获得没有“子窗口”的窗口数量。

PS:做了一些改变。 要计算没有对话窗口的窗口数量,这是我目前的解决scheme:

 #!/bin/bash pids=$(pidof $1) IFS=' ' read -r -a pid_arr <<< "$pids" matches=0 for pid in "${pid_arr[@]}" do ids=$(wmctrl -l -p | awk '$3=='$pid'{printf $1" "}') IFS=' ' read -r -a id_arr <<< "$ids" for id in "${id_arr[@]}" do if ! xprop -id "$id" | egrep -q '(WM_TRANSIENT_FOR|_NET_WM_WINDOW_TYPE_DIALOG)' then ((matches++)) fi done done echo $matches 

但在Firefox的情况下,脚本无法区分浏览器窗口和其偏好窗口,因为它们都不是一个对话窗口。

上面的脚本对我来说已经足够了,因为我用它来确定xfce4-appfinder有多less个窗口(没有对话窗口)。 对于xfce4-appfinder,脚本可以工作,因为它的首选项窗口很容易被识别为对话窗口。 在Firefox中,首选项窗口甚至可以通过调用firefox -preferences来单独打开。 把窗户这样的窗口识别为某种“子窗口”也许是不可能的。

这里是我的浏览器和Firefox的首选项窗口xpropxwininfo结果:

xwininfo (浏览器):

 xwininfo: Window id: 0x1c0007f "bash - Get number of opened application windows in linux - Stack Overflow - Mozilla Firefox" Root window id: 0xa1 (the root window) (has no name) Parent window id: 0x1400048 (has no name) 1 child: 0x1c00080 (has no name): () 1x1+-1+-1 +1+37 Absolute upper-left X: 2 Absolute upper-left Y: 38 Relative upper-left X: 0 Relative upper-left Y: 14 Width: 956 Height: 511 Depth: 24 Visual: 0x20 Visual Class: TrueColor Border width: 0 Class: InputOutput Colormap: 0x22 (installed) Bit Gravity State: NorthWestGravity Window Gravity State: NorthWestGravity Backing Store State: NotUseful Save Under State: no Map State: IsViewable Override Redirect State: no Corners: +2+38 -962+38 -962-531 +2-531 -geometry 956x511+0+22 Bit gravity: NorthWestGravity Window gravity: NorthWestGravity Backing-store hint: NotUseful Backing-planes to be preserved: 0xffffffff Backing pixel: 0 Save-unders: No Someone wants these events: KeyPress KeyRelease ButtonPress ButtonRelease EnterWindow LeaveWindow PointerMotion Exposure VisibilityChange StructureNotify FocusChange PropertyChange Do not propagate these events: Override redirection?: No Window manager hints: Client accepts input or input focus: Yes Initial state is Normal State Displayed on desktop 0 Window type: Normal Process id: 792 on host T530 Normal window size hints: Program supplied minimum size: 300 by 71 Program supplied maximum size: 32767 by 32767 Program supplied window gravity: NorthWestGravity No zoom window size hints defined No window shape defined No border shape defined 

xwininfo (首选项):

 xwininfo: Window id: 0x1c046ef "Firefox Preferences" Root window id: 0xa1 (the root window) (has no name) Parent window id: 0x1400060 (has no name) 1 child: 0x1c046f0 (has no name): () 1x1+-1+-1 +961+37 Absolute upper-left X: 962 Absolute upper-left Y: 38 Relative upper-left X: 0 Relative upper-left Y: 14 Width: 956 Height: 1040 Depth: 24 Visual: 0x20 Visual Class: TrueColor Border width: 0 Class: InputOutput Colormap: 0x22 (installed) Bit Gravity State: NorthWestGravity Window Gravity State: NorthWestGravity Backing Store State: NotUseful Save Under State: no0x1c00001 Map State: IsViewable Override Redirect State: no Corners: +962+38 -2+38 -2-2 +962-2 -geometry 956x1040-0-0 Bit gravity: NorthWestGravity Window gravity: NorthWestGravity Backing-store hint: NotUseful Backing-planes to be preserved: 0xffffffff Backing pixel: 0 Save-unders: No Someone wants these events: KeyPress KeyRelease ButtonPress ButtonRelease EnterWindow LeaveWindow PointerMotion Exposure VisibilityChange StructureNotify FocusChange PropertyChange Do not propagate these events: Override redirection?: No Window manager hints: Client accepts input or input focus: Yes Initial state is Normal State Displayed on desktop 0 Window type: Normal Process id: 792 on host T530 Normal window size hints: Program supplied location: 0, 0 Program supplied minimum size: 604 by 594 Program supplied maximum size: 32767 by 32767 Program supplied window gravity: NorthWestGravity No zoom window size hints defined No window shape defined No border shape defined 

xprop (浏览器):

 _DESKTOP(CARDINAL) = 0 WM_STATE(WM_STATE): window state: Normal icon window: 0x0 WM_HINTS(WM_HINTS): Client accepts input or input focus: True Initial state is Normal State. bitmap id # to use for icon: 0x1c00082 bitmap id # of mask for icon: 0x1c00083 window id # of group leader: 0x1c00001 _NET_STARTUP_ID(UTF8_STRING) = "xfce4-appfinder/|usr|lib|firefox|firefox/756-0-T530_TIME21351" WM_WINDOW_ROLE(STRING) = "browser" XdndAware(ATOM) = BITMAP _MOTIF_DRAG_RECEIVER_INFO(_MOTIF_DRAG_RECEIVER_INFO) = 0x6c, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0 _NET_WM_SYNC_REQUEST_COUNTER(CARDINAL) = 29360257 _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL _NET_WM_USER_TIME(CARDINAL) = 1758669 _NET_WM_USER_TIME_WINDOW(WINDOW): window id # 0x1c00080 WM_CLIENT_LEADER(WINDOW): window id # 0x1c00001 _NET_WM_PID(CARDINAL) = 792 WM_LOCALE_NAME(STRING) = "en_US.UTF-8" WM_CLIENT_MACHINE(STRING) = "T530" WM_NORMAL_HINTS(WM_SIZE_HINTS): program specified minimum size: 300 by 71 program specified maximum size: 32767 by 32767 window gravity: NorthWest WM_PROTOCOLS(ATOM): protocols WM_DELETE_WINDOW, WM_TAKE_FOCUS, _NET_WM_PING, _NET_WM_SYNC_REQUEST WM_CLASS(STRING) = "Navigator", "Firefox" WM_ICON_NAME(STRING) = "bash - Get number of opened application windows in linux - Stack Overflow - Mozilla Firefox" _NET_WM_ICON_NAME(UTF8_STRING) = "bash - Get number of opened application windows in linux - Stack Overflow - Mozilla Firefox" WM_NAME(STRING) = "bash - Get number of opened application windows in linux - Stack Overflow - Mozilla Firefox" _NET_WM_NAME(UTF8_STRING) = "bash - Get number of opened application windows in linux - Stack Overflow - Mozilla Firefox" 

xprop (偏好)

 _NET_WM_DESKTOP(CARDINAL) = 0 WM_STATE(WM_STATE): window state: Normal icon window: 0x0 WM_HINTS(WM_HINTS): Client accepts input or input focus: True Initial state is Normal State. bitmap id # to use for icon: 0x1c046f2 bitmap id # of mask for icon: 0x1c046f3 window id # of group leader: 0x1c00001 WM_WINDOW_ROLE(STRING) = "Preferences" XdndAware(ATOM) = BITMAP _MOTIF_DRAG_RECEIVER_INFO(_MOTIF_DRAG_RECEIVER_INFO) = 0x6c, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0 _NET_WM_SYNC_REQUEST_COUNTER(CARDINAL) = 29378289 _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL _NET_WM_USER_TIME(CARDINAL) = 1456410 _NET_WM_USER_TIME_WINDOW(WINDOW): window id # 0x1c046f0 WM_CLIENT_LEADER(WINDOW): window id # 0x1c00001 _NET_WM_PID(CARDINAL) = 792 WM_LOCALE_NAME(STRING) = "en_US.UTF-8" WM_CLIENT_MACHINE(STRING) = "T530" WM_NORMAL_HINTS(WM_SIZE_HINTS): program specified location: 0, 0 program specified minimum size: 604 by 594 program specified maximum size: 32767 by 32767 window gravity: NorthWest WM_PROTOCOLS(ATOM): protocols WM_DELETE_WINDOW, WM_TAKE_FOCUS, _NET_WM_PING, _NET_WM_SYNC_REQUEST WM_CLASS(STRING) = "Browser", "Firefox" WM_ICON_NAME(STRING) = "Firefox Preferences" _NET_WM_ICON_NAME(UTF8_STRING) = "Firefox Preferences" WM_NAME(STRING) = "Firefox Preferences" _NET_WM_NAME(UTF8_STRING) = "Firefox Preferences" 

我不知道这是一个简单的答案。 你可能需要更仔细地检查窗户,并清除任何不是你想要的东西。

窗口上的组长属性可能是有用的。 (有些子窗口应该有这个和主窗口可能不)。

您也可以查看完整的WM_CLASS和WM_WINDOW_ROLE值,这可能会帮助您区分窗口类型。

_NET_WM_WINDOW_TYPE等属性也可能有助于确定你在看什么样的窗口。

在你的显示器上的各种窗口上玩xwininfoxprop ,你会看到你能找到什么。