]> git.tdb.fi Git - libs/gui.git/blob - source/input/mouse.cpp
Fix windows compilation
[libs/gui.git] / source / input / mouse.cpp
1 #ifdef WIN32
2 #include <windowsx.h>
3 #endif
4 #include <msp/graphics/window.h>
5 #include <msp/graphics/window_priv.h>
6 #include <msp/strings/format.h>
7 #include "mouse.h"
8
9 namespace Msp {
10 namespace Input {
11
12 Mouse::Mouse(Graphics::Window &w):
13         window(w)
14 {
15         name = "Mouse";
16
17         buttons.resize(3);
18         axes.resize(2);
19
20         window.signal_input_event.connect(sigc::mem_fun(this, &Mouse::input_event));
21 }
22
23 std::string Mouse::get_button_name(unsigned btn) const
24 {
25         switch(btn)
26         {
27         case 1:
28                 return "Left";
29         case 2:
30                 return "Middle";
31         case 3:
32                 return "Right";
33         case 4:
34                 return "Wheel Up";
35         case 5:
36                 return "Wheel Down";
37         default:
38                 return format("Button %d", btn);
39         }
40 }
41
42 std::string Mouse::get_axis_name(unsigned axis) const
43 {
44         switch(axis)
45         {
46         case 0:
47                 return "X axis";
48         case 1:
49                 return "Y axis";
50         default:
51                 return format("Axis %d", axis);
52         };
53 }
54
55 void Mouse::input_event(const Graphics::Window::Event &event)
56 {
57 #ifdef WIN32
58         switch(event.msg)
59         {
60         case WM_LBUTTONDOWN:
61         case WM_LBUTTONUP:
62                 set_button_state(1, event.msg==WM_LBUTTONDOWN, true);
63                 break;
64         case WM_MBUTTONDOWN:
65         case WM_MBUTTONUP:
66                 set_button_state(2, event.msg==WM_LBUTTONDOWN, true);
67                 break;
68         case WM_RBUTTONDOWN:
69         case WM_RBUTTONUP:
70                 set_button_state(3, event.msg==WM_LBUTTONDOWN, true);
71                 break;
72         case WM_MOUSEWHEEL:
73                 {
74                         unsigned btn = (HIWORD(event.wparam)&0x8000) ? 5 : 4;
75                         set_button_state(btn, true, true);
76                         set_button_state(btn, false, true);
77                 }
78                 break;
79         case WM_MOUSEMOVE:
80                 set_axis_value(0, GET_X_LPARAM(event.lparam)*2.0/window.get_width()-1.0, true);
81                 set_axis_value(1, 1.0-GET_Y_LPARAM(event.lparam)*2.0/window.get_height(), true);
82                 break;
83         }
84 #else
85         switch(event.xevent.type)
86         {
87         case ButtonPress:
88         case ButtonRelease:
89                 set_button_state(event.xevent.xbutton.button, event.xevent.type==ButtonPress, true);
90                 break;
91         case MotionNotify:
92                 set_axis_value(0, event.xevent.xmotion.x*2.0/window.get_width()-1.0, true);
93                 set_axis_value(1, 1.0-event.xevent.xmotion.y*2.0/window.get_height(), true);
94                 break;
95         }
96 #endif
97 }
98
99 } // namespace Input
100 } // namespace Msp