about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--bar.c12
-rw-r--r--client.c9
-rw-r--r--cmd.c10
-rw-r--r--config.h12
-rw-r--r--key.c16
-rw-r--r--util.c25
-rw-r--r--util.h12
-rw-r--r--wm.c33
-rw-r--r--wm.h9
9 files changed, 87 insertions, 51 deletions
diff --git a/bar.c b/bar.c
index 8d4fb36..17db8cd 100644
--- a/bar.c
+++ b/bar.c
@@ -5,12 +5,22 @@
 
 #include "wm.h"
 
+static const char *status[] = {
+	"sh", "-c", "echo -n `date` `uptime | sed 's/.*://; s/,//g'`"
+		" `acpi | awk '{print $4}' | sed 's/,//'`", 0 \
+};
+
 void
 draw_bar()
 {
+	static char buf[1024];
+
+	buf[0] = 0;
+	pipe_spawn(buf, sizeof(buf), dpy, (char **)status);
+
 	brush.rect = barrect;
 	brush.rect.x = brush.rect.y = 0;
-	draw(dpy, &brush, False, 0);
+	draw(dpy, &brush, False, buf);
 
 	XCopyArea(dpy, brush.drawable, barwin, brush.gc, 0, 0, barrect.width,
 			barrect.height, 0, 0);
diff --git a/client.c b/client.c
index caa523c..f87fb80 100644
--- a/client.c
+++ b/client.c
@@ -122,6 +122,8 @@ unmanage(Client *c)
 	XSetErrorHandler(error_handler);
 	XUngrabServer(dpy);
 	flush_events(EnterWindowMask);
+	if(stack)
+		focus(stack);
 }
 
 
@@ -135,3 +137,10 @@ getclient(Window w)
 	return NULL;
 }
 
+void
+draw_client(Client *c)
+{
+	
+
+
+}
diff --git a/cmd.c b/cmd.c
index 9ac4e72..4f1c84b 100644
--- a/cmd.c
+++ b/cmd.c
@@ -5,22 +5,22 @@
 
 #include "wm.h"
 #include <stdio.h>
+#include <string.h>
 
 void
-run(char *arg)
+run(void *aux)
 {
-	spawn(dpy, arg);
+	spawn(dpy, aux);
 }
 
 void
-quit(char *arg)
+quit(void *aux)
 {
-	fputs("quit\n", stderr);
 	running = False;
 }
 
 void
-kill(char *arg)
+kill(void *aux)
 {
 	Client *c = stack;
 
diff --git a/config.h b/config.h
index adca4e5..ce9e7ab 100644
--- a/config.h
+++ b/config.h
@@ -3,16 +3,8 @@
  * See LICENSE file for license details.
  */
 
-#define FONT		"-*-terminus-medium-*-*-*-14-*-*-*-*-*-iso10646-*"
+#define FONT		"-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*"
 #define BGCOLOR		"#000000"
 #define FGCOLOR		"#ffaa00"
 #define BORDERCOLOR	"#000000"
-#define STATUSCMD	"echo -n `date` `uptime | sed 's/.*://; s/,//g'`" \
-					" `acpi | awk '{print $4}' | sed 's/,//'`"
-#define PLCMD		"`ls -lL /bin /sbin /usr/bin /usr/local/bin 2>/dev/null | awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | gridmenu`"
-
-#define KEYS		\
-	{ Mod1Mask, XK_Return, run, "xterm -u8 -bg black -fg white -fn '-*-terminus-medium-*-*-*-14-*-*-*-*-*-iso10646-*'" }, \
-	{ Mod1Mask, XK_p, run, PLCMD }, \
-	{ Mod1Mask | ShiftMask, XK_q, quit, NULL},
-
+#define STATUSDELAY 1 /* milliseconds */
diff --git a/key.c b/key.c
index b5d46c6..7caae15 100644
--- a/key.c
+++ b/key.c
@@ -7,8 +7,20 @@
 
 #include <X11/keysym.h>
 
+static const char *term[] = { 
+	"xterm", "-u8", "-bg", "black", "-fg", "white", "-fn",
+	"-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*", 0 
+};
+
+static const char *proglist[] = {
+		"sh", "-c", "exec `ls -lL /bin /sbin /usr/bin /usr/local/bin 2>/dev/null | awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | gridmenu`", 0
+};
+
 static Key key[] = {
-	KEYS
+	{ Mod1Mask, XK_Return, run, term },
+	{ Mod1Mask, XK_p, run, proglist }, 
+	{ Mod1Mask | ShiftMask, XK_c, kill, NULL}, 
+	{ Mod1Mask | ShiftMask, XK_q, quit, NULL},
 };
 
 void
@@ -37,7 +49,7 @@ keypress(XEvent *e)
 	for(i = 0; i < len; i++)
 		if((keysym == key[i].keysym) && (key[i].mod == ev->state)) {
 			if(key[i].func)
-				key[i].func(key[i].arg);
+				key[i].func(key[i].aux);
 			return;
 		}
 }
diff --git a/util.c b/util.c
index 052d535..2cc2d4d 100644
--- a/util.c
+++ b/util.c
@@ -14,8 +14,6 @@
 
 #include "util.h"
 
-static char *shell = NULL;
-
 void
 error(char *errstr, ...) {
 	va_list ap;
@@ -85,21 +83,17 @@ swap(void **p1, void **p2)
 }
 
 void
-spawn(Display *dpy, const char *cmd)
+spawn(Display *dpy, char *argv[])
 {
-	if(!shell && !(shell = getenv("SHELL")))
-		shell = "/bin/sh";
-
-	if(!cmd)
+	if(!argv || !argv[0])
 		return;
 	if(fork() == 0) {
 		if(fork() == 0) {
 			if(dpy)
 				close(ConnectionNumber(dpy));
 			setsid();
-			fprintf(stderr, "gridwm: execlp %s %s -c %s", shell, shell, cmd);
-			execlp(shell, shell, "-c", cmd, NULL);
-			fprintf(stderr, "gridwm: execlp %s", cmd);
+			execvp(argv[0], argv);
+			fprintf(stderr, "gridwm: execvp %s", argv[0]);
 			perror(" failed");
 		}
 		exit (0);
@@ -108,15 +102,12 @@ spawn(Display *dpy, const char *cmd)
 }
 
 void
-pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd)
+pipe_spawn(char *buf, unsigned int len, Display *dpy, char *argv[])
 {
 	unsigned int l, n;
 	int pfd[2];
 
-	if(!shell && !(shell = getenv("SHELL")))
-		shell = "/bin/sh";
-
-	if(!cmd)
+	if(!argv || !argv[0])
 		return;
 
 	if(pipe(pfd) == -1) {
@@ -131,8 +122,8 @@ pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd)
 		dup2(pfd[1], STDOUT_FILENO);
 		close(pfd[0]);
 		close(pfd[1]);
-		execlp(shell, shell, "-c", cmd, NULL);
-		fprintf(stderr, "gridwm: execlp %s", cmd);
+		execvp(argv[0], argv);
+		fprintf(stderr, "gridwm: execvp %s", argv[0]);
 		perror(" failed");
 	}
 	else {
diff --git a/util.h b/util.h
index 51b0871..00f0714 100644
--- a/util.h
+++ b/util.h
@@ -9,12 +9,16 @@ extern void *emallocz(unsigned int size);
 extern void *emalloc(unsigned int size);
 extern void *erealloc(void *ptr, unsigned int size);
 extern char *estrdup(const char *str);
-#define eassert(a) do { \
+#define eassert(a) \
+	do { \
 		if(!(a)) \
 			failed_assert(#a, __FILE__, __LINE__); \
 	} while (0)
 extern void failed_assert(char *a, char *file, int line);
-void pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd);
-extern void spawn(Display *dpy, const char *cmd);
+extern void pipe_spawn(char *buf, unsigned int len, Display *dpy, char *argv[]);
+extern void spawn(Display *dpy, char *argv[]);
 extern void swap(void **p1, void **p2);
-unsigned char *getselection(unsigned long offset, unsigned long *len, unsigned long *remain);
+extern unsigned char *getselection(unsigned long offset, unsigned long *len,
+		unsigned long *remain);
+extern unsigned int tokenize(char **result, unsigned int reslen,
+		char *str, char delim);
diff --git a/wm.c b/wm.c
index b156cba..f247372 100644
--- a/wm.c
+++ b/wm.c
@@ -3,10 +3,15 @@
  * See LICENSE file for license details.
  */
 
+#include <errno.h>
+
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 
+#include <sys/types.h>
+#include <sys/time.h>
+
 #include <X11/cursorfont.h>
 #include <X11/Xatom.h>
 #include <X11/Xproto.h>
@@ -160,12 +165,9 @@ startup_error_handler(Display *dpy, XErrorEvent *error)
 static void
 cleanup()
 {
-	/*
-	Client *c;
-	for(c=client; c; c=c->next)
-		reparent_client(c, root, c->sel->rect.x, c->sel->rect.y);
+	while(clients)
+		unmanage(clients);
 	XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
-	*/
 }
 
 int
@@ -176,6 +178,11 @@ main(int argc, char *argv[])
 	unsigned int mask;
 	Window w;
 	XEvent ev;
+	fd_set fds;
+	struct timeval t, timeout = {
+		.tv_usec = 0,
+		.tv_sec = STATUSDELAY,
+	};
 
 	/* command line args */
 	for(i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
@@ -264,9 +271,19 @@ main(int argc, char *argv[])
 	scan_wins();
 
 	while(running) {
-		XNextEvent(dpy, &ev);
-		if(handler[ev.type])
-			(handler[ev.type]) (&ev); /* call handler */
+		if(XPending(dpy) > 0) {
+			XNextEvent(dpy, &ev);
+			if(handler[ev.type])
+				(handler[ev.type]) (&ev); /* call handler */
+			continue;
+		}
+		FD_ZERO(&fds);
+		FD_SET(ConnectionNumber(dpy), &fds);
+		t = timeout;
+		if(select(ConnectionNumber(dpy) + 1, &fds, NULL, NULL, &t) > 0)
+			continue;
+		else if(errno != EINTR)
+			draw_bar();
 	}
 
 	cleanup();
diff --git a/wm.h b/wm.h
index b9ba8f7..24662fa 100644
--- a/wm.h
+++ b/wm.h
@@ -42,8 +42,8 @@ struct Client {
 struct Key {
 	unsigned long mod;
 	KeySym keysym;
-	void (*func)(char *arg);
-	char *arg;
+	void (*func)(void *aux);
+	void *aux;
 };
 
 extern Display *dpy;
@@ -64,8 +64,9 @@ extern Client *clients, *stack;
 extern void draw_bar();
 
 /* cmd.c */
-extern void run(char *arg);
-extern void quit(char *arg);
+extern void run(void *aux);
+extern void quit(void *aux);
+extern void kill(void *aux);
 
 /* client.c */
 extern void manage(Window w, XWindowAttributes *wa);
devel&id=2104863910d8b54d575b81bc48a49770b2a8f93d'>^
9ecb1aae8 ^
d07489abf ^

669a56449 ^


















d07489abf ^
dae545094 ^

43832f8e5 ^
dae545094 ^


0a8762eb7 ^
669a56449 ^

d07489abf ^
669a56449 ^




86556ebfd ^

669a56449 ^





c640bd2d1 ^
669a56449 ^


c94647aec ^
669a56449 ^


c640bd2d1 ^
669a56449 ^


























cb9110c43 ^
b3c3a4631 ^

669a56449 ^
c94647aec ^
669a56449 ^



c94647aec ^
669a56449 ^




3d88d06b3 ^



669a56449 ^

cae197385 ^
669a56449 ^
cae197385 ^

669a56449 ^

8fc7cecfa ^
669a56449 ^











1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270