首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回的Xlib XGetWindowProperty零项

返回的Xlib XGetWindowProperty零项
EN

Stack Overflow用户
提问于 2015-07-02 14:48:28
回答 1查看 1K关注 0票数 4

我在阅读一些XWindow ICCCM属性时遇到了问题。

问题实际上是当我试图读取_NET_WM_STATUS属性时。我使用的功能是:

代码语言:javascript
复制
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);
}

get_property_value函数是在接收到ClientMessage之后调用的,这是处理事件的代码片段:

代码语言:javascript
复制
    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;

但是,当我读属性时,有时我会得到一个没有值的属性,这可能吗?问题主要是当我尝试在AtomProperties事件中读取火狐发送的_NET_WM_STATE (我试图读取ClientMessage值)时。

从输出中可以看出,属性名是正确读取的,但它似乎不包含任何项。

代码语言:javascript
复制
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-------
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-13 04:30:04

我还没有足够的代表来发表评论(我对此还有点陌生),但我自己花了一些时间与Xlib搏斗,我会尽力看看是否能帮上忙。我编写了一个包含您的代码的小程序:

代码语言:javascript
复制
#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“输出更改为打印原子名,而不是二进制数据。总之,我把这个版本的代码指向了运行在我的计算机上的Firefox实例,这就是我得到的:

代码语言:javascript
复制
$ ./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最大化时的输出;如果不是,则输出如下:

代码语言:javascript
复制
$ ./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属性格式的唯一方法是在不存在的属性上调用它。我不知道为什么你的火狐不会设置_NET_WM_STATE

总之,我的猜测是,您的代码实际上运行得很完美(除了其中一个输出的错误),但是由于某种原因,您试图读取的属性并不存在于您试图从中读取的窗口中。如果我是对的,如果在读取属性后检查actual_type_return的值,您应该会发现它是None。此外,您应该能够(如果您还没有)在代码(window)中打印您试图读取的窗口id,并使用xwininfoxprop-id标志来检查您正在读取的窗口是否是您认为的窗口,以及它是否真正具有要读取的属性。希望这将帮助您了解实际问题是什么。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31187800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档