X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInput%2Finput.hxx;h=83527590b4f37c9f78969c536fa8f7c427ad7c19;hb=5246e69b5a54b6a0cc841e383f19999226164f1f;hp=8358412da4130775b234359b0c501090338b926f;hpb=f695b5b4791889229d6db12f917115417a83e28c;p=flightgear.git diff --git a/src/Input/input.hxx b/src/Input/input.hxx index 8358412da..83527590b 100644 --- a/src/Input/input.hxx +++ b/src/Input/input.hxx @@ -16,7 +16,7 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -28,50 +28,45 @@ # error This library requires C++ #endif +#include +#include + #include -#include -#include +#include +#include +#include +#include +#include +#include -#include
+#include
+#include
#include
#include +#include #include SG_USING_STD(map); SG_USING_STD(vector); -/** - * An input binding of some sort. - * - *

This class represents a binding that can be assigned to a - * keyboard key, a joystick button or axis, or even a panel - * instrument.

- */ -class FGBinding -{ -public: - FGBinding (); - FGBinding (const SGPropertyNode * node); - virtual ~FGBinding (); + - virtual const string &getCommandName () const { return _command_name; } - virtual SGCommandMgr::command_t getCommand () const { return _command; } - virtual const SGPropertyNode * getArg () { return _arg; } - - virtual void read (const SGPropertyNode * node); +#if defined( UL_WIN32 ) +#define TGT_PLATFORM "windows" +#elif defined ( UL_MAC_OSX ) +#define TGT_PLATFORM "mac" +#else +#define TGT_PLATFORM "unix" +#endif - virtual void fire () const; -// virtual void fire (double value); -// virtual void fire (int xdelta, int ydelta); -private: - string _command_name; - SGCommandMgr::command_t _command; - const SGPropertyNode * _arg; -}; + +//////////////////////////////////////////////////////////////////////// +// General input mapping support. +//////////////////////////////////////////////////////////////////////// /** @@ -81,59 +76,264 @@ private: * keyboard, joystick, mouse, or even panel switches -- in a consistent * way, and to allow users to rebind any of the actions at runtime.

*/ -class FGInput : public FGSubsystem +class FGInput : public SGSubsystem { public: + /** + * Default constructor. + */ + FGInput (); - enum { - FG_MOD_NONE = 0, - FG_MOD_SHIFT = 1, - FG_MOD_CTRL = 2, - FG_MOD_ALT = 4, - FG_MOD_MAX = 8 // one past all modifiers - }; - - FGInput(); + /** + * Destructor. + */ virtual ~FGInput(); // - // Implementation of FGSubsystem. + // Implementation of SGSubsystem. // virtual void init (); + virtual void reinit (); + virtual void postinit (); virtual void bind (); virtual void unbind (); - virtual void update (); + virtual void update (double dt); + virtual void suspend (); + virtual void resume (); + virtual bool is_suspended () const; /** - * Handle a single keystroke. + * Control whether this is the default module to receive events. * - *

Note: for special keys, the integer key code will be the Glut - * code + 256.

+ * The first input module created will set itself as the default + * automatically. * - * @param k The integer key code, as returned by glut. + * @param status true if this should be the default module for + * events, false otherwise. + */ + virtual void makeDefault (bool status = true); + + + /** + * Handle a single keystroke. + * + * @param k The integer key code, see Main/fg_os.hxx * @param modifiers Modifier keys pressed (bitfield). * @param x The mouse x position at the time of keypress. * @param y The mouse y position at the time of keypress. - * @see #FG_MOD_SHIFT - * @see #FG_MOD_CTRL - * @see #FG_MOD_ALT */ virtual void doKey (int k, int modifiers, int x, int y); + /** + * Handle a mouse click event. + * + * @param button The mouse button selected. + * @param updown Button status. + * @param x The X position of the mouse event, in screen coordinates. + * @param y The Y position of the mouse event, in screen coordinates. + */ + virtual void doMouseClick (int button, int updown, int x, int y, bool mainWindow, const osgGA::GUIEventAdapter*); + + + /** + * Handle mouse motion. + * + * @param x The new mouse x position, in screen coordinates. + * @param y The new mouse y position, in screen coordinates. + */ + virtual void doMouseMotion (int x, int y); + + private: + // Constants + enum + { + MAX_KEYS = 1024, + MAX_JOYSTICKS = 10, + MAX_JOYSTICK_AXES = _JS_MAX_AXES, + MAX_JOYSTICK_BUTTONS = 32, + + MAX_MICE = 1, + MAX_MOUSE_BUTTONS = 8 + }; + struct mouse; + friend struct mouse; + + typedef vector > binding_list_t; + + /** + * Settings for a key or button. + */ + struct button { + button (); + virtual ~button (); + bool is_repeatable; + float interval_sec; + float last_dt; + int last_state; + binding_list_t bindings[KEYMOD_MAX]; + }; + + + /** + * Settings for a single joystick axis. + */ + struct axis { + axis (); + virtual ~axis (); + float last_value; + float tolerance; + binding_list_t bindings[KEYMOD_MAX]; + float low_threshold; + float high_threshold; + struct button low; + struct button high; + float interval_sec; + double last_dt; + }; + + + /** + * Settings for a joystick. + */ + struct joystick { + joystick (); + virtual ~joystick (); + int jsnum; + jsJoystick * js; + int naxes; + int nbuttons; + axis * axes; + button * buttons; + }; + + + /** + * Settings for a mouse mode. + */ + struct mouse_mode { + mouse_mode (); + virtual ~mouse_mode (); + int cursor; + bool constrained; + bool pass_through; + button * buttons; + binding_list_t x_bindings[KEYMOD_MAX]; + binding_list_t y_bindings[KEYMOD_MAX]; + }; + + + /** + * Settings for a mouse. + */ + struct mouse { + mouse (); + virtual ~mouse (); + int x; + int y; + SGPropertyNode_ptr mode_node; + SGPropertyNode_ptr mouse_button_nodes[MAX_MOUSE_BUTTONS]; + int nModes; + int current_mode; + double timeout; + int save_x; + int save_y; + mouse_mode * modes; + }; + + + /** + * Initialize key bindings. + */ + void _init_keyboard (); + + + /** + * Initialize joystick bindings. + */ + void _init_joystick (); + + + /** + * Scan directory recursively for "named joystick" configuration files, + * and read them into /input/joysticks/js-named[index]++. + */ + void _scan_joystick_dir (SGPath *path, SGPropertyNode* node, int *index); + + + /** + * Initialize mouse bindings. + */ + void _init_mouse (); + + + /** + * Initialize a single button. + */ + inline void _init_button (const SGPropertyNode * node, + button &b, + const string name); + + /** + * Initialize nasal parts that had to wait for the nasal to get + * functional. + */ + void _postinit_keyboard (); + void _postinit_joystick (); + + /** + * Update the keyboard. + */ + void _update_keyboard (); + + + /** + * Update the joystick. + */ + void _update_joystick (double dt); + + + /** + * Update the mouse. + */ + void _update_mouse (double dt); + + + /** + * Update a single button. + */ + inline void _update_button (button &b, int modifiers, bool pressed, + int x, int y); + + + /** + * Read bindings and modifiers. + */ + void _read_bindings (const SGPropertyNode * node, + binding_list_t * binding_list, + int modifiers); /** * Look up the bindings for a key code. */ - const vector * _find_bindings (int k, int modifiers); + const binding_list_t& _find_key_bindings (unsigned int k, + int modifiers); - typedef map > keyboard_map; - keyboard_map _key_bindings[FG_MOD_MAX]; + button _key_bindings[MAX_KEYS]; + joystick _joystick_bindings[MAX_JOYSTICKS]; + mouse _mouse_bindings[MAX_MICE]; -}; + /** + * Nasal module name/namespace. + */ + string _module; -extern FGInput current_input; + /** + * List of currently pressed mouse button events + */ + std::map > > _activePickCallbacks; +}; -#endif // _CONTROLS_HXX +#endif // _INPUT_HXX