Redraw the screen when a ObWindow is destroyed, but not on every related event
authorDana Jansens <danakj@orodu.net>
Sun, 27 Jun 2010 11:27:14 +0000 (13:27 +0200)
committerDana Jansens <danakj@orodu.net>
Sun, 27 Jun 2010 11:27:14 +0000 (13:27 +0200)
We won't get an event we recognize is a window if we destroy the window
 (such as a MenuFrame going away), as the event will no longer be tracable
 to that window.
Also don't redraw on every map/unmap/configurenotify we see, just ones for
 the top-level windows.

openbox/event.c
openbox/window.c

index b9ed709c7311580a4185ea9029b3445afa7fbdc5..2dcdb6caf496dcc034a9415cd2d52198331c9c70 100644 (file)
@@ -1819,15 +1819,15 @@ static void event_handle_window(ObWindow *wi, XEvent *e)
         break;
 
     case MapNotify:
-        composite_dirty();
         if (e->xmap.window == window_redir(wi)) {
+            composite_dirty();
             wi->mapped = TRUE;
             pixchange = TRUE;
         }
         break;
     case UnmapNotify:
-        composite_dirty();
         if (e->xunmap.window == window_top(wi)) {
+            composite_dirty();
             wi->mapped = FALSE;
         }
         break;
@@ -1838,8 +1838,8 @@ static void event_handle_window(ObWindow *wi, XEvent *e)
             e->type == obt_display_extension_shape_basep + ShapeNotify)
         {
             XShapeEvent *s = (XShapeEvent*)e;
-            composite_dirty();
             if (s->window == window_redir(wi) && s->kind == ShapeBounding) {
+                composite_dirty();
                 window_adjust_redir_shape(wi);
             }
         }
index b9f58310e878307d977e819389af2ddcefddf59d..6a0d1632ca2fd6d1f37777b3a2427aff84364110 100644 (file)
@@ -117,8 +117,11 @@ void window_set_top_area(ObWindow *self, const Rect *r, gint border)
 
 void window_cleanup(ObWindow *self)
 {
-    if (window_redir(self))
+    if (window_redir(self)) {
         composite_window_cleanup(self);
+        /* when the window goes away, we will need to redraw */
+        composite_dirty();
+    }
 }
 
 void window_free(ObWindow *self)