fixed mouse events the windows can grab the mouse
[winnie] / src / wm.cc
index 4547e1d..33f2879 100644 (file)
--- a/src/wm.cc
+++ b/src/wm.cc
@@ -23,9 +23,8 @@ 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);
 
@@ -46,6 +45,10 @@ void WindowManager::destroy_frame(Window *win)
                return;
        }
 
+       if(grab_win == win) {
+               release_mouse();
+       }
+
        std::list<Window*>::iterator it;
        it = std::find(windows.begin(), windows.end(), frame);
        if(it != windows.end()) {
@@ -74,8 +77,8 @@ 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;
@@ -168,7 +171,7 @@ void WindowManager::remove_window(Window *win)
 
 void WindowManager::set_focused_window(Window *win)
 {
-       if(win == focused_win) {
+       if(win && win == focused_win) {
                return;
        }
 
@@ -226,6 +229,21 @@ Window *WindowManager::get_window_at_pos(int pointer_x, int pointer_y)
        return 0;
 }
 
+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);
@@ -237,9 +255,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();
+               }
        }
 }