9 extern SDL_Event sdl_event;
21 if(!(mouse = (Mouse*)sh_malloc(sizeof *mouse))) {
24 memset(mouse, 0, sizeof *mouse);
33 void set_mouse_bounds(const Rect &rect)
42 void process_mouse_event()
45 MouseMotionFuncType motion_callback = 0;
46 MouseButtonFuncType button_callback = 0;
49 if(!(win = wm->get_grab_window())) {
50 win = wm->get_window_at_pos(mouse->pointer_x, mouse->pointer_y);
52 wm->set_focused_window(win);
55 wm->set_focused_window(0);
59 switch(sdl_event.type) {
61 mouse->pointer_x = sdl_event.motion.x;
62 mouse->pointer_y = sdl_event.motion.y;
63 if(win && (motion_callback = win->get_mouse_motion_callback())) {
64 Rect rect = win->get_absolute_rect();
65 motion_callback(win, mouse->pointer_x - rect.x, mouse->pointer_y - rect.y);
69 case SDL_MOUSEBUTTONUP:
70 case SDL_MOUSEBUTTONDOWN:
71 bn = sdl_event.button.button - SDL_BUTTON_LEFT;
72 if(sdl_event.button.state == SDL_PRESSED) {
73 mouse->bnstate |= 1 << bn;
76 mouse->bnstate &= ~(1 << bn);
78 if(win && (button_callback = win->get_mouse_button_callback())) {
79 Rect rect = win->get_absolute_rect();
80 button_callback(win, bn, sdl_event.button.state, mouse->pointer_x - rect.x, mouse->pointer_y - rect.y);
85 void get_pointer_pos(int *x, int *y)
87 *x = mouse->pointer_x;
88 *y = mouse->pointer_y;
91 int get_button_state()
93 return mouse->bnstate;
96 int get_button(int bn)
98 if(bn < 0 || bn >= 3) {
101 return (mouse->bnstate & (1 << bn)) != 0;