X-Git-Url: https://eleni.mutantstargoat.com/git/?p=winnie;a=blobdiff_plain;f=src%2Fwm.cc;h=b4e2d79472891f0f65bdac81251a14f508d87909;hp=d3b3c95370aad0e01f41ccfa46c0bd99d45a3a79;hb=981f0eab2195d34f7c186a2e3e891810e14ce5b4;hpb=a43297a61d69ca5fa5bb7ae8407757da978b4dd4 diff --git a/src/wm.cc b/src/wm.cc index d3b3c95..b4e2d79 100644 --- a/src/wm.cc +++ b/src/wm.cc @@ -1,5 +1,6 @@ #include #include +#include // TODO #include "gfx.h" #include "wm.h" @@ -11,7 +12,7 @@ WindowManager *wm; static WindowManager wminst; static void display(Window *win); -static void mouse(Window *win, int key, bool pressed); +static void mouse(Window *win, int bn, bool pressed); static void motion(Window *win, int x, int y); void WindowManager::create_frame(Window *win) @@ -20,11 +21,13 @@ void WindowManager::create_frame(Window *win) Window *parent = win->get_parent(); frame->set_display_callback(display); -// frame->set_mouse_button_callback(mouse); -// frame->set_mouse_motion_callback(motion); + frame->set_mouse_button_callback(mouse); + frame->set_mouse_motion_callback(motion); frame->add_child(win); - frames.push_back(frame); + frame->set_focusable(false); + + windows.push_back(frame); Rect win_rect = win->get_rect(); frame->move(win_rect.x - frame_thickness, @@ -32,6 +35,7 @@ void WindowManager::create_frame(Window *win) frame->resize(win_rect.width + frame_thickness * 2, win_rect.height + frame_thickness * 2 + titlebar_thickness); + win->move(frame_thickness, frame_thickness + titlebar_thickness); parent->add_child(frame); } @@ -43,10 +47,10 @@ void WindowManager::destroy_frame(Window *win) } std::list::iterator it; - it = std::find(frames.begin(), frames.end(), frame); - if(it != frames.end()) { + it = std::find(windows.begin(), windows.end(), frame); + if(it != windows.end()) { root_win->add_child(win); - frames.erase(it); + windows.erase(it); delete frame; } } @@ -127,6 +131,8 @@ void WindowManager::process_windows() Rect mouse_rect = {mouse_x, mouse_y, mouse_cursor.get_width(), mouse_cursor.get_height()}; invalidate_region(mouse_rect); + + gfx_update(); } void WindowManager::add_window(Window *win) @@ -160,7 +166,37 @@ void WindowManager::remove_window(Window *win) void WindowManager::set_focused_window(Window *win) { - focused_win = win; + if(win == focused_win) { + return; + } + + if(focused_win) { + // invalidate the frame (if any) + Window *parent = focused_win->get_parent(); + if(parent && parent != root_win) { + parent->invalidate(); + } + } + + if(!win) { + focused_win = 0; + return; + } + + if(win->get_focusable()) { + focused_win = win; + return; + } + + Window **children = win->get_children(); + for(int i=0; iget_children_count(); i++) { + if(children[0]->get_focusable()) { + set_focused_window(children[0]); + return; + } + } + + focused_win = 0; } const Window *WindowManager::get_focused_window() const @@ -175,26 +211,49 @@ Window *WindowManager::get_focused_window() Window *WindowManager::get_window_at_pos(int pointer_x, int pointer_y) { - Window *win = 0; std::list::reverse_iterator rit = windows.rbegin(); while(rit != windows.rend()) { - if((*rit)->contains_point(pointer_x, pointer_y)) { - win = *rit; - break; + Window *w = *rit++; + Window *parent = w->get_parent(); + + if(parent == root_win && w->contains_point(pointer_x, pointer_y)) { + return w; } - rit++; } - return win; + return 0; } static void display(Window *win) { - if(win->get_managed()) { - fill_rect(win->get_rect(), 255, 211, 5); - win->draw(win->get_parent()->get_rect()); + fill_rect(win->get_absolute_rect(), 255, 211, 5); +} + +static int prev_x, prev_y; + +static void mouse(Window *win, int bn, bool pressed) +{ + if(bn == 0) { + if(pressed) { + get_pointer_pos(&prev_x, &prev_y); + printf("pressed: %d\n", prev_x); + } else { + printf("released\n"); + } } } -//static void mouse(Window *win, int key, bool pressed); -//static void motion(Window *win, int x, int y); +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); + } +}