使用 class 或名称从 xcb 获取 Window ID

Get Window ID from xcb using a class or name

我想使用 Qt 的 QWindow::fromWinID 函数将小部件绘制到外部 window(希望这会起作用)。

不幸的是,我需要在具有特定 name/class 的 window 上绘制(我可以使用 xwininfo 和 xprop 显示它)。我能找到的唯一代码是在 xwininfo 和 xprop 的源代码中,但它似乎是一堆不必要的代码来做一件简单的事情:找到 window 与某个 属性 等于一些字符串,return 它的 window ID 供 Qt 使用。不幸的是,我对 XCB 非常不熟悉,不知道如何开始。

没有 200 行代码我如何做到这一点?

The only code I can find to do this is inside the source of xwininfo and xprop

这确实是一个很好的资源,还有 xdotool。

find the window with a certain property equal to some string

是的,但是没有内置的 X11 可以执行此操作,这就是这些工具采用这种方式的原因。然后还有一些事情需要考虑,比如重新养育和不重新养育 window 经理,即你是否需要深入到客户 window 等等。

恐怕没有更简单的方法了。低级 X 编程,无论是使用 Xlib 还是 XCB,都会带来一些冗长。

您可以考虑使用从 xdotool 中提取(并被其使用)的库,称为 libxdo。它会在 xdo_search_windows 中为您提供此功能。不过,该库使用(因此引入)Xlib 而不是 XCB。

这是一个示例程序,您可以使用 gcc -lxdo test.c:

进行编译
#include <xdo.h>

int main() {
    xdo_t *xdo = xdo_new(NULL);
    xdo_enter_text_window(xdo, CURRENTWINDOW, "A", 0);
    return 0;
}