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