224bc47849f3e138c51ed6e9d1ff7ad9ce738cb0
[winnie] / src / sdl / mouse.cc
1 #ifdef WINNIE_SDL
2 #include <SDL/SDL.h>
3
4 #include "mouse.h"
5 #include "window.h"
6 #include "wm.h"
7
8 extern SDL_Event sdl_event;
9
10 struct Mouse {
11         int pointer_x;
12         int pointer_y;
13         int bnstate;
14 };
15
16 static Mouse *mouse;
17
18 bool init_mouse()
19 {
20         if(!(mouse = (Mouse*)malloc(sizeof *mouse))) {
21                 return false;
22         }
23         return true;
24 }
25
26 void destroy_mouse()
27 {
28         free(mouse);
29 }
30
31 void set_mouse_bounds(const Rect &rect)
32 {
33 }
34
35 int get_mouse_fd()
36 {
37         return -1;
38 }
39
40 void process_mouse_event()
41 {
42         int bn;
43         MouseMotionFuncType motion_callback = 0;
44         MouseButtonFuncType button_callback = 0;
45
46         Window *win;
47         if(!(win = wm->get_grab_window())) {
48                 win = wm->get_window_at_pos(mouse->pointer_x, mouse->pointer_y);
49                 if(win) {
50                         wm->set_focused_window(win);
51                 }
52                 else {
53                         wm->set_focused_window(0);
54                 }
55         }
56
57         switch(sdl_event.type) {
58         case SDL_MOUSEMOTION:
59                 mouse->pointer_x = sdl_event.motion.x;
60                 mouse->pointer_y = sdl_event.motion.y;
61                 if(win && (motion_callback = win->get_mouse_motion_callback())) {
62                         Rect rect = win->get_absolute_rect();
63                         motion_callback(win, mouse->pointer_x - rect.x, mouse->pointer_y - rect.y);
64                 }
65                 break;
66
67         case SDL_MOUSEBUTTONUP:
68         case SDL_MOUSEBUTTONDOWN:
69                 bn = sdl_event.button.button - SDL_BUTTON_LEFT;
70                 if(sdl_event.button.state == SDL_PRESSED) {
71                         mouse->bnstate |= 1 << bn;
72                 }
73                 else {
74                         mouse->bnstate &= ~(1 << bn);
75                 }
76                 if(win && (button_callback = win->get_mouse_button_callback())) {
77                         Rect rect = win->get_absolute_rect();
78                         button_callback(win, bn, sdl_event.button.state, mouse->pointer_x - rect.x, mouse->pointer_y - rect.y);
79                 }
80         }
81 }
82
83 void get_pointer_pos(int *x, int *y)
84 {
85         *x = mouse->pointer_x;
86         *y = mouse->pointer_y;
87 }
88
89 int get_button_state()
90 {
91         return mouse->bnstate;
92 }
93
94 int get_button(int bn)
95 {
96         if(bn < 0 || bn >= 3) {
97                 return 0;
98         }
99         return (mouse->bnstate & (1 << bn)) != 0;
100 }
101 #endif // WINNIE_SDL