с 4 дня я пытаюсь посмотреть, как работает XLib, и я наконец-то это понял.
Я попытался сделать короткую программу, которая получит название открытого окна.
Для этого я создал 2 функции:
Window *list (Display *disp, unsigned long *len) {
Atom prop = XInternAtom(disp,"_NET_CLIENT_LIST",False), type;
int form;
unsigned long remain;
unsigned char *list;
if (XGetWindowProperty(disp,XDefaultRootWindow(disp),prop,0,1024,False,XA_WINDOW,
&type,&form,len,&remain,&list) != Success) {
return 0;
}
return (Window*)list;
}
Итак, эта первая функция возвращает объект окна всех окон.
Затем я создал функцию для извлечения имени из всех этих окон.
char *name (Display *disp, Window win) {
Atom prop = XInternAtom(disp,"WM_NAME",False), type;
int form;
unsigned long remain, len;
unsigned char *list;
if (XGetWindowProperty(disp,win,prop,0,1024,False,XA_STRING,
&type,&form,&len,&remain,&list) != Success) {
return NULL;
}
return (char*)list;
}
И эта функция работает нормально, пример main.c:
int main(int argc, char* argv[]){
int i;
unsigned long len;
XKeyEvent esend;
Display *disp = XOpenDisplay(NULL);
Window *list;
char *name;
list = (Window*)list(disp,&len);
for (i=0;i<(int)len;i++) {
name = name(disp,list[i]);
printf("%d : %s \n",i,name);
free(name);
}
}
И, он работает очень хорошо, за исключением окон Skype, он возвращает:
1: Руководство по программированию Xlib: События клавиатуры и указателя - Google Chrome
2: Debian Web [ru] - Oracle VM VirtualBox
3: XChat: некромойн @ / (+ CSTfnst 10: 2)
4:
5: root @ root-Laptop: ~
6:
И, числа 4 и 6 пустые (у меня на самом деле есть два открытых окна скайпа).
Можете ли вы помочь мне, пожалуйста.