summaryrefslogtreecommitdiff
path: root/src/event.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/event.c')
-rw-r--r--src/event.c64
1 files changed, 35 insertions, 29 deletions
diff --git a/src/event.c b/src/event.c
index ccabfca..6dd80b7 100644
--- a/src/event.c
+++ b/src/event.c
@@ -230,39 +230,45 @@ handleEvent (CompDisplay *display,
}
else if (event->type == display->damageEvent + XDamageNotify)
{
- (*display->handleDamageEvent) (display,
- (XDamageNotifyEvent *) event);
- }
- break;
- }
-}
+ XDamageNotifyEvent *de = (XDamageNotifyEvent *) event;
-void
-handleDamageEvent (CompDisplay *display,
- XDamageNotifyEvent *event)
-{
- CompScreen *screen;
- REGION rect;
-
- rect.rects = &rect.extents;
- rect.numRects = rect.size = 1;
+ if (lastDamagedWindow && de->drawable == lastDamagedWindow->id)
+ {
+ w = lastDamagedWindow;
+ }
+ else
+ {
+ w = findWindowAtDisplay (display, de->drawable);
+ if (w)
+ lastDamagedWindow = w;
+ }
- screen = display->screens;
- if (screen->next)
- {
- CompWindow *w;
+ if (w)
+ {
+ REGION region;
+ Bool initial = FALSE;
- w = findWindowAtDisplay (display, event->drawable);
- if (!w)
- return;
+ if (!w->damaged)
+ {
+ w->damaged = initial = TRUE;
+ w->invisible = WINDOW_INVISIBLE (w);
+ }
- screen = w->screen;
- }
+ region.extents.x1 = de->geometry.x + de->area.x;
+ region.extents.y1 = de->geometry.y + de->area.y;
+ region.extents.x2 = region.extents.x1 + de->area.width;
+ region.extents.y2 = region.extents.y1 + de->area.height;
- rect.extents.x1 = event->geometry.x + event->area.x;
- rect.extents.y1 = event->geometry.y + event->area.y;
- rect.extents.x2 = rect.extents.x1 + event->area.width;
- rect.extents.y2 = rect.extents.y1 + event->area.height;
+ if (!(*w->screen->damageWindowRect) (w, initial,
+ &region.extents))
+ {
+ region.rects = &region.extents;
+ region.numRects = region.size = 1;
- damageScreenRegion (screen, &rect);
+ damageScreenRegion (w->screen, &region);
+ }
+ }
+ }
+ break;
+ }
}