繁体   English   中英

python:使用XResQueryClientIds将PID转换为X11窗口ID

[英]python: PID to X11 Window ID using XResQueryClientIds

注意:这是对X11窗口的创建过程的回答的延续 来自unix.stackexchange 该答案提到了X-Resource v1.2 extension中的XResQueryClientIds 我想知道如何使用它。

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

我对X11不太了解, XCB API文档似乎不完整,并且自动生成的xcffib python绑定未记录。 从我的收集中,我需要:

  1. 创建一个连接: xcb_connect
  2. 获取扩展名:?undocumented?
  3. 查询扩展名: xcb_get_extension_data提到“?QueryExtension请求”
  4. 获取查询响应: xcb_get_extension_data
  5. 使用扩展文档协议存根API来解压缩响应。

假设没有比赛条件; 没有创建或销毁窗口或进程

如果您知道该假设不成立,则假设是错误的。 幸运的是,您不需要这个假设。 只需在操作过程中使用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函数名并碰到了这个 为了理解各个部分,我建议阅读它的Xlib文档。 正如您所注意到的,XCB通常是……“文档不足”,但实际上它实际上与Xlib相同,但在大多数情况下其他名称略有不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM