removed (visual) bell. '\a' sets the urgency flag if st is unfocused. - st - Simple Terminal
       
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit e851736e8bd6c04f1805659d4783de2314ecb263
 (DIR) parent 188293c828033fd7ff74d753239b3a5052b372a2
 (HTM) Author: Aurélien Aptel <aurelien.aptel@gmail.com>
       Date:   Mon, 30 Aug 2010 03:05:05 +0200
       
       removed (visual) bell. '\a' sets the urgency flag if st is unfocused.
       
       Diffstat:
         config.h                            |       2 --
         st.c                                |      42 +++++++++++++++++++------------
       
       2 files changed, 26 insertions(+), 18 deletions(-)
       ---
 (DIR) diff --git a/config.h b/config.h
       @@ -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[] = {
 (DIR) diff --git a/st.c b/st.c
       @@ -108,6 +108,7 @@ typedef struct {
                int bufh; /* pixmap height */
                int ch; /* char height */
                int cw; /* char width  */
       +        int hasfocus;
        } XWindow; 
        
        ttypedef 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);