-/* $Id$
-
-This file is part of libmspgbase
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
-#ifndef MSP_GBASE_INPUTDEVICE_H_
-#define MSP_GBASE_INPUTDEVICE_H_
+#ifndef MSP_INPUT_INPUTDEVICE_H_
+#define MSP_INPUT_INPUTDEVICE_H_
#include <string>
#include <vector>
Base class for input devices. Input devices have two types of controls:
buttons and axes. Buttons are either on or off. Axes have a floating point
value in the range [-1, 1].
+
+Event handlers return a boolean indicating whether the event is considered
+processed. If a handler returns true, no further handlers are invoked.
*/
class Device
{
+protected:
+ struct EventAccumulator
+ {
+ typedef void result_type;
+
+ template<typename Iter>
+ result_type operator()(Iter begin, Iter end) const
+ {
+ for(Iter i=begin; i!=end; ++i)
+ if(*i)
+ return;
+ }
+ };
+
public:
- sigc::signal<void, unsigned> signal_button_press;
- sigc::signal<void, unsigned> signal_button_release;
- sigc::signal<void, unsigned, float, float> signal_axis_motion;
+ sigc::signal<bool, unsigned>::accumulated<EventAccumulator> signal_button_press;
+ sigc::signal<bool, unsigned>::accumulated<EventAccumulator> signal_button_release;
+ sigc::signal<bool, unsigned, float, float>::accumulated<EventAccumulator> signal_axis_motion;
protected:
std::string name;
- std::vector<char> buttons;
+ std::vector<char> buttons;
std::vector<float> axes;
Device() { }
public:
virtual ~Device() { }
const std::string &get_name() const { return name; }
- bool get_button_state(unsigned) const;
+ bool get_button_state(unsigned) const;
float get_axis_value(unsigned) const;
virtual std::string get_button_name(unsigned) const;