我如何使用 xprop 或 xwininfo Gnome-Do?

我如何使用 xprop 或 xwininfo Gnome-Do?

我需要查看 Gnome-Do 弹出窗口的 X 属性,关于这个问题我之前问过。问题是,一旦 Gnome-Do 窗口失去焦点,它就会关闭,所以我无法将焦点转移到终端来运行xprop。我在网上不断看到的答案是:

sleep 5; xprop

然后打开 Gnome-Do 窗口并等待xprop启动。这看起来很聪明,但根本不起作用:

$睡眠5;xprop
xprop:错误:无法抓住鼠标。

同样的道理也适用于xwininfo

$睡眠5;xwininfo

xwininfo: 请选择您要查看的窗口
          想要了解详情,请点击
          鼠标在那个窗口中。
xwininfo:错误:无法抓住鼠标。

我也尝试过xprop使用Mod+RAwesome 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-namexprop -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 个状态后它将自动停止)。

现在我知道我感兴趣的变化是在状态之间的res2res3所以我可以运行meld res2 res3 &来查看图形比较 UI 中的变化。

更新:这里有一个更长的单行代码,用于那些xprop不显示任何内容的讨厌窗口。这个代码收集所有窗口的xpropxwininfo,但运行速度相当慢。它同样在当前工作目录中创建名为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 &

相关内容