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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										33
									
								
								wm.c
								
								
								
								
							
							
						
						
									
										33
									
								
								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) {
 | 
				
			||||||
		XNextEvent(dpy, &ev);
 | 
							if(XPending(dpy) > 0) {
 | 
				
			||||||
		if(handler[ev.type])
 | 
								XNextEvent(dpy, &ev);
 | 
				
			||||||
			(handler[ev.type]) (&ev); /* call handler */
 | 
								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();
 | 
						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