Просмотр исходного кода

Add mouse wheel support for linux

Daniele Bartolini 11 лет назад
Родитель
Сommit
6918e3c937
5 измененных файлов с 46 добавлено и 0 удалено
  1. 14 0
      engine/core/os_event_queue.h
  2. 16 0
      engine/input/mouse.h
  3. 8 0
      engine/lua/lua_mouse.cpp
  4. 1 0
      engine/main/main.cpp
  5. 7 0
      engine/main/main_linux.cpp

+ 14 - 0
engine/core/os_event_queue.h

@@ -54,6 +54,7 @@ struct OsMouseEvent
 	enum Enum
 	{
 		BUTTON,
+		WHEEL,
 		MOVE
 	};
 
@@ -62,6 +63,7 @@ struct OsMouseEvent
 	uint16_t x;
 	uint16_t y;
 	bool pressed;
+	float wheel;
 };
 
 /// Represents an event fired by keyboard.
@@ -163,6 +165,18 @@ struct OsEventQueue
 		push_event(ev);
 	}
 
+	void push_mouse_event(uint16_t x, uint16_t y, float wheel)
+	{
+		OsEvent ev;
+		ev.type = OsEvent::MOUSE;
+		ev.mouse.type = OsMouseEvent::WHEEL;
+		ev.mouse.x = x;
+		ev.mouse.y = y;
+		ev.mouse.wheel = wheel;
+
+		push_event(ev);
+	}
+
 	void push_keyboard_event(uint32_t modifier, KeyboardButton::Enum b, bool pressed)
 	{
 		OsEvent ev;

+ 16 - 0
engine/input/mouse.h

@@ -55,6 +55,7 @@ struct Mouse
 {
 	Mouse()
 		: _last_button(MouseButton::NONE)
+		, _wheel(0.0f)
 	{
 		memset(_last_state, 0, MouseButton::COUNT);
 		memset(_current_state, 0, MouseButton::COUNT);
@@ -133,6 +134,14 @@ struct Mouse
 		set_cursor_xy(Vector2(position.x * (float) _width, position.y * (float) _height));
 	}
 
+	/// Returns the mouse wheel state in the current frame.
+	/// A positive or negative value is returned when the wheel is up or down
+	/// respectively, 0.0 otherwise.
+	float wheel()
+	{
+		return _wheel;
+	}
+
 	void set_position(uint16_t x, uint16_t y)
 	{
 		_x = x;
@@ -153,14 +162,21 @@ struct Mouse
 		_current_state[b] = state;
 	}
 
+	void set_wheel(uint16_t x, uint16_t y, float wheel)
+	{
+		_wheel = wheel;
+	}
+
 	void update()
 	{
+		_wheel = 0.0f;
 		memcpy(_last_state, _current_state, MouseButton::COUNT);
 	}
 
 public:
 
 	MouseButton::Enum _last_button;
+	float _wheel;
 	uint8_t _last_state[MouseButton::COUNT];
 	uint8_t _current_state[MouseButton::COUNT];
 

+ 8 - 0
engine/lua/lua_mouse.cpp

@@ -89,6 +89,13 @@ static int mouse_set_cursor_relative_xy(lua_State* L)
 	return 0;
 }
 
+static int mouse_wheel(lua_State* L)
+{
+	LuaStack stack(L);
+	stack.push_float(mouse().wheel());
+	return 1;
+}
+
 void load_mouse(LuaEnvironment& env)
 {
 	env.load_module_function("Mouse", "button_pressed",         mouse_button_pressed);
@@ -99,6 +106,7 @@ void load_mouse(LuaEnvironment& env)
 	env.load_module_function("Mouse", "set_cursor_xy",          mouse_set_cursor_xy);
 	env.load_module_function("Mouse", "cursor_relative_xy",     mouse_cursor_relative_xy);
 	env.load_module_function("Mouse", "set_cursor_relative_xy", mouse_set_cursor_relative_xy);
+	env.load_module_function("Mouse", "wheel",                  mouse_wheel);
 	
 	env.load_module_enum("Mouse", "LEFT",   MouseButton::LEFT);
 	env.load_module_enum("Mouse", "MIDDLE", MouseButton::MIDDLE);

+ 1 - 0
engine/main/main.cpp

@@ -66,6 +66,7 @@ bool process_events()
 				switch (ev.type)
 				{
 					case OsMouseEvent::BUTTON: mouse().set_button_state(ev.x, ev.y, ev.button, ev.pressed); break;
+					case OsMouseEvent::WHEEL: mouse().set_wheel(ev.x, ev.y, ev.wheel); break;
 					case OsMouseEvent::MOVE: mouse().set_position(ev.x, ev.y); break;
 					default: CE_FATAL("Oops, unknown mouse event type"); break;
 				}

+ 7 - 0
engine/main/main_linux.cpp

@@ -347,6 +347,13 @@ struct LinuxDevice
 				case ButtonPress:
 				case ButtonRelease:
 				{
+					if (event.xbutton.button == Button4 || event.xbutton.button == Button5)
+					{
+						_queue.push_mouse_event(event.xbutton.x, event.xbutton.y,
+							event.xbutton.button == Button4 ? 1.0f : -1.0f);
+						break;
+					}
+
 					MouseButton::Enum mb;
 					switch (event.xbutton.button)
 					{