2001-05-23 22:59:40 +00:00
|
|
|
|
// input.cxx -- 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$
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
# include <config.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
#ifdef HAVE_WINDOWS_H
|
2005-06-11 14:26:11 +00:00
|
|
|
|
# include <windows.h>
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
#endif
|
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
#include <simgear/compiler.h>
|
|
|
|
|
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
#include <math.h>
|
2001-05-29 22:06:14 +00:00
|
|
|
|
#include <ctype.h>
|
2007-07-12 22:57:14 +00:00
|
|
|
|
#include <sstream>
|
2001-05-29 22:06:14 +00:00
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
#include STL_FSTREAM
|
|
|
|
|
#include STL_STRING
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
#include <vector>
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
2001-06-05 22:11:16 +00:00
|
|
|
|
#include <simgear/compiler.h>
|
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
#include <simgear/constants.h>
|
|
|
|
|
#include <simgear/debug/logstream.hxx>
|
2007-01-04 13:22:27 +00:00
|
|
|
|
#include <simgear/math/SGMath.hxx>
|
2003-05-06 23:46:24 +00:00
|
|
|
|
#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
|
|
|
|
|
|
|
|
|
#include <Aircraft/aircraft.hxx>
|
2004-01-31 19:47:45 +00:00
|
|
|
|
#include <Autopilot/xmlauto.hxx>
|
2001-05-23 22:59:40 +00:00
|
|
|
|
#include <Cockpit/hud.hxx>
|
|
|
|
|
#include <Cockpit/panel.hxx>
|
|
|
|
|
#include <Cockpit/panel_io.hxx>
|
|
|
|
|
#include <GUI/gui.h>
|
Andy Ross:
The biggest and coolest patch adds mouse sensitivity to the 3D
cockpits, so we can finally work the radios. This ended up requiring
significant modifications outside of the 3D cockpit code. Stuff folks
will want to look at:
+ The list of all "3D" cockpits is stored statically in the
panelnode.cxx file. This is clumsy, and won't migrate well to a
multiple-aircraft feature. Really, there should be a per-model list
of 3D panels, but I couldn't find a clean place to put this. The
only handle you get back after parsing a model is a generic ssg
node, to which I obviously can't add panel-specific methods.
+ The aircraft model is parsed *very* early in the initialization
order. Earlier, in fact, than the static list of allowable command
bindings is built in fgInitCommands(). This is bad, as it means
that mouse bindings on the instruments can't work yet. I moved the
call to fgInitCommands, but someone should look carefully to see
that I picked the right place. There's a lot of initialization
code, and I got a little lost in there... :)
+ I added yet another "update" hook to the fgRenderFrame routine to
hook the updates for the 3D panels. This is only required for
"mouse press delay", and it's a fairly clumsy mechanism based on
frame rate instead of real time. There appears to be delay handling
already in place in the Input stuff, and there's a discussion going
on about different mouse behavior right now. Maybe this is a good
time to unify these two (now three) approaches?
2002-10-29 19:44:03 +00:00
|
|
|
|
#include <Model/panelnode.hxx>
|
2005-06-11 14:26:11 +00:00
|
|
|
|
#include <Scripting/NasalSys.hxx>
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
|
|
|
|
#include <Main/globals.hxx>
|
|
|
|
|
#include <Main/fg_props.hxx>
|
|
|
|
|
|
|
|
|
|
#include "input.hxx"
|
|
|
|
|
|
2005-12-12 22:22:28 +00:00
|
|
|
|
#include <Scenery/scenery.hxx>
|
|
|
|
|
#include <Main/renderer.hxx>
|
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
SG_USING_STD(ifstream);
|
2007-07-12 22:57:14 +00:00
|
|
|
|
SG_USING_STD(ostringstream);
|
2001-05-23 22:59:40 +00:00
|
|
|
|
SG_USING_STD(string);
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
SG_USING_STD(vector);
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
2007-05-26 13:53:46 +00:00
|
|
|
|
void mouseClickHandler(int button, int updown, int x, int y, bool mainWindow, const osgGA::GUIEventAdapter*);
|
2004-03-31 21:10:32 +00:00
|
|
|
|
void mouseMotionHandler(int x, int y);
|
|
|
|
|
void keyHandler(int key, int keymod, int mousex, int mousey);
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2002-10-04 13:20:53 +00:00
|
|
|
|
// Local variables.
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2002-10-04 13:20:53 +00:00
|
|
|
|
static FGInput * default_input = 0;
|
|
|
|
|
|
2006-06-05 13:45:59 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Local functions.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
static bool
|
|
|
|
|
getModShift ()
|
|
|
|
|
{
|
|
|
|
|
return bool(fgGetKeyModifiers() & KEYMOD_SHIFT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool
|
|
|
|
|
getModCtrl ()
|
|
|
|
|
{
|
|
|
|
|
return bool(fgGetKeyModifiers() & KEYMOD_CTRL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool
|
|
|
|
|
getModAlt ()
|
|
|
|
|
{
|
|
|
|
|
return bool(fgGetKeyModifiers() & KEYMOD_ALT);
|
|
|
|
|
}
|
2002-10-04 13:20:53 +00:00
|
|
|
|
|
2007-12-01 13:09:11 +00:00
|
|
|
|
static bool
|
|
|
|
|
getModMeta ()
|
|
|
|
|
{
|
|
|
|
|
return bool(fgGetKeyModifiers() & KEYMOD_META);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool
|
|
|
|
|
getModSuper ()
|
|
|
|
|
{
|
|
|
|
|
return bool(fgGetKeyModifiers() & KEYMOD_SUPER);
|
|
|
|
|
}
|
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGInput.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
2007-11-12 19:29:08 +00:00
|
|
|
|
FGInput::FGInput () :
|
|
|
|
|
_key_event(fgGetNode("/devices/status/keyboard/event", true))
|
2001-05-23 22:59:40 +00:00
|
|
|
|
{
|
2002-10-04 13:20:53 +00:00
|
|
|
|
if (default_input == 0)
|
|
|
|
|
default_input = this;
|
2001-05-23 22:59:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FGInput::~FGInput ()
|
|
|
|
|
{
|
2002-10-04 13:20:53 +00:00
|
|
|
|
if (default_input == this)
|
|
|
|
|
default_input = 0;
|
2001-05-23 22:59:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
FGInput::init ()
|
|
|
|
|
{
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
_init_joystick();
|
2002-03-23 23:16:13 +00:00
|
|
|
|
_init_mouse();
|
2002-03-26 13:45:44 +00:00
|
|
|
|
|
2004-03-31 21:10:32 +00:00
|
|
|
|
fgRegisterKeyHandler(keyHandler);
|
|
|
|
|
fgRegisterMouseClickHandler(mouseClickHandler);
|
|
|
|
|
fgRegisterMouseMotionHandler(mouseMotionHandler);
|
2001-05-23 22:59:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
2004-06-24 02:08:38 +00:00
|
|
|
|
void
|
|
|
|
|
FGInput::reinit ()
|
|
|
|
|
{
|
|
|
|
|
init();
|
|
|
|
|
}
|
|
|
|
|
|
2005-06-11 14:26:11 +00:00
|
|
|
|
void
|
|
|
|
|
FGInput::postinit ()
|
|
|
|
|
{
|
|
|
|
|
_postinit_joystick();
|
2007-07-13 10:15:48 +00:00
|
|
|
|
_postinit_keyboard();
|
2005-06-11 14:26:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
2006-06-05 13:45:59 +00:00
|
|
|
|
void
|
|
|
|
|
FGInput::bind ()
|
|
|
|
|
{
|
|
|
|
|
fgTie("/devices/status/keyboard/shift", getModShift);
|
|
|
|
|
fgTie("/devices/status/keyboard/ctrl", getModCtrl);
|
|
|
|
|
fgTie("/devices/status/keyboard/alt", getModAlt);
|
2007-12-01 13:09:11 +00:00
|
|
|
|
fgTie("/devices/status/keyboard/meta", getModMeta);
|
|
|
|
|
fgTie("/devices/status/keyboard/super", getModSuper);
|
2007-11-12 19:29:08 +00:00
|
|
|
|
|
|
|
|
|
_key_event->tie("key", SGRawValuePointer<int>(&_key_code));
|
|
|
|
|
_key_event->tie("pressed", SGRawValuePointer<bool>(&_key_pressed));
|
|
|
|
|
_key_event->tie("modifier", SGRawValuePointer<int>(&_key_modifiers));
|
|
|
|
|
_key_event->tie("modifier/shift", SGRawValuePointer<bool>(&_key_shift));
|
|
|
|
|
_key_event->tie("modifier/ctrl", SGRawValuePointer<bool>(&_key_ctrl));
|
|
|
|
|
_key_event->tie("modifier/alt", SGRawValuePointer<bool>(&_key_alt));
|
2007-12-01 13:09:11 +00:00
|
|
|
|
_key_event->tie("modifier/meta", SGRawValuePointer<bool>(&_key_meta));
|
|
|
|
|
_key_event->tie("modifier/super", SGRawValuePointer<bool>(&_key_super));
|
2006-06-05 13:45:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
FGInput::unbind ()
|
|
|
|
|
{
|
|
|
|
|
fgUntie("/devices/status/keyboard/shift");
|
|
|
|
|
fgUntie("/devices/status/keyboard/ctrl");
|
|
|
|
|
fgUntie("/devices/status/keyboard/alt");
|
2007-12-01 13:09:11 +00:00
|
|
|
|
fgUntie("/devices/status/keyboard/meta");
|
|
|
|
|
fgUntie("/devices/status/keyboard/super");
|
2007-11-12 19:29:08 +00:00
|
|
|
|
|
|
|
|
|
_key_event->untie("key");
|
|
|
|
|
_key_event->untie("pressed");
|
|
|
|
|
_key_event->untie("modifier");
|
|
|
|
|
_key_event->untie("modifier/shift");
|
|
|
|
|
_key_event->untie("modifier/ctrl");
|
|
|
|
|
_key_event->untie("modifier/alt");
|
2007-12-01 13:09:11 +00:00
|
|
|
|
_key_event->untie("modifier/meta");
|
|
|
|
|
_key_event->untie("modifier/super");
|
2006-06-05 13:45:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
2003-03-01 21:29:31 +00:00
|
|
|
|
void
|
|
|
|
|
FGInput::update (double dt)
|
|
|
|
|
{
|
2003-06-04 14:22:51 +00:00
|
|
|
|
_update_keyboard();
|
2003-07-01 16:32:00 +00:00
|
|
|
|
_update_joystick(dt);
|
2004-06-14 18:46:58 +00:00
|
|
|
|
_update_mouse(dt);
|
2003-03-01 21:29:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
void
|
2003-03-01 21:29:31 +00:00
|
|
|
|
FGInput::suspend ()
|
2001-05-23 22:59:40 +00:00
|
|
|
|
{
|
2003-03-01 21:29:31 +00:00
|
|
|
|
// NO-OP
|
2001-05-23 22:59:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2003-03-01 21:29:31 +00:00
|
|
|
|
FGInput::resume ()
|
2001-05-23 22:59:40 +00:00
|
|
|
|
{
|
2003-03-01 21:29:31 +00:00
|
|
|
|
// NO-OP
|
2001-05-23 22:59:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
2003-03-01 21:29:31 +00:00
|
|
|
|
bool
|
|
|
|
|
FGInput::is_suspended () const
|
2001-05-23 22:59:40 +00:00
|
|
|
|
{
|
2003-03-01 21:29:31 +00:00
|
|
|
|
return false;
|
2001-05-23 22:59:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-10-04 13:20:53 +00:00
|
|
|
|
void
|
|
|
|
|
FGInput::makeDefault (bool status)
|
|
|
|
|
{
|
|
|
|
|
if (status)
|
|
|
|
|
default_input = this;
|
|
|
|
|
else if (default_input == this)
|
|
|
|
|
default_input = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2001-05-23 22:59:40 +00:00
|
|
|
|
void
|
|
|
|
|
FGInput::doKey (int k, int modifiers, int x, int y)
|
|
|
|
|
{
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Sanity check.
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
if (k < 0 || k >= MAX_KEYS) {
|
2002-03-23 23:16:13 +00:00
|
|
|
|
SG_LOG(SG_INPUT, SG_WARN, "Key value " << k << " out of range");
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
2007-11-12 19:29:08 +00:00
|
|
|
|
_key_code = k;
|
|
|
|
|
_key_modifiers = modifiers & ~KEYMOD_RELEASED;
|
2007-12-01 13:09:11 +00:00
|
|
|
|
_key_pressed = !bool(modifiers & KEYMOD_RELEASED);
|
2007-11-12 19:29:08 +00:00
|
|
|
|
_key_shift = bool(modifiers & KEYMOD_SHIFT);
|
|
|
|
|
_key_ctrl = bool(modifiers & KEYMOD_CTRL);
|
|
|
|
|
_key_alt = bool(modifiers & KEYMOD_ALT);
|
2007-12-01 13:09:11 +00:00
|
|
|
|
_key_meta = bool(modifiers & KEYMOD_META);
|
|
|
|
|
_key_super = bool(modifiers & KEYMOD_SUPER);
|
2007-11-12 19:29:08 +00:00
|
|
|
|
_key_event->fireValueChanged();
|
|
|
|
|
if (!_key_code)
|
2007-12-01 13:09:11 +00:00
|
|
|
|
return;
|
2007-11-12 19:29:08 +00:00
|
|
|
|
|
2007-12-01 23:37:58 +00:00
|
|
|
|
k = _key_code;
|
|
|
|
|
modifiers = _key_modifiers | (_key_pressed ? KEYMOD_NONE : KEYMOD_RELEASED);
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
button &b = _key_bindings[k];
|
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Key pressed.
|
2005-06-27 07:13:02 +00:00
|
|
|
|
if (!(modifiers & KEYMOD_RELEASED)) {
|
2002-03-23 23:16:13 +00:00
|
|
|
|
SG_LOG( SG_INPUT, SG_DEBUG, "User pressed key " << k
|
2002-11-05 02:28:07 +00:00
|
|
|
|
<< " with modifiers " << modifiers );
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
if (!b.last_state || b.is_repeatable) {
|
2005-06-27 07:13:02 +00:00
|
|
|
|
const binding_list_t &bindings = _find_key_bindings(k, modifiers);
|
|
|
|
|
|
2005-06-27 13:59:48 +00:00
|
|
|
|
for (unsigned int i = 0; i < bindings.size(); i++)
|
2005-06-27 07:13:02 +00:00
|
|
|
|
bindings[i]->fire();
|
|
|
|
|
b.last_state = 1;
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Key released.
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
else {
|
2002-03-23 23:16:13 +00:00
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "User released key " << k
|
2002-11-05 02:28:07 +00:00
|
|
|
|
<< " with modifiers " << modifiers);
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
if (b.last_state) {
|
2005-06-27 07:13:02 +00:00
|
|
|
|
const binding_list_t &bindings = _find_key_bindings(k, modifiers);
|
2005-06-27 13:59:48 +00:00
|
|
|
|
for (unsigned int i = 0; i < bindings.size(); i++)
|
2005-06-27 07:13:02 +00:00
|
|
|
|
bindings[i]->fire();
|
|
|
|
|
b.last_state = 0;
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
}
|
2004-04-05 18:54:53 +00:00
|
|
|
|
}
|
2001-05-23 22:59:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
void
|
2007-05-26 13:53:46 +00:00
|
|
|
|
FGInput::doMouseClick (int b, int updown, int x, int y, bool mainWindow, const osgGA::GUIEventAdapter* ea)
|
2002-03-23 23:16:13 +00:00
|
|
|
|
{
|
2004-03-31 21:10:32 +00:00
|
|
|
|
int modifiers = fgGetKeyModifiers();
|
2002-03-23 23:16:13 +00:00
|
|
|
|
|
2002-03-26 13:45:44 +00:00
|
|
|
|
mouse &m = _mouse_bindings[0];
|
2002-03-26 17:14:48 +00:00
|
|
|
|
mouse_mode &mode = m.modes[m.current_mode];
|
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Let the property manager know.
|
2002-03-27 23:45:11 +00:00
|
|
|
|
if (b >= 0 && b < MAX_MOUSE_BUTTONS)
|
2004-03-31 21:10:32 +00:00
|
|
|
|
m.mouse_button_nodes[b]->setBoolValue(updown == MOUSE_BUTTON_DOWN);
|
2002-03-27 23:45:11 +00:00
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Pass on to PUI and the panel if
|
|
|
|
|
// requested, and return if one of
|
|
|
|
|
// them consumes the event.
|
2007-01-04 13:22:27 +00:00
|
|
|
|
|
|
|
|
|
if (updown != MOUSE_BUTTON_DOWN) {
|
|
|
|
|
// Execute the mouse up event in any case, may be we should
|
|
|
|
|
// stop processing here?
|
|
|
|
|
while (!_activePickCallbacks[b].empty()) {
|
|
|
|
|
_activePickCallbacks[b].front()->buttonReleased();
|
|
|
|
|
_activePickCallbacks[b].pop_front();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2002-03-26 17:14:48 +00:00
|
|
|
|
if (mode.pass_through) {
|
2007-05-26 13:53:46 +00:00
|
|
|
|
// The pu stuff seems to need that. May be it does opengl picking ...
|
|
|
|
|
fgMakeCurrent();
|
|
|
|
|
if (0 <= x && 0 <= y && puMouse(b, updown, x, y))
|
2002-03-26 17:14:48 +00:00
|
|
|
|
return;
|
2007-05-26 13:53:46 +00:00
|
|
|
|
else if (0 <= x && 0 <= y && (globals->get_current_panel() != 0) &&
|
2003-03-30 12:46:08 +00:00
|
|
|
|
globals->get_current_panel()->getVisibility() &&
|
|
|
|
|
globals->get_current_panel()->doMouseAction(b, updown, x, y))
|
Andy Ross:
The biggest and coolest patch adds mouse sensitivity to the 3D
cockpits, so we can finally work the radios. This ended up requiring
significant modifications outside of the 3D cockpit code. Stuff folks
will want to look at:
+ The list of all "3D" cockpits is stored statically in the
panelnode.cxx file. This is clumsy, and won't migrate well to a
multiple-aircraft feature. Really, there should be a per-model list
of 3D panels, but I couldn't find a clean place to put this. The
only handle you get back after parsing a model is a generic ssg
node, to which I obviously can't add panel-specific methods.
+ The aircraft model is parsed *very* early in the initialization
order. Earlier, in fact, than the static list of allowable command
bindings is built in fgInitCommands(). This is bad, as it means
that mouse bindings on the instruments can't work yet. I moved the
call to fgInitCommands, but someone should look carefully to see
that I picked the right place. There's a lot of initialization
code, and I got a little lost in there... :)
+ I added yet another "update" hook to the fgRenderFrame routine to
hook the updates for the 3D panels. This is only required for
"mouse press delay", and it's a fairly clumsy mechanism based on
frame rate instead of real time. There appears to be delay handling
already in place in the Input stuff, and there's a discussion going
on about different mouse behavior right now. Maybe this is a good
time to unify these two (now three) approaches?
2002-10-29 19:44:03 +00:00
|
|
|
|
return;
|
2007-05-26 13:53:46 +00:00
|
|
|
|
else if (0 <= x && 0 <= y && fgHandle3DPanelMouseEvent(b, updown, x, y))
|
2002-03-26 17:14:48 +00:00
|
|
|
|
return;
|
2005-12-12 22:22:28 +00:00
|
|
|
|
else {
|
2007-01-04 13:22:27 +00:00
|
|
|
|
// pui didn't want the click event so compute a
|
|
|
|
|
// scenegraph intersection point corresponding to the mouse click
|
|
|
|
|
if (updown == MOUSE_BUTTON_DOWN) {
|
|
|
|
|
|
|
|
|
|
// Get the list of hit callbacks. Take the first callback that
|
|
|
|
|
// accepts the mouse button press and ignore the rest of them
|
|
|
|
|
// That is they get sorted by distance and by scenegraph depth.
|
|
|
|
|
// The nearest one is the first one and the deepest
|
|
|
|
|
// (the most specialized one in the scenegraph) is the first.
|
2007-01-07 12:02:50 +00:00
|
|
|
|
std::vector<SGSceneryPick> pickList;
|
2007-05-26 13:53:46 +00:00
|
|
|
|
if (FGRenderer::pick(x, y, pickList, ea)) {
|
2007-01-04 13:22:27 +00:00
|
|
|
|
std::vector<SGSceneryPick>::const_iterator i;
|
|
|
|
|
for (i = pickList.begin(); i != pickList.end(); ++i) {
|
|
|
|
|
if (i->callback->buttonPressed(b, i->info)) {
|
|
|
|
|
_activePickCallbacks[b].push_back(i->callback);
|
2007-01-07 08:33:02 +00:00
|
|
|
|
return;
|
2007-01-04 13:22:27 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2005-12-12 22:22:28 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2002-03-26 17:14:48 +00:00
|
|
|
|
}
|
2002-03-26 13:45:44 +00:00
|
|
|
|
|
2007-01-04 13:22:27 +00:00
|
|
|
|
// OK, PUI and the panel didn't want the click
|
2002-03-25 12:58:26 +00:00
|
|
|
|
if (b >= MAX_MOUSE_BUTTONS) {
|
|
|
|
|
SG_LOG(SG_INPUT, SG_ALERT, "Mouse button " << b
|
2002-11-05 02:28:07 +00:00
|
|
|
|
<< " where only " << MAX_MOUSE_BUTTONS << " expected");
|
2002-03-25 12:58:26 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2002-05-10 23:35:06 +00:00
|
|
|
|
_update_button(m.modes[m.current_mode].buttons[b], modifiers, 0 != updown, x, y);
|
2002-03-23 23:16:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
FGInput::doMouseMotion (int x, int y)
|
|
|
|
|
{
|
2004-04-01 23:28:47 +00:00
|
|
|
|
// Don't call fgGetKeyModifiers() here, until we are using a
|
|
|
|
|
// toolkit that supports getting the mods from outside a key
|
|
|
|
|
// callback. Glut doesn't.
|
|
|
|
|
int modifiers = KEYMOD_NONE;
|
2002-03-26 13:45:44 +00:00
|
|
|
|
|
|
|
|
|
int xsize = fgGetInt("/sim/startup/xsize", 800);
|
|
|
|
|
int ysize = fgGetInt("/sim/startup/ysize", 600);
|
2004-06-14 18:46:58 +00:00
|
|
|
|
|
2002-03-26 13:45:44 +00:00
|
|
|
|
mouse &m = _mouse_bindings[0];
|
2004-06-14 18:46:58 +00:00
|
|
|
|
|
|
|
|
|
if (m.current_mode < 0 || m.current_mode >= m.nModes) {
|
|
|
|
|
m.x = x;
|
|
|
|
|
m.y = y;
|
|
|
|
|
return;
|
|
|
|
|
}
|
2002-03-26 13:45:44 +00:00
|
|
|
|
mouse_mode &mode = m.modes[m.current_mode];
|
2002-03-26 17:14:48 +00:00
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Pass on to PUI if requested, and return
|
|
|
|
|
// if PUI consumed the event.
|
2004-06-14 18:46:58 +00:00
|
|
|
|
if (mode.pass_through && puMouse(x, y)) {
|
|
|
|
|
m.x = x;
|
|
|
|
|
m.y = y;
|
|
|
|
|
return;
|
|
|
|
|
}
|
2002-03-26 17:14:48 +00:00
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// OK, PUI didn't want the event,
|
|
|
|
|
// so we can play with it.
|
2002-03-26 13:45:44 +00:00
|
|
|
|
if (x != m.x) {
|
|
|
|
|
int delta = x - m.x;
|
2002-07-18 22:32:12 +00:00
|
|
|
|
for (unsigned int i = 0; i < mode.x_bindings[modifiers].size(); i++)
|
2002-03-26 13:45:44 +00:00
|
|
|
|
mode.x_bindings[modifiers][i]->fire(double(delta), double(xsize));
|
|
|
|
|
}
|
|
|
|
|
if (y != m.y) {
|
|
|
|
|
int delta = y - m.y;
|
2002-07-18 22:32:12 +00:00
|
|
|
|
for (unsigned int i = 0; i < mode.y_bindings[modifiers].size(); i++)
|
2002-03-26 13:45:44 +00:00
|
|
|
|
mode.y_bindings[modifiers][i]->fire(double(delta), double(ysize));
|
|
|
|
|
}
|
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Constrain the mouse if requested
|
2002-03-26 13:45:44 +00:00
|
|
|
|
if (mode.constrained) {
|
|
|
|
|
bool need_warp = false;
|
2006-02-16 01:30:28 +00:00
|
|
|
|
if (x <= (xsize * .25) || x >= (xsize * .75)) {
|
|
|
|
|
x = int(xsize * .5);
|
2002-03-26 13:45:44 +00:00
|
|
|
|
need_warp = true;
|
|
|
|
|
}
|
|
|
|
|
|
2006-02-16 01:30:28 +00:00
|
|
|
|
if (y <= (ysize * .25) || y >= (ysize * .75)) {
|
|
|
|
|
y = int(ysize * .5);
|
2002-03-26 13:45:44 +00:00
|
|
|
|
need_warp = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (need_warp)
|
2004-03-31 21:10:32 +00:00
|
|
|
|
fgWarpMouse(x, y);
|
2002-03-26 13:45:44 +00:00
|
|
|
|
}
|
2007-02-05 20:29:26 +00:00
|
|
|
|
|
|
|
|
|
if (m.x != x)
|
|
|
|
|
fgSetInt("/devices/status/mice/mouse/x", m.x = x);
|
|
|
|
|
|
|
|
|
|
if (m.y != y)
|
|
|
|
|
fgSetInt("/devices/status/mice/mouse/y", m.y = y);
|
2002-03-23 23:16:13 +00:00
|
|
|
|
}
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
2005-06-11 14:26:11 +00:00
|
|
|
|
void
|
|
|
|
|
FGInput::_scan_joystick_dir(SGPath *path, SGPropertyNode* node, int *index)
|
|
|
|
|
{
|
|
|
|
|
ulDir *dir = ulOpenDir(path->c_str());
|
|
|
|
|
if (dir) {
|
|
|
|
|
ulDirEnt* dent;
|
|
|
|
|
while ((dent = ulReadDir(dir)) != 0) {
|
|
|
|
|
if (dent->d_name[0] == '.')
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
SGPath p(path->str());
|
|
|
|
|
p.append(dent->d_name);
|
|
|
|
|
_scan_joystick_dir(&p, node, index);
|
|
|
|
|
}
|
|
|
|
|
ulCloseDir(dir);
|
|
|
|
|
|
|
|
|
|
} else if (path->extension() == "xml") {
|
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "Reading joystick file " << path->str());
|
|
|
|
|
SGPropertyNode *n = node->getChild("js-named", (*index)++, true);
|
|
|
|
|
readProperties(path->str(), n);
|
|
|
|
|
n->setStringValue("source", path->c_str());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
void
|
|
|
|
|
FGInput::_init_joystick ()
|
|
|
|
|
{
|
2004-05-04 19:02:19 +00:00
|
|
|
|
jsInit();
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// TODO: zero the old bindings first.
|
2002-03-23 23:16:13 +00:00
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "Initializing joystick bindings");
|
2005-06-12 13:35:55 +00:00
|
|
|
|
SGPropertyNode * js_nodes = fgGetNode("/input/joysticks", true);
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
2005-06-11 14:26:11 +00:00
|
|
|
|
// read all joystick xml files into /input/joysticks/js_named[1000++]
|
|
|
|
|
SGPath path(globals->get_fg_root());
|
|
|
|
|
path.append("Input/Joysticks");
|
|
|
|
|
int js_named_index = 1000;
|
|
|
|
|
_scan_joystick_dir(&path, js_nodes, &js_named_index);
|
|
|
|
|
|
2005-06-11 15:26:32 +00:00
|
|
|
|
// build name->node map with each <name> (reverse order)
|
2005-06-11 14:26:11 +00:00
|
|
|
|
map<string, SGPropertyNode_ptr> jsmap;
|
|
|
|
|
vector<SGPropertyNode_ptr> js_named = js_nodes->getChildren("js-named");
|
|
|
|
|
|
|
|
|
|
for (int k = (int)js_named.size() - 1; k >= 0; k--) {
|
|
|
|
|
SGPropertyNode *n = js_named[k];
|
|
|
|
|
vector<SGPropertyNode_ptr> names = n->getChildren("name");
|
|
|
|
|
if (names.size() && (n->getChildren("axis").size() || n->getChildren("button").size()))
|
|
|
|
|
for (unsigned int j = 0; j < names.size(); j++)
|
|
|
|
|
jsmap[names[j]->getStringValue()] = n;
|
|
|
|
|
}
|
|
|
|
|
|
- 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
|
|
|
|
// set up js[] nodes
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
for (int i = 0; i < MAX_JOYSTICKS; i++) {
|
|
|
|
|
jsJoystick * js = new jsJoystick(i);
|
|
|
|
|
_joystick_bindings[i].js = js;
|
- 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
|
|
|
|
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
if (js->notWorking()) {
|
2003-11-24 17:45:35 +00:00
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "Joystick " << i << " not found");
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
continue;
|
2005-06-11 14:26:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char * name = js->getName();
|
|
|
|
|
SGPropertyNode_ptr js_node = js_nodes->getChild("js", i);
|
|
|
|
|
|
|
|
|
|
if (js_node) {
|
|
|
|
|
SG_LOG(SG_INPUT, SG_INFO, "Using existing bindings for joystick " << i);
|
|
|
|
|
|
2002-04-18 20:18:33 +00:00
|
|
|
|
} else {
|
2005-06-11 14:26:11 +00:00
|
|
|
|
SG_LOG(SG_INPUT, SG_INFO, "Looking for bindings for joystick \"" << name << '"');
|
|
|
|
|
SGPropertyNode_ptr named;
|
|
|
|
|
|
|
|
|
|
if ((named = jsmap[name])) {
|
2005-06-11 15:26:32 +00:00
|
|
|
|
string source = named->getStringValue("source", "user defined");
|
2005-06-12 19:27:20 +00:00
|
|
|
|
SG_LOG(SG_INPUT, SG_INFO, "... found joystick: " << source);
|
2005-06-11 14:26:11 +00:00
|
|
|
|
|
|
|
|
|
} else if ((named = jsmap["default"])) {
|
2005-06-11 15:26:32 +00:00
|
|
|
|
string source = named->getStringValue("source", "user defined");
|
2005-06-11 14:26:11 +00:00
|
|
|
|
SG_LOG(SG_INPUT, SG_INFO, "No config found for joystick \"" << name
|
|
|
|
|
<< "\"\nUsing default: \"" << source << '"');
|
|
|
|
|
|
|
|
|
|
} else {
|
2005-06-12 19:27:20 +00:00
|
|
|
|
throw sg_throwable(string("No joystick configuration file with "
|
|
|
|
|
"<name>default</name> entry found!"));
|
2002-07-04 17:38:18 +00:00
|
|
|
|
}
|
2005-06-11 14:26:11 +00:00
|
|
|
|
|
|
|
|
|
js_node = js_nodes->getChild("js", i, true);
|
|
|
|
|
copyProperties(named, js_node);
|
|
|
|
|
js_node->setStringValue("id", name);
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
}
|
- 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
|
|
|
|
}
|
2005-06-30 19:26:29 +00:00
|
|
|
|
|
|
|
|
|
// get rid of unused config nodes
|
2005-10-23 12:32:15 +00:00
|
|
|
|
js_nodes->removeChildren("js-named", false);
|
- 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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-07-12 22:57:14 +00:00
|
|
|
|
void
|
|
|
|
|
FGInput::_postinit_keyboard()
|
|
|
|
|
{
|
2007-07-13 10:15:48 +00:00
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "Initializing key bindings");
|
|
|
|
|
_module = "__kbd";
|
|
|
|
|
SGPropertyNode * key_nodes = fgGetNode("/input/keyboard");
|
|
|
|
|
if (key_nodes == 0) {
|
|
|
|
|
SG_LOG(SG_INPUT, SG_WARN, "No key bindings (/input/keyboard)!!");
|
|
|
|
|
key_nodes = fgGetNode("/input/keyboard", true);
|
|
|
|
|
}
|
|
|
|
|
|
2007-07-12 22:57:14 +00:00
|
|
|
|
FGNasalSys *nasalsys = (FGNasalSys *)globals->get_subsystem("nasal");
|
|
|
|
|
vector<SGPropertyNode_ptr> nasal = key_nodes->getChildren("nasal");
|
|
|
|
|
for (unsigned int j = 0; j < nasal.size(); j++) {
|
|
|
|
|
nasal[j]->setStringValue("module", _module.c_str());
|
|
|
|
|
nasalsys->handleCommand(nasal[j]);
|
|
|
|
|
}
|
2007-07-13 10:15:48 +00:00
|
|
|
|
|
|
|
|
|
vector<SGPropertyNode_ptr> keys = key_nodes->getChildren("key");
|
|
|
|
|
for (unsigned int i = 0; i < keys.size(); i++) {
|
|
|
|
|
int index = keys[i]->getIndex();
|
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "Binding key " << index);
|
|
|
|
|
|
|
|
|
|
_key_bindings[index].bindings->clear();
|
|
|
|
|
_key_bindings[index].is_repeatable = keys[i]->getBoolValue("repeatable");
|
|
|
|
|
_key_bindings[index].last_state = 0;
|
|
|
|
|
_read_bindings(keys[i], _key_bindings[index].bindings, KEYMOD_NONE);
|
|
|
|
|
}
|
2007-07-12 22:57:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
- 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
|
|
|
|
void
|
|
|
|
|
FGInput::_postinit_joystick()
|
|
|
|
|
{
|
|
|
|
|
FGNasalSys *nasalsys = (FGNasalSys *)globals->get_subsystem("nasal");
|
|
|
|
|
SGPropertyNode *js_nodes = fgGetNode("/input/joysticks");
|
2005-06-11 14:26:11 +00:00
|
|
|
|
|
- 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
|
|
|
|
for (int i = 0; i < MAX_JOYSTICKS; i++) {
|
|
|
|
|
SGPropertyNode_ptr js_node = js_nodes->getChild("js", i);
|
|
|
|
|
jsJoystick *js = _joystick_bindings[i].js;
|
|
|
|
|
if (!js_node || js->notWorking())
|
|
|
|
|
continue;
|
2005-06-11 14:26:11 +00:00
|
|
|
|
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
#ifdef WIN32
|
|
|
|
|
JOYCAPS jsCaps ;
|
|
|
|
|
joyGetDevCaps( i, &jsCaps, sizeof(jsCaps) );
|
2005-06-27 07:13:02 +00:00
|
|
|
|
unsigned int nbuttons = jsCaps.wNumButtons;
|
2002-03-23 23:16:13 +00:00
|
|
|
|
if (nbuttons > MAX_JOYSTICK_BUTTONS) nbuttons = MAX_JOYSTICK_BUTTONS;
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
#else
|
2005-06-27 07:13:02 +00:00
|
|
|
|
unsigned int nbuttons = MAX_JOYSTICK_BUTTONS;
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
#endif
|
2005-06-11 14:26:11 +00:00
|
|
|
|
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
int naxes = js->getNumAxes();
|
2002-03-23 23:16:13 +00:00
|
|
|
|
if (naxes > MAX_JOYSTICK_AXES) naxes = MAX_JOYSTICK_AXES;
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
_joystick_bindings[i].naxes = naxes;
|
|
|
|
|
_joystick_bindings[i].nbuttons = nbuttons;
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "Initializing joystick " << i);
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Set up range arrays
|
2002-03-23 23:16:13 +00:00
|
|
|
|
float minRange[MAX_JOYSTICK_AXES];
|
|
|
|
|
float maxRange[MAX_JOYSTICK_AXES];
|
|
|
|
|
float center[MAX_JOYSTICK_AXES];
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Initialize with default values
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
js->getMinRange(minRange);
|
|
|
|
|
js->getMaxRange(maxRange);
|
|
|
|
|
js->getCenter(center);
|
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Allocate axes and buttons
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
_joystick_bindings[i].axes = new axis[naxes];
|
|
|
|
|
_joystick_bindings[i].buttons = new button[nbuttons];
|
|
|
|
|
|
- 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
|
|
|
|
//
|
|
|
|
|
// Initialize nasal groups.
|
|
|
|
|
//
|
2007-07-12 22:57:14 +00:00
|
|
|
|
ostringstream str;
|
|
|
|
|
str << "__js" << i;
|
|
|
|
|
_module = str.str();
|
|
|
|
|
nasalsys->createModule(_module.c_str(), _module.c_str(), "", 0);
|
- 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
|
|
|
|
|
|
|
|
|
vector<SGPropertyNode_ptr> nasal = js_node->getChildren("nasal");
|
2005-06-27 07:13:02 +00:00
|
|
|
|
unsigned int j;
|
|
|
|
|
for (j = 0; j < nasal.size(); j++) {
|
2007-07-12 22:57:14 +00:00
|
|
|
|
nasal[j]->setStringValue("module", _module.c_str());
|
- 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
|
|
|
|
nasalsys->handleCommand(nasal[j]);
|
|
|
|
|
}
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Initialize the axes.
|
|
|
|
|
//
|
2004-04-28 08:03:40 +00:00
|
|
|
|
vector<SGPropertyNode_ptr> axes = js_node->getChildren("axis");
|
|
|
|
|
size_t nb_axes = axes.size();
|
2005-06-27 07:13:02 +00:00
|
|
|
|
for (j = 0; j < nb_axes; j++ ) {
|
2004-04-28 08:03:40 +00:00
|
|
|
|
const SGPropertyNode * axis_node = axes[j];
|
|
|
|
|
const SGPropertyNode * num_node = axis_node->getChild("number");
|
2005-01-17 10:48:35 +00:00
|
|
|
|
int n_axis = axis_node->getIndex();
|
2004-04-28 08:03:40 +00:00
|
|
|
|
if (num_node != 0) {
|
2005-01-17 10:46:39 +00:00
|
|
|
|
n_axis = num_node->getIntValue(TGT_PLATFORM, -1);
|
2005-01-17 10:39:55 +00:00
|
|
|
|
|
|
|
|
|
// Silently ignore platforms that are not specified within the
|
|
|
|
|
// <number></number> section
|
2005-01-17 10:46:39 +00:00
|
|
|
|
if (n_axis < 0)
|
2005-01-17 10:39:55 +00:00
|
|
|
|
continue;
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
2005-06-11 14:26:11 +00:00
|
|
|
|
if (n_axis >= naxes) {
|
2004-10-24 14:45:52 +00:00
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "Dropping bindings for axis " << n_axis);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2004-04-29 09:10:06 +00:00
|
|
|
|
axis &a = _joystick_bindings[i].axes[n_axis];
|
2004-04-28 08:03:40 +00:00
|
|
|
|
|
2004-04-29 09:10:06 +00:00
|
|
|
|
js->setDeadBand(n_axis, axis_node->getDoubleValue("dead-band", 0.0));
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
|
|
|
|
a.tolerance = axis_node->getDoubleValue("tolerance", 0.002);
|
2004-04-29 09:10:06 +00:00
|
|
|
|
minRange[n_axis] = axis_node->getDoubleValue("min-range", minRange[n_axis]);
|
|
|
|
|
maxRange[n_axis] = axis_node->getDoubleValue("max-range", maxRange[n_axis]);
|
|
|
|
|
center[n_axis] = axis_node->getDoubleValue("center", center[n_axis]);
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
2004-03-31 21:10:32 +00:00
|
|
|
|
_read_bindings(axis_node, a.bindings, KEYMOD_NONE);
|
2001-06-20 20:51:15 +00:00
|
|
|
|
|
|
|
|
|
// Initialize the virtual axis buttons.
|
|
|
|
|
_init_button(axis_node->getChild("low"), a.low, "low");
|
|
|
|
|
a.low_threshold = axis_node->getDoubleValue("low-threshold", -0.9);
|
2005-06-11 14:26:11 +00:00
|
|
|
|
|
2001-06-20 20:51:15 +00:00
|
|
|
|
_init_button(axis_node->getChild("high"), a.high, "high");
|
|
|
|
|
a.high_threshold = axis_node->getDoubleValue("high-threshold", 0.9);
|
2003-07-01 16:32:00 +00:00
|
|
|
|
a.interval_sec = axis_node->getDoubleValue("interval-sec",0.0);
|
|
|
|
|
a.last_dt = 0.0;
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Initialize the buttons.
|
|
|
|
|
//
|
2004-04-28 08:03:40 +00:00
|
|
|
|
vector<SGPropertyNode_ptr> buttons = js_node->getChildren("button");
|
2002-03-27 12:49:07 +00:00
|
|
|
|
char buf[32];
|
2005-06-27 07:13:02 +00:00
|
|
|
|
for (j = 0; j < buttons.size() && j < nbuttons; j++) {
|
2004-04-28 08:03:40 +00:00
|
|
|
|
const SGPropertyNode * button_node = buttons[j];
|
|
|
|
|
const SGPropertyNode * num_node = button_node->getChild("number");
|
|
|
|
|
size_t n_but = button_node->getIndex();
|
|
|
|
|
if (num_node != 0) {
|
|
|
|
|
n_but = num_node->getIntValue(TGT_PLATFORM,n_but);
|
|
|
|
|
}
|
2004-10-24 14:45:52 +00:00
|
|
|
|
|
2005-06-27 07:13:02 +00:00
|
|
|
|
if (n_but >= nbuttons) {
|
2004-10-24 14:45:52 +00:00
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "Dropping bindings for button " << n_but);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2004-04-28 08:03:40 +00:00
|
|
|
|
sprintf(buf, "%d", n_but);
|
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "Initializing button " << n_but);
|
|
|
|
|
_init_button(button_node,
|
|
|
|
|
_joystick_bindings[i].buttons[n_but],
|
2002-11-05 02:28:07 +00:00
|
|
|
|
buf);
|
2005-06-11 14:26:11 +00:00
|
|
|
|
|
|
|
|
|
// get interval-sec property
|
2004-04-28 08:03:40 +00:00
|
|
|
|
button &b = _joystick_bindings[i].buttons[n_but];
|
2003-07-02 19:21:11 +00:00
|
|
|
|
if (button_node != 0) {
|
|
|
|
|
b.interval_sec = button_node->getDoubleValue("interval-sec",0.0);
|
|
|
|
|
b.last_dt = 0.0;
|
|
|
|
|
}
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
js->setMinRange(minRange);
|
|
|
|
|
js->setMaxRange(maxRange);
|
|
|
|
|
js->setCenter(center);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2005-06-11 14:26:11 +00:00
|
|
|
|
|
2002-03-25 12:58:26 +00:00
|
|
|
|
//
|
2004-03-31 21:10:32 +00:00
|
|
|
|
// Map of all known cursor names
|
|
|
|
|
// This used to contain all the Glut cursors, but those are
|
|
|
|
|
// not defined by other toolkits. It now supports only the cursor
|
|
|
|
|
// images we actually use, in the interest of portability. Someday,
|
|
|
|
|
// it would be cool to write an OpenGL cursor renderer, with the
|
|
|
|
|
// cursors defined as textures referenced in the property tree. This
|
|
|
|
|
// list could then be eliminated. -Andy
|
2002-03-25 12:58:26 +00:00
|
|
|
|
//
|
2004-12-18 11:59:33 +00:00
|
|
|
|
static struct {
|
2002-03-25 12:58:26 +00:00
|
|
|
|
const char * name;
|
|
|
|
|
int cursor;
|
|
|
|
|
} mouse_cursor_map[] = {
|
2004-03-31 21:10:32 +00:00
|
|
|
|
{ "none", MOUSE_CURSOR_NONE },
|
|
|
|
|
{ "inherit", MOUSE_CURSOR_POINTER },
|
|
|
|
|
{ "wait", MOUSE_CURSOR_WAIT },
|
|
|
|
|
{ "crosshair", MOUSE_CURSOR_CROSSHAIR },
|
|
|
|
|
{ "left-right", MOUSE_CURSOR_LEFTRIGHT },
|
2002-03-25 12:58:26 +00:00
|
|
|
|
{ 0, 0 }
|
|
|
|
|
};
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
void
|
|
|
|
|
FGInput::_init_mouse ()
|
|
|
|
|
{
|
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "Initializing mouse bindings");
|
2007-07-12 22:57:14 +00:00
|
|
|
|
_module = "";
|
2002-03-23 23:16:13 +00:00
|
|
|
|
|
|
|
|
|
SGPropertyNode * mouse_nodes = fgGetNode("/input/mice");
|
|
|
|
|
if (mouse_nodes == 0) {
|
|
|
|
|
SG_LOG(SG_INPUT, SG_WARN, "No mouse bindings (/input/mice)!!");
|
|
|
|
|
mouse_nodes = fgGetNode("/input/mice", true);
|
|
|
|
|
}
|
|
|
|
|
|
2002-03-25 12:58:26 +00:00
|
|
|
|
int j;
|
2002-03-23 23:16:13 +00:00
|
|
|
|
for (int i = 0; i < MAX_MICE; i++) {
|
2002-03-26 13:45:44 +00:00
|
|
|
|
SGPropertyNode * mouse_node = mouse_nodes->getChild("mouse", i, true);
|
|
|
|
|
mouse &m = _mouse_bindings[i];
|
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Grab node pointers
|
2002-03-27 23:45:11 +00:00
|
|
|
|
char buf[64];
|
|
|
|
|
sprintf(buf, "/devices/status/mice/mouse[%d]/mode", i);
|
2003-12-28 17:42:26 +00:00
|
|
|
|
m.mode_node = fgGetNode(buf);
|
|
|
|
|
if (m.mode_node == NULL) {
|
|
|
|
|
m.mode_node = fgGetNode(buf, true);
|
|
|
|
|
m.mode_node->setIntValue(0);
|
|
|
|
|
}
|
2002-03-27 23:45:11 +00:00
|
|
|
|
for (j = 0; j < MAX_MOUSE_BUTTONS; j++) {
|
|
|
|
|
sprintf(buf, "/devices/status/mice/mouse[%d]/button[%d]", i, j);
|
|
|
|
|
m.mouse_button_nodes[j] = fgGetNode(buf, true);
|
|
|
|
|
m.mouse_button_nodes[j]->setBoolValue(false);
|
|
|
|
|
}
|
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Read all the modes
|
2002-03-26 13:45:44 +00:00
|
|
|
|
m.nModes = mouse_node->getIntValue("mode-count", 1);
|
|
|
|
|
m.modes = new mouse_mode[m.nModes];
|
|
|
|
|
|
|
|
|
|
for (int j = 0; j < m.nModes; j++) {
|
|
|
|
|
int k;
|
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Read the mouse cursor for this mode
|
2002-03-26 13:45:44 +00:00
|
|
|
|
SGPropertyNode * mode_node = mouse_node->getChild("mode", j, true);
|
|
|
|
|
const char * cursor_name =
|
2002-11-05 02:28:07 +00:00
|
|
|
|
mode_node->getStringValue("cursor", "inherit");
|
2004-03-31 21:10:32 +00:00
|
|
|
|
m.modes[j].cursor = MOUSE_CURSOR_POINTER;
|
2002-03-26 13:45:44 +00:00
|
|
|
|
for (k = 0; mouse_cursor_map[k].name != 0; k++) {
|
2002-11-05 02:28:07 +00:00
|
|
|
|
if (!strcmp(mouse_cursor_map[k].name, cursor_name)) {
|
|
|
|
|
m.modes[j].cursor = mouse_cursor_map[k].cursor;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2002-03-25 12:58:26 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Read other properties for this mode
|
2002-03-26 13:45:44 +00:00
|
|
|
|
m.modes[j].constrained = mode_node->getBoolValue("constrained", false);
|
2002-03-26 17:14:48 +00:00
|
|
|
|
m.modes[j].pass_through = mode_node->getBoolValue("pass-through", false);
|
2002-03-26 13:45:44 +00:00
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Read the button bindings for this mode
|
2002-03-26 13:45:44 +00:00
|
|
|
|
m.modes[j].buttons = new button[MAX_MOUSE_BUTTONS];
|
2002-03-28 17:16:37 +00:00
|
|
|
|
char buf[32];
|
2002-03-26 13:45:44 +00:00
|
|
|
|
for (k = 0; k < MAX_MOUSE_BUTTONS; k++) {
|
2002-11-05 02:28:07 +00:00
|
|
|
|
sprintf(buf, "mouse button %d", k);
|
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "Initializing mouse button " << k);
|
|
|
|
|
_init_button(mode_node->getChild("button", k),
|
|
|
|
|
m.modes[j].buttons[k],
|
|
|
|
|
buf);
|
2002-03-26 13:45:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Read the axis bindings for this mode
|
2002-03-26 13:45:44 +00:00
|
|
|
|
_read_bindings(mode_node->getChild("x-axis", 0, true),
|
2002-11-05 02:28:07 +00:00
|
|
|
|
m.modes[j].x_bindings,
|
2004-03-31 21:10:32 +00:00
|
|
|
|
KEYMOD_NONE);
|
2002-03-26 13:45:44 +00:00
|
|
|
|
_read_bindings(mode_node->getChild("y-axis", 0, true),
|
2002-11-05 02:28:07 +00:00
|
|
|
|
m.modes[j].y_bindings,
|
2004-03-31 21:10:32 +00:00
|
|
|
|
KEYMOD_NONE);
|
2002-03-23 23:16:13 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2001-06-20 20:51:15 +00:00
|
|
|
|
FGInput::_init_button (const SGPropertyNode * node,
|
2002-11-05 02:28:07 +00:00
|
|
|
|
button &b,
|
|
|
|
|
const string name)
|
|
|
|
|
{
|
2002-03-23 23:16:13 +00:00
|
|
|
|
if (node == 0) {
|
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "No bindings for button " << name);
|
|
|
|
|
} else {
|
2001-06-20 20:51:15 +00:00
|
|
|
|
b.is_repeatable = node->getBoolValue("repeatable", b.is_repeatable);
|
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Get the bindings for the button
|
2004-03-31 21:10:32 +00:00
|
|
|
|
_read_bindings(node, b.bindings, KEYMOD_NONE);
|
2001-06-20 20:51:15 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
void
|
2003-06-04 14:22:51 +00:00
|
|
|
|
FGInput::_update_keyboard ()
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
{
|
|
|
|
|
// no-op
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2003-07-01 16:32:00 +00:00
|
|
|
|
FGInput::_update_joystick (double dt)
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
{
|
2004-03-31 21:10:32 +00:00
|
|
|
|
int modifiers = KEYMOD_NONE; // FIXME: any way to get the real ones?
|
2003-06-04 14:22:51 +00:00
|
|
|
|
int buttons;
|
2001-06-14 22:07:19 +00:00
|
|
|
|
// float js_val, diff;
|
2002-03-23 23:16:13 +00:00
|
|
|
|
float axis_values[MAX_JOYSTICK_AXES];
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
2003-06-04 14:22:51 +00:00
|
|
|
|
int i;
|
|
|
|
|
int j;
|
2001-06-06 23:31:48 +00:00
|
|
|
|
|
|
|
|
|
for ( i = 0; i < MAX_JOYSTICKS; i++) {
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
|
|
|
|
jsJoystick * js = _joystick_bindings[i].js;
|
|
|
|
|
if (js == 0 || js->notWorking())
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
js->read(&buttons, axis_values);
|
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Fire bindings for the axes.
|
2001-06-06 23:31:48 +00:00
|
|
|
|
for ( j = 0; j < _joystick_bindings[i].naxes; j++) {
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
axis &a = _joystick_bindings[i].axes[j];
|
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Do nothing if the axis position
|
|
|
|
|
// is unchanged; only a change in
|
|
|
|
|
// position fires the bindings.
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
if (fabs(axis_values[j] - a.last_value) > a.tolerance) {
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// SG_LOG(SG_INPUT, SG_DEBUG, "Axis " << j << " has moved");
|
|
|
|
|
a.last_value = axis_values[j];
|
|
|
|
|
// SG_LOG(SG_INPUT, SG_DEBUG, "There are "
|
|
|
|
|
// << a.bindings[modifiers].size() << " bindings");
|
|
|
|
|
for (unsigned int k = 0; k < a.bindings[modifiers].size(); k++)
|
|
|
|
|
a.bindings[modifiers][k]->fire(axis_values[j]);
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
}
|
2001-06-20 20:51:15 +00:00
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// do we have to emulate axis buttons?
|
2003-07-01 16:32:00 +00:00
|
|
|
|
a.last_dt += dt;
|
|
|
|
|
if(a.last_dt >= a.interval_sec) {
|
|
|
|
|
if (a.low.bindings[modifiers].size())
|
|
|
|
|
_update_button(_joystick_bindings[i].axes[j].low,
|
|
|
|
|
modifiers,
|
|
|
|
|
axis_values[j] < a.low_threshold,
|
|
|
|
|
-1, -1);
|
2003-06-04 14:22:51 +00:00
|
|
|
|
|
2003-07-01 16:32:00 +00:00
|
|
|
|
if (a.high.bindings[modifiers].size())
|
|
|
|
|
_update_button(_joystick_bindings[i].axes[j].high,
|
|
|
|
|
modifiers,
|
|
|
|
|
axis_values[j] > a.high_threshold,
|
|
|
|
|
-1, -1);
|
|
|
|
|
a.last_dt -= a.interval_sec;
|
|
|
|
|
}
|
2001-07-02 22:26:19 +00:00
|
|
|
|
}
|
2003-06-04 12:46:49 +00:00
|
|
|
|
|
2003-06-04 14:22:51 +00:00
|
|
|
|
// Fire bindings for the buttons.
|
|
|
|
|
for (j = 0; j < _joystick_bindings[i].nbuttons; j++) {
|
2003-07-02 19:21:11 +00:00
|
|
|
|
button &b = _joystick_bindings[i].buttons[j];
|
|
|
|
|
b.last_dt += dt;
|
|
|
|
|
if(b.last_dt >= b.interval_sec) {
|
|
|
|
|
_update_button(_joystick_bindings[i].buttons[j],
|
|
|
|
|
modifiers,
|
|
|
|
|
(buttons & (1 << j)) > 0,
|
|
|
|
|
-1, -1);
|
|
|
|
|
b.last_dt -= b.interval_sec;
|
|
|
|
|
}
|
2003-06-04 14:22:51 +00:00
|
|
|
|
}
|
2003-06-04 12:46:49 +00:00
|
|
|
|
}
|
2001-06-20 20:51:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
void
|
2004-06-14 18:46:58 +00:00
|
|
|
|
FGInput::_update_mouse ( double dt )
|
2002-03-23 23:16:13 +00:00
|
|
|
|
{
|
2002-03-26 13:45:44 +00:00
|
|
|
|
mouse &m = _mouse_bindings[0];
|
2002-03-27 23:45:11 +00:00
|
|
|
|
int mode = m.mode_node->getIntValue();
|
2002-03-26 13:45:44 +00:00
|
|
|
|
if (mode != m.current_mode) {
|
|
|
|
|
m.current_mode = mode;
|
2004-06-14 18:46:58 +00:00
|
|
|
|
m.timeout = fgGetDouble( "/sim/mouse/cursor-timeout-sec", 10.0 );
|
2002-03-26 13:45:44 +00:00
|
|
|
|
if (mode >= 0 && mode < m.nModes) {
|
2004-03-31 21:10:32 +00:00
|
|
|
|
fgSetMouseCursor(m.modes[mode].cursor);
|
2002-03-28 16:12:26 +00:00
|
|
|
|
m.x = fgGetInt("/sim/startup/xsize", 800) / 2;
|
|
|
|
|
m.y = fgGetInt("/sim/startup/ysize", 600) / 2;
|
2004-03-31 21:10:32 +00:00
|
|
|
|
fgWarpMouse(m.x, m.y);
|
2002-03-25 12:58:26 +00:00
|
|
|
|
} else {
|
2002-03-26 13:45:44 +00:00
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "Mouse mode " << mode << " out of range");
|
2004-03-31 21:10:32 +00:00
|
|
|
|
fgSetMouseCursor(MOUSE_CURSOR_POINTER);
|
2002-03-25 12:58:26 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2004-06-14 18:46:58 +00:00
|
|
|
|
|
|
|
|
|
if ( fgGetBool( "/sim/mouse/hide-cursor", true ) ) {
|
|
|
|
|
if ( m.x != m.save_x || m.y != m.save_y ) {
|
|
|
|
|
m.timeout = fgGetDouble( "/sim/mouse/cursor-timeout-sec", 10.0 );
|
|
|
|
|
fgSetMouseCursor(m.modes[mode].cursor);
|
|
|
|
|
} else {
|
|
|
|
|
m.timeout -= dt;
|
|
|
|
|
if ( m.timeout <= 0.0 ) {
|
|
|
|
|
fgSetMouseCursor(MOUSE_CURSOR_NONE);
|
|
|
|
|
m.timeout = 0.0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
m.save_x = m.x;
|
|
|
|
|
m.save_y = m.y;
|
|
|
|
|
}
|
2007-01-04 13:22:27 +00:00
|
|
|
|
|
|
|
|
|
// handle repeatable mouse press events
|
|
|
|
|
std::map<int, std::list<SGSharedPtr<SGPickCallback> > >::iterator mi;
|
|
|
|
|
for (mi = _activePickCallbacks.begin();
|
|
|
|
|
mi != _activePickCallbacks.end(); ++mi) {
|
|
|
|
|
std::list<SGSharedPtr<SGPickCallback> >::iterator li;
|
|
|
|
|
for (li = mi->second.begin(); li != mi->second.end(); ++li) {
|
|
|
|
|
(*li)->update(dt);
|
|
|
|
|
}
|
|
|
|
|
}
|
2002-03-23 23:16:13 +00:00
|
|
|
|
}
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
2001-07-02 22:26:19 +00:00
|
|
|
|
void
|
2002-03-23 23:16:13 +00:00
|
|
|
|
FGInput::_update_button (button &b, int modifiers, bool pressed,
|
2002-11-05 02:28:07 +00:00
|
|
|
|
int x, int y)
|
2001-06-20 20:51:15 +00:00
|
|
|
|
{
|
|
|
|
|
if (pressed) {
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// The press event may be repeated.
|
2001-06-20 20:51:15 +00:00
|
|
|
|
if (!b.last_state || b.is_repeatable) {
|
2002-03-23 23:16:13 +00:00
|
|
|
|
SG_LOG( SG_INPUT, SG_DEBUG, "Button has been pressed" );
|
2007-01-04 13:22:27 +00:00
|
|
|
|
for (unsigned int k = 0; k < b.bindings[modifiers].size(); k++) {
|
2002-11-05 02:28:07 +00:00
|
|
|
|
b.bindings[modifiers][k]->fire(x, y);
|
2007-01-04 13:22:27 +00:00
|
|
|
|
}
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
}
|
2001-06-20 20:51:15 +00:00
|
|
|
|
} else {
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// The release event is never repeated.
|
2001-07-02 22:26:19 +00:00
|
|
|
|
if (b.last_state) {
|
2002-03-23 23:16:13 +00:00
|
|
|
|
SG_LOG( SG_INPUT, SG_DEBUG, "Button has been released" );
|
2004-03-31 21:10:32 +00:00
|
|
|
|
for (unsigned int k = 0; k < b.bindings[modifiers|KEYMOD_RELEASED].size(); k++)
|
|
|
|
|
b.bindings[modifiers|KEYMOD_RELEASED][k]->fire(x, y);
|
2001-07-02 22:26:19 +00:00
|
|
|
|
}
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
}
|
2002-11-05 02:28:07 +00:00
|
|
|
|
|
2001-06-20 20:51:15 +00:00
|
|
|
|
b.last_state = pressed;
|
|
|
|
|
}
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
FGInput::_read_bindings (const SGPropertyNode * node,
|
2002-11-05 02:28:07 +00:00
|
|
|
|
binding_list_t * binding_list,
|
|
|
|
|
int modifiers)
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
{
|
2002-03-23 23:16:13 +00:00
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "Reading all bindings");
|
2002-05-11 00:59:26 +00:00
|
|
|
|
vector<SGPropertyNode_ptr> bindings = node->getChildren("binding");
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
for (unsigned int i = 0; i < bindings.size(); i++) {
|
- 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
|
|
|
|
const char *cmd = bindings[i]->getStringValue("command");
|
|
|
|
|
SG_LOG(SG_INPUT, SG_DEBUG, "Reading binding " << cmd);
|
|
|
|
|
|
2007-07-12 22:57:14 +00:00
|
|
|
|
if (!strcmp(cmd, "nasal") && !_module.empty())
|
|
|
|
|
bindings[i]->setStringValue("module", _module.c_str());
|
2007-01-04 13:22:27 +00:00
|
|
|
|
binding_list[modifiers].push_back(new SGBinding(bindings[i], globals->get_props()));
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Read nested bindings for modifiers
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
if (node->getChild("mod-up") != 0)
|
|
|
|
|
_read_bindings(node->getChild("mod-up"), binding_list,
|
2004-03-31 21:10:32 +00:00
|
|
|
|
modifiers|KEYMOD_RELEASED);
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
|
|
|
|
if (node->getChild("mod-shift") != 0)
|
|
|
|
|
_read_bindings(node->getChild("mod-shift"), binding_list,
|
2004-03-31 21:10:32 +00:00
|
|
|
|
modifiers|KEYMOD_SHIFT);
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
|
|
|
|
if (node->getChild("mod-ctrl") != 0)
|
|
|
|
|
_read_bindings(node->getChild("mod-ctrl"), binding_list,
|
2004-03-31 21:10:32 +00:00
|
|
|
|
modifiers|KEYMOD_CTRL);
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
|
|
|
|
|
if (node->getChild("mod-alt") != 0)
|
|
|
|
|
_read_bindings(node->getChild("mod-alt"), binding_list,
|
2004-03-31 21:10:32 +00:00
|
|
|
|
modifiers|KEYMOD_ALT);
|
2007-12-01 16:38:49 +00:00
|
|
|
|
|
|
|
|
|
if (node->getChild("mod-meta") != 0)
|
|
|
|
|
_read_bindings(node->getChild("mod-meta"), binding_list,
|
|
|
|
|
modifiers|KEYMOD_META);
|
|
|
|
|
|
|
|
|
|
if (node->getChild("mod-super") != 0)
|
|
|
|
|
_read_bindings(node->getChild("mod-super"), binding_list,
|
|
|
|
|
modifiers|KEYMOD_SUPER);
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2007-01-04 13:22:27 +00:00
|
|
|
|
const FGInput::binding_list_t&
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
FGInput::_find_key_bindings (unsigned int k, int modifiers)
|
2001-05-29 22:31:04 +00:00
|
|
|
|
{
|
2003-09-27 09:44:41 +00:00
|
|
|
|
unsigned char kc = (unsigned char)k;
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
button &b = _key_bindings[k];
|
2001-05-29 22:31:04 +00:00
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Try it straight, first.
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
if (b.bindings[modifiers].size() > 0)
|
|
|
|
|
return b.bindings[modifiers];
|
2001-05-29 22:31:04 +00:00
|
|
|
|
|
2003-09-27 09:44:41 +00:00
|
|
|
|
// Alt-Gr is CTRL+ALT
|
2004-03-31 21:10:32 +00:00
|
|
|
|
else if (modifiers&(KEYMOD_CTRL|KEYMOD_ALT))
|
|
|
|
|
return _find_key_bindings(k, modifiers&~(KEYMOD_CTRL|KEYMOD_ALT));
|
2003-09-27 09:44:41 +00:00
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Try removing the control modifier
|
|
|
|
|
// for control keys.
|
2004-03-31 21:10:32 +00:00
|
|
|
|
else if ((modifiers&KEYMOD_CTRL) && iscntrl(kc))
|
|
|
|
|
return _find_key_bindings(k, modifiers&~KEYMOD_CTRL);
|
2001-05-29 22:31:04 +00:00
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Try removing shift modifier
|
|
|
|
|
// for upper case or any punctuation
|
|
|
|
|
// (since different keyboards will
|
|
|
|
|
// shift different punctuation types)
|
2004-03-31 21:10:32 +00:00
|
|
|
|
else if ((modifiers&KEYMOD_SHIFT) && (isupper(kc) || ispunct(kc)))
|
|
|
|
|
return _find_key_bindings(k, modifiers&~KEYMOD_SHIFT);
|
2001-05-29 22:31:04 +00:00
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Try removing alt modifier for
|
|
|
|
|
// high-bit characters.
|
2004-03-31 21:10:32 +00:00
|
|
|
|
else if ((modifiers&KEYMOD_ALT) && k >= 128 && k < 256)
|
|
|
|
|
return _find_key_bindings(k, modifiers&~KEYMOD_ALT);
|
2001-05-29 22:31:04 +00:00
|
|
|
|
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// Give up and return the empty vector.
|
2001-05-29 22:31:04 +00:00
|
|
|
|
else
|
- added FGBinding::fire(double) - added support for "mod-up" property
- go back to using index as key code (otherwise, we'll get nasty
surprises when users try to override bindings)
- XML config file now nests bindings inside modifiers
- allow user to specify whether key is repeatable
- removed hard-coded bindings for 'b', ',', and '.'
- added code from joystick.cxx, with the following major changes:
- changed from js0, axis0, button0 to js[0], axis[0], button[0], etc.
- removed factor, offset, etc. since they will be args to command in
binding
- allow multiple bindings, as with key mappings
- allow access to keyboard modifier keys for bindings
- include infrastructure for modifiers (only FG_MOD_UP is used so far)
- removed unused 'saturation' property
- temporarily removed capture property and trim code; it will have to
be rewritten to be more generic
- allow modifiers for joystick buttons
2001-06-04 21:06:48 +00:00
|
|
|
|
return b.bindings[modifiers];
|
2001-05-29 22:31:04 +00:00
|
|
|
|
}
|
2001-05-23 22:59:40 +00:00
|
|
|
|
|
2001-06-05 22:11:16 +00:00
|
|
|
|
|
2001-08-10 05:17:40 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGInput::button.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
FGInput::button::button ()
|
|
|
|
|
: is_repeatable(false),
|
2005-12-06 18:32:07 +00:00
|
|
|
|
interval_sec(0),
|
|
|
|
|
last_dt(0),
|
This is an ugly fix for an ugly problem. And no, the two uglies don't cancel
each other out. The problem is this: if we press, for example, "Ctrl-a", but
release the "Ctrl" modifier button *before* the "a" button (which nobody does
intentionally, but which happens all the time), then we don't get the RELEASE
signal on "Ctrl-a" (keycode 1), but on the "a" (79). But "a" hasn't been
pressed, so the signal is dropped. And who releases "Ctrl-a"? Nobody!
So the next PRESSED signal for "Ctrl-a" is ignored, too. It is still
"pressed" after all, isn't it? That's the reason for the occasional
non-functioning of keys.
Due to the nearing 0.9.9 release, I only commit a crude last-minute fix.
It's not as intrusive as it looks, and shouldn't be "dangerous" at all.
It only makes sure that when we get an unexpected RELEASE for one letter
key ("a") that the two twins "A" and "Ctrl-A" are released if they are
still in "pressed" state.
The proper fix will be to let fg_os{,_sdl}.cxx always report presses on the
same key ("a", "Shift-a", "Ctrl-a", "Alt-a", and other combinations of
modifiers) as the *same* key (97), only with modifiers appropriately set.
2005-11-12 10:51:58 +00:00
|
|
|
|
last_state(0)
|
2001-08-10 05:17:40 +00:00
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FGInput::button::~button ()
|
|
|
|
|
{
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// FIXME: memory leak
|
2004-03-31 21:10:32 +00:00
|
|
|
|
// for (int i = 0; i < KEYMOD_MAX; i++)
|
2001-08-10 05:17:40 +00:00
|
|
|
|
// for (int j = 0; i < bindings[i].size(); j++)
|
|
|
|
|
// delete bindings[i][j];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGInput::axis.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
FGInput::axis::axis ()
|
|
|
|
|
: last_value(9999999),
|
|
|
|
|
tolerance(0.002),
|
|
|
|
|
low_threshold(-0.9),
|
2005-12-06 18:32:07 +00:00
|
|
|
|
high_threshold(0.9),
|
|
|
|
|
interval_sec(0),
|
|
|
|
|
last_dt(0)
|
2001-08-10 05:17:40 +00:00
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FGInput::axis::~axis ()
|
|
|
|
|
{
|
2004-03-31 21:10:32 +00:00
|
|
|
|
// for (int i = 0; i < KEYMOD_MAX; i++)
|
2001-08-16 16:06:55 +00:00
|
|
|
|
// for (int j = 0; i < bindings[i].size(); j++)
|
|
|
|
|
// delete bindings[i][j];
|
2001-08-10 05:17:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGInput::joystick.
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
FGInput::joystick::joystick ()
|
2005-12-06 18:32:07 +00:00
|
|
|
|
: jsnum(0),
|
|
|
|
|
js(0),
|
|
|
|
|
naxes(0),
|
|
|
|
|
nbuttons(0),
|
|
|
|
|
axes(0),
|
|
|
|
|
buttons(0)
|
2001-08-10 05:17:40 +00:00
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FGInput::joystick::~joystick ()
|
|
|
|
|
{
|
2001-08-16 16:06:55 +00:00
|
|
|
|
// delete js;
|
2002-03-23 23:16:13 +00:00
|
|
|
|
delete[] axes;
|
|
|
|
|
delete[] buttons;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2002-03-26 13:45:44 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGInput::mouse_mode
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
FGInput::mouse_mode::mouse_mode ()
|
2004-03-31 21:10:32 +00:00
|
|
|
|
: cursor(MOUSE_CURSOR_POINTER),
|
2002-03-26 13:45:44 +00:00
|
|
|
|
constrained(false),
|
2002-03-26 17:14:48 +00:00
|
|
|
|
pass_through(false),
|
2002-03-26 13:45:44 +00:00
|
|
|
|
buttons(0)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FGInput::mouse_mode::~mouse_mode ()
|
|
|
|
|
{
|
2002-11-05 02:28:07 +00:00
|
|
|
|
// FIXME: memory leak
|
2004-03-31 21:10:32 +00:00
|
|
|
|
// for (int i = 0; i < KEYMOD_MAX; i++) {
|
2002-03-26 13:45:44 +00:00
|
|
|
|
// int j;
|
|
|
|
|
// for (j = 0; i < x_bindings[i].size(); j++)
|
|
|
|
|
// delete bindings[i][j];
|
|
|
|
|
// for (j = 0; j < y_bindings[i].size(); j++)
|
|
|
|
|
// delete bindings[i][j];
|
|
|
|
|
// }
|
|
|
|
|
delete [] buttons;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Implementation of FGInput::mouse
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
FGInput::mouse::mouse ()
|
2002-07-18 22:32:12 +00:00
|
|
|
|
: x(-1),
|
2002-03-26 13:45:44 +00:00
|
|
|
|
y(-1),
|
2008-01-19 18:06:05 +00:00
|
|
|
|
save_x(-1),
|
|
|
|
|
save_y(-1),
|
2002-07-18 22:32:12 +00:00
|
|
|
|
nModes(1),
|
|
|
|
|
current_mode(0),
|
2002-03-26 13:45:44 +00:00
|
|
|
|
modes(0)
|
2002-03-23 23:16:13 +00:00
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FGInput::mouse::~mouse ()
|
|
|
|
|
{
|
2002-03-26 13:45:44 +00:00
|
|
|
|
delete [] modes;
|
2001-08-10 05:17:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-03-23 23:16:13 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
2004-03-31 21:10:32 +00:00
|
|
|
|
// Implementation of OS callbacks.
|
2002-03-23 23:16:13 +00:00
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2004-03-31 21:10:32 +00:00
|
|
|
|
void keyHandler(int key, int keymod, int mousex, int mousey)
|
2001-06-05 22:11:16 +00:00
|
|
|
|
{
|
2004-03-31 21:10:32 +00:00
|
|
|
|
if((keymod & KEYMOD_RELEASED) == 0)
|
|
|
|
|
if(puKeyboard(key, PU_DOWN))
|
|
|
|
|
return;
|
2001-06-05 22:11:16 +00:00
|
|
|
|
|
2004-03-31 21:10:32 +00:00
|
|
|
|
if(default_input)
|
|
|
|
|
default_input->doKey(key, keymod, mousex, mousey);
|
2001-06-05 22:11:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
2007-05-26 13:53:46 +00:00
|
|
|
|
void mouseClickHandler(int button, int updown, int x, int y, bool mainWindow, const osgGA::GUIEventAdapter* ea)
|
2002-03-23 23:16:13 +00:00
|
|
|
|
{
|
2004-03-31 21:10:32 +00:00
|
|
|
|
if(default_input)
|
2007-05-26 13:53:46 +00:00
|
|
|
|
default_input->doMouseClick(button, updown, x, y, mainWindow, ea);
|
2002-03-23 23:16:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
2004-03-31 21:10:32 +00:00
|
|
|
|
void mouseMotionHandler(int x, int y)
|
2002-03-23 23:16:13 +00:00
|
|
|
|
{
|
2002-10-04 13:20:53 +00:00
|
|
|
|
if (default_input != 0)
|
|
|
|
|
default_input->doMouseMotion(x, y);
|
2002-03-23 23:16:13 +00:00
|
|
|
|
}
|