LINUX.ORG.RU

История изменений

Исправление 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.