2

I'm using the following to get the names of all X windows:

  Atom nameAtom = XInternAtom(dpy,"_NET_WM_NAME",false);
  Atom type;
  int format;
  unsigned long nitems, after;
  unsigned char *data = 0;

  if (Success == XGetWindowProperty(dpy, window, nameAtom, 0, 65536,
                                    false, XA_ATOM, &type, &format,
                                    &nitems, &after, &data)) {
    if (data) {
      Atom windowName = *(Atom*)data;
      const char* name = XGetAtomName(dpy, windowName);
      log.debug("Name: %s", name);
      XFree(data);
    }
  }

But in my log I'm just getting (null) for every single window. What am I doing wrong?

fredley
  • 32,953
  • 42
  • 145
  • 236
  • Have you checked that you actually get something? From my man page: _XGetWindowProperty always allocates one extra byte in prop_return (even if the property is zero length)_. Is `nitems` non-zero? – Some programmer dude Jan 19 '12 at 11:46
  • @JoachimPileborg `nitems` is 0 for every window. – fredley Jan 19 '12 at 11:48

1 Answers1

8

What was required was to specify the req_type as UTF8_STRING accordingly:

  Atom nameAtom = XInternAtom(dpy,"_NET_WM_NAME",false);
  Atom utf8Atom = XInternAtom(dpy,"UTF8_STRING",false);
  Atom type;
  int format;
  unsigned long nitems, after;
  unsigned char *data = 0;

  if (Success == XGetWindowProperty(dpy, window, nameAtom, 0, 65536,
                                    false, utf8Atom, &type, &format,
                                    &nitems, &after, &data)) {
    if (data) {
      log.debug("Name: %s", data);
      XFree(data);
    }
  }
fredley
  • 32,953
  • 42
  • 145
  • 236