X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fwindow.cc;h=fb46b381da7e53eee2b2eac5a7a0d1d9d101bb2e;hb=fd0b93374d8e5a49c16b5e9fe5a0468d00a21c36;hp=21ff70f00f4400e9eca1d03ceb9b2be1caab2684;hpb=ecb25bb23fcd6f98fb049297483e312c84fd7b5b;p=winnie diff --git a/src/window.cc b/src/window.cc index 21ff70f..fb46b38 100644 --- a/src/window.cc +++ b/src/window.cc @@ -1,4 +1,5 @@ #include +#include //TODO #include #include "gfx.h" @@ -90,24 +91,31 @@ void Window::invalidate() wm->invalidate_region(abs_rect); } -void Window::draw(const Rect &dirty_region) +void Window::draw(Rect *dirty_region) { Rect abs_rect = get_absolute_rect(); - Rect intersect = rect_intersection(abs_rect, dirty_region); + Rect intersect = rect_intersection(abs_rect, *dirty_region); if(intersect.width && intersect.height) { + Rect prev_clip = get_clipping_rect(); + set_clipping_rect(abs_rect); + if(callbacks.display) { callbacks.display(this); } dirty = false; draw_children(abs_rect); + + *dirty_region = rect_union(*dirty_region, abs_rect); + set_clipping_rect(prev_clip); } } void Window::draw_children(const Rect &dirty_region) { + Rect drect = dirty_region; for(size_t i=0; idraw(dirty_region); + children[i]->draw(&drect); } } @@ -143,6 +151,11 @@ bool Window::get_focusable() const return focusable; } +bool Window::get_dirty() const +{ + return dirty; +} + void Window::set_display_callback(DisplayFuncType func) { callbacks.display = func;