簡體   English   中英

Xlib XGetWindowProperty返回零項

[英]Xlib XGetWindowProperty Zero items returned

我在閱讀一些XWindow ICCCM屬性時遇到問題。

問題實際上是當我嘗試讀取_NET_WM_STATUS屬性時。 我正在使用的功能是:

int get_property_value(Display* display, Window window,char *propname, long max_length,
           unsigned long *nitems_return, unsigned char **prop_return){
    int result;
    Atom property;
    Atom actual_type_return;
    int actual_format_return;
    unsigned long bytes_after_return;
    unsigned char* prop_to_return;
    unsigned long n_items;
    printf("-----GET_PROPERTY_VALUE-------\n");
    printf("\tPropname: %s\n", propname);
    property = XInternAtom(display, propname, True);
    if(property==None){
      printf("\tWrong Atom\n");
      return;
    }

    result = XGetWindowProperty(display, window, property, 0,   /* long_offset */
            (~0L),  /* long_length */
            False,  /* delete */
            AnyPropertyType,    /* req_type */
            &actual_type_return,
            &actual_format_return,
            &n_items, &bytes_after_return, &prop_to_return);
    if (result != Success){
        printf("\tXGetWindowProperty failed\n");
        return (-1);
    }   else {
        printf("\tActual Type: %s\n", XGetAtomName(display,property));
        printf("\tProperty format: %d\n", actual_format_return);
        //printf("Actual property return: %s\n", XGetAtomName(display,actual_type_return));
        printf("\tByte after return: %ld\n", bytes_after_return);
        printf("\tnitems return: %d\n", n_items);
        printf("\tprop return: %s\n", prop_to_return);
    }
    printf("-----END OF GET_PROPERTY_VALUE-------\n");

    return (0);
}

收到ClientMessage后調用get_property_value函數,這是處理事件的代碼段:

    case ClientMessage:
        printf("ClientMessage\n");
        printf("Message: %s\n", XGetAtomName(display,local_event.xclient.message_type));
        unsigned long nitems_return;
        unsigned char *prop_return;
        get_property_value(display, local_event.xclient.window, XGetAtomName(display,local_event.xclient.message_type), 256, &nitems_return, (unsigned char **)&prop_return);
    break;

但是,當我閱讀屬性時,我有時會得到一個沒有值的屬性,這可能嗎? 問題主要是當我嘗試從ClientMessage事件中讀取從firefox發送的AtomProperties(我正在嘗試讀取_NET_WM_STATE值)。

正如您在輸出中看到的那樣,屬性名稱被正確讀取,但似乎它不包含任何項目。

ClientMessage
Message: _NET_WM_STATE
-----GET_PROPERTY_VALUE-------
    Propname: _NET_WM_STATE
    Actual Type: _NET_WM_STATE
    Property format: 0
    Byte after return: 0
    nitems return: 0
    prop return: (null)
-----END OF GET_PROPERTY_VALUE-------

我還沒有足夠的評論來評論(我對此有點新鮮),但我已經花了一些時間自己摔跤Xlib,我會試着看看我是否可以提供幫助。 我寫了一個包含你代碼的小程序:

#include <X11/Xlib.h>
#include <stdlib.h>
#include <stdio.h>

int get_property_value(Display* display, Window window,char *propname, long max_length,
           unsigned long *nitems_return, unsigned char **prop_return){
    int result;
    Atom property;
    Atom actual_type_return;
    int actual_format_return;
    unsigned long bytes_after_return;
    unsigned char* prop_to_return;
    unsigned long n_items;
    printf("-----GET_PROPERTY_VALUE-------\n");
    printf("\tPropname: %s\n", propname);
    property = XInternAtom(display, propname, True);
    if(property==None){
      printf("\tWrong Atom\n");
      return;
    }

    result = XGetWindowProperty(display, window, property, 0,   /* long_offset */
            (~0L),  /* long_length */
            False,  /* delete */
            AnyPropertyType,    /* req_type */
            &actual_type_return,
            &actual_format_return,
            &n_items, &bytes_after_return, &prop_to_return);
    if (result != Success){
        printf("\tXGetWindowProperty failed\n");
        return (-1);
    }   else {
        printf("\tActual Type: %s\n", XGetAtomName(display,actual_type_return));
        printf("\tProperty format: %d\n", actual_format_return);
        //printf("Actual property return: %s\n", XGetAtomName(display,actual_type_return));
        printf("\tByte after return: %ld\n", bytes_after_return);
        printf("\tnitems return: %d\n", n_items);
        printf("\tprop return: %s %s\n", XGetAtomName(display,*(Atom*)prop_to_return), XGetAtomName(display,((Atom*)prop_to_return)[1]));
    }
    printf("-----END OF GET_PROPERTY_VALUE-------\n");

    return (0);
}

int main(int argc, char** argv) {
    Display* dsp = XOpenDisplay(NULL);
    unsigned long nitems_return;
    unsigned char* prop_return;
    get_property_value(dsp, (Window)atoi(argv[1]), "_NET_WM_STATE", 100000, &nitems_return, &prop_return);
    return 0;
}

我確實更改了一些輸出內容:我更改了“實際類型”輸出以打印actual_type_return的名稱而不是property (因為這似乎是一個錯字)並且我將“prop return”輸出更改為打印原子名稱而不是二進制數據。 無論如何,我在我的計算機上運行的Firefox實例上指出了這個版本的代碼,這就是我得到的:

$ ./xproptest 60817587
-----GET_PROPERTY_VALUE-------
    Propname: _NET_WM_STATE
    Actual Type: ATOM
    Property format: 32
    Byte after return: 0
    nitems return: 2
    prop return: _NET_WM_STATE_MAXIMIZED_VERT _NET_WM_STATE_MAXIMIZED_HORZ
-----END OF GET_PROPERTY_VALUE-------

所以,好消息是你的代碼在我的機器上實際上是完美的。 不過,我不確定為什么它對你不起作用。 當然,上面的輸出來自Firefox最大化時; 當它不是時,輸出是這樣的:

$ ./xproptest 60817587
-----GET_PROPERTY_VALUE-------
    Propname: _NET_WM_STATE
    Actual Type: ATOM
    Property format: 32
    Byte after return: 0
    nitems return: 0
    prop return:

...然后關於我如何讀取無效Atoms的幾個錯誤,因為上面的代碼假定有兩個。 當屬性為空且沒有值時,這是正確的輸出; 但是,請注意我的屬性格式是32並且你的屬性是0.從閱讀手冊,看​​起來從成功調用XGetWindowProperty獲得0屬性格式的唯一方法是在不存在的屬性上調用它。 我不知道為什么你的Firefox不會設置_NET_WM_STATE

總而言之,我的猜測是你的代碼實際上是完美的功能(除了其中一個輸出上的拼寫錯誤),但由於某種原因,你試圖讀取的屬性在你試圖讀取的窗口中不存在來自。 如果我是對的,如果你在讀取屬性后檢查actual_type_return的值,你會發現它是None 此外,您應該能夠(如果您還沒有)在您的代碼( window )中打印您嘗試讀取的窗口ID,並使用帶有-id標志的xwininfoxprop來檢查窗口是否為您你正在閱讀的是你認為它是什么,以及它是否真的具有你想要閱讀的屬性。 希望這有助於您弄清楚實際問題是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM