2001-05-23 22:59:40 +00:00
|
|
|
|
// input.hxx -- handle user input from various sources.
|
|
|
|
|
//
|
|
|
|
|
// Written by David Megginson, started May 2001.
|
|
|
|
|
//
|
|
|
|
|
// Copyright (C) 2001 David Megginson, david@megginson.com
|
|
|
|
|
//
|
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
|
// modify it under the terms of the GNU General Public License as
|
|
|
|
|
// published by the Free Software Foundation; either version 2 of the
|
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
|
//
|
|
|
|
|
// This program is distributed in the hope that it will be useful, but
|
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
// General Public License for more details.
|
|
|
|
|
//
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
|
// along with this program; if not, write to the Free Software
|
2006-02-21 01:16:04 +00:00
|
|
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2001-05-23 22:59:40 +00:00
|
|
|
|
//
|
|
|
|
|
// $Id$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _INPUT_HXX
|
|
|
|
|
#define _INPUT_HXX
|
|
|
|
|
|
|
|
|
|
#ifndef __cplusplus
|
|
|
|
|
# error This library requires C++
|
|
|
|
|
#endif
|
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
#include <plib/js.h>
|
2004-04-27 08:43:20 +00:00
|
|
|
|
#include <plib/ul.h>
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
#include <simgear/compiler.h>
|
|
|
|
|
|
2005-06-11 14:26:11 +00:00
|
|
|
|
#include <simgear/misc/sg_path.hxx>
|
2003-09-24 17:20:55 +00:00
|
|
|
|
#include <simgear/structure/subsystem_mgr.hxx>
|
2007-01-04 13:22:27 +00:00
|
|
|
|
#include <simgear/structure/SGBinding.hxx>
|
2003-05-06 23:46:24 +00:00
|
|
|
|
#include <simgear/props/condition.hxx>
|
|
|
|
|
#include <simgear/props/props.hxx>
|
2007-01-04 13:22:27 +00:00
|
|
|
|
#include <simgear/scene/util/SGSceneUserData.hxx>
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
2004-03-31 21:10:32 +00:00
|
|
|
|
#include <Main/fg_os.hxx>
|
2003-01-18 15:16:54 +00:00
|
|
|
|
#include <Main/fg_props.hxx>
|
2001-05-23 22:59:40 +00:00
|
|
|
|
#include <Main/globals.hxx>
|
|
|
|
|
|
|
|
|
|
#include <map>
|
2007-01-04 13:22:27 +00:00
|
|
|
|
#include <list>
|
2001-05-23 22:59:40 +00:00
|
|
|
|
#include <vector>
|
|
|
|
|
|
2008-07-27 16:25:13 +00:00
|
|
|
|
using std::map;
|
|
|
|
|
using std::vector;
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
2001-08-10 05:17:40 +00:00
|
|
|
|
|
2004-04-27 08:43:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( UL_WIN32 )
|
2004-04-28 08:03:40 +00:00
|
|
|
|
#define TGT_PLATFORM "windows"
|
2004-05-06 16:07:30 +00:00
|
|
|
|
#elif defined ( UL_MAC_OSX )
|
|
|
|
|
#define TGT_PLATFORM "mac"
|
2004-04-27 08:43:20 +00:00
|
|
|
|
#else
|
2004-04-28 08:03:40 +00:00
|
|
|
|
#define TGT_PLATFORM "unix"
|
2004-04-27 08:43:20 +00:00
|
|
|
|
#endif
|
2003-01-18 15:16:54 +00:00
|
|
|
|
|
|
|
|
|
|
2001-08-10 05:17:40 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// General input mapping support.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
/**
|
|
|
|
|
* Generic input module.
|
|
|
|
|
*
|
|
|
|
|
* <p>This module is designed to handle input from multiple sources --
|
|
|
|
|
* keyboard, joystick, mouse, or even panel switches -- in a consistent
|
|
|
|
|
* way, and to allow users to rebind any of the actions at runtime.</p>
|
|
|
|
|
*/
|
2003-09-24 17:20:55 +00:00
|
|
|
|
class FGInput : public SGSubsystem
|
2001-05-23 22:59:40 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2001-08-10 05:17:40 +00:00
|
|
|
|
/**
|
|
|
|
|
* Default constructor.
|
|
|
|
|
*/
|
|
|
|
|
FGInput ();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Destructor.
|
|
|
|
|
*/
|
2001-05-23 22:59:40 +00:00
|
|
|
|
virtual ~FGInput();
|
|
|
|
|
|
|
|
|
|
//
|
2003-09-24 17:20:55 +00:00
|
|
|
|
// Implementation of SGSubsystem.
|
2001-05-23 22:59:40 +00:00
|
|
|
|
//
|
|
|
|
|
virtual void init ();
|
2004-06-24 02:08:38 +00:00
|
|
|
|
virtual void reinit ();
|
2005-06-11 14:26:11 +00:00
|
|
|
|
virtual void postinit ();
|
2006-06-05 16:28:20 +00:00
|
|
|
|
virtual void bind ();
|
|
|
|
|
virtual void unbind ();
|
2002-05-11 16:28:50 +00:00
|
|
|
|
virtual void update (double dt);
|
2003-03-01 21:29:31 +00:00
|
|
|
|
virtual void suspend ();
|
|
|
|
|
virtual void resume ();
|
|
|
|
|
virtual bool is_suspended () const;
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
|
|
|
|
|
2002-10-04 13:20:53 +00:00
|
|
|
|
/**
|
|
|
|
|
* Control whether this is the default module to receive events.
|
|
|
|
|
*
|
|
|
|
|
* The first input module created will set itself as the default
|
|
|
|
|
* automatically.
|
|
|
|
|
*
|
|
|
|
|
* @param status true if this should be the default module for
|
|
|
|
|
* events, false otherwise.
|
|
|
|
|
*/
|
|
|
|
|
virtual void makeDefault (bool status = true);
|
|
|
|
|
|
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
/**
|
|
|
|
|
* Handle a single keystroke.
|
|
|
|
|
*
|
2004-03-31 21:10:32 +00:00
|
|
|
|
* @param k The integer key code, see Main/fg_os.hxx
|
2001-05-23 22:59:40 +00:00
|
|
|
|
* @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.
|
|
|
|
|
*/
|
|
|
|
|
virtual void doKey (int k, int modifiers, int x, int y);
|
|
|
|
|
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
/**
|
|
|
|
|
* 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.
|
|
|
|
|
*/
|
2007-05-26 13:53:46 +00:00
|
|
|
|
virtual void doMouseClick (int button, int updown, int x, int y, bool mainWindow, const osgGA::GUIEventAdapter*);
|
2002-03-23 23:16:13 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 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);
|
|
|
|
|
|
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
private:
|
2001-06-04 21:07:02 +00:00
|
|
|
|
// Constants
|
2001-06-12 05:16:57 +00:00
|
|
|
|
enum
|
|
|
|
|
{
|
|
|
|
|
MAX_KEYS = 1024,
|
|
|
|
|
MAX_JOYSTICKS = 10,
|
2002-03-23 23:16:13 +00:00
|
|
|
|
MAX_JOYSTICK_AXES = _JS_MAX_AXES,
|
|
|
|
|
MAX_JOYSTICK_BUTTONS = 32,
|
|
|
|
|
|
|
|
|
|
MAX_MICE = 1,
|
2002-03-26 13:45:44 +00:00
|
|
|
|
MAX_MOUSE_BUTTONS = 8
|
2001-06-12 05:16:57 +00:00
|
|
|
|
};
|
2002-03-30 12:52:55 +00:00
|
|
|
|
struct mouse;
|
|
|
|
|
friend struct mouse;
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
2007-01-04 13:22:27 +00:00
|
|
|
|
typedef vector<SGSharedPtr<SGBinding> > binding_list_t;
|
2001-06-20 20:51:15 +00:00
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Settings for a key or button.
|
|
|
|
|
*/
|
|
|
|
|
struct button {
|
2001-08-10 05:17:40 +00:00
|
|
|
|
button ();
|
|
|
|
|
virtual ~button ();
|
2001-06-04 21:07:02 +00:00
|
|
|
|
bool is_repeatable;
|
2003-07-02 19:21:11 +00:00
|
|
|
|
float interval_sec;
|
|
|
|
|
float last_dt;
|
2001-06-04 21:07:02 +00:00
|
|
|
|
int last_state;
|
2004-03-31 21:10:32 +00:00
|
|
|
|
binding_list_t bindings[KEYMOD_MAX];
|
2001-06-04 21:07:02 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Settings for a single joystick axis.
|
|
|
|
|
*/
|
|
|
|
|
struct axis {
|
2001-08-10 05:17:40 +00:00
|
|
|
|
axis ();
|
|
|
|
|
virtual ~axis ();
|
2001-06-04 21:07:02 +00:00
|
|
|
|
float last_value;
|
|
|
|
|
float tolerance;
|
2004-03-31 21:10:32 +00:00
|
|
|
|
binding_list_t bindings[KEYMOD_MAX];
|
2001-06-20 20:51:15 +00:00
|
|
|
|
float low_threshold;
|
|
|
|
|
float high_threshold;
|
|
|
|
|
struct button low;
|
|
|
|
|
struct button high;
|
2003-07-01 16:32:00 +00:00
|
|
|
|
float interval_sec;
|
|
|
|
|
double last_dt;
|
2001-06-04 21:07:02 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Settings for a joystick.
|
|
|
|
|
*/
|
|
|
|
|
struct joystick {
|
2001-08-10 05:17:40 +00:00
|
|
|
|
joystick ();
|
|
|
|
|
virtual ~joystick ();
|
|
|
|
|
int jsnum;
|
|
|
|
|
jsJoystick * js;
|
2001-06-04 21:07:02 +00:00
|
|
|
|
int naxes;
|
|
|
|
|
int nbuttons;
|
|
|
|
|
axis * axes;
|
|
|
|
|
button * buttons;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2002-03-26 13:45:44 +00:00
|
|
|
|
/**
|
|
|
|
|
* Settings for a mouse mode.
|
|
|
|
|
*/
|
|
|
|
|
struct mouse_mode {
|
|
|
|
|
mouse_mode ();
|
|
|
|
|
virtual ~mouse_mode ();
|
|
|
|
|
int cursor;
|
|
|
|
|
bool constrained;
|
2002-03-26 17:14:48 +00:00
|
|
|
|
bool pass_through;
|
2002-03-26 13:45:44 +00:00
|
|
|
|
button * buttons;
|
2004-03-31 21:10:32 +00:00
|
|
|
|
binding_list_t x_bindings[KEYMOD_MAX];
|
|
|
|
|
binding_list_t y_bindings[KEYMOD_MAX];
|
2002-03-26 13:45:44 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
/**
|
|
|
|
|
* Settings for a mouse.
|
|
|
|
|
*/
|
|
|
|
|
struct mouse {
|
|
|
|
|
mouse ();
|
|
|
|
|
virtual ~mouse ();
|
2002-03-26 13:45:44 +00:00
|
|
|
|
int x;
|
|
|
|
|
int y;
|
2008-04-26 13:25:08 +00:00
|
|
|
|
int save_x;
|
|
|
|
|
int save_y;
|
2006-06-11 10:21:10 +00:00
|
|
|
|
SGPropertyNode_ptr mode_node;
|
|
|
|
|
SGPropertyNode_ptr mouse_button_nodes[MAX_MOUSE_BUTTONS];
|
2002-03-25 12:58:26 +00:00
|
|
|
|
int nModes;
|
2002-03-26 13:45:44 +00:00
|
|
|
|
int current_mode;
|
2004-06-14 18:46:58 +00:00
|
|
|
|
double timeout;
|
2002-03-26 13:45:44 +00:00
|
|
|
|
mouse_mode * modes;
|
2002-03-23 23:16:13 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Initialize joystick bindings.
|
|
|
|
|
*/
|
|
|
|
|
void _init_joystick ();
|
|
|
|
|
|
|
|
|
|
|
2005-06-11 14:26:11 +00:00
|
|
|
|
/**
|
|
|
|
|
* 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);
|
|
|
|
|
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
/**
|
|
|
|
|
* Initialize mouse bindings.
|
|
|
|
|
*/
|
|
|
|
|
void _init_mouse ();
|
|
|
|
|
|
|
|
|
|
|
2001-06-20 20:51:15 +00:00
|
|
|
|
/**
|
|
|
|
|
* Initialize a single button.
|
|
|
|
|
*/
|
|
|
|
|
inline void _init_button (const SGPropertyNode * node,
|
|
|
|
|
button &b,
|
|
|
|
|
const string name);
|
|
|
|
|
|
2005-06-11 14:26:11 +00:00
|
|
|
|
/**
|
2007-07-13 10:15:48 +00:00
|
|
|
|
* Initialize key bindings, as well as those joystick parts that
|
|
|
|
|
* depend on a working Nasal subsystem.
|
2005-06-11 14:26:11 +00:00
|
|
|
|
*/
|
2007-07-12 22:57:14 +00:00
|
|
|
|
void _postinit_keyboard ();
|
2005-06-11 14:26:11 +00:00
|
|
|
|
void _postinit_joystick ();
|
2001-06-20 20:51:15 +00:00
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Update the keyboard.
|
|
|
|
|
*/
|
2003-06-04 14:22:51 +00:00
|
|
|
|
void _update_keyboard ();
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Update the joystick.
|
|
|
|
|
*/
|
2003-07-01 16:32:00 +00:00
|
|
|
|
void _update_joystick (double dt);
|
2001-06-04 21:07:02 +00:00
|
|
|
|
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
/**
|
|
|
|
|
* Update the mouse.
|
|
|
|
|
*/
|
2004-06-14 18:46:58 +00:00
|
|
|
|
void _update_mouse (double dt);
|
2002-03-23 23:16:13 +00:00
|
|
|
|
|
|
|
|
|
|
2001-06-20 20:51:15 +00:00
|
|
|
|
/**
|
|
|
|
|
* Update a single button.
|
|
|
|
|
*/
|
2002-03-23 23:16:13 +00:00
|
|
|
|
inline void _update_button (button &b, int modifiers, bool pressed,
|
|
|
|
|
int x, int y);
|
2001-06-20 20:51:15 +00:00
|
|
|
|
|
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
/**
|
|
|
|
|
* Read bindings and modifiers.
|
|
|
|
|
*/
|
|
|
|
|
void _read_bindings (const SGPropertyNode * node,
|
|
|
|
|
binding_list_t * binding_list,
|
|
|
|
|
int modifiers);
|
|
|
|
|
|
2001-05-29 22:06:14 +00:00
|
|
|
|
/**
|
|
|
|
|
* Look up the bindings for a key code.
|
|
|
|
|
*/
|
2007-01-04 13:22:27 +00:00
|
|
|
|
const binding_list_t& _find_key_bindings (unsigned int k,
|
|
|
|
|
int modifiers);
|
2001-05-29 22:06:14 +00:00
|
|
|
|
|
2001-06-04 21:07:02 +00:00
|
|
|
|
button _key_bindings[MAX_KEYS];
|
|
|
|
|
joystick _joystick_bindings[MAX_JOYSTICKS];
|
2002-03-23 23:16:13 +00:00
|
|
|
|
mouse _mouse_bindings[MAX_MICE];
|
|
|
|
|
|
- fix bug that let <mod-up> bindings be executed before the nasal init
block (this required to move most of init() into postinit())
- undo the "which" pseudo-namespace workaround, and do it proper:
- let all nasal code in a joystick config file be executed in its own
namespace. This allows to define functions in the init block that
can be used throughout the driver file, and to write state variables
in one binding, while reading them in other bindings, all without
having to make sure that the values aren't lost in between, or collide
with another joystick driver's code.
For this the input subsystem creates a namespace for each joystick:
"__js0" for joystick 0, etc. The two leading underscores are there to
avoid collisions with user defined modules (similar to internal compiler
variables). The namespace shouldn't be used explicitly, at least not in
releases, and not from outside code, except for testing purposes, for
which it can be useful. (If using the Cyborg joystick as js[0], you
can read the modifier level as "__js0.modifier" from any nasal context.)
2005-06-19 17:23:41 +00:00
|
|
|
|
/**
|
|
|
|
|
* Nasal module name/namespace.
|
|
|
|
|
*/
|
2007-07-12 22:57:14 +00:00
|
|
|
|
string _module;
|
2007-01-04 13:22:27 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* List of currently pressed mouse button events
|
|
|
|
|
*/
|
|
|
|
|
std::map<int, std::list<SGSharedPtr<SGPickCallback> > > _activePickCallbacks;
|
2007-11-12 19:29:08 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Key listener interface.
|
|
|
|
|
*/
|
|
|
|
|
SGPropertyNode_ptr _key_event;
|
|
|
|
|
int _key_code;
|
|
|
|
|
int _key_modifiers;
|
|
|
|
|
bool _key_pressed;
|
2007-12-01 13:09:11 +00:00
|
|
|
|
bool _key_shift;
|
2007-11-12 19:29:08 +00:00
|
|
|
|
bool _key_ctrl;
|
|
|
|
|
bool _key_alt;
|
2007-12-01 13:09:11 +00:00
|
|
|
|
bool _key_meta;
|
|
|
|
|
bool _key_super;
|
2008-04-25 23:21:47 +00:00
|
|
|
|
bool _key_hyper;
|
2001-05-23 22:59:40 +00:00
|
|
|
|
};
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
#endif // _INPUT_HXX
|