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);
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);
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);
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) {
return;
}
+ if(grab_win == win) {
+ release_mouse();
+ }
+
std::list<Window*>::iterator it;
it = std::find(windows.begin(), windows.end(), frame);
if(it != windows.end()) {
void WindowManager::set_focused_window(Window *win)
{
- if(win == focused_win) {
+ if(win && win == focused_win) {
return;
}
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);
{
if(bn == 0) {
if(pressed) {
+ wm->grab_mouse(win);
prev_x = x;
prev_y = y;
}
+ else {
+ wm->release_mouse();
+ }
}
}
Window *root_win;
Window *focused_win;
+ Window *grab_win;
Pixmap mouse_cursor;
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;