1
// input.hxx -- handle user input from various sources.
3
// Written by David Megginson, started May 2001.
5
// Copyright (C) 2001 David Megginson, david@megginson.com
7
// This program is free software; you can redistribute it and/or
8
// modify it under the terms of the GNU General Public License as
9
// published by the Free Software Foundation; either version 2 of the
10
// License, or (at your option) any later version.
12
// This program is distributed in the hope that it will be useful, but
13
// WITHOUT ANY WARRANTY; without even the implied warranty of
14
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
// General Public License for more details.
17
// You should have received a copy of the GNU General Public License
18
// along with this program; if not, write to the Free Software
19
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
// $Id: input.hxx,v 1.13 2001/12/22 16:33:30 david Exp $
28
# error This library requires C++
33
#include <simgear/compiler.h>
35
#include <simgear/misc/commands.hxx>
36
#include <simgear/misc/props.hxx>
38
#include <Main/fgfs.hxx>
39
#include <Main/globals.hxx>
49
////////////////////////////////////////////////////////////////////////
50
// General binding support.
51
////////////////////////////////////////////////////////////////////////
55
* An input binding of some sort.
57
* <p>This class represents a binding that can be assigned to a
58
* keyboard key, a joystick button or axis, or even a panel
61
class FGBinding : public FGConditional
66
* Default constructor.
72
* Convenience constructor.
74
* @param node The binding will be built from this node.
76
FGBinding (const SGPropertyNode * node);
82
virtual ~FGBinding ();
86
* Get the command name.
88
* @return The string name of the command for this binding.
90
virtual const string &getCommandName () const { return _command_name; }
94
* Get the command itself.
96
* @return The command associated with this binding, or 0 if none
99
virtual SGCommandMgr::command_t getCommand () const { return _command; }
103
* Get the argument that will be passed to the command.
105
* @return A property node that will be passed to the command as its
106
* argument, or 0 if none was supplied.
108
virtual const SGPropertyNode * getArg () { return _arg; }
112
* Read a binding from a property node.
114
* @param node The property node containing the binding.
116
virtual void read (const SGPropertyNode * node);
122
virtual void fire () const;
126
* Fire a binding with a setting (i.e. joystick axis).
128
* A double 'setting' property will be added to the arguments.
130
* @param setting The input setting, usually between -1.0 and 1.0.
132
virtual void fire (double setting) const;
136
string _command_name;
137
SGCommandMgr::command_t _command;
138
mutable SGPropertyNode * _arg;
139
mutable SGPropertyNode * _setting;
140
mutable SGCommandState * _command_state;
145
////////////////////////////////////////////////////////////////////////
146
// General input mapping support.
147
////////////////////////////////////////////////////////////////////////
151
* Generic input module.
153
* <p>This module is designed to handle input from multiple sources --
154
* keyboard, joystick, mouse, or even panel switches -- in a consistent
155
* way, and to allow users to rebind any of the actions at runtime.</p>
157
class FGInput : public FGSubsystem
163
FG_MOD_UP = 1, // key- or button-up
167
FG_MOD_MAX = 16 // enough to handle all combinations
172
* Default constructor.
183
// Implementation of FGSubsystem.
185
virtual void init ();
186
virtual void bind ();
187
virtual void unbind ();
188
virtual void update (int dt);
192
* Handle a single keystroke.
194
* <p>Note: for special keys, the integer key code will be the Glut
197
* @param k The integer key code, as returned by glut.
198
* @param modifiers Modifier keys pressed (bitfield).
199
* @param x The mouse x position at the time of keypress.
200
* @param y The mouse y position at the time of keypress.
205
virtual void doKey (int k, int modifiers, int x, int y);
219
MAX_AXES = _JS_MAX_AXES,
224
typedef vector<FGBinding *> binding_list_t;
227
* Settings for a key or button.
234
binding_list_t bindings[FG_MOD_MAX];
239
* Settings for a single joystick axis.
246
binding_list_t bindings[FG_MOD_MAX];
248
float high_threshold;
255
* Settings for a joystick.
259
virtual ~joystick ();
270
* Initialize key bindings.
272
void _init_keyboard ();
276
* Initialize joystick bindings.
278
void _init_joystick ();
282
* Initialize a single button.
284
inline void _init_button (const SGPropertyNode * node,
290
* Update the keyboard.
292
void _update_keyboard ();
296
* Update the joystick.
298
void _update_joystick ();
302
* Update a single button.
304
inline void _update_button (button &b, int modifiers, bool pressed);
308
* Read bindings and modifiers.
310
void _read_bindings (const SGPropertyNode * node,
311
binding_list_t * binding_list,
315
* Look up the bindings for a key code.
317
const vector<FGBinding *> &_find_key_bindings (unsigned int k,
320
button _key_bindings[MAX_KEYS];
321
joystick _joystick_bindings[MAX_JOYSTICKS];
326
extern FGInput current_input;
330
////////////////////////////////////////////////////////////////////////
332
////////////////////////////////////////////////////////////////////////
334
// Handle keyboard events
335
void GLUTkey(unsigned char k, int x, int y);
336
void GLUTkeyup(unsigned char k, int x, int y);
337
void GLUTspecialkey(int k, int x, int y);
338
void GLUTspecialkeyup(int k, int x, int y);
340
#endif // _CONTROLS_HXX