lsw.c - lsw - lists window titles of X clients to stdout
(HTM) git clone git://git.suckless.org/lsw
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
lsw.c (1466B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <X11/Xlib.h>
6 #include <X11/Xutil.h>
7
8 static Atom netwmname;
9 static Display *dpy;
10
11 static char *
12 getname(Window win)
13 {
14 static char buf[BUFSIZ];
15 char **list;
16 int n;
17 XTextProperty prop;
18
19 if (!XGetTextProperty(dpy, win, &prop, netwmname) || !prop.nitems) {
20 if (!XGetWMName(dpy, win, &prop) || !prop.nitems)
21 return "";
22 }
23 if (!XmbTextPropertyToTextList(dpy, &prop, &list, &n) && n > 0) {
24 strncpy(buf, list[0], sizeof(buf));
25 XFreeStringList(list);
26 } else {
27 strncpy(buf, (char *)prop.value, sizeof(buf));
28 }
29 XFree(prop.value);
30 buf[sizeof(buf) - 1] = '\0';
31
32 return buf;
33 }
34
35 static void
36 lsw(Window win)
37 {
38 unsigned int n;
39 Window *wins, *w, dw;
40 XWindowAttributes wa;
41
42 if (!XQueryTree(dpy, win, &dw, &dw, &wins, &n) || !n)
43 return;
44 for (w = &wins[n-1]; w >= &wins[0]; w--) {
45 if (XGetWindowAttributes(dpy, *w, &wa)
46 && !wa.override_redirect && wa.map_state == IsViewable)
47 printf("0x%07lx %s\n", *w, getname(*w));
48 }
49 XFree(wins);
50 }
51
52 int
53 main(int argc, char *argv[])
54 {
55 int i;
56
57 if (!(dpy = XOpenDisplay(NULL))) {
58 fprintf(stderr, "%s: cannot open display\n", argv[0]);
59 exit(EXIT_FAILURE);
60 }
61 netwmname = XInternAtom(dpy, "_NET_WM_NAME", False);
62
63 if (argc < 2) {
64 lsw(DefaultRootWindow(dpy));
65 } else {
66 for (i = 1; i < argc; i++)
67 lsw(strtol(argv[i], NULL, 0));
68 }
69
70 XCloseDisplay(dpy);
71
72 return EXIT_SUCCESS;
73 }