mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-13 00:24:12 +00:00
[input] Give input drivers a private data pointer
The pointer can be updated at any time using the driver handle (returned by IN_RegisterData).
This commit is contained in:
parent
05215e0295
commit
b39b6031e8
4 changed files with 53 additions and 29 deletions
|
@ -36,11 +36,11 @@ typedef struct {
|
||||||
} viewdelta_t;
|
} viewdelta_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void (*init) (void);
|
void (*init) (void *data);
|
||||||
void (*shutdown) (void);
|
void (*shutdown) (void *data);
|
||||||
void (*process_events) (void);
|
void (*process_events) (void *data);
|
||||||
void (*clear_states) (void);
|
void (*clear_states) (void *data);
|
||||||
void (*grab_input) (int grab);
|
void (*grab_input) (void *data, int grab);
|
||||||
} in_driver_t;
|
} in_driver_t;
|
||||||
|
|
||||||
extern viewdelta_t viewdelta;
|
extern viewdelta_t viewdelta;
|
||||||
|
@ -49,7 +49,8 @@ extern viewdelta_t viewdelta;
|
||||||
|
|
||||||
struct cvar_s;
|
struct cvar_s;
|
||||||
|
|
||||||
void IN_RegisterDriver (in_driver_t *driver);
|
int IN_RegisterDriver (in_driver_t *driver, void *data);
|
||||||
|
void IN_DriverData (int handlle, void *data);
|
||||||
void IN_Init (struct cbuf_s *cbuf);
|
void IN_Init (struct cbuf_s *cbuf);
|
||||||
void IN_Init_Cvars (void);
|
void IN_Init_Cvars (void);
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,12 @@
|
||||||
#include "QF/sys.h"
|
#include "QF/sys.h"
|
||||||
#include "QF/vid.h"
|
#include "QF/vid.h"
|
||||||
|
|
||||||
static struct DARRAY_TYPE (in_driver_t) in_drivers = { .grow = 8, };
|
typedef struct {
|
||||||
|
in_driver_t driver;
|
||||||
|
void *data;
|
||||||
|
} in_regdriver_t;
|
||||||
|
|
||||||
|
static struct DARRAY_TYPE (in_regdriver_t) in_drivers = { .grow = 8, };
|
||||||
|
|
||||||
VISIBLE viewdelta_t viewdelta;
|
VISIBLE viewdelta_t viewdelta;
|
||||||
|
|
||||||
|
@ -79,10 +84,18 @@ qboolean in_mouse_avail;
|
||||||
float in_mouse_x, in_mouse_y;
|
float in_mouse_x, in_mouse_y;
|
||||||
static float in_old_mouse_x, in_old_mouse_y;
|
static float in_old_mouse_x, in_old_mouse_y;
|
||||||
|
|
||||||
void
|
int
|
||||||
IN_RegisterDriver (in_driver_t *driver)
|
IN_RegisterDriver (in_driver_t *driver, void *data)
|
||||||
{
|
{
|
||||||
DARRAY_APPEND (&in_drivers, *driver);
|
in_regdriver_t rdriver = { *driver, data };
|
||||||
|
DARRAY_APPEND (&in_drivers, rdriver);
|
||||||
|
return in_drivers.size - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
IN_DriverData (int handle, void *data)
|
||||||
|
{
|
||||||
|
in_drivers.a[handle].data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -90,8 +103,9 @@ IN_UpdateGrab (cvar_t *var) // called from context_*.c
|
||||||
{
|
{
|
||||||
if (var) {
|
if (var) {
|
||||||
for (size_t i = 0; i < in_drivers.size; i++) {
|
for (size_t i = 0; i < in_drivers.size; i++) {
|
||||||
if (in_drivers.a[i].grab_input) {
|
in_regdriver_t *rd = &in_drivers.a[i];
|
||||||
in_drivers.a[i].grab_input (var->int_val);
|
if (rd->driver.grab_input) {
|
||||||
|
rd->driver.grab_input (rd->data, var->int_val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,7 +115,8 @@ void
|
||||||
IN_ProcessEvents (void)
|
IN_ProcessEvents (void)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < in_drivers.size; i++) {
|
for (size_t i = 0; i < in_drivers.size; i++) {
|
||||||
in_drivers.a[i].process_events ();
|
in_regdriver_t *rd = &in_drivers.a[i];
|
||||||
|
rd->driver.process_events (rd->data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,8 +163,9 @@ IN_shutdown (void *data)
|
||||||
|
|
||||||
Sys_MaskPrintf (SYS_vid, "IN_Shutdown\n");
|
Sys_MaskPrintf (SYS_vid, "IN_Shutdown\n");
|
||||||
for (size_t i = in_drivers.size; i-- > 0; ) {
|
for (size_t i = in_drivers.size; i-- > 0; ) {
|
||||||
if (in_drivers.a[i].shutdown) {
|
in_regdriver_t *rd = &in_drivers.a[i];
|
||||||
in_drivers.a[i].shutdown ();
|
if (rd->driver.shutdown) {
|
||||||
|
rd->driver.shutdown (rd->data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -163,7 +179,8 @@ IN_Init (cbuf_t *cbuf)
|
||||||
|
|
||||||
IE_Init ();
|
IE_Init ();
|
||||||
for (size_t i = 0; i < in_drivers.size; i++) {
|
for (size_t i = 0; i < in_drivers.size; i++) {
|
||||||
in_drivers.a[i].init ();
|
in_regdriver_t *rd = &in_drivers.a[i];
|
||||||
|
rd->driver.init (rd->data);
|
||||||
}
|
}
|
||||||
Key_Init (cbuf);
|
Key_Init (cbuf);
|
||||||
//JOY_Init ();
|
//JOY_Init ();
|
||||||
|
@ -200,8 +217,9 @@ void
|
||||||
IN_ClearStates (void)
|
IN_ClearStates (void)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < in_drivers.size; i++) {
|
for (size_t i = 0; i < in_drivers.size; i++) {
|
||||||
if (in_drivers.a[i].clear_states) {
|
in_regdriver_t *rd = &in_drivers.a[i];
|
||||||
in_drivers.a[i].clear_states ();
|
if (rd->driver.clear_states) {
|
||||||
|
rd->driver.clear_states (rd->data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Key_ClearStates ();
|
Key_ClearStates ();
|
||||||
|
|
|
@ -49,14 +49,14 @@ in_evdev_keydest_callback (keydest_t key_dest, void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
in_evdev_process_events (void)
|
in_evdev_process_events (void *data)
|
||||||
{
|
{
|
||||||
if (inputlib_check_input ()) {
|
if (inputlib_check_input ()) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
in_evdev_shutdown (void)
|
in_evdev_shutdown (void *data)
|
||||||
{
|
{
|
||||||
inputlib_close ();
|
inputlib_close ();
|
||||||
}
|
}
|
||||||
|
@ -64,15 +64,20 @@ in_evdev_shutdown (void)
|
||||||
static void
|
static void
|
||||||
device_add (device_t *dev)
|
device_add (device_t *dev)
|
||||||
{
|
{
|
||||||
|
Sys_Printf ("in_evdev: add %s\n", dev->path);
|
||||||
|
Sys_Printf (" %s\n", dev->name);
|
||||||
|
Sys_Printf (" %s\n", dev->phys);
|
||||||
|
Sys_Printf (" %s\n", dev->uniq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
device_remove (device_t *dev)
|
device_remove (device_t *dev)
|
||||||
{
|
{
|
||||||
|
Sys_Printf ("in_evdev: remove %s\n", dev->path);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
in_evdev_init (void)
|
in_evdev_init (void *data)
|
||||||
{
|
{
|
||||||
Key_KeydestCallback (in_evdev_keydest_callback, 0);
|
Key_KeydestCallback (in_evdev_keydest_callback, 0);
|
||||||
|
|
||||||
|
@ -80,7 +85,7 @@ in_evdev_init (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
in_evdev_clear_states (void)
|
in_evdev_clear_states (void *data)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,7 +99,7 @@ static in_driver_t in_evdev_driver = {
|
||||||
static void __attribute__((constructor))
|
static void __attribute__((constructor))
|
||||||
in_evdev_register_driver (void)
|
in_evdev_register_driver (void)
|
||||||
{
|
{
|
||||||
IN_RegisterDriver (&in_evdev_driver);
|
IN_RegisterDriver (&in_evdev_driver, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int in_evdev_force_link;
|
int in_evdev_force_link;
|
||||||
|
|
|
@ -743,7 +743,7 @@ grab_error (int code, const char *device)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
in_x11_grab_input (int grab)
|
in_x11_grab_input (void *data, int grab)
|
||||||
{
|
{
|
||||||
if (!x_disp || !x_win)
|
if (!x_disp || !x_win)
|
||||||
return;
|
return;
|
||||||
|
@ -781,13 +781,13 @@ in_x11_grab_input (int grab)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
in_x11_process_events (void)
|
in_x11_process_events (void *data)
|
||||||
{
|
{
|
||||||
X11_ProcessEvents (); // Get events from X server.
|
X11_ProcessEvents (); // Get events from X server.
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
in_x11_shutdown (void)
|
in_x11_shutdown (void *data)
|
||||||
{
|
{
|
||||||
Sys_MaskPrintf (SYS_vid, "in_x11_shutdown\n");
|
Sys_MaskPrintf (SYS_vid, "in_x11_shutdown\n");
|
||||||
in_mouse_avail = 0;
|
in_mouse_avail = 0;
|
||||||
|
@ -813,7 +813,7 @@ in_x11_init_cvars (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
in_x11_init (void)
|
in_x11_init (void *data)
|
||||||
{
|
{
|
||||||
// open the display
|
// open the display
|
||||||
if (!x_disp)
|
if (!x_disp)
|
||||||
|
@ -863,7 +863,7 @@ in_x11_init (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
in_x11_clear_states (void)
|
in_x11_clear_states (void *data)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -878,7 +878,7 @@ static in_driver_t in_x11_driver = {
|
||||||
static void __attribute__((constructor))
|
static void __attribute__((constructor))
|
||||||
in_x11_register_driver (void)
|
in_x11_register_driver (void)
|
||||||
{
|
{
|
||||||
IN_RegisterDriver (&in_x11_driver);
|
IN_RegisterDriver (&in_x11_driver, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int x11_force_link;
|
int x11_force_link;
|
||||||
|
|
Loading…
Reference in a new issue