Проблемы с именем окна XLib - PullRequest
       56

Проблемы с именем окна XLib

3 голосов
/ 20 февраля 2012

с 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 пустые (у меня на самом деле есть два открытых окна скайпа).

Можете ли вы помочь мне, пожалуйста.

1 Ответ

3 голосов
/ 21 февраля 2012

A WM_NAME не обязательно простая строка.Это может быть составной текст (другой тип строки), что на самом деле относится к окнам Skype.Вам нужно использовать AnyPropertyType вместо XA_STRING, чтобы получить свойство, затем отформатировать в соответствии с фактическим типом.Посмотрите на источник xprops, чтобы увидеть, как это делается.

...