-#include <msp/strings/formatter.h>
+#ifdef WIN32
+#include <windowsx.h>
+#endif
+#include <msp/graphics/window.h>
+#include <msp/graphics/window_priv.h>
#include "mouse.h"
namespace Msp {
namespace Input {
-Mouse::Mouse(Graphics::EventSource &s):
- source(s)
+Mouse::Mouse(Graphics::Window &w):
+ window(w)
{
name = "Mouse";
buttons.resize(3);
axes.resize(2);
- source.signal_button_press.connect(sigc::mem_fun(this, &Mouse::button_press));
- source.signal_button_release.connect(sigc::mem_fun(this, &Mouse::button_release));
- source.signal_pointer_motion.connect(sigc::mem_fun(this, &Mouse::pointer_motion));
+ window.signal_input_event.connect(sigc::mem_fun(this, &Mouse::input_event));
}
std::string Mouse::get_button_name(unsigned btn) const
case 5:
return "Wheel Down";
default:
- return format("Button %d", btn);
+ return Device::get_button_name(btn);
}
}
case 1:
return "Y axis";
default:
- return format("Axis %d", axis);
+ return Device::get_axis_name(axis);
};
}
-void Mouse::button_press(int, int, unsigned btn, unsigned)
+void Mouse::input_event(const Graphics::Window::Event &event)
{
- set_button_state(btn, true, true);
-}
-
-void Mouse::button_release(int, int, unsigned btn, unsigned)
-{
- set_button_state(btn, false, true);
-}
-
-void Mouse::pointer_motion(int x, int y)
-{
- set_axis_value(0, x*2.0f/source.get_width()-1.0f, true);
- set_axis_value(1, 1.0f-y*2.0f/source.get_height(), true);
+#ifdef WIN32
+ switch(event.msg)
+ {
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONUP:
+ set_button_state(1, event.msg==WM_LBUTTONDOWN, true);
+ break;
+ case WM_MBUTTONDOWN:
+ case WM_MBUTTONUP:
+ set_button_state(2, event.msg==WM_LBUTTONDOWN, true);
+ break;
+ case WM_RBUTTONDOWN:
+ case WM_RBUTTONUP:
+ set_button_state(3, event.msg==WM_LBUTTONDOWN, true);
+ break;
+ case WM_MOUSEWHEEL:
+ {
+ unsigned btn = (HIWORD(event.wparam)&0x8000) ? 5 : 4;
+ set_button_state(btn, true, true);
+ set_button_state(btn, false, true);
+ }
+ break;
+ case WM_MOUSEMOVE:
+ set_axis_value(0, GET_X_LPARAM(event.lparam)*2.0/window.get_width()-1.0, true);
+ set_axis_value(1, 1.0-GET_Y_LPARAM(event.lparam)*2.0/window.get_height(), true);
+ break;
+ }
+#else
+ switch(event.xevent.type)
+ {
+ case ButtonPress:
+ case ButtonRelease:
+ set_button_state(event.xevent.xbutton.button, event.xevent.type==ButtonPress, true);
+ break;
+ case MotionNotify:
+ set_axis_value(0, event.xevent.xmotion.x*2.0/window.get_width()-1.0, true);
+ set_axis_value(1, 1.0-event.xevent.xmotion.y*2.0/window.get_height(), true);
+ break;
+ }
+#endif
}
} // namespace Input