История изменений
Исправление thm, (текущая версия) :
4 - это XA_ATOM. Подключил <X11/Xatom.h>, теперь видит константы.
По числам. XGetWindowProperty(display, (Window)id, prop, 0, 1024, False, XA_ATOM, &type, &form, &len, &remain, &list) 0 - long_offset, 1024 - long_length
По Window. Посмотрел в X.h. Window - это XID, а XID - это обычный unsigned long. Т.е. по идее, с ним должно быть все ок.
По QList. Попробовал. Получил совершенно другие числа и также никакого ответа от XGetWindowProperty.
По memory leak. Добавил XFree(list) в связи с тем, что теперь есть QList.
Единственное, что меня здесь насторожило, это XA_ATOM, который я попробовал заменить на XA_WM_NAME (мне же _NET_WM_NAME нужно). Положительного результата не дало. По прежнему все переменные (type, form, len) = 0.
QList<Window*> winlist(Display* display, unsigned long* len) {
Atom prop = XInternAtom(display, "_NET_CLIENT_LIST", False), type;
int form;
unsigned long remain;
unsigned char* list;
QList<Window*> windows;
XGetWindowProperty(display, XDefaultRootWindow(display), prop, 0, 1024,
False, XA_WINDOW, &type,&form,len,&remain,&list);
for (unsigned short i = 0; i < *len; ++i) {
windows << (Window*)(list + i);
}
XFree(list);
return windows;
}
QString WindowList::getNameByID(Display* display, Window* win) {
Atom prop = XInternAtom(display, "_NET_WM_NAME", False), type;
int form;
unsigned long remain;
unsigned char* list;
unsigned long len = 0;
XGetWindowProperty(display, *win, prop, 0, 1024, False, XA_WM_NAME,
&type, &form, &len, &remain, &list);
qDebug() << "len:" << len;
qDebug() << "form:" << form;
for (unsigned int i = 0; i < len; ++i) {
qDebug() << *(list + i);
}
return "";
}
void WindowList::getWinList(Display* display, QList<unsigned long>* winIDs) {
unsigned long len;
QList<Window*> windows = winlist(display, &len);
qDebug() << "Length: " << len;
foreach(Window* win, windows) {
qDebug() << win;
getNameByID(display, win);
}
}
Исходная версия thm, :
4 - это XA_ATOM. Подключил <X11/Xatom.h>, теперь видит константы.
По числам. XGetWindowProperty(display, (Window)id, prop, 0, 1024, False, XA_ATOM, &type, &form, &len, &remain, &list) 0 - long_offset, 1024 - long_length
По Window. Посмотрел в X.h. Window - это XID, а XID - это обычный unsigned long. Т.е. по идее, с ним должно быть все ок.
По QList. Попробовал. Получил совершенно другие числа и также никакого ответа от XGetWindowProperty.
QList<Window*> winlist(Display* display, unsigned long* len) {
Atom prop = XInternAtom(display, "_NET_CLIENT_LIST", False), type;
int form;
unsigned long remain;
unsigned char* list;
QList<Window*> windows;
XGetWindowProperty(display, XDefaultRootWindow(display), prop, 0, 1024,
False, XA_WINDOW, &type,&form,len,&remain,&list);
for (unsigned short i = 0; i < *len; ++i) {
windows << (Window*)(list + i);
}
return windows;
}
QString WindowList::getNameByID(Display* display, Window* win) {
Atom prop = XInternAtom(display, "_NET_WM_NAME", False), type;
int form;
unsigned long remain;
unsigned char* list;
unsigned long len = 0;
XGetWindowProperty(display, *win, prop, 0, 1024, False, XA_WM_NAME,
&type, &form, &len, &remain, &list);
qDebug() << "len:" << len;
qDebug() << "form:" << form;
for (unsigned int i = 0; i < len; ++i) {
qDebug() << *(list + i);
}
return "";
}
void WindowList::getWinList(Display* display, QList<unsigned long>* winIDs) {
unsigned long len;
QList<Window*> windows = winlist(display, &len);
qDebug() << "Length: " << len;
foreach(Window* win, windows) {
qDebug() << win;
getNameByID(display, win);
}
}
Единственное, что меня здесь насторожило, это XA_ATOM, который я попробовал заменить на XA_WM_NAME (мне же _NET_WM_NAME нужно). Положительного результата не дало. По прежнему все переменные (type, form, len) = 0.