dwm

my fork of dwm
Index Commits Files Refs README LICENSE
commit 586f66331d1105be03c42e6faeae1672b974a98a
parent 33996500763b04119a6867dfa4040a4236c21a41
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Tue, 11 Jul 2006 18:15:11 +0200

added bar event timer

Diffstat:
Mbar.c | 12+++++++++++-
Mclient.c | 9+++++++++
Mcmd.c | 10+++++-----
Mconfig.h | 12++----------
Mkey.c | 16++++++++++++++--
Mutil.c | 25++++++++-----------------
Mutil.h | 12++++++++----
Mwm.c | 33+++++++++++++++++++++++++--------
Mwm.h | 9+++++----
9 files changed, 87 insertions(+), 51 deletions(-)
diff --git 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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);