X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fwm.cc;h=7791e7989b0208054d539d83476628c536750ff2;hb=15e07ead145a859762b48ac9062a07cddf826151;hp=056c6e7b94a839281b6791d8cbbcd7a6ef71821e;hpb=906b341b177e5947710107eceb9ab2e4ee09528c;p=winnie diff --git a/src/wm.cc b/src/wm.cc index 056c6e7..7791e79 100644 --- a/src/wm.cc +++ b/src/wm.cc @@ -1,20 +1,38 @@ #include +#include #include #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" +#include "winnie.h" + +#define DCLICK_INTERVAL 400 WindowManager *wm; -static WindowManager wminst; static void display(Window *win); 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; @@ -71,6 +89,7 @@ WindowManager::WindowManager() root_win->move(0, 0); root_win->set_managed(false); + grab_win = 0; focused_win = 0; bg_color[0] = 210; @@ -80,8 +99,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(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(); @@ -244,7 +263,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]; @@ -258,6 +277,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; @@ -307,32 +333,95 @@ void WindowManager::sink_window(Window *win) } } +void WindowManager::maximize_window(Window *win) +{ + win->normal_rect = win->rect; + + Rect rect = get_screen_size(); + + Window *frame; + if((frame = win->get_parent())) { + frame->normal_rect = frame->rect; + frame->resize(rect.width, rect.height); + frame->move(rect.x, rect.y); + + rect.width -= frame_thickness * 2; + rect.height -= frame_thickness * 2 + titlebar_thickness; + } + else { + rect.x = 0; + rect.y = 0; + win->move(rect.x, rect.y); + } + + win->resize(rect.width, rect.height); + win->set_state(Window::STATE_MAXIMIZED); +} + +void WindowManager::unmaximize_window(Window *win) +{ + win->resize(win->normal_rect.width, win->normal_rect.height); + win->move(win->normal_rect.x, win->normal_rect.y); + + Window *frame; + if((frame = win->get_parent())) { + frame->resize(frame->normal_rect.width, frame->normal_rect.height); + frame->move(frame->normal_rect.x, frame->normal_rect.y); + } + + win->set_state(Window::STATE_NORMAL); +} + static void display(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); - return; - } + 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); } - fill_rect(win->get_absolute_rect(), 74, 175, 198); + draw_text(child->get_title()); } static int prev_x, prev_y; static void mouse(Window *win, int bn, bool pressed, int x, int y) { + static long last_click = 0; + if(bn == 0) { if(pressed) { + long time = winnie_get_time(); + if((time - last_click) < DCLICK_INTERVAL) { + Window *child = win->get_children()[0]; + Window::State state = child->get_state(); + if(state == Window::STATE_MAXIMIZED) { + child->set_state(Window::STATE_NORMAL); + wm->unmaximize_window(child); + } + else if(state == Window::STATE_NORMAL) { + wm->maximize_window(child); + } + } + wm->grab_mouse(win); wm->raise_window(win); prev_x = x; prev_y = y; + + last_click = time; } else { wm->release_mouse(); @@ -343,7 +432,6 @@ 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;