~petersanchez/st

e851736e8bd6c04f1805659d4783de2314ecb263 — Aurélien Aptel 13 years ago 188293c
removed (visual) bell. '\a' sets the urgency flag if st is unfocused.
2 files changed, 26 insertions(+), 18 deletions(-)

M config.h
M st.c
M config.h => config.h +0 -2
@@ 29,8 29,6 @@ static const char *colorname[] = {
#define DefaultFG 7
#define DefaultBG 0
#define DefaultCS 1
#define BellCol   DefaultFG
#define BellTime  30000 /* microseconds */

/* special keys */
static Key key[] = {

M st.c => st.c +26 -16
@@ 108,6 108,7 @@ typedef struct {
	int bufh; /* pixmap height */
	int ch; /* char height */
	int cw; /* char width  */
	int hasfocus;
} XWindow; 

typedef struct {


@@ 161,23 162,27 @@ static void ttyread(void);
static void ttyresize(int, int);
static void ttywrite(const char *, size_t);

static void xbell(void);
static void xdraws(char *, Glyph, int, int, int);
static void xhints(void);
static void xclear(int, int, int, int);
static void xdrawcursor(void);
static void xinit(void);
static void xloadcols(void);
static void xseturgency(int);

static void expose(XEvent *);
static char* kmap(KeySym);
static void kpress(XEvent *);
static void resize(XEvent *);
static void focus(XEvent *);


static void (*handler[LASTEvent])(XEvent *) = {
	[KeyPress] = kpress,
	[Expose] = expose,
	[ConfigureNotify] = resize
	[ConfigureNotify] = resize,
	[FocusIn] = focus,
	[FocusOut] = focus,
};

/* Globals */


@@ 187,7 192,6 @@ static Term term;
static CSIEscape escseq;
static int cmdfd;
static pid_t pid;
static int running;

#ifdef DEBUG
void


@@ 227,15 231,6 @@ execsh(void) {
	execvp(args[0], args);
}

void
xbell(void) {
	XSetForeground(xw.dis, dc.gc, dc.col[BellCol]);
	XFillRectangle(xw.dis, xw.win, dc.gc, BORDER, BORDER, xw.bufw, xw.bufh);
	XFlush(xw.dis);
	usleep(BellTime);
	draw(SCREEN_REDRAW);
}

void 
sigchld(int a) {
	int stat = 0;


@@ 930,7 925,8 @@ tputc(char c) {
			tnewline();
			break;
		case '\a':
			xbell();
			if(!xw.hasfocus)
				xseturgency(1);
			break;
		case '\033':
			csireset();


@@ 1208,6 1204,20 @@ expose(XEvent *ev) {
	draw(SCREEN_REDRAW);
}

void
xseturgency(int add) {
	XWMHints *h = XGetWMHints(xw.dis, xw.win);
	h->flags = add ? (h->flags | XUrgencyHint) : (h->flags & ~XUrgencyHint);
	XSetWMHints(xw.dis, xw.win, h);
	XFree(h);
}

void
focus(XEvent *ev) {
	if((xw.hasfocus = ev->type == FocusIn))
		xseturgency(0);
}

char*
kmap(KeySym k) {
	int i;


@@ 1282,12 1292,12 @@ run(void) {
	XEvent ev;
	fd_set rfd;
	int xfd = XConnectionNumber(xw.dis);
	long mask = ExposureMask | KeyPressMask | StructureNotifyMask | FocusChangeMask;

	running = 1;
	XSelectInput(xw.dis, xw.win, ExposureMask | KeyPressMask | StructureNotifyMask);
	XSelectInput(xw.dis, xw.win, mask);
	XResizeWindow(xw.dis, xw.win, xw.w, xw.h); /* XXX: fix resize bug in wmii (?) */

	while(running) {
	while(1) {
		FD_ZERO(&rfd);
		FD_SET(cmdfd, &rfd);
		FD_SET(xfd, &rfd);