给定进程iD为XX,我希望有一个_NET_WM_PID = XX的所有窗口id的列表。如果可能的话,更好的方法是最老的仍然活动的窗口id。
我对linux是个新手,但我要做的是创建一个脚本,这个脚本需要一个命令行,看看是否有一个已经打开的属于同一个命令行调用的进程的windows。如果是,只需将焦点设置到该窗口,否则执行命令行以使新进程继续运行。我的目的是在我的ubuntu桌面上使用它,在那里我会将这个脚本挂到我的鼠标手势命令中,这样,例如,每次我对gmail做手势时,我不会得到一个全新的gmail会话,我只是被带到我现有的gmail chrome应用程序窗口。也许有一种更简单的方法来做这一切,但我还没有找到我的方法。
在帮助下,我已经了解了如何使用pgrep查找命令行的PID,以及如何使用wmctrl将焦点设置到窗口句柄,但我仍然坚持从PID到窗口ID。
发布于 2012-09-18 09:12:47
事实上,您也可以使用wmctrl来查找PID,我认为这是一个更好的方法。xwininfo将返回各种看似windows的实体,但你不会真的在桌面上找到它们。
如果您使用man wmctrl,您会发现wmctrl -l列出了在您桌面上实际可见的所有窗口,以及(最重要的)窗口If和标题。-p添加PID,-x将添加窗口类。
正如手册所说( RTFM,对吧?:D),wmctrl还可以搜索其中的一些内容,并激活与搜索匹配的窗口。然而,我不知道是什么决定了所有可能的匹配项中的哪一个将被返回。另一方面,您可以使用提供的列表函数来编写一个包装器,该包装器可以更好地执行搜索,并且可能基于一些其他属性(例如,最后一次访问窗口的时间戳),例如,您可以通过向xprop查询所提供的win来获得这些属性。
下面这几行代码返回最新的一个mate-terminal类窗口:
XTIME="_NET_WM_USER_TIME" #a shorter name for xprop query that shoul return timestamps
export TMPDIR=/dev/shm #save tmp files to memory to make it faster
LST=`mktemp` #tmp file to store our listing
wmctrl -lx | awk -F' ' '{printf("%s\t%s \t",$1,$3); for(i=5;i<=NF;i++) printf("%s",$i); printf("\n") }' > $LST #pretty-print our listing of windows into the tmp file
#To each line of listing, prepend a timestamp acquired via an xprop call
#Use awk to find a line whose 3rd column (winclass) matches the window class "mate-terminal.Mate-terminal" and among those that do, find the one whose timestamp is the largest
while read LINE; do ID=`echo "$LINE"|cut -f 1`; TIME=`xprop -id $ID $XTIME`; TIME="${TIME/* = /}"; echo -e "$TIME\t$LINE" ; done <$LST ) | awk -v s="mate-terminal.Mate-terminal" '$3 == s {if($1>max){max=$1;line=$0};};END{print line}'
rm $LST #delete tmp file无论如何,对于你描述的你正在构建的东西-如果我是你,我会找出你想要的命令生成的窗口类,然后基于它而不是PID进行搜索。或者,您可以假定命令CMD可能会生成具有包含CMD的类名的窗口。
找到行之后,您应该使用窗口id
通过wmctrl激活窗口。
希望这能有所帮助。
附注:我发现xdotool也可以基于类名和窗口标题进行搜索,但速度非常慢。在我的计算机上,这个bash脚本(它调用了相当多的外部实用程序)的速度是编译后的替代脚本xdotool :P的10倍。
https://stackoverflow.com/questions/2250757
复制相似问题