mirror of git://git.suckless.org/dwm
added bar event timer
This commit is contained in:
parent
3399650076
commit
586f66331d
12
bar.c
12
bar.c
|
@ -5,12 +5,22 @@
|
||||||
|
|
||||||
#include "wm.h"
|
#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
|
void
|
||||||
draw_bar()
|
draw_bar()
|
||||||
{
|
{
|
||||||
|
static char buf[1024];
|
||||||
|
|
||||||
|
buf[0] = 0;
|
||||||
|
pipe_spawn(buf, sizeof(buf), dpy, (char **)status);
|
||||||
|
|
||||||
brush.rect = barrect;
|
brush.rect = barrect;
|
||||||
brush.rect.x = brush.rect.y = 0;
|
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,
|
XCopyArea(dpy, brush.drawable, barwin, brush.gc, 0, 0, barrect.width,
|
||||||
barrect.height, 0, 0);
|
barrect.height, 0, 0);
|
||||||
|
|
9
client.c
9
client.c
|
@ -122,6 +122,8 @@ unmanage(Client *c)
|
||||||
XSetErrorHandler(error_handler);
|
XSetErrorHandler(error_handler);
|
||||||
XUngrabServer(dpy);
|
XUngrabServer(dpy);
|
||||||
flush_events(EnterWindowMask);
|
flush_events(EnterWindowMask);
|
||||||
|
if(stack)
|
||||||
|
focus(stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -135,3 +137,10 @@ getclient(Window w)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
draw_client(Client *c)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
10
cmd.c
10
cmd.c
|
@ -5,22 +5,22 @@
|
||||||
|
|
||||||
#include "wm.h"
|
#include "wm.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
void
|
void
|
||||||
run(char *arg)
|
run(void *aux)
|
||||||
{
|
{
|
||||||
spawn(dpy, arg);
|
spawn(dpy, aux);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
quit(char *arg)
|
quit(void *aux)
|
||||||
{
|
{
|
||||||
fputs("quit\n", stderr);
|
|
||||||
running = False;
|
running = False;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
kill(char *arg)
|
kill(void *aux)
|
||||||
{
|
{
|
||||||
Client *c = stack;
|
Client *c = stack;
|
||||||
|
|
||||||
|
|
12
config.h
12
config.h
|
@ -3,16 +3,8 @@
|
||||||
* See LICENSE file for license details.
|
* See LICENSE file for license details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define FONT "-*-terminus-medium-*-*-*-14-*-*-*-*-*-iso10646-*"
|
#define FONT "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*"
|
||||||
#define BGCOLOR "#000000"
|
#define BGCOLOR "#000000"
|
||||||
#define FGCOLOR "#ffaa00"
|
#define FGCOLOR "#ffaa00"
|
||||||
#define BORDERCOLOR "#000000"
|
#define BORDERCOLOR "#000000"
|
||||||
#define STATUSCMD "echo -n `date` `uptime | sed 's/.*://; s/,//g'`" \
|
#define STATUSDELAY 1 /* milliseconds */
|
||||||
" `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},
|
|
||||||
|
|
||||||
|
|
16
key.c
16
key.c
|
@ -7,8 +7,20 @@
|
||||||
|
|
||||||
#include <X11/keysym.h>
|
#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[] = {
|
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
|
void
|
||||||
|
@ -37,7 +49,7 @@ keypress(XEvent *e)
|
||||||
for(i = 0; i < len; i++)
|
for(i = 0; i < len; i++)
|
||||||
if((keysym == key[i].keysym) && (key[i].mod == ev->state)) {
|
if((keysym == key[i].keysym) && (key[i].mod == ev->state)) {
|
||||||
if(key[i].func)
|
if(key[i].func)
|
||||||
key[i].func(key[i].arg);
|
key[i].func(key[i].aux);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
25
util.c
25
util.c
|
@ -14,8 +14,6 @@
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
static char *shell = NULL;
|
|
||||||
|
|
||||||
void
|
void
|
||||||
error(char *errstr, ...) {
|
error(char *errstr, ...) {
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
@ -85,21 +83,17 @@ swap(void **p1, void **p2)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
spawn(Display *dpy, const char *cmd)
|
spawn(Display *dpy, char *argv[])
|
||||||
{
|
{
|
||||||
if(!shell && !(shell = getenv("SHELL")))
|
if(!argv || !argv[0])
|
||||||
shell = "/bin/sh";
|
|
||||||
|
|
||||||
if(!cmd)
|
|
||||||
return;
|
return;
|
||||||
if(fork() == 0) {
|
if(fork() == 0) {
|
||||||
if(fork() == 0) {
|
if(fork() == 0) {
|
||||||
if(dpy)
|
if(dpy)
|
||||||
close(ConnectionNumber(dpy));
|
close(ConnectionNumber(dpy));
|
||||||
setsid();
|
setsid();
|
||||||
fprintf(stderr, "gridwm: execlp %s %s -c %s", shell, shell, cmd);
|
execvp(argv[0], argv);
|
||||||
execlp(shell, shell, "-c", cmd, NULL);
|
fprintf(stderr, "gridwm: execvp %s", argv[0]);
|
||||||
fprintf(stderr, "gridwm: execlp %s", cmd);
|
|
||||||
perror(" failed");
|
perror(" failed");
|
||||||
}
|
}
|
||||||
exit (0);
|
exit (0);
|
||||||
|
@ -108,15 +102,12 @@ spawn(Display *dpy, const char *cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
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;
|
unsigned int l, n;
|
||||||
int pfd[2];
|
int pfd[2];
|
||||||
|
|
||||||
if(!shell && !(shell = getenv("SHELL")))
|
if(!argv || !argv[0])
|
||||||
shell = "/bin/sh";
|
|
||||||
|
|
||||||
if(!cmd)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(pipe(pfd) == -1) {
|
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);
|
dup2(pfd[1], STDOUT_FILENO);
|
||||||
close(pfd[0]);
|
close(pfd[0]);
|
||||||
close(pfd[1]);
|
close(pfd[1]);
|
||||||
execlp(shell, shell, "-c", cmd, NULL);
|
execvp(argv[0], argv);
|
||||||
fprintf(stderr, "gridwm: execlp %s", cmd);
|
fprintf(stderr, "gridwm: execvp %s", argv[0]);
|
||||||
perror(" failed");
|
perror(" failed");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
12
util.h
12
util.h
|
@ -9,12 +9,16 @@ extern void *emallocz(unsigned int size);
|
||||||
extern void *emalloc(unsigned int size);
|
extern void *emalloc(unsigned int size);
|
||||||
extern void *erealloc(void *ptr, unsigned int size);
|
extern void *erealloc(void *ptr, unsigned int size);
|
||||||
extern char *estrdup(const char *str);
|
extern char *estrdup(const char *str);
|
||||||
#define eassert(a) do { \
|
#define eassert(a) \
|
||||||
|
do { \
|
||||||
if(!(a)) \
|
if(!(a)) \
|
||||||
failed_assert(#a, __FILE__, __LINE__); \
|
failed_assert(#a, __FILE__, __LINE__); \
|
||||||
} while (0)
|
} while (0)
|
||||||
extern void failed_assert(char *a, char *file, int line);
|
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 pipe_spawn(char *buf, unsigned int len, Display *dpy, char *argv[]);
|
||||||
extern void spawn(Display *dpy, const char *cmd);
|
extern void spawn(Display *dpy, char *argv[]);
|
||||||
extern void swap(void **p1, void **p2);
|
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);
|
||||||
|
|
27
wm.c
27
wm.c
|
@ -3,10 +3,15 @@
|
||||||
* See LICENSE file for license details.
|
* See LICENSE file for license details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
#include <X11/cursorfont.h>
|
#include <X11/cursorfont.h>
|
||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
#include <X11/Xproto.h>
|
#include <X11/Xproto.h>
|
||||||
|
@ -160,12 +165,9 @@ startup_error_handler(Display *dpy, XErrorEvent *error)
|
||||||
static void
|
static void
|
||||||
cleanup()
|
cleanup()
|
||||||
{
|
{
|
||||||
/*
|
while(clients)
|
||||||
Client *c;
|
unmanage(clients);
|
||||||
for(c=client; c; c=c->next)
|
|
||||||
reparent_client(c, root, c->sel->rect.x, c->sel->rect.y);
|
|
||||||
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
|
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -176,6 +178,11 @@ main(int argc, char *argv[])
|
||||||
unsigned int mask;
|
unsigned int mask;
|
||||||
Window w;
|
Window w;
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
|
fd_set fds;
|
||||||
|
struct timeval t, timeout = {
|
||||||
|
.tv_usec = 0,
|
||||||
|
.tv_sec = STATUSDELAY,
|
||||||
|
};
|
||||||
|
|
||||||
/* command line args */
|
/* command line args */
|
||||||
for(i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
|
for(i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
|
||||||
|
@ -264,9 +271,19 @@ main(int argc, char *argv[])
|
||||||
scan_wins();
|
scan_wins();
|
||||||
|
|
||||||
while(running) {
|
while(running) {
|
||||||
|
if(XPending(dpy) > 0) {
|
||||||
XNextEvent(dpy, &ev);
|
XNextEvent(dpy, &ev);
|
||||||
if(handler[ev.type])
|
if(handler[ev.type])
|
||||||
(handler[ev.type]) (&ev); /* call handler */
|
(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();
|
cleanup();
|
||||||
|
|
9
wm.h
9
wm.h
|
@ -42,8 +42,8 @@ struct Client {
|
||||||
struct Key {
|
struct Key {
|
||||||
unsigned long mod;
|
unsigned long mod;
|
||||||
KeySym keysym;
|
KeySym keysym;
|
||||||
void (*func)(char *arg);
|
void (*func)(void *aux);
|
||||||
char *arg;
|
void *aux;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern Display *dpy;
|
extern Display *dpy;
|
||||||
|
@ -64,8 +64,9 @@ extern Client *clients, *stack;
|
||||||
extern void draw_bar();
|
extern void draw_bar();
|
||||||
|
|
||||||
/* cmd.c */
|
/* cmd.c */
|
||||||
extern void run(char *arg);
|
extern void run(void *aux);
|
||||||
extern void quit(char *arg);
|
extern void quit(void *aux);
|
||||||
|
extern void kill(void *aux);
|
||||||
|
|
||||||
/* client.c */
|
/* client.c */
|
||||||
extern void manage(Window w, XWindowAttributes *wa);
|
extern void manage(Window w, XWindowAttributes *wa);
|
||||||
|
|
Loading…
Reference in New Issue