diff --git a/main.c b/main.c
index af00ee1..2595889 100644
--- a/main.c
+++ b/main.c
@@ -420,7 +420,7 @@ void run(void) {
 	fd_set fds;
 	struct timeval timeout;
 	XEvent ev, nextev;
-	unsigned int qlen;
+	bool discard;
 
 	redraw();
 
@@ -453,10 +453,20 @@ void run(void) {
 
 		do {
 			XNextEvent(win.env.dpy, &ev);
-			qlen = XEventsQueued(win.env.dpy, QueuedAlready);
-			if (qlen > 0)
+			discard = false;
+			if (XEventsQueued(win.env.dpy, QueuedAlready) > 0) {
 				XPeekEvent(win.env.dpy, &nextev);
-		} while (qlen > 0 && ev.type == nextev.type);
+				switch (ev.type) {
+					case ConfigureNotify:
+						discard = ev.type == nextev.type;
+						break;
+					case KeyPress:
+						discard = (nextev.type == KeyPress || nextev.type == KeyRelease)
+						          && ev.xkey.keycode == nextev.xkey.keycode;
+						break;
+				}
+			}
+		} while (discard);
 
 		switch (ev.type) {
 			/* handle events */
@@ -482,9 +492,11 @@ void run(void) {
 					}
 				}
 				break;
+			case Expose:
+				win_expose(&win, &ev.xexpose);
+				break;
 			case KeyPress:
-				if (qlen == 0 || ev.xkey.keycode != nextev.xkey.keycode)
-					on_keypress(&ev.xkey);
+				on_keypress(&ev.xkey);
 				break;
 			case MotionNotify:
 				if (mode == MODE_IMAGE) {
diff --git a/window.c b/window.c
index 0d86925..b9970a6 100644
--- a/window.c
+++ b/window.c
@@ -188,8 +188,9 @@ void win_open(win_t *win) {
 	if (win->xwin == None)
 		die("could not create window");
 	
-	XSelectInput(e->dpy, win->xwin, StructureNotifyMask | KeyPressMask |
-	             ButtonPressMask | ButtonReleaseMask | PointerMotionMask);
+	XSelectInput(e->dpy, win->xwin,
+	             ExposureMask | ButtonReleaseMask | ButtonPressMask |
+	             KeyPressMask | PointerMotionMask | StructureNotifyMask);
 
 	carrow = XCreateFontCursor(e->dpy, XC_left_ptr);
 	chand = XCreateFontCursor(e->dpy, XC_fleur);
@@ -246,10 +247,15 @@ void win_close(win_t *win) {
 bool win_configure(win_t *win, XConfigureEvent *c) {
 	bool changed;
 
-	if (win == NULL)
+	if (win == NULL || c == NULL)
 		return false;
 	
-	changed = win->w != c->width || win->h + win->barh != c->height;
+	if ((changed = win->w != c->width || win->h + win->barh != c->height)) {
+		if (win->pm != None) {
+			XFreePixmap(win->env.dpy, win->pm);
+			win->pm = None;
+		}
+	}
 
 	win->x = c->x;
 	win->y = c->y;
@@ -260,6 +266,14 @@ bool win_configure(win_t *win, XConfigureEvent *c) {
 	return changed;
 }
 
+void win_expose(win_t *win, XExposeEvent *e) {
+	if (win == NULL || win->xwin == None || win->pm == None || e == NULL)
+		return;
+
+	XCopyArea(win->env.dpy, win->pm, win->xwin, gc,
+	          e->x, e->y, e->width, e->height, e->x, e->y);
+}
+
 bool win_moveresize(win_t *win, int x, int y, unsigned int w, unsigned int h) {
 	if (win == NULL || win->xwin == None)
 		return false;
@@ -323,19 +337,20 @@ void win_toggle_bar(win_t *win) {
 }
 
 void win_clear(win_t *win) {
+	int h;
 	win_env_t *e;
 
 	if (win == NULL || win->xwin == None)
 		return;
 
+	h = win->h + win->barh;
 	e = &win->env;
 
-	if (win->pm != None)
-		XFreePixmap(e->dpy, win->pm);
-	win->pm = XCreatePixmap(e->dpy, win->xwin, e->scrw, e->scrh, e->depth);
+	if (win->pm == None)
+		win->pm = XCreatePixmap(e->dpy, win->xwin, win->w, h, e->depth);
 
 	XSetForeground(e->dpy, gc, win->fullscreen ? win->fscol : win->bgcol);
-	XFillRectangle(e->dpy, win->pm, gc, 0, 0, e->scrw, e->scrh);
+	XFillRectangle(e->dpy, win->pm, gc, 0, 0, win->w, h);
 }
 
 void win_draw_bar(win_t *win) {
@@ -343,7 +358,7 @@ void win_draw_bar(win_t *win) {
 	int len, x, y, w, tw = 0, seplen;
 	const char *rt;
 
-	if (win == NULL || win->xwin == None)
+	if (win == NULL || win->xwin == None || win->pm == None)
 		return;
 
 	e = &win->env;
@@ -391,18 +406,19 @@ void win_draw_bar(win_t *win) {
 }
 
 void win_draw(win_t *win) {
-	if (win == NULL || win->xwin == None)
+	if (win == NULL || win->xwin == None || win->pm == None)
 		return;
 
 	if (win->barh > 0)
 		win_draw_bar(win);
 
-	XSetWindowBackgroundPixmap(win->env.dpy, win->xwin, win->pm);
-	XClearWindow(win->env.dpy, win->xwin);
+	XCopyArea(win->env.dpy, win->pm, win->xwin, gc,
+	          0, 0, win->w, win->h + win->barh, 0, 0);
 }
 
 void win_draw_rect(win_t *win, Pixmap pm, int x, int y, int w, int h,
-		bool fill, int lw, unsigned long col) {
+                   bool fill, int lw, unsigned long col)
+{
 	XGCValues gcval;
 
 	if (win == NULL || pm == None)
diff --git a/window.h b/window.h
index c3948cd..5e033e3 100644
--- a/window.h
+++ b/window.h
@@ -66,6 +66,7 @@ void win_open(win_t*);
 void win_close(win_t*);
 
 bool win_configure(win_t*, XConfigureEvent*);
+void win_expose(win_t*, XExposeEvent*);
 bool win_moveresize(win_t*, int, int, unsigned int, unsigned int);
 
 void win_toggle_fullscreen(win_t*);