我需要查看 Gnome-Do 弹出窗口的 X 属性,关于这个问题我之前问过。问题是,一旦 Gnome-Do 窗口失去焦点,它就会关闭,所以我无法将焦点转移到终端来运行xprop
。我在网上不断看到的答案是:
sleep 5; xprop
然后打开 Gnome-Do 窗口并等待xprop
启动。这看起来很聪明,但根本不起作用:
$睡眠5;xprop xprop:错误:无法抓住鼠标。
同样的道理也适用于xwininfo
:
$睡眠5;xwininfo xwininfo: 请选择您要查看的窗口 想要了解详情,请点击 鼠标在那个窗口中。 xwininfo:错误:无法抓住鼠标。
我也尝试过xprop
使用Mod+R
Awesome WM 中的快捷方式运行,但当 Gnome-Do 窗口打开时,快捷方式不起作用。它只是在搜索框中输入 r。
我没有其他想法。我该怎么做?
答案1
如果您运行下面的脚本,它会xprop
在最前面的窗口(运行命令xprop -root
)上记录 10 秒(或您设置的任何其他时间)的命令输出。随后,在时间过去后,它会将输出写入文件:outfile.txt
如果您确保Gnome-Do
在脚本完成之前保持窗口处于活动状态,则可以确保最后一条记录与窗口相对应Gnome-Do
。
使用它
只需将下面的脚本复制到一个空文件中,在头部部分设置输出文件的所需路径(
outfile =
使用绝对路径)。另存为record_xprop.py
通过命令启动脚本:
python3 /path/to/record_xprop.py
调用您的
Gnome-Do
窗口(或任何其他您需要数据的应用程序)。时间过去后,输出文件将显示命令的五倍输出
xprop -root
,以虚线分隔。
笔记
如果需要更多时间,只需更改该行中的“5”:
while t < 5:
转换为您需要的任何其他值
剧本
#!/usr/bin/env python3
import subprocess
import time
outfile = "/home/jacob/Bureaublad/outfile.txt"
data = []; t = 0
while t < 5:
data.append(subprocess.check_output(["/bin/bash", "-c", "xprop -root"]).decode("utf-8"))
time.sleep(2)
t = t + 1
with open(outfile, "wt") as out:
for rec in data:
out.write(rec+"\n"+"-"*20+"\n\n")
编辑
如果由于某种原因此方法不起作用(显然窗口不是最前面的,正如 所识别的那样xprop
),我们可以使用命令wmctrl -l
(在脚本中替换xprop -root
为)执行相同的技巧,首先通过其名称识别窗口。 完成后,我们可以随后再次运行,使用选项,以获取所需的信息:wmctrl -l
xprop
-name
xprop -name <windowname>
对于这两个命令,您可以运行任何一个sleep
命令,或者,如果需要更多时间,可以再次运行该脚本。
答案2
雅各布 (Jacob) 在评论中得到了它!
使用该sleep 1; wmctrl -l
命令,然后打开 Gnome-Do,我得到了以下输出:
0x00e000b9 0 bonus-debian 执行
它显示了 Gnome-Do 窗口的名称。然后我可以使用该名称来识别 xprop 的窗口:
sleep 1; xprop -name "Do"
这给了我我想要的输出:
$ sleep 1; xprop -name“做” WM_STATE(WM_STATE): 窗口状态: 已撤回 图标窗口:0x0 GDK_TIMESTAMP_PROP(GDK_TIMESTAMP_PROP)= 0x61 _NET_WM_SYNC_REQUEST_COUNTER(基数) = 14680093 _XEMBED_INFO(_XEMBED_INFO) = 0x1, 0x1 _NET_WM_USER_TIME_WINDOW(WINDOW): 窗口 ID # 0xe00004 WM_CLIENT_LEADER(WINDOW):窗口 ID # 0xe00001 _NET_WM_PID(基数) = 6708 WM_LOCALE_NAME(字符串)=“en_US.UTF-8” WM_CLIENT_MACHINE(STRING) = “奖金-debian” WM_NORMAL_HINTS(WM_SIZE_HINTS): 程序指定最小尺寸:19 x 19 窗户重力:西北 WM_PROTOCOLS(ATOM):协议 WM_DELETE_WINDOW、WM_TAKE_FOCUS、_NET_WM_PING、_NET_WM_SYNC_REQUEST WM_CLASS(STRING) = "做", "做" WM_ICON_NAME(STRING) = "做" _NET_WM_ICON_NAME(UTF8_STRING) = "执行" WM_NAME(STRING) = "做" _NET_WM_NAME(UTF8_STRING) = "执行"
答案3
这是我用来弄清楚 Chrome 如何呈现其上下文菜单以将其配置为与picom
或 一起使用的解决方案compton
。这很难,因为从技术上讲,菜单是由 Chrome 窗口呈现的,当菜单打开时,鼠标被抓取,所以我无法xprop
直接使用。
实际上,我曾经xwininfo
获取所有 X 窗口的列表(包括那些没有用户可见或可访问部分的窗口),然后xprop -id
针对其中的每一个运行该列表。
下面是bash
一行程序,如果你让它运行大约 10-20 秒,它会在当前工作目录中创建名为res1
、、res2
...的文件:res9
for ((i=1; i<=9; i++)); do echo -n "res$i ..."; xwininfo -root -tree | sort -u | grep -oP '^\s*0x[0-9a-f]+\b' | xargs -rn1 xprop -id > res$i; echo " done"; sleep 2; done
它res1...
会在第一个状态的快照过程中显示(对每个窗口重复运行 xprop 需要一些时间),然后done
在快照完成后附加。然后您有 2 秒钟的时间来更改系统状态(例如切换到另一个窗口、单击打开的菜单、打开新应用程序),然后拍摄系统状态的另一个快照。尝试在下一行看到“完成”和“res...”之间进行任何更改。
记住你对感兴趣的系统所做的更改。例如,当我执行上述操作时,我让它在我仍在终端时收集当前状态。当我看到时done
,我切换到 Chrome 窗口并等待,直到看到另一个done
(在我的情况下是行res2
)。然后我打开我感兴趣的菜单,并等待打开的菜单,直到看到我res3... done
知道我有该状态的完整快照。然后我切换回终端并按 Ctrl+C 停止数据收集(收集 9 个状态后它将自动停止)。
现在我知道我感兴趣的变化是在状态之间的res2
,res3
所以我可以运行meld res2 res3 &
来查看图形比较 UI 中的变化。
更新:这里有一个更长的单行代码,用于那些xprop
不显示任何内容的讨厌窗口。这个代码收集所有窗口的xprop
和xwininfo
,但运行速度相当慢。它同样在当前工作目录中创建名为res1
、、res2
...的文件:res9
for ((i=1; i<=9; i++)); do echo -n "res$i ..."; echo > "res$i"; xwininfo -root -tree | sort -u | grep -oP '^\s*0x[0-9a-f]+\b' | while read id; do echo -n "."; printf "\n\nWindow id %s:\n\n" "$id" >> "res$i"; xprop -id "$id" >> "res$i"; xwininfo -id "$id" >> "res$i"; done; echo " done"; sleep 2; done
例如,这是我在picom
没有任何配置文件的情况下运行的命令行:
picom --config /dev/null --log-file /dev/null --shadow -o 0.50 -r 8 -l -8 -t -8 --corner-radius 4 --backend glx --glx-no-stencil --glx-no-rebind-pixmap --no-use-damage --xrender-sync-fence --vsync --shadow-exclude '_GTK_FRAME_EXTENTS@:c' --shadow-exclude "name ?= 'Thunderbird' && (window_type = 'utility' || window_type = 'popup_menu')" --rounded-corners-exclude "_NET_WM_WINDOW_TYPE:a = '_NET_WM_WINDOW_TYPE_DND'" --shadow-exclude "_NET_WM_STATE:a = '_NET_WM_STATE_ABOVE' && _NET_WM_WINDOW_TYPE:a = '_NET_WM_WINDOW_TYPE_MENU'" --shadow-exclude "WM_CLASS:s = 'xfwm4-wireframe'" --shadow-exclude '! class_g && ! class_i && ! _NET_WM_WINDOW_TYPE:a' --no-fading-openclose --unredir-if-possible --unredir-if-possible-delay 50 > /dev/null 2>&1 &