From 287b4d5d1b7eadfe9d5d0aa3b33700f3e1bed55e Mon Sep 17 00:00:00 2001 From: Eleni Maria Stea Date: Mon, 25 Feb 2013 01:58:23 +0200 Subject: [PATCH] fixed mouse events the windows can grab the mouse --- src/main.cc | 8 ++++---- src/sdl/mouse.cc | 16 +++++++++------- src/wm.cc | 25 ++++++++++++++++++++++++- src/wm.h | 6 ++++++ 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/main.cc b/src/main.cc index 15245b0..b04d4dc 100644 --- a/src/main.cc +++ b/src/main.cc @@ -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); diff --git a/src/sdl/mouse.cc b/src/sdl/mouse.cc index f31c900..51cceb3 100644 --- a/src/sdl/mouse.cc +++ b/src/sdl/mouse.cc @@ -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) { diff --git a/src/wm.cc b/src/wm.cc index ffe6f6a..33f2879 100644 --- 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::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(); + } } } diff --git a/src/wm.h b/src/wm.h index 162121b..406ef9d 100644 --- 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; -- 1.7.10.4