X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fwm.cc;h=fd86d1d82960afc4251e68e735267692f2fede2c;hb=65eda3d5a8e4ad8d28bda12cace044628c1a69be;hp=ffe6f6acfd2534fa7b4b91ff4d86f92fe8117abc;hpb=f634e2d68f3f5b4ba5645891b2c8110f48e80129;p=winnie diff --git a/src/wm.cc b/src/wm.cc index ffe6f6a..fd86d1d 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()) { @@ -76,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(); @@ -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,56 @@ 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; +} + 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,9 +292,13 @@ static void mouse(Window *win, int bn, bool pressed, int x, int y) { if(bn == 0) { if(pressed) { + wm->grab_mouse(win); prev_x = x; prev_y = y; } + else { + wm->release_mouse(); + } } }