summaryrefslogtreecommitdiffstats
path: root/input/joystick.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-03-24 16:02:48 +0100
committerwm4 <wm4@nowhere>2015-03-24 16:04:44 +0100
commit9b5a7241e88f8147a391f1bb79ce01593a02d443 (patch)
treec6b986d7d29b9828c9d7e1c758416f3988763f41 /input/joystick.c
parent1e659a9f0f3a3836912c66ab75b5af38e632ef12 (diff)
downloadmpv-9b5a7241e88f8147a391f1bb79ce01593a02d443.tar.bz2
mpv-9b5a7241e88f8147a391f1bb79ce01593a02d443.tar.xz
input: remove Linux joystick support
Why did this exist in the first place? Other than being completely useless, this even caused some regressions in the past. For example, there was the case of a laptop exposing its accelerometer as joystick device, which led to extremely fun things due to the default mappings of axis movement being mapped to seeking. I suppose those who really want to use their joystick to control a media player (???) can configure it as mouse device or so.
Diffstat (limited to 'input/joystick.c')
-rw-r--r--input/joystick.c216
1 files changed, 0 insertions, 216 deletions
diff --git a/input/joystick.c b/input/joystick.c
deleted file mode 100644
index e3df106735..0000000000
--- a/input/joystick.c
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * This file is part of MPlayer.
- *
- * MPlayer 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.
- *
- * MPlayer 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 MPlayer; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "input.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <poll.h>
-
-#include "common/common.h"
-#include "common/msg.h"
-#include "keycodes.h"
-
-#ifndef JOY_AXIS_DELTA
-#define JOY_AXIS_DELTA 500
-#endif
-
-#ifndef JS_DEV
-#define JS_DEV "/dev/input/js0"
-#endif
-
-#include <linux/joystick.h>
-
-struct ctx {
- struct mp_log *log;
- int axis[256];
- int btns;
- int fd;
-};
-
-static int close_js(void *ctx, int fd)
-{
- close(fd);
- talloc_free(ctx);
- return 0;
-}
-
-static struct ctx *joystick_init(struct input_ctx *ictx, struct mp_log *log, char *dev)
-{
- int fd,l=0;
- int initialized = 0;
- struct js_event ev;
-
- mp_verbose(log, "Opening joystick device %s\n",dev ? dev : JS_DEV);
-
- fd = open( dev ? dev : JS_DEV , O_RDONLY | O_NONBLOCK );
- if(fd < 0) {
- mp_err(log, "Can't open joystick device %s: %s\n",dev ? dev : JS_DEV,
- mp_strerror(errno));
- return NULL;
- }
-
- struct ctx *ctx = talloc_ptrtype(NULL, ctx);
- *ctx = (struct ctx) {.log = log};
-
- while(! initialized) {
- l = 0;
- while((unsigned int)l < sizeof(struct js_event)) {
- int r = read(fd,((char*)&ev)+l,sizeof(struct js_event)-l);
- if(r < 0) {
- if(errno == EINTR)
- continue;
- else if(errno == EAGAIN) {
- initialized = 1;
- break;
- }
- MP_ERR(ctx, "Error while reading joystick device: %s\n",
- mp_strerror(errno));
- close(fd);
- talloc_free(ctx);
- return NULL;
- }
- l += r;
- }
- if((unsigned int)l < sizeof(struct js_event)) {
- if(l > 0)
- MP_WARN(ctx, "Joystick: We lose %d bytes of data\n",l);
- break;
- }
- if(ev.type == JS_EVENT_BUTTON)
- ctx->btns |= (ev.value << ev.number);
- if(ev.type == JS_EVENT_AXIS)
- ctx->axis[ev.number] = ev.value;
- }
-
- ctx->fd = fd;
- return ctx;
-}
-
-static int mp_input_joystick_read(void *pctx, int fd) {
- struct ctx *ctx = pctx;
- struct js_event ev;
- int l=0;
-
- while((unsigned int)l < sizeof(struct js_event)) {
- int r = read(fd,((char*)&ev)+l,sizeof(struct js_event)-l);
- if(r <= 0) {
- if(errno == EINTR)
- continue;
- else if(errno == EAGAIN)
- return 0;
- if( r < 0) {
- MP_ERR(ctx, "Error while reading joystick device: %s\n",
- mp_strerror(errno));
- } else {
- MP_ERR(ctx, "Error while reading joystick device: %s\n","EOF");
- }
- return -1;
- }
- l += r;
- }
-
- if((unsigned int)l < sizeof(struct js_event)) {
- if(l > 0)
- MP_WARN(ctx, "Joystick: We lose %d bytes of data\n",l);
- return 0;
- }
-
- if(ev.type & JS_EVENT_INIT) {
- MP_WARN(ctx, "Joystick: warning init event, we have lost sync with driver.\n");
- ev.type &= ~JS_EVENT_INIT;
- if(ev.type == JS_EVENT_BUTTON) {
- int s = (ctx->btns >> ev.number) & 1;
- if(s == ev.value) // State is the same : ignore
- return 0;
- }
- if(ev.type == JS_EVENT_AXIS) {
- if( ( ctx->axis[ev.number] == 1 && ev.value > JOY_AXIS_DELTA) ||
- (ctx->axis[ev.number] == -1 && ev.value < -JOY_AXIS_DELTA) ||
- (ctx->axis[ev.number] == 0 && ev.value >= -JOY_AXIS_DELTA && ev.value <= JOY_AXIS_DELTA)
- ) // State is the same : ignore
- return 0;
- }
- }
-
- if(ev.type & JS_EVENT_BUTTON) {
- ctx->btns &= ~(1 << ev.number);
- ctx->btns |= (ev.value << ev.number);
- if(ev.value == 1)
- return (MP_JOY_BTN0 + ev.number) | MP_KEY_STATE_DOWN;
- else
- return (MP_JOY_BTN0 + ev.number) | MP_KEY_STATE_UP;
- } else if(ev.type & JS_EVENT_AXIS) {
- if(ev.value < -JOY_AXIS_DELTA && ctx->axis[ev.number] != -1) {
- ctx->axis[ev.number] = -1;
- return (MP_JOY_AXIS0_MINUS+(2*ev.number)) | MP_KEY_STATE_DOWN;
- } else if(ev.value > JOY_AXIS_DELTA && ctx->axis[ev.number] != 1) {
- ctx->axis[ev.number] = 1;
- return (MP_JOY_AXIS0_PLUS+(2*ev.number)) | MP_KEY_STATE_DOWN;
- } else if(ev.value <= JOY_AXIS_DELTA && ev.value >= -JOY_AXIS_DELTA && ctx->axis[ev.number] != 0) {
- int r = ctx->axis[ev.number] == 1 ? MP_JOY_AXIS0_PLUS+(2*ev.number) : MP_JOY_AXIS0_MINUS+(2*ev.number);
- ctx->axis[ev.number] = 0;
- return r | MP_KEY_STATE_UP;
- } else
- return 0;
- } else {
- MP_WARN(ctx, "Joystick warning unknown event type %d\n",ev.type);
- return -1;
- }
-
- return 0;
-}
-
-static void read_joystick_thread(struct mp_input_src *src, void *param)
-{
- int wakeup_fd = mp_input_src_get_wakeup_fd(src);
- struct ctx *ctx = joystick_init(src->input_ctx, src->log, param);
-
- if (!ctx)
- return;
-
- mp_input_src_init_done(src);
-
- while (1) {
- struct pollfd fds[2] = {
- { .fd = ctx->fd, .events = POLLIN },
- { .fd = wakeup_fd, .events = POLLIN },
- };
- poll(fds, 2, -1);
- if (!(fds[0].revents & POLLIN))
- break;
- int r = mp_input_joystick_read(ctx, ctx->fd);
- if (r < 0)
- break;
- if (r > 0)
- mp_input_put_key(src->input_ctx, r);
- }
-
- close_js(ctx, ctx->fd);
-}
-
-void mp_input_joystick_add(struct input_ctx *ictx, char *dev)
-{
- mp_input_add_thread_src(ictx, (void *)dev, read_joystick_thread);
-}