Introduction
Introduction Statistics Contact Development Disclaimer Help
refactored, manpage, -l flag - lsw - lists window titles of X clients to stdout
git clone git://git.suckless.org/lsw
Log
Files
Refs
README
LICENSE
---
commit c43d205c65f6223efd93b1b01c6e76e80737b15e
parent 84e6fd3cd229b57d894d6ed9db6517580d8189ef
Author: Connor Lane Smith <[email protected]>
Date: Thu, 19 May 2011 17:04:03 +0100
refactored, manpage, -l flag
Diffstat:
M LICENSE | 3 ++-
M Makefile | 13 ++++++++-----
M README | 2 +-
M config.mk | 17 +++++++----------
A lsw.1 | 19 +++++++++++++++++++
M lsw.c | 119 ++++++++++++++++-------------…
6 files changed, 99 insertions(+), 74 deletions(-)
---
diff --git a/LICENSE b/LICENSE
@@ -1,6 +1,7 @@
MIT/X Consortium License
-(C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
+© 2011 Connor Lane Smith <[email protected]>
+© 2006-2011 Anselm R Garbe <[email protected]>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
diff --git a/Makefile b/Makefile
@@ -1,5 +1,5 @@
# lsw - list window names
-# (C)opyright MMVI Anselm R. Garbe
+# See LICENSE file for copyright and license details.
include config.mk
@@ -7,7 +7,6 @@ SRC = lsw.c
OBJ = ${SRC:.c=.o}
all: options lsw
- @echo finished
options:
@echo lsw build options:
@@ -16,13 +15,12 @@ options:
@echo "CC = ${CC}"
.c.o:
- @echo CC $<
+ @echo CC -c $<
@${CC} -c ${CFLAGS} $<
lsw: ${OBJ}
- @echo LD $@
+ @echo CC -o $@
@${CC} -o $@ ${OBJ} ${LDFLAGS}
- @strip $@
clean:
@echo cleaning
@@ -41,9 +39,14 @@ install: all
@mkdir -p ${DESTDIR}${PREFIX}/bin
@cp -f lsw ${DESTDIR}${PREFIX}/bin
@chmod 755 ${DESTDIR}${PREFIX}/bin/lsw
+ @echo installing manual page to ${DESTDIR}${MANPREFIX}/man1/lsw.1
+ @sed "s/VERSION/${VERSION}/g" < lsw.1 > ${DESTDIR}${MANPREFIX}/man1/ls…
+ @chmod 644 ${DESTDIR}${MANPREFIX}/man1/lsw.1
uninstall:
@echo removing executable file from ${DESTDIR}${PREFIX}/bin
@rm -f ${DESTDIR}${PREFIX}/bin/lsw
+ @echo removing manual page from ${DESTDIR}${MANPREFIX}/man1
+ @rm -f ${DESTDIR}${MANPREFIX}/man1/lsw.1
.PHONY: all options clean dist install uninstall
diff --git a/README b/README
@@ -21,4 +21,4 @@ necessary as root):
Running lsw
-----------
-Simply invoke the 'lsw' command.
+See the man page for details.
diff --git a/config.mk b/config.mk
@@ -1,7 +1,5 @@
# lsw version
-VERSION = 0.1
-
-# Customize below to fit your system
+VERSION = 0.2
# paths
PREFIX = /usr/local
@@ -11,14 +9,13 @@ X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib
# includes and libs
-INCS = -I/usr/lib -I${X11INC}
-LIBS = -L/usr/lib -lc -L${X11LIB} -lX11
+INCS = -I${X11INC}
+LIBS = -L${X11LIB} -lX11
# flags
-CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
-LDFLAGS = ${LIBS}
-#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
-#LDFLAGS = -g ${LIBS}
+CPPFLAGS = -DVERSION=\"${VERSION}\"
+CFLAGS = -ansi -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
+LDFLAGS = -s ${LIBS}
-# compiler
+# compiler and linker
CC = cc
diff --git a/lsw.1 b/lsw.1
@@ -0,0 +1,19 @@
+.TH LSW 1 lsw\-VERSION
+.SH NAME
+lsw \- list window titles
+.SH SYNOPSIS
+.B lsw
+.RB [ \-l ]
+.RB [ \-v ]
+.RI [ windows ...]
+.SH DESCRIPTION
+.B lsw
+prints the titles of the given X windows' children to stdout. If no windows a…
+given the root window is used.
+.SH OPTIONS
+.TP
+.B \-l
+lsw lists each window's XID as well as its title.
+.TP
+.B \-v
+prints version information to stdout, then exits.
diff --git a/lsw.c b/lsw.c
@@ -1,6 +1,4 @@
-/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
- * See LICENSE file for license details.
- */
+/* See LICENSE file for copyright and license details. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -8,70 +6,77 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
-static char buf[1024];
+static void getname(Window win, char *buf, size_t size);
+static void lsw(Window win);
+
static Atom netwmname;
+static Bool longfmt = False;
static Display *dpy;
-static void
-getname(Window w) {
- char **list = NULL;
- int n;
- XTextProperty prop;
-
- prop.nitems = 0;
- buf[0] = 0;
- XGetTextProperty(dpy, w, &prop, netwmname);
- if(!prop.nitems)
- XGetWMName(dpy, w, &prop);
- if(!prop.nitems)
- return;
- if(prop.encoding == XA_STRING)
- strncpy(buf, (char *)prop.value, sizeof(buf));
- else {
- if(XmbTextPropertyToTextList(dpy, &prop, &list, &n) >= Success
- && n > 0 && *list)
- {
- strncpy(buf, *list, sizeof(buf));
- XFreeStringList(list);
- }
- }
- XFree(prop.value);
-}
-
int
main(int argc, char *argv[]) {
- unsigned int i, num;
- Window *wins, d1, d2;
- XWindowAttributes wa;
- Window win;
+ int i;
- if((argc > 1) && !strncmp(argv[1], "-v", 3)) {
- fputs("lsw-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", std…
- exit(EXIT_SUCCESS);
- }
- if(!(dpy = XOpenDisplay(0))) {
+ if(!(dpy = XOpenDisplay(NULL))) {
fputs("lsw: cannot open display\n", stderr);
exit(EXIT_FAILURE);
}
- if(argc == 2)
- win = atoi(argv[1]);
- else
- win = DefaultRootWindow(dpy);
-
netwmname = XInternAtom(dpy, "_NET_WM_NAME", False);
- if(XQueryTree(dpy, win, &d1, &d2, &wins, &num)) {
- for(i = 0; i < num; i++) {
- if(!XGetWindowAttributes(dpy, wins[i], &wa))
- continue;
- if(wa.override_redirect)
- continue;
- getname(wins[i]);
- if(buf[0])
- fprintf(stdout, "%s\n", buf);
+
+ for(i = 1; i < argc; i++)
+ if(!strcmp(argv[i], "-v")) {
+ puts("lsw-"VERSION", © 2006-2011 lsw engineers, see L…
+ exit(EXIT_SUCCESS);
}
+ else if(!strcmp(argv[i], "-l"))
+ longfmt = True;
+ else
+ break;
+
+ if(i == argc)
+ lsw(DefaultRootWindow(dpy));
+ while(i < argc)
+ lsw(strtol(argv[i++], NULL, 0));
+
+ return EXIT_SUCCESS;
+}
+
+void
+lsw(Window win) {
+ char buf[BUFSIZ];
+ unsigned int i, n;
+ Window *wins, dw;
+ XWindowAttributes wa;
+
+ if(!XQueryTree(dpy, win, &dw, &dw, &wins, &n))
+ return;
+ for(i = 0; i < n; i++)
+ if(XGetWindowAttributes(dpy, win, &wa) && !wa.override_redirec…
+ getname(wins[i], buf, sizeof buf);
+ if(longfmt)
+ printf("0x%07lx %s\n", wins[i], buf);
+ else if(buf[0] != '\0')
+ puts(buf);
+ }
+ XFree(wins);
+}
+
+void
+getname(Window win, char *buf, size_t size) {
+ char **list = NULL;
+ int n;
+ XTextProperty prop;
+
+ buf[0] = '\0';
+ if(!XGetTextProperty(dpy, win, &prop, netwmname) || prop.nitems == 0)
+ if(!XGetWMName(dpy, win, &prop) || prop.nitems == 0)
+ return;
+
+ if(prop.encoding == XA_STRING)
+ strncpy(buf, (char *)prop.value, size);
+ else if(!XmbTextPropertyToTextList(dpy, &prop, &list, &n) && n > 0) {
+ strncpy(buf, list[0], size);
+ XFreeStringList(list);
}
- if(wins)
- XFree(wins);
- XCloseDisplay(dpy);
- return 0;
+ XFree(prop.value);
}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.