X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fwm.cc;h=c9b8959770e4c997dd8bd11f390715d2c6fefa2e;hb=d02747c88b1df856c5531cdc4b7af5b3ac8a0dc3;hp=33f28795c30d65f4a63629f9379bd7378280c607;hpb=287b4d5d1b7eadfe9d5d0aa3b33700f3e1bed55e;p=winnie diff --git a/src/wm.cc b/src/wm.cc index 33f2879..c9b8959 100644 --- a/src/wm.cc +++ b/src/wm.cc @@ -80,8 +80,8 @@ WindowManager::WindowManager() frame_thickness = 8; titlebar_thickness = 16; - frame_fcolor[0] = frame_fcolor[1] = frame_fcolor[2] = 142; - frame_ucolor[0] = frame_ucolor[1] = frame_ucolor[2] = 210; + frame_fcolor[0] = frame_fcolor[1] = frame_fcolor[2] = 0; + frame_ucolor[0] = frame_ucolor[1] = frame_ucolor[2] = 255; mouse_cursor.set_image(mouse_cursor_width, mouse_cursor_height); unsigned char *pixels = mouse_cursor.get_image(); @@ -175,11 +175,13 @@ void WindowManager::set_focused_window(Window *win) return; } + Window *parent; if(focused_win) { // invalidate the frame (if any) - Window *parent = focused_win->get_parent(); + parent = focused_win->get_parent(); if(parent && parent != root_win) { parent->invalidate(); + fill_rect(parent->get_absolute_rect(), frame_ucolor[0], frame_ucolor[1], frame_ucolor[2]); } } @@ -190,6 +192,8 @@ void WindowManager::set_focused_window(Window *win) if(win->get_focusable()) { focused_win = win; + parent = focused_win->get_parent(); + fill_rect(parent->get_absolute_rect(), frame_fcolor[0], frame_fcolor[1], frame_fcolor[2]); return; } @@ -197,6 +201,7 @@ void WindowManager::set_focused_window(Window *win) for(int i=0; iget_children_count(); i++) { if(children[0]->get_focusable()) { set_focused_window(children[0]); + fill_rect(win->get_absolute_rect(), frame_fcolor[0], frame_fcolor[1], frame_fcolor[2]); return; } } @@ -229,6 +234,27 @@ Window *WindowManager::get_window_at_pos(int pointer_x, int pointer_y) return 0; } +void WindowManager::set_focused_frame_color(int r, int g, int b) +{ + frame_fcolor[0] = r; + frame_fcolor[1] = g; + frame_fcolor[2] = b; +} + +void WindowManager::get_focused_frame_color(int *r, int *g, int *b) +{ + *r = frame_fcolor[0]; + *g = frame_fcolor[1]; + *b = frame_fcolor[2]; +} + +void WindowManager::set_unfocused_frame_color(int r, int g, int b) +{ + frame_ucolor[0] = r; + frame_ucolor[1] = g; + frame_ucolor[2] = b; +} + Window *WindowManager::get_grab_window() const { return grab_win; @@ -244,9 +270,54 @@ void WindowManager::release_mouse() 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::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) { - fill_rect(win->get_absolute_rect(), 255, 211, 5); + //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); + return; + } + } + + fill_rect(win->get_absolute_rect(), 74, 175, 198); } static int prev_x, prev_y; @@ -256,6 +327,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; } @@ -268,6 +340,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;