Привет, ЛОР!
Помоги, пожалуйста, искать ошибку в коде. Или подскажи, как сделать лучше. Хочу получить список окон. Получить-то получаю, но заодно и segfault там, где вроде-бы должно быть root window.
Еще вопрос: XQueryTree() возвращает у меня около 20 дочерних окон для root window, хотя вижу я только 3. Откуда остальные, что это за окна?
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <X11/Xlib.h>
#include <X11/XKBlib.h>
#include <X11/Xutil.h>
static Display * dpy;
static Window root;
int main(int argc, char ** argv)
{
dpy = XOpenDisplay (NULL);
assert (dpy);
root = DefaultRootWindow (dpy);
assert (root);
Window rw, pw, *cw, *wlist;
unsigned int nchildren, i, nwindows = 0, w_indexes[256];
XWindowAttributes wa;
assert (XQueryTree (dpy, root, &rw, &pw, &cw, &nchildren));
for (i = 0; i < nchildren; i++)
{
assert (XGetWindowAttributes (dpy, cw[i], &wa));
if (wa.map_state == IsViewable)
{
/* сохраню номер видимого окна в общем списке окон */
w_indexes[nwindows++] = i;
}
}
printf ("%d windows:\n", nwindows);
wlist = malloc (sizeof (Window) * nwindows);
assert (wlist);
for (i = 0; i < nwindows; i++)
{
wlist[i] = cw[w_indexes[i]];
}
for (i = 0; i < nwindows; i++)
{
XTextProperty wp;
XGetWMName (dpy, wlist[i], &wp);
printf ("%s\n", wp.value);
}
XCloseDisplay (dpy);
return EXIT_SUCCESS;
}
Результат:
% gcc pwkl.c -o pwkl -lX11 -ggdb3
% ./pwkl
4 windows:
Xlib Programming Manual: XQueryTree - Chromium
emacs@lamarr
evgeny@lamarr:~/devel
Ошибка сегментирования