*work in progress*
[winnie] / src / wm.cc
1 #include <stdexcept>
2 #include "gfx.h"
3 #include "wm.h"
4 #include "window.h"
5
6 WindowManager *wm;
7 static WindowManager wminst;
8
9 WindowManager::WindowManager()
10 {
11         if(!wm) {
12                 wm = this;
13         } else {
14                 throw std::runtime_error("Trying to create a second instance of WindowManager!\n");
15         }
16
17         focused_win = 0;
18
19         bg_color[0] = 210;
20         bg_color[1] = 106;
21         bg_color[2] = 106;
22 }
23
24 void WindowManager::invalidate_region(const Rect &rect)
25 {
26         dirty_rects.push_back(rect);
27 }
28
29 void WindowManager::process_windows()
30 {
31         if(dirty_rects.empty()) {
32                 return;
33         }
34
35         std::list<Rect>::iterator drit = dirty_rects.begin();
36         Rect uni = *drit++;
37         while(drit != dirty_rects.end()) {
38                 uni = rect_union(uni, *drit++);
39         }
40         dirty_rects.clear();
41
42         fill_rect(uni, bg_color[0], bg_color[1], bg_color[2]);
43         
44         std::list<Window*>::iterator it = windows.begin();
45         while(it != windows.end()) {
46                 Rect intersect = rect_intersection((*it)->rect, uni); 
47                 if(intersect.width && intersect.height) {
48                         (*it)->draw();
49                 }
50                 it++;
51         }
52 }
53
54 void WindowManager::add_window(Window *win)
55 {
56         if(windows.empty()) {
57                 focused_win = win;
58         }
59
60         windows.push_back(win);
61 }
62
63 void WindowManager::set_focused_window(Window *win)
64 {
65         focused_win = win;
66 }
67
68 const Window *WindowManager::get_focused_window() const
69 {
70         return focused_win;
71 }
72
73 Window *WindowManager::get_focused_window()
74 {
75         return focused_win;
76 }
77
78 Window *WindowManager::get_window_at_pos(int pointer_x, int pointer_y)
79 {
80         Window *win = 0;
81         std::list<Window*>::reverse_iterator rit = windows.rbegin();
82         while(rit != windows.rend()) {
83                 if((*rit)->contains_point(pointer_x, pointer_y)) {
84                         win = *rit;
85                         break;
86                 }
87                 rit++;
88         }
89
90         return win;
91 }