簡體   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