diff options
Diffstat (limited to 'src/event.c')
-rw-r--r-- | src/event.c | 64 |
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, + ®ion.extents)) + { + region.rects = ®ion.extents; + region.numRects = region.size = 1; - damageScreenRegion (screen, &rect); + damageScreenRegion (w->screen, ®ion); + } + } + } + break; + } } |