From cddd13281c846e325a263d1605777c6ff79d2a4a Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 8 Jul 2007 22:14:37 +0000 Subject: [PATCH] Merged FreeBSD joystick patch --- src/joystick/bsd/SDL_sysjoystick.c | 61 ++++++++++++++++++------------ 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/src/joystick/bsd/SDL_sysjoystick.c b/src/joystick/bsd/SDL_sysjoystick.c index 0c7043aca..926899db6 100644 --- a/src/joystick/bsd/SDL_sysjoystick.c +++ b/src/joystick/bsd/SDL_sysjoystick.c @@ -123,6 +123,12 @@ struct joystick_hwdata { struct report_desc *repdesc; struct report inreport; int axis_map[JOYAXE_count]; /* map present JOYAXE_* to 0,1,..*/ + int x; + int y; + int xmin; + int ymin; + int xmax; + int ymax; }; static char *joynames[MAX_JOYS]; @@ -257,6 +263,12 @@ SDL_SYS_JoystickOpen(SDL_Joystick *joy) joy->hwdata = hw; hw->fd = fd; hw->path = strdup(path); + hw->x = 0; + hw->y = 0; + hw->xmin = 0xffff; + hw->ymin = 0xffff; + hw->xmax = 0; + hw->ymax = 0; if (! SDL_strncmp(path, "/dev/joy", 8)) { hw->type = BSDJOY_JOY; joy->naxes = 2; @@ -380,43 +392,42 @@ SDL_SYS_JoystickUpdate(SDL_Joystick *joy) #if defined(__FREEBSD__) || SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H struct joystick gameport; - static int x, y, xmin = 0xffff, ymin = 0xffff, xmax = 0, ymax = 0; if (joy->hwdata->type == BSDJOY_JOY) { if (read(joy->hwdata->fd, &gameport, sizeof gameport) != sizeof gameport) return; - if (abs(x - gameport.x) > 8) { - x = gameport.x; - if (x < xmin) { - xmin = x; + if (abs(joy->hwdata->x - gameport.x) > 8) { + joy->hwdata->x = gameport.x; + if (joy->hwdata->x < joy->hwdata->xmin) { + joy->hwdata->xmin = joy->hwdata->x; } - if (x > xmax) { - xmax = x; + if (joy->hwdata->x > joy->hwdata->xmax) { + joy->hwdata->xmax = joy->hwdata->x; } - if (xmin == xmax) { - xmin--; - xmax++; + if (joy->hwdata->xmin == joy->hwdata->xmax) { + joy->hwdata->xmin--; + joy->hwdata->xmax++; } - v = (Sint32)x; - v -= (xmax + xmin + 1)/2; - v *= 32768/((xmax - xmin + 1)/2); + v = (Sint32)joy->hwdata->x; + v -= (joy->hwdata->xmax + joy->hwdata->xmin + 1)/2; + v *= 32768/((joy->hwdata->xmax - joy->hwdata->xmin + 1)/2); SDL_PrivateJoystickAxis(joy, 0, v); } - if (abs(y - gameport.y) > 8) { - y = gameport.y; - if (y < ymin) { - ymin = y; + if (abs(joy->hwdata->y - gameport.y) > 8) { + joy->hwdata->y = gameport.y; + if (joy->hwdata->y < joy->hwdata->ymin) { + joy->hwdata->ymin = joy->hwdata->y; } - if (y > ymax) { - ymax = y; + if (joy->hwdata->y > joy->hwdata->ymax) { + joy->hwdata->ymax = joy->hwdata->y; } - if (ymin == ymax) { - ymin--; - ymax++; + if (joy->hwdata->ymin == joy->hwdata->ymax) { + joy->hwdata->ymin--; + joy->hwdata->ymax++; } - v = (Sint32)y; - v -= (ymax + ymin + 1)/2; - v *= 32768/((ymax - ymin + 1)/2); + v = (Sint32)joy->hwdata->y; + v -= (joy->hwdata->ymax + joy->hwdata->ymin + 1)/2; + v *= 32768/((joy->hwdata->ymax - joy->hwdata->ymin + 1)/2); SDL_PrivateJoystickAxis(joy, 1, v); } if (gameport.b1 != joy->buttons[0]) {