python:使用XResQueryClientIds的PID到X11窗口ID

时间:2016-05-17 17:53:22

标签: python x11 xcb

注意:这是unix.stackexchange对What process created this X11 window?的回答的延续。该答案提到了来自X-Resource v1.2 extensionXResQueryClientIds。我想知道如何使用它。

如何使用python's xcffib module查找与提供的PID关联的所有X11窗口ID(假设没有竞争条件;未创建或销毁窗口或进程)。

我对X11知之甚少,XCB API documentation似乎不完整,auto-generated xcffib python bindings没有记录。从我收集的内容来看,我需要:

  1. 创建连接:xcb_connect
  2. 获取扩展名:?未记录?
  3. 查询扩展程序:?xcb_get_extension_data提及“?QueryExtension requests”
  4. 获取查询回复:xcb_get_extension_data
  5. 使用extension documentationprotocol stub API解压缩回复。

1 个答案:

答案 0 :(得分:2)

  

假设没有竞争条件;窗口或进程没有被创建或销毁

如果您知道假设不成立,假设是不好的。幸运的是,你不需要这个假设。只需在您的操作周围使用xcb_grab_serverxcb_ungrab_server,这不会成为问题。

现在,对于XResQueryClientIds,您实际上只需输入man xcb_res_query_client_ids即可。 XCB只是提供了这个,不需要实际查询扩展名。这是一个示例程序。用gcc -lxcb -lxcb-res main.c编译它,然后通过传递窗口ID作为唯一参数来执行它(例如,./a.out 0x2c00004)。

#include <stdio.h>
#include <stdlib.h>
#include <xcb/xcb.h>
#include <xcb/res.h>

int main(int argc, char *argv[]) {
    int screen;
    xcb_connection_t *conn = xcb_connect(NULL, &screen);

    xcb_res_client_id_spec_t spec = {0};
    spec.client = strtol(argv[1], NULL, 0);
    spec.mask = XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID;

    xcb_generic_error_t *err = NULL;
    xcb_res_query_client_ids_cookie_t cookie = xcb_res_query_client_ids(conn, 1, &spec);
    xcb_res_query_client_ids_reply_t *reply = xcb_res_query_client_ids_reply(conn, cookie, &err);

    if (reply == NULL) {
        fprintf(stderr, "Uh-Oh! :(\n");
        return -1;
    }

    uint32_t *pid = NULL;
    xcb_res_client_id_value_iterator_t it = xcb_res_query_client_ids_ids_iterator(reply);
    for (; it.rem; xcb_res_client_id_value_next(&it)) {
        spec = it.data->spec;
        if (spec.mask & XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID) {
            pid = xcb_res_client_id_value_value(it.data);
            break;
        }
    }

    free(reply);
    xcb_disconnect(conn);

    fprintf(stderr, "PID: %d\n", *pid);
}

为了给出正确的归属,我自己也不知道这些,我只是用Google搜索XCB函数名称并遇到了this。为了理解各个部分,我建议阅读它的Xlib文档。正如你所注意到的那样,XCB通常是......“记录不足”,但它与Xlib实际上只是大致相同,其他大部分名称略有不同。