summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2014-03-13 14:39:12 +0100
committerHans de Goede <hdegoede@redhat.com>2014-03-13 14:42:57 +0100
commit4b736f3ba1d575cc040f9ab8634ce41b2a09dbe0 (patch)
treed63a8e376a5db3f82f05c8ac5709414414a57584
parentea2b4d888d91c2fbe582f130d745677253c98ac0 (diff)
Add support for server managed fdsHEADmaster
Keep things simple by handling server managed fds in the common parts of the open and close paths. Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-rw-r--r--src/backend_bsd.c10
-rw-r--r--src/backend_evdev.c10
-rw-r--r--src/backend_joystick.c10
-rw-r--r--src/jstk.c19
-rw-r--r--src/jstk.h4
-rw-r--r--src/jstk_key.c3
6 files changed, 39 insertions, 17 deletions
diff --git a/src/backend_bsd.c b/src/backend_bsd.c
index f3f501e..d8c6bac 100644
--- a/src/backend_bsd.c
+++ b/src/backend_bsd.c
@@ -91,10 +91,12 @@ jstkOpenDevice_bsd(JoystickDevPtr joystick, Bool probe)
report_desc_t rd;
struct jstk_bsd_hid_data *bsddata;
- if ((joystick->fd = open(joystick->device, O_RDWR | O_NDELAY, 0)) < 0) {
- xf86Msg(X_ERROR, "Cannot open joystick '%s' (%s)\n", joystick->device,
- strerror(errno));
- return -1;
+ if (joystick->fd == -1) {
+ if ((joystick->fd = open(joystick->device, O_RDWR | O_NDELAY, 0)) < 0) {
+ xf86Msg(X_ERROR, "Cannot open joystick '%s' (%s)\n",
+ joystick->device, strerror(errno));
+ return -1;
+ }
}
if ((rd = hid_get_report_desc(joystick->fd)) == 0) {
diff --git a/src/backend_evdev.c b/src/backend_evdev.c
index 2a7b0e2..cae4b28 100644
--- a/src/backend_evdev.c
+++ b/src/backend_evdev.c
@@ -90,10 +90,12 @@ jstkOpenDevice_evdev(JoystickDevPtr joystick, Bool probe)
unsigned long key_bits[NBITS(KEY_MAX)];
int axes, buttons, j;
- if ((joystick->fd = open(joystick->device, O_RDONLY | O_NDELAY, 0)) < 0) {
- xf86Msg(X_ERROR, "Cannot open joystick '%s' (%s)\n",
- joystick->device, strerror(errno));
- return -1;
+ if (joystick->fd == -1) {
+ if ((joystick->fd = open(joystick->device, O_RDONLY | O_NDELAY, 0)) < 0) {
+ xf86Msg(X_ERROR, "Cannot open joystick '%s' (%s)\n",
+ joystick->device, strerror(errno));
+ return -1;
+ }
}
if (ioctl(joystick->fd, EVIOCGVERSION, &driver_version) == -1) {
diff --git a/src/backend_joystick.c b/src/backend_joystick.c
index d335bc2..172ce50 100644
--- a/src/backend_joystick.c
+++ b/src/backend_joystick.c
@@ -72,10 +72,12 @@ jstkOpenDevice_joystick(JoystickDevPtr joystick, Bool probe)
unsigned char axes, buttons;
int driver_version;
- if ((joystick->fd = open(joystick->device, O_RDONLY | O_NDELAY, 0)) < 0) {
- xf86Msg(X_ERROR, "Cannot open joystick '%s' (%s)\n",
- joystick->device, strerror(errno));
- return -1;
+ if (joystick->fd == -1) {
+ if ((joystick->fd = open(joystick->device, O_RDONLY | O_NDELAY, 0)) < 0) {
+ xf86Msg(X_ERROR, "Cannot open joystick '%s' (%s)\n",
+ joystick->device, strerror(errno));
+ return -1;
+ }
}
if (ioctl(joystick->fd, JSIOCGVERSION, &driver_version) == -1) {
diff --git a/src/jstk.c b/src/jstk.c
index 211fe32..6cf0ef9 100644
--- a/src/jstk.c
+++ b/src/jstk.c
@@ -80,6 +80,9 @@ jstkOpenDevice(JoystickDevPtr priv, BOOL probe)
int fd;
fd = -1;
+ if (priv->joystick_device->flags & XI86_SERVER_FD)
+ priv->fd = priv->joystick_device->fd;
+
if (probe == FALSE && priv->open_proc)
return priv->open_proc(priv, probe);
@@ -112,7 +115,8 @@ jstkOpenDevice(JoystickDevPtr priv, BOOL probe)
void jstkCloseDevice(JoystickDevPtr priv)
{
if ((priv->fd >= 0)) {
- xf86CloseSerial(priv->fd);
+ if (!(priv->joystick_device->flags & XI86_SERVER_FD))
+ xf86CloseSerial(priv->fd);
priv->fd = -1;
}
}
@@ -434,7 +438,8 @@ jstkDeviceControlProc(DeviceIntPtr pJstk,
if (pInfo->fd >= 0)
RemoveEnabledDevice(pInfo->fd);
- pInfo->fd = -1;
+ if (!(pInfo->flags & XI86_SERVER_FD))
+ pInfo->fd = -1;
if (priv->close_proc)
priv->close_proc(priv);
pJstk->public.on = FALSE;
@@ -485,7 +490,8 @@ jstkCorePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
pInfo->read_input = jstkReadProc;
pInfo->control_proc = NULL;
pInfo->switch_mode = NULL;
- pInfo->fd = -1;
+ if (!(pInfo->flags & XI86_SERVER_FD))
+ pInfo->fd = -1;
pInfo->dev = NULL;
pInfo->type_name = XI_JOYSTICK;
@@ -506,6 +512,7 @@ jstkCorePreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
priv->mouse_enabled = TRUE;
priv->keys_enabled = TRUE;
priv->amplify = 1.0f;
+ priv->joystick_device = pInfo;
priv->keyboard_device = keyboard_device;
priv->num_axes = MAXAXES;
priv->num_buttons = MAXBUTTONS;
@@ -682,7 +689,11 @@ _X_EXPORT InputDriverRec JOYSTICK = {
NULL,
jstkCorePreInit,
jstkCoreUnInit,
- NULL
+ NULL,
+ NULL,
+#ifdef XI86_DRV_CAP_SERVER_FD
+ XI86_DRV_CAP_SERVER_FD
+#endif
};
/*
diff --git a/src/jstk.h b/src/jstk.h
index 4955435..6421e7f 100644
--- a/src/jstk.h
+++ b/src/jstk.h
@@ -55,6 +55,9 @@
#define XI_JOYSTICK "JOYSTICK"
#endif
+#ifndef XI86_SERVER_FD
+#define XI86_SERVER_FD 0x20
+#endif
typedef enum _JOYSTICKEVENT {
EVENT_NONE=0,
@@ -106,6 +109,7 @@ typedef struct _JoystickDevRec {
jstkReadDataProc read_proc; /* Callback for reading data from the backend */
void *devicedata; /* Extra platform device dependend data */
char *device; /* Name of the device */
+ InputInfoPtr joystick_device; /* Back pointer to the joystick device */
InputInfoPtr keyboard_device; /* Slave device for keyboard events */
OsTimerPtr timer; /* Timer for axis movement */
diff --git a/src/jstk_key.c b/src/jstk_key.c
index 241b15d..5a4ed8e 100644
--- a/src/jstk_key.c
+++ b/src/jstk_key.c
@@ -200,7 +200,8 @@ int jstkKeyboardPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
pInfo->read_input = NULL;
pInfo->control_proc = NULL;
pInfo->switch_mode = NULL;
- pInfo->fd = -1;
+ if (!(pInfo->flags & XI86_SERVER_FD))
+ pInfo->fd = -1;
pInfo->type_name = XI_JOYSTICK;
/* parse keyboard-related options */