X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fwm.cc;h=c9b8959770e4c997dd8bd11f390715d2c6fefa2e;hb=d02747c88b1df856c5531cdc4b7af5b3ac8a0dc3;hp=a77f026bc8a2909dec2893167a25d7e2885c1c4a;hpb=ecb25bb23fcd6f98fb049297483e312c84fd7b5b;p=winnie diff --git a/src/wm.cc b/src/wm.cc index a77f026..c9b8959 100644 --- a/src/wm.cc +++ b/src/wm.cc @@ -45,6 +45,10 @@ void WindowManager::destroy_frame(Window *win) return; } + if(grab_win == win) { + release_mouse(); + } + std::list::iterator it; it = std::find(windows.begin(), windows.end(), frame); if(it != windows.end()) { @@ -73,11 +77,11 @@ WindowManager::WindowManager() bg_color[1] = 106; bg_color[2] = 106; - frame_thickness = 2; - titlebar_thickness = 4; + 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(); @@ -167,15 +171,17 @@ void WindowManager::remove_window(Window *win) void WindowManager::set_focused_window(Window *win) { - if(win == focused_win) { + if(win && win == focused_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]); } } @@ -186,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; } @@ -193,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; } } @@ -225,9 +234,90 @@ 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; +} + +void WindowManager::grab_mouse(Window *win) +{ + grab_win = win; +} + +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; @@ -236,15 +326,22 @@ 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; } + else { + wm->release_mouse(); + } } } 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;