X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fwm.cc;h=7fe13fbcf6a1929a38661722bdab202f5151ee28;hb=52044efd7717f4b02bd463c9a26f83c9a41953ea;hp=fd86d1d82960afc4251e68e735267692f2fede2c;hpb=65eda3d5a8e4ad8d28bda12cace044628c1a69be;p=winnie diff --git a/src/wm.cc b/src/wm.cc index fd86d1d..7fe13fb 100644 --- a/src/wm.cc +++ b/src/wm.cc @@ -3,10 +3,11 @@ #include // TODO #include "gfx.h" -#include "wm.h" -#include "window.h" #include "mouse.h" #include "mouse_cursor.h" +#include "text.h" +#include "wm.h" +#include "window.h" WindowManager *wm; static WindowManager wminst; @@ -80,8 +81,8 @@ WindowManager::WindowManager() frame_thickness = 8; titlebar_thickness = 16; - frame_fcolor[0] = frame_fcolor[1] = frame_fcolor[2] = 0; - frame_ucolor[0] = frame_ucolor[1] = frame_ucolor[2] = 255; + set_focused_frame_color(36, 59, 98); + set_unfocused_frame_color(80, 129, 162); mouse_cursor.set_image(mouse_cursor_width, mouse_cursor_height); unsigned char *pixels = mouse_cursor.get_image(); @@ -221,19 +222,22 @@ Window *WindowManager::get_focused_window() Window *WindowManager::get_window_at_pos(int pointer_x, int pointer_y) { - std::list::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; @@ -241,7 +245,7 @@ void WindowManager::set_focused_frame_color(int r, int g, int b) frame_fcolor[2] = b; } -void WindowManager::get_focused_frame_color(int *r, int *g, int *b) +void WindowManager::get_focused_frame_color(int *r, int *g, int *b) const { *r = frame_fcolor[0]; *g = frame_fcolor[1]; @@ -255,6 +259,13 @@ void WindowManager::set_unfocused_frame_color(int r, int g, int b) frame_ucolor[2] = b; } +void WindowManager::get_unfocused_frame_color(int *r, int *g, int *b) const +{ + *r = frame_ucolor[0]; + *g = frame_ucolor[1]; + *b = frame_ucolor[2]; +} + Window *WindowManager::get_grab_window() const { return grab_win; @@ -270,20 +281,61 @@ void WindowManager::release_mouse() grab_win = 0; } -static void display(Window *win) +void WindowManager::raise_window(Window *win) { - //frame display: - Window **children = win->get_children(); - for(int i=0; iget_children_count(); i++) { - if(children[0] == wm->get_focused_window()) { - int r, g, b; - wm->get_focused_frame_color(&r, &g, &b); - fill_rect(win->get_absolute_rect(), r, g, b); + if(!win) { + return; + } + + Window *parent = win->get_parent(); + if(parent != root_win) { + if(parent->get_parent() == root_win) { + win = parent; + } + else { return; } } - fill_rect(win->get_absolute_rect(), 74, 175, 198); + root_win->remove_child(win); + root_win->add_child(win); +} + +void WindowManager::sink_window(Window *win) +{ + if(!win) { + return; + } + + std::list::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: + Window *child = win->get_children()[0]; + int r, g, b; + Rect abs_rect = win->get_absolute_rect(); + + //TODO 5 not hardcoded + set_text_position(abs_rect.x + 5, abs_rect.y + 15); + set_text_color(255, 255, 255); + + if(child == wm->get_focused_window()) { + wm->get_focused_frame_color(&r, &g, &b); + fill_rect(abs_rect, r, g, b); + } + else { + wm->get_unfocused_frame_color(&r, &g, &b); + fill_rect(win->get_absolute_rect(), r, g, b); + } + + draw_text(child->get_title()); } static int prev_x, prev_y; @@ -293,6 +345,7 @@ static void mouse(Window *win, int bn, bool pressed, int x, int y) if(bn == 0) { if(pressed) { wm->grab_mouse(win); + wm->raise_window(win); prev_x = x; prev_y = y; } @@ -305,6 +358,8 @@ static void mouse(Window *win, int bn, bool pressed, int x, int 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;