tadded bar event timer - dwm - [fork] customized build of dwm, the dynamic wind… | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 586f66331d1105be03c42e6faeae1672b974a98a | |
parent 33996500763b04119a6867dfa4040a4236c21a41 | |
Author: Anselm R. Garbe <[email protected]> | |
Date: Tue, 11 Jul 2006 18:15:11 +0200 | |
added bar event timer | |
Diffstat: | |
M bar.c | 12 +++++++++++- | |
M client.c | 9 +++++++++ | |
M cmd.c | 10 +++++----- | |
M config.h | 12 ++---------- | |
M key.c | 16 ++++++++++++++-- | |
M util.c | 25 ++++++++----------------- | |
M util.h | 12 ++++++++---- | |
M wm.c | 33 +++++++++++++++++++++++------… | |
M wm.h | 9 +++++---- | |
9 files changed, 87 insertions(+), 51 deletions(-) | |
--- | |
diff --git a/bar.c b/bar.c | |
t@@ -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 | |
t@@ -122,6 +122,8 @@ unmanage(Client *c) | |
XSetErrorHandler(error_handler); | |
XUngrabServer(dpy); | |
flush_events(EnterWindowMask); | |
+ if(stack) | |
+ focus(stack); | |
} | |
t@@ -135,3 +137,10 @@ getclient(Window w) | |
return NULL; | |
} | |
+void | |
+draw_client(Client *c) | |
+{ | |
+ | |
+ | |
+ | |
+} | |
diff --git a/cmd.c b/cmd.c | |
t@@ -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 | |
t@@ -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>/de… | |
- | |
-#define KEYS \ | |
- { Mod1Mask, XK_Return, run, "xterm -u8 -bg black -fg white -fn '-*-ter… | |
- { Mod1Mask, XK_p, run, PLCMD }, \ | |
- { Mod1Mask | ShiftMask, XK_q, quit, NULL}, | |
- | |
+#define STATUSDELAY 1 /* milliseconds */ | |
diff --git a/key.c b/key.c | |
t@@ -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… | |
+}; | |
+ | |
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 | |
t@@ -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 | |
t@@ -14,8 +14,6 @@ | |
#include "util.h" | |
-static char *shell = NULL; | |
- | |
void | |
error(char *errstr, ...) { | |
va_list ap; | |
t@@ -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, s… | |
- 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); | |
t@@ -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) { | |
t@@ -131,8 +122,8 @@ pipe_spawn(char *buf, unsigned int len, Display *dpy, cons… | |
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 | |
t@@ -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… | |
+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 | |
t@@ -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> | |
t@@ -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 | |
t@@ -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++) { | |
t@@ -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 | |
t@@ -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; | |
t@@ -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); |