2001-04-10 21:01:29 +00:00
|
|
|
/*
|
|
|
|
input.h
|
|
|
|
|
|
|
|
External (non-keyboard) input devices
|
|
|
|
|
|
|
|
Copyright (C) 1996-1997 Id Software, Inc.
|
|
|
|
|
|
|
|
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:
|
|
|
|
|
|
|
|
Free Software Foundation, Inc.
|
|
|
|
59 Temple Place - Suite 330
|
|
|
|
Boston, MA 02111-1307, USA
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
2020-02-24 03:21:20 +00:00
|
|
|
#ifndef __QF_input_h
|
|
|
|
#define __QF_input_h
|
2001-04-10 21:01:29 +00:00
|
|
|
|
2001-10-28 04:23:37 +00:00
|
|
|
#include "QF/keys.h"
|
|
|
|
|
2021-09-20 06:21:11 +00:00
|
|
|
typedef struct in_axisinfo_s {
|
|
|
|
int deviceid;
|
|
|
|
int axis;
|
|
|
|
int value;
|
|
|
|
int min;
|
|
|
|
int max;
|
|
|
|
} in_axisinfo_t;
|
|
|
|
|
|
|
|
typedef struct in_buttoninfo_s {
|
|
|
|
int deviceid;
|
|
|
|
int button;
|
|
|
|
int state;
|
|
|
|
} in_buttoninfo_t;
|
|
|
|
|
2021-11-01 04:05:05 +00:00
|
|
|
#include "QF/input/binding.h"
|
2021-11-03 10:02:39 +00:00
|
|
|
#include "QF/input/imt.h"
|
2021-11-01 04:05:05 +00:00
|
|
|
|
2021-09-20 06:21:11 +00:00
|
|
|
#ifndef __QFCC__
|
2021-09-26 06:11:07 +00:00
|
|
|
|
2001-10-23 16:55:23 +00:00
|
|
|
typedef struct {
|
2001-04-11 07:57:08 +00:00
|
|
|
vec3_t angles;
|
|
|
|
vec3_t position;
|
2001-10-23 16:55:23 +00:00
|
|
|
} viewdelta_t;
|
|
|
|
|
2021-09-28 01:53:51 +00:00
|
|
|
struct qf_fd_set;
|
|
|
|
|
2021-08-30 05:40:19 +00:00
|
|
|
typedef struct in_driver_s {
|
2021-08-30 00:54:36 +00:00
|
|
|
void (*init) (void *data);
|
|
|
|
void (*shutdown) (void *data);
|
2021-09-26 06:11:07 +00:00
|
|
|
|
2021-11-09 13:31:09 +00:00
|
|
|
void (*set_device_event_data) (void *device, void *event_data, void *data);
|
|
|
|
void *(*get_device_event_data) (void *device, void *data);
|
|
|
|
|
2021-09-26 06:11:07 +00:00
|
|
|
// The driver must provide either both or none of add_select and
|
|
|
|
// chec_select.
|
2021-09-28 01:53:51 +00:00
|
|
|
void (*add_select) (struct qf_fd_set *fdset, int *maxfd, void *data);
|
|
|
|
void (*check_select) (struct qf_fd_set *fdset, void *data);
|
2021-09-26 06:11:07 +00:00
|
|
|
// Generally musually exclusive with add_select/check_select
|
2021-08-30 00:54:36 +00:00
|
|
|
void (*process_events) (void *data);
|
2021-09-26 06:11:07 +00:00
|
|
|
|
2021-08-30 00:54:36 +00:00
|
|
|
void (*clear_states) (void *data);
|
|
|
|
void (*grab_input) (void *data, int grab);
|
2021-09-20 06:21:11 +00:00
|
|
|
|
|
|
|
void (*axis_info) (void *data, void *device, in_axisinfo_t *axes,
|
|
|
|
int *numaxes);
|
|
|
|
void (*button_info) (void *data, void *device, in_buttoninfo_t *buttons,
|
|
|
|
int *numbuttons);
|
2021-08-27 00:10:21 +00:00
|
|
|
} in_driver_t;
|
|
|
|
|
2021-08-30 05:40:19 +00:00
|
|
|
typedef struct in_device_s {
|
|
|
|
int driverid;
|
|
|
|
void *device;
|
|
|
|
const char *name;
|
2021-09-20 06:21:11 +00:00
|
|
|
const char *id;
|
2021-11-09 13:31:09 +00:00
|
|
|
void *event_data;
|
2021-08-30 05:40:19 +00:00
|
|
|
} in_device_t;
|
|
|
|
|
2021-11-01 04:05:05 +00:00
|
|
|
/*** Connect a device and its axes and buttons to logical axes and buttons.
|
2021-10-01 06:38:48 +00:00
|
|
|
|
2021-11-01 04:05:05 +00:00
|
|
|
\a name is used to specify the device when creating bindings, and
|
|
|
|
identifying the device for hints etc (eg, "press joy1 1 to ...").
|
[input] Rework logical buttons
kbutton_t is now in_button_t and has been moved to input.h. Also, a
button registration function has been added to take care of +button and
-button command creation and, eventually, direct binding of "physical"
buttons to logical buttons. "Physical" buttons are those coming in from
the OS (keyboard, mouse, joystick...), logical buttons are what the code
looks at for button state.
Additionally, the button edge detection code has been cleaned up such
that it no longer uses magic numbers, and the conversion to a float is
cleaner. Interestingly, I found that the handling is extremely
frame-rate dependent (eg, +forward will accelerate the player to full
speed much faster at 72fps than it does at 20fps). This may be a factor
in why gamers are frame rate obsessed: other games doing the same thing
would certainly feel different under varying frame rates.
2021-10-01 00:16:31 +00:00
|
|
|
|
2021-11-10 04:22:44 +00:00
|
|
|
\a devname is the device name (eg, "6d spacemouse")
|
|
|
|
|
|
|
|
\a id is the device id (eg "usb-0000:00:1d.1-2/input0").
|
|
|
|
|
|
|
|
The device name is useful for ease of user identification and allowing
|
|
|
|
the device to be plugged into any USB socket. However, it doesn't allow
|
|
|
|
multiple devices with the same name (eg, using twin joysticks of the same
|
|
|
|
model). Thus if \a match_id is true, both the device name and the device
|
|
|
|
id used to auto-connect the device, but it does require the device to be
|
|
|
|
plugged into the same uSB path (ie, same socket on the same hub connected
|
|
|
|
to the same port on the PC)
|
[input] Rework logical buttons
kbutton_t is now in_button_t and has been moved to input.h. Also, a
button registration function has been added to take care of +button and
-button command creation and, eventually, direct binding of "physical"
buttons to logical buttons. "Physical" buttons are those coming in from
the OS (keyboard, mouse, joystick...), logical buttons are what the code
looks at for button state.
Additionally, the button edge detection code has been cleaned up such
that it no longer uses magic numbers, and the conversion to a float is
cleaner. Interestingly, I found that the handling is extremely
frame-rate dependent (eg, +forward will accelerate the player to full
speed much faster at 72fps than it does at 20fps). This may be a factor
in why gamers are frame rate obsessed: other games doing the same thing
would certainly feel different under varying frame rates.
2021-10-01 00:16:31 +00:00
|
|
|
|
2021-11-08 06:38:26 +00:00
|
|
|
\a devid is the actual device associated with the bindings. If -1, the
|
2021-11-01 04:05:05 +00:00
|
|
|
device is not currently connected.
|
[input] Rework logical buttons
kbutton_t is now in_button_t and has been moved to input.h. Also, a
button registration function has been added to take care of +button and
-button command creation and, eventually, direct binding of "physical"
buttons to logical buttons. "Physical" buttons are those coming in from
the OS (keyboard, mouse, joystick...), logical buttons are what the code
looks at for button state.
Additionally, the button edge detection code has been cleaned up such
that it no longer uses magic numbers, and the conversion to a float is
cleaner. Interestingly, I found that the handling is extremely
frame-rate dependent (eg, +forward will accelerate the player to full
speed much faster at 72fps than it does at 20fps). This may be a factor
in why gamers are frame rate obsessed: other games doing the same thing
would certainly feel different under varying frame rates.
2021-10-01 00:16:31 +00:00
|
|
|
|
2021-11-01 04:05:05 +00:00
|
|
|
\a axis_info holds the device/axis specific range info and the current
|
|
|
|
raw value of the axis.
|
[input] Rework logical buttons
kbutton_t is now in_button_t and has been moved to input.h. Also, a
button registration function has been added to take care of +button and
-button command creation and, eventually, direct binding of "physical"
buttons to logical buttons. "Physical" buttons are those coming in from
the OS (keyboard, mouse, joystick...), logical buttons are what the code
looks at for button state.
Additionally, the button edge detection code has been cleaned up such
that it no longer uses magic numbers, and the conversion to a float is
cleaner. Interestingly, I found that the handling is extremely
frame-rate dependent (eg, +forward will accelerate the player to full
speed much faster at 72fps than it does at 20fps). This may be a factor
in why gamers are frame rate obsessed: other games doing the same thing
would certainly feel different under varying frame rates.
2021-10-01 00:16:31 +00:00
|
|
|
|
2021-11-01 04:05:05 +00:00
|
|
|
\a button_info holds the current raw state of the button
|
[input] Rework logical buttons
kbutton_t is now in_button_t and has been moved to input.h. Also, a
button registration function has been added to take care of +button and
-button command creation and, eventually, direct binding of "physical"
buttons to logical buttons. "Physical" buttons are those coming in from
the OS (keyboard, mouse, joystick...), logical buttons are what the code
looks at for button state.
Additionally, the button edge detection code has been cleaned up such
that it no longer uses magic numbers, and the conversion to a float is
cleaner. Interestingly, I found that the handling is extremely
frame-rate dependent (eg, +forward will accelerate the player to full
speed much faster at 72fps than it does at 20fps). This may be a factor
in why gamers are frame rate obsessed: other games doing the same thing
would certainly feel different under varying frame rates.
2021-10-01 00:16:31 +00:00
|
|
|
|
2021-11-09 13:28:56 +00:00
|
|
|
\a axis_imt_id is -1 if the device has no axis bindings, otherwise it is
|
|
|
|
the base index into the imt axis bindings array.
|
[input] Rework logical buttons
kbutton_t is now in_button_t and has been moved to input.h. Also, a
button registration function has been added to take care of +button and
-button command creation and, eventually, direct binding of "physical"
buttons to logical buttons. "Physical" buttons are those coming in from
the OS (keyboard, mouse, joystick...), logical buttons are what the code
looks at for button state.
Additionally, the button edge detection code has been cleaned up such
that it no longer uses magic numbers, and the conversion to a float is
cleaner. Interestingly, I found that the handling is extremely
frame-rate dependent (eg, +forward will accelerate the player to full
speed much faster at 72fps than it does at 20fps). This may be a factor
in why gamers are frame rate obsessed: other games doing the same thing
would certainly feel different under varying frame rates.
2021-10-01 00:16:31 +00:00
|
|
|
|
2021-11-09 13:28:56 +00:00
|
|
|
\a button_imt_id is -1 if the device has no button bindings, otherwise it
|
|
|
|
is the base index into the imt button bindings array.
|
[input] Rework logical buttons
kbutton_t is now in_button_t and has been moved to input.h. Also, a
button registration function has been added to take care of +button and
-button command creation and, eventually, direct binding of "physical"
buttons to logical buttons. "Physical" buttons are those coming in from
the OS (keyboard, mouse, joystick...), logical buttons are what the code
looks at for button state.
Additionally, the button edge detection code has been cleaned up such
that it no longer uses magic numbers, and the conversion to a float is
cleaner. Interestingly, I found that the handling is extremely
frame-rate dependent (eg, +forward will accelerate the player to full
speed much faster at 72fps than it does at 20fps). This may be a factor
in why gamers are frame rate obsessed: other games doing the same thing
would certainly feel different under varying frame rates.
2021-10-01 00:16:31 +00:00
|
|
|
*/
|
2021-11-01 04:05:05 +00:00
|
|
|
typedef struct in_devbindings_s {
|
2021-11-10 04:22:44 +00:00
|
|
|
struct in_devbindings_s *next;
|
|
|
|
char *name; ///< name used when binding inputs
|
|
|
|
char *devname; ///< physical device name
|
|
|
|
char *id; ///< physical device id
|
|
|
|
int match_id; ///< if true, both devname and id must match
|
2021-11-03 10:02:39 +00:00
|
|
|
int devid; ///< id of device associated with these bindings
|
|
|
|
int num_axes;
|
|
|
|
int num_buttons;
|
2021-11-01 04:05:05 +00:00
|
|
|
in_axisinfo_t *axis_info; ///< axis range info and raw state
|
|
|
|
in_buttoninfo_t *button_info; ///< button raw state
|
|
|
|
int axis_imt_id; ///< index into array of imt axis bindings
|
|
|
|
int button_imt_id; ///< index into array of imt button bindings
|
|
|
|
} in_devbindings_t;
|
[input] Rework logical buttons
kbutton_t is now in_button_t and has been moved to input.h. Also, a
button registration function has been added to take care of +button and
-button command creation and, eventually, direct binding of "physical"
buttons to logical buttons. "Physical" buttons are those coming in from
the OS (keyboard, mouse, joystick...), logical buttons are what the code
looks at for button state.
Additionally, the button edge detection code has been cleaned up such
that it no longer uses magic numbers, and the conversion to a float is
cleaner. Interestingly, I found that the handling is extremely
frame-rate dependent (eg, +forward will accelerate the player to full
speed much faster at 72fps than it does at 20fps). This may be a factor
in why gamers are frame rate obsessed: other games doing the same thing
would certainly feel different under varying frame rates.
2021-10-01 00:16:31 +00:00
|
|
|
|
2001-10-23 16:55:23 +00:00
|
|
|
extern viewdelta_t viewdelta;
|
2001-04-11 07:57:08 +00:00
|
|
|
|
2001-05-19 23:24:20 +00:00
|
|
|
#define freelook (in_mlook.state & 1 || in_freelook->int_val)
|
2001-04-10 21:01:29 +00:00
|
|
|
|
2012-02-01 11:07:21 +00:00
|
|
|
struct cvar_s;
|
2001-09-18 04:53:01 +00:00
|
|
|
|
2021-08-30 00:54:36 +00:00
|
|
|
int IN_RegisterDriver (in_driver_t *driver, void *data);
|
|
|
|
void IN_DriverData (int handlle, void *data);
|
2012-02-01 12:52:47 +00:00
|
|
|
void IN_Init (struct cbuf_s *cbuf);
|
2001-04-10 21:01:29 +00:00
|
|
|
void IN_Init_Cvars (void);
|
2021-11-14 01:17:05 +00:00
|
|
|
struct plitem_s;
|
|
|
|
void IN_SaveConfig (struct plitem_s *config);
|
|
|
|
void IN_LoadConfig (struct plitem_s *config);
|
2001-04-10 21:01:29 +00:00
|
|
|
|
2021-09-20 06:21:11 +00:00
|
|
|
int IN_AddDevice (int driver, void *device, const char *name, const char *id);
|
2021-08-30 05:40:19 +00:00
|
|
|
void IN_RemoveDevice (int devid);
|
|
|
|
|
2021-09-20 06:21:11 +00:00
|
|
|
void IN_SendConnectedDevices (void);
|
2021-09-28 01:53:51 +00:00
|
|
|
const char *IN_GetDeviceName (int devid) __attribute__((pure));
|
|
|
|
const char *IN_GetDeviceId (int devid) __attribute__((pure));
|
2021-11-09 13:31:09 +00:00
|
|
|
void IN_SetDeviceEventData (int devid, void *data);
|
|
|
|
void *IN_GetDeviceEventData (int devid);
|
2021-09-20 06:21:11 +00:00
|
|
|
int IN_AxisInfo (int devid, in_axisinfo_t *axes, int *numaxes);
|
|
|
|
int IN_ButtonInfo (int devid, in_buttoninfo_t *button, int *numbuttons);
|
|
|
|
|
2003-04-08 18:45:12 +00:00
|
|
|
void IN_ProcessEvents (void);
|
2001-04-10 21:01:29 +00:00
|
|
|
|
2003-04-08 18:45:12 +00:00
|
|
|
void IN_UpdateGrab (struct cvar_s *);
|
2002-01-17 22:04:58 +00:00
|
|
|
|
2003-04-08 18:45:12 +00:00
|
|
|
void IN_ClearStates (void);
|
2001-04-10 21:01:29 +00:00
|
|
|
|
2001-04-11 07:57:08 +00:00
|
|
|
void IN_Move (void); // FIXME: was cmduser_t?
|
2001-04-10 21:01:29 +00:00
|
|
|
// add additional movement on top of the keyboard move cmd
|
|
|
|
|
2001-08-30 20:04:13 +00:00
|
|
|
extern struct cvar_s *in_grab;
|
2001-10-28 04:23:37 +00:00
|
|
|
extern struct cvar_s *in_amp;
|
|
|
|
extern struct cvar_s *in_pre_amp;
|
2001-05-31 03:41:35 +00:00
|
|
|
extern struct cvar_s *m_filter;
|
2003-09-04 22:29:40 +00:00
|
|
|
extern struct cvar_s *in_mouse_accel;
|
2001-05-31 03:41:35 +00:00
|
|
|
extern struct cvar_s *in_freelook;
|
|
|
|
extern struct cvar_s *lookstrafe;
|
2001-04-10 21:01:29 +00:00
|
|
|
|
2001-05-19 23:24:20 +00:00
|
|
|
extern qboolean in_mouse_avail;
|
|
|
|
extern float in_mouse_x, in_mouse_y;
|
2001-04-15 07:18:04 +00:00
|
|
|
|
|
|
|
|
2021-09-20 06:21:11 +00:00
|
|
|
#endif
|
2001-10-28 04:23:37 +00:00
|
|
|
|
2020-02-24 03:21:20 +00:00
|
|
|
#endif//__QF_input_h
|