X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fwm.cc;h=1b283fc9f29890c18e104ddc4f5ccac366ebe8f5;hb=ffd2c0a0f8b898cb4199a0c63aff255a85cc0f11;hp=0428a7cce19e0f6722a8a34c168d672d2cc1c132;hpb=8a92836b3af157fd47c657cfe546887e5f5683a8;p=winnie diff --git a/src/wm.cc b/src/wm.cc index 0428a7c..1b283fc 100644 --- a/src/wm.cc +++ b/src/wm.cc @@ -1,8 +1,8 @@ #include +#include "gfx.h" #include "wm.h" #include "window.h" - WindowManager *wm; static WindowManager wminst; @@ -13,6 +13,12 @@ WindowManager::WindowManager() } else { throw std::runtime_error("Trying to create a second instance of WindowManager!\n"); } + + focused_win = 0; + + bg_color[0] = 210; + bg_color[1] = 106; + bg_color[2] = 106; } void WindowManager::invalidate_region(const Rect &rect) @@ -22,16 +28,49 @@ void WindowManager::invalidate_region(const Rect &rect) void WindowManager::process_windows() { - //TODO: - //sta dirty rectangles na brw to union - //na eleg3w poia einai sto dirty area k na ta kanw dirty - //na ka8arizw ta dirty areas - //prwta render to bg - //meta ola ta dirty: + if(dirty_rects.empty()) { + return; + } + + std::list::iterator drit = dirty_rects.begin(); + Rect uni = *drit++; + while(drit != dirty_rects.end()) { + uni = rect_union(uni, *drit++); + } + dirty_rects.clear(); + + fill_rect(uni, bg_color[0], bg_color[1], bg_color[2]); + std::list::iterator it = windows.begin(); while(it != windows.end()) { - if((*it)->dirty) { + Rect intersect = rect_intersection((*it)->rect, uni); + if(intersect.width && intersect.height) { (*it)->draw(); } + it++; + } +} + +void WindowManager::add_window(Window *win) +{ + if(windows.empty()) { + focused_win = win; } + + windows.push_back(win); +} + +void WindowManager::set_focused_window(Window *win) +{ + focused_win = win; +} + +const Window *WindowManager::get_focused_window() const +{ + return focused_win; +} + +Window *WindowManager::get_focused_window() +{ + return focused_win; }