X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fwm.cc;h=7c5959eb5ef08def8cff2a626b86f6825f4fe7db;hb=5984d5479693fd7519674a5bc40ebf804f8d0a46;hp=b4e2d79472891f0f65bdac81251a14f508d87909;hpb=981f0eab2195d34f7c186a2e3e891810e14ce5b4;p=winnie diff --git a/src/wm.cc b/src/wm.cc index b4e2d79..7c5959e 100644 --- a/src/wm.cc +++ b/src/wm.cc @@ -3,18 +3,32 @@ #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; static void display(Window *win); -static void mouse(Window *win, int bn, bool pressed); +static void mouse(Window *win, int bn, bool pressed, int x, int y); static void motion(Window *win, int x, int y); +bool init_window_manager() +{ + if(!(wm = new WindowManager)) { + return false; + } + + return true; +} + +void destroy_window_manager() +{ + delete wm; +} + void WindowManager::create_frame(Window *win) { Window *frame = new Window; @@ -23,16 +37,15 @@ void WindowManager::create_frame(Window *win) frame->set_display_callback(display); frame->set_mouse_button_callback(mouse); frame->set_mouse_motion_callback(motion); - - frame->add_child(win); frame->set_focusable(false); + frame->add_child(win); windows.push_back(frame); Rect win_rect = win->get_rect(); - frame->move(win_rect.x - frame_thickness, + frame->move(win_rect.x - frame_thickness, win_rect.y - frame_thickness - titlebar_thickness); - frame->resize(win_rect.width + frame_thickness * 2, + frame->resize(win_rect.width + frame_thickness * 2, win_rect.height + frame_thickness * 2 + titlebar_thickness); win->move(frame_thickness, frame_thickness + titlebar_thickness); @@ -46,6 +59,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()) { @@ -68,17 +85,18 @@ WindowManager::WindowManager() root_win->move(0, 0); root_win->set_managed(false); + grab_win = 0; focused_win = 0; bg_color[0] = 210; 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; + set_focused_frame_color(0, 0, 0); + set_unfocused_frame_color(200, 200, 200); mouse_cursor.set_image(mouse_cursor_width, mouse_cursor_height); unsigned char *pixels = mouse_cursor.get_image(); @@ -117,6 +135,8 @@ void WindowManager::process_windows() } dirty_rects.clear(); + wait_vsync(); + fill_rect(uni, bg_color[0], bg_color[1], bg_color[2]); root_win->draw_children(uni); @@ -166,15 +186,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]); } } @@ -185,6 +207,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; } @@ -192,6 +216,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; } } @@ -211,34 +236,135 @@ 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; + frame_fcolor[1] = g; + frame_fcolor[2] = b; +} + +void WindowManager::get_focused_frame_color(int *r, int *g, int *b) const +{ + *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; +} + +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; +} + +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 *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; -static void mouse(Window *win, int bn, bool pressed) +static void mouse(Window *win, int bn, bool pressed, int x, int y) { if(bn == 0) { if(pressed) { - get_pointer_pos(&prev_x, &prev_y); - printf("pressed: %d\n", prev_x); - } else { - printf("released\n"); + wm->grab_mouse(win); + wm->raise_window(win); + prev_x = x; + prev_y = y; + } + else { + wm->release_mouse(); } } } @@ -246,13 +372,13 @@ static void mouse(Window *win, int bn, bool pressed) static void motion(Window *win, int x, int y) { int left_bn = get_button(0); + if(left_bn) { int dx = x - prev_x; int dy = y - prev_y; prev_x = x - dx; prev_y = y - dy; - printf("dx: %d dy: %d\n", dx, dy); Rect rect = win->get_rect(); win->move(rect.x + dx, rect.y + dy); }