st

simple terminal
git clone https://git.parazyd.org/st
Log | Files | Refs | README | LICENSE

commit ab7037cb33b4be4d16e3197d907066ed5b8ab16b
parent f693476365c9383ac83420319dd69372c55f9f50
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:
Mst.c | 29+++++++++++++++++++++++++----
1 file changed, 25 insertions(+), 4 deletions(-)

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);