don't draw if the window is not visible. - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit ab7037cb33b4be4d16e3197d907066ed5b8ab16b
 (DIR) parent f693476365c9383ac83420319dd69372c55f9f50
 (HTM) Author: Aurélien Aptel <aurelien.aptel@gmail.com>
       Date:   Sat, 11 Sep 2010 16:05:57 +0200
       
       don't draw if the window is not visible.
       
       Diffstat:
         M st.c                                |      29 +++++++++++++++++++++++++----
       
       1 file changed, 25 insertions(+), 4 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -115,6 +115,7 @@ typedef struct {
                int ch; /* char height */
                int cw; /* char width  */
                int hasfocus;
       +        int vis; /* is visible */
        } XWindow; 
        
        typedef struct {
       @@ -187,6 +188,8 @@ static void xloadcols(void);
        static void xseturgency(int);
        
        static void expose(XEvent *);
       +static void visibility(XEvent *);
       +static void unmap(XEvent *);
        static char* kmap(KeySym);
        static void kpress(XEvent *);
        static void resize(XEvent *);
       @@ -198,8 +201,10 @@ static void bmotion(XEvent *);
        
        static void (*handler[LASTEvent])(XEvent *) = {
                [KeyPress] = kpress,
       -        [Expose] = expose,
                [ConfigureNotify] = resize,
       +        [VisibilityNotify] = visibility,
       +        [UnmapNotify] = unmap,
       +        [Expose] = expose,
                [FocusIn] = focus,
                [FocusOut] = focus,
                [MotionNotify] = bmotion,
       @@ -1211,9 +1216,9 @@ xinit(void) {
                attrs.background_pixel = dc.col[DefaultBG];
                attrs.border_pixel = dc.col[DefaultBG];
                attrs.bit_gravity = NorthWestGravity;
       -        attrs.event_mask = ExposureMask | KeyPressMask
       -                | StructureNotifyMask | FocusChangeMask | PointerMotionMask
       -                | ButtonPressMask | ButtonReleaseMask;
       +        attrs.event_mask = FocusChangeMask | KeyPressMask
       +                | ExposureMask | VisibilityChangeMask | StructureNotifyMask
       +                | PointerMotionMask | ButtonPressMask | ButtonReleaseMask;
                attrs.colormap = xw.cmap;
        
                xw.win = XCreateWindow(xw.dis, XRootWindow(xw.dis, xw.scr), 0, 0,
       @@ -1321,6 +1326,9 @@ draw(int redraw_all) {
                Glyph base, new;
                char buf[DRAW_BUF_SIZ];
        
       +        if(!xw.vis)
       +                return;
       +
                xclear(0, 0, term.col-1, term.row-1);
                for(y = 0; y < term.row; y++) {
                        base = term.line[y][0];
       @@ -1358,6 +1366,19 @@ expose(XEvent *ev) {
        }
        
        void
       +visibility(XEvent *ev) {
       +        XVisibilityEvent *e = &ev->xvisibility;
       +        /* XXX if this goes from 0 to 1, need a full redraw for next Expose,
       +         * not just a buf copy */
       +        xw.vis = e->state != VisibilityFullyObscured;
       +}
       +
       +void
       +unmap(XEvent *ev) {
       +        xw.vis = 0;
       +}
       +
       +void
        xseturgency(int add) {
                XWMHints *h = XGetWMHints(xw.dis, xw.win);
                h->flags = add ? (h->flags | XUrgencyHint) : (h->flags & ~XUrgencyHint);