![](/img/trans.png)
[英]C - Xlib - BadWindow Error using XGetWindowProperty for window title
[英]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
標志的xwininfo
和xprop
來檢查窗口是否為您你正在閱讀的是你認為它是什么,以及它是否真的具有你想要閱讀的屬性。 希望這有助於您弄清楚實際問題是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.