Window *WindowManager::get_window_at_pos(int pointer_x, int pointer_y)
{
- std::list<Window*>::reverse_iterator rit = windows.rbegin();
- while(rit != windows.rend()) {
- Window *w = *rit++;
- Window *parent = w->get_parent();
-
- if(parent == root_win && w->contains_point(pointer_x, pointer_y)) {
- return w;
+ Window *root_win = wm->get_root_window();
+ Window **children = root_win->get_children();
+ for(int i=root_win->get_children_count() - 1; i>=0; i--) {
+ if(children[i]->contains_point(pointer_x, pointer_y)) {
+ return children[i];
}
}
return 0;
}
+Window *WindowManager::get_root_window() const
+{
+ return root_win;
+}
+
void WindowManager::set_focused_frame_color(int r, int g, int b)
{
frame_fcolor[0] = r;
grab_win = 0;
}
+void WindowManager::raise_window(Window *win)
+{
+ if(!win) {
+ return;
+ }
+
+ Window *parent = win->get_parent();
+ if(parent != root_win) {
+ if(parent->get_parent() == root_win) {
+ win = parent;
+ }
+ else {
+ return;
+ }
+ }
+
+ root_win->remove_child(win);
+ root_win->add_child(win);
+}
+
+void WindowManager::sink_window(Window *win)
+{
+ if(!win) {
+ return;
+ }
+
+ std::list<Window*>::iterator it;
+ it = std::find(windows.begin(), windows.end(), win);
+ if(it != windows.end()) {
+ windows.erase(it);
+ windows.push_front(win);
+ }
+}
+
static void display(Window *win)
{
//frame display:
if(bn == 0) {
if(pressed) {
wm->grab_mouse(win);
+ wm->raise_window(win);
prev_x = x;
prev_y = y;
}
static void motion(Window *win, int x, int y)
{
int left_bn = get_button(0);
+ int right_button = get_button(2);
+
if(left_bn) {
int dx = x - prev_x;
int dy = y - prev_y;