added bar event timer

This commit is contained in:
Anselm R. Garbe 2006-07-11 18:15:11 +02:00
parent 3399650076
commit 586f66331d
9 changed files with 87 additions and 51 deletions

12
bar.c
View File

@ -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);

View File

@ -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)
{
}

10
cmd.c
View File

@ -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;

View File

@ -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 */

16
key.c
View File

@ -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;
}
}

25
util.c
View File

@ -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 {

12
util.h
View File

@ -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);

33
wm.c
View File

@ -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();

9
wm.h
View File

@ -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);