fixed mouse events the windows can grab the mouse
authorEleni Maria Stea <elene.mst@gmail.com>
Sun, 24 Feb 2013 23:58:23 +0000 (01:58 +0200)
committerEleni Maria Stea <elene.mst@gmail.com>
Sun, 24 Feb 2013 23:58:23 +0000 (01:58 +0200)
src/main.cc
src/sdl/mouse.cc
src/wm.cc
src/wm.h

index 15245b0..b04d4dc 100644 (file)
@@ -19,7 +19,7 @@ int main()
        atexit(cleanup);
 
        Window *win1 = new Window;
-       win1->set_title("title1");
+       win1->set_title("red");
        win1->move(5, 10);
        win1->resize(200, 300);
        win1->set_display_callback(display);
@@ -28,7 +28,7 @@ int main()
        win1->set_mouse_motion_callback(motion);
 
        Window *win2 = new Window;
-       win2->set_title("title2");
+       win2->set_title("green");
        win2->move(150, 10);
        win2->resize(200, 300);
        win2->set_display_callback(display);
@@ -47,8 +47,8 @@ int main()
 static void display(Window *win)
 {
        const char *win_title = win->get_title();
-       const char *t1 = "title1";
-       const char *t2 = "title2";
+       const char *t1 = "red";
+       const char *t2 = "green";
 
        if(!strcmp(win_title, t1)) {
                fill_rect(win->get_absolute_rect(), 255, 0, 0);
index f31c900..51cceb3 100644 (file)
@@ -34,13 +34,15 @@ void process_mouse_event()
        MouseMotionFuncType motion_callback = 0;
        MouseButtonFuncType button_callback = 0;
 
-       Window *top = wm->get_window_at_pos(pointer_x, pointer_y);
-
-       if(top) {
-               wm->set_focused_window(top);
-       }
-       else {
-               wm->set_focused_window(0);
+       Window *top;
+       if(!(top = wm->get_grab_window())) {
+               top = wm->get_window_at_pos(pointer_x, pointer_y);
+               if(top) {
+                       wm->set_focused_window(top);
+               }
+               else {
+                       wm->set_focused_window(0);
+               }
        }
 
        switch(sdl_event.type) {
index ffe6f6a..33f2879 100644 (file)
--- 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<Window*>::iterator it;
        it = std::find(windows.begin(), windows.end(), frame);
        if(it != windows.end()) {
@@ -167,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;
        }
 
@@ -225,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);
@@ -236,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();
+               }
        }
 }
 
index 162121b..406ef9d 100644 (file)
--- a/src/wm.h
+++ b/src/wm.h
@@ -22,6 +22,7 @@ private:
 
        Window *root_win;
        Window *focused_win;
+       Window *grab_win;
 
        Pixmap mouse_cursor;
 
@@ -43,6 +44,11 @@ public:
        Window *get_focused_window();
 
        Window *get_window_at_pos(int pointer_x, int pointer_y);
+
+       Window *get_grab_window() const;
+
+       void grab_mouse(Window *win);
+       void release_mouse();
 };
 
 extern WindowManager *wm;