summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sterrett <mr_bones_@gentoo.org>2004-07-14 00:17:25 +0000
committerMichael Sterrett <mr_bones_@gentoo.org>2004-07-14 00:17:25 +0000
commit1361a1f02f384ac1df590000653859fe10e8d01e (patch)
treea1301586c5ea465a269988cc3be9568b6ae93d86
parentnew release, fixes bugs and squashfs update (Manifest recommit) (diff)
downloadgentoo-2-1361a1f02f384ac1df590000653859fe10e8d01e.tar.gz
gentoo-2-1361a1f02f384ac1df590000653859fe10e8d01e.tar.bz2
gentoo-2-1361a1f02f384ac1df590000653859fe10e8d01e.zip
Updated joystick patch from libsdl CVS. (bug #52833)
-rw-r--r--media-libs/libsdl/ChangeLog8
-rw-r--r--media-libs/libsdl/Manifest21
-rw-r--r--media-libs/libsdl/files/1.2.7-joystick2.patch567
-rw-r--r--media-libs/libsdl/files/digest-libsdl-1.2.7-r21
-rw-r--r--media-libs/libsdl/libsdl-1.2.7-r2.ebuild97
5 files changed, 684 insertions, 10 deletions
diff --git a/media-libs/libsdl/ChangeLog b/media-libs/libsdl/ChangeLog
index 1f74b08dd598..233dfed549f7 100644
--- a/media-libs/libsdl/ChangeLog
+++ b/media-libs/libsdl/ChangeLog
@@ -1,6 +1,12 @@
# ChangeLog for media-libs/libsdl
# Copyright 2002-2004 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/media-libs/libsdl/ChangeLog,v 1.52 2004/07/13 23:46:29 kloeri Exp $
+# $Header: /var/cvsroot/gentoo-x86/media-libs/libsdl/ChangeLog,v 1.53 2004/07/14 00:17:25 mr_bones_ Exp $
+
+*libsdl-1.2.7-r2 (13 Jul 2004)
+
+ 13 Jul 2004; Michael Sterrett <mr_bones_@gentoo.org>
+ +files/1.2.7-joystick2.patch, +libsdl-1.2.7-r2.ebuild:
+ Updated joystick patch from libsdl CVS. (bug #52833)
14 Jul 2004; Bryan Østergaard <kloeri@gentoo.org> libsdl-1.2.7-r1.ebuild:
Stable on alpha.
diff --git a/media-libs/libsdl/Manifest b/media-libs/libsdl/Manifest
index 16e9c62b5491..01b29105cbe4 100644
--- a/media-libs/libsdl/Manifest
+++ b/media-libs/libsdl/Manifest
@@ -1,15 +1,18 @@
-MD5 725053ce30b454e912aaab60c08caf10 libsdl-1.2.6-r3.ebuild 2854
-MD5 5074715fa2ad4fbd78e35864ff07248a libsdl-1.2.7.ebuild 2486
-MD5 4cdef02cae2d28ec06e6fc752ff24602 libsdl-1.2.7-r1.ebuild 2750
MD5 97257b0c3b14e040ec2af96d04ade1a6 ChangeLog 7843
MD5 baaaa69f33ef9027dac84ee4ff02773b metadata.xml 974
-MD5 206ddd08dd3e33819d03245d11af3014 files/1.2.7-gcc34.patch 8196
-MD5 0c2020ec3ce37ea0612064c52d1014b1 files/1.2.6-alsa-1.0.0.patch 557
+MD5 725053ce30b454e912aaab60c08caf10 libsdl-1.2.6-r3.ebuild 2854
+MD5 4cdef02cae2d28ec06e6fc752ff24602 libsdl-1.2.7-r1.ebuild 2750
+MD5 5074715fa2ad4fbd78e35864ff07248a libsdl-1.2.7.ebuild 2486
+MD5 90fe3281a63d2d5ebb14099e3e30d819 libsdl-1.2.7-r2.ebuild 2751
MD5 803844293dc7df2bb7d2323c03977b71 files/1.2.7-libcaca.patch 23266
+MD5 2e9d99f7ab858b5a64d124abea4565b9 files/digest-libsdl-1.2.7-r1 62
+MD5 0c2020ec3ce37ea0612064c52d1014b1 files/1.2.6-alsa-1.0.0.patch 557
+MD5 2e9d99f7ab858b5a64d124abea4565b9 files/digest-libsdl-1.2.7 62
+MD5 206ddd08dd3e33819d03245d11af3014 files/1.2.7-gcc34.patch 8196
+MD5 e71ab5ce20cb7c70631a59f9d209cce1 files/1.2.7-joystick.patch 1317
+MD5 b66ce90b8939cef871c1c9b065fc0658 files/digest-libsdl-1.2.6-r3 62
MD5 419d8c241f85b4deba895c615faa5612 files/libsdl-1.2.6-fullscreen.patch 1094
MD5 4f1ce33c931d461bed06277f60341085 files/1.2.6-nobuggy-X.patch 568
-MD5 e71ab5ce20cb7c70631a59f9d209cce1 files/1.2.7-joystick.patch 1317
-MD5 2e9d99f7ab858b5a64d124abea4565b9 files/digest-libsdl-1.2.7 62
MD5 4f1ce33c931d461bed06277f60341085 files/1.2.7-nobuggy-X.patch 568
-MD5 b66ce90b8939cef871c1c9b065fc0658 files/digest-libsdl-1.2.6-r3 62
-MD5 2e9d99f7ab858b5a64d124abea4565b9 files/digest-libsdl-1.2.7-r1 62
+MD5 abf0c6fe9d93e5b0cc9a4dbb6d93ad87 files/1.2.7-joystick2.patch 16196
+MD5 2e9d99f7ab858b5a64d124abea4565b9 files/digest-libsdl-1.2.7-r2 62
diff --git a/media-libs/libsdl/files/1.2.7-joystick2.patch b/media-libs/libsdl/files/1.2.7-joystick2.patch
new file mode 100644
index 000000000000..ad6eda329156
--- /dev/null
+++ b/media-libs/libsdl/files/1.2.7-joystick2.patch
@@ -0,0 +1,567 @@
+--- src/joystick/linux/SDL_sysjoystick.c.orig 2004-07-13 04:20:48.000000000 -0700
++++ src/joystick/linux/SDL_sysjoystick.c 2004-07-13 04:20:53.000000000 -0700
+@@ -67,11 +67,102 @@
+ { "Saitek Saitek X45", 6, 1, 0 }
+ };
+
++#ifndef NO_LOGICAL_JOYSTICKS
++
++static struct joystick_logical_values {
++ int njoy;
++ int nthing;
++} joystick_logical_values[] = {
++
++/* +0 */
++ /* MP-8800 axes map - map to {logical joystick #, logical axis #} */
++ {0,0},{0,1},{0,2},{1,0},{1,1},{0,3},{1,2},{1,3},{2,0},{2,1},{2,2},{2,3},
++ {3,0},{3,1},{3,2},{3,3},{0,4},{1,4},{2,4},
++
++/* +19 */
++ /* MP-8800 hat map - map to {logical joystick #, logical hat #} */
++ {0,0},{1,0},{2,0},{3,0},
++
++/* +23 */
++ /* MP-8800 button map - map to {logical joystick #, logical button #} */
++ {0,0},{0,1},{0,2},{0,3},{0,4},{0,5},{0,6},{0,7},{0,8},{0,9},{0,10},{0,11},
++ {1,0},{1,1},{1,2},{1,3},{1,4},{1,5},{1,6},{1,7},{1,8},{1,9},{1,10},{1,11},
++ {2,0},{2,1},{2,2},{2,3},{2,4},{2,5},{2,6},{2,7},{2,8},{2,9},{2,10},{2,11},
++ {3,0},{3,1},{3,2},{3,3},{3,4},{3,5},{3,6},{3,7},{3,8},{3,9},{3,10},{3,11}
++};
++
++static struct joystick_logical_layout {
++ int naxes;
++ int nhats;
++ int nballs;
++ int nbuttons;
++} joystick_logical_layout[] = {
++ /* MP-8800 logical layout */
++ {5, 1, 0, 12},
++ {5, 1, 0, 12},
++ {5, 1, 0, 12},
++ {4, 1, 0, 12}
++};
++
++/*
++ Some USB HIDs show up as a single joystick even though they actually
++ control 2 or more joysticks. This array sets up a means of mapping
++ a single physical joystick to multiple logical joysticks. (djm)
++
++ njoys
++ the number of logical joysticks
++
++ layouts
++ an array of layout structures, one to describe each logical joystick
++
++ axes, hats, balls, buttons
++ arrays that map a physical thingy to a logical thingy
++ */
++static struct joystick_logicalmap {
++ const char *name;
++ int njoys;
++ struct joystick_logical_layout *layouts;
++ struct joystick_logical_values *axes;
++ struct joystick_logical_values *hats;
++ struct joystick_logical_values *balls;
++ struct joystick_logical_values *buttons;
++
++} joystick_logicalmap[] = {
++ {"WiseGroup.,Ltd MP-8800 Quad USB Joypad", 4, joystick_logical_layout,
++ joystick_logical_values, joystick_logical_values+19, NULL,
++ joystick_logical_values+23}
++};
++
++/* find the head of a linked list, given a point in it
++ */
++#define SDL_joylist_head(i, start)\
++ for(i = start; SDL_joylist[i].fname == NULL;) i = SDL_joylist[i].prev;
++
++#define SDL_logical_joydecl(d) d
++
++
++#else
++
++#define SDL_logical_joydecl(d)
++
++#endif /* USE_LOGICAL_JOYSTICKS */
++
+ /* The maximum number of joysticks we'll detect */
+ #define MAX_JOYSTICKS 32
+
+ /* A list of available joysticks */
+-static char *SDL_joylist[MAX_JOYSTICKS];
++static struct
++{
++ char* fname;
++#ifndef NO_LOGICAL_JOYSTICKS
++ SDL_Joystick* joy;
++ struct joystick_logicalmap* map;
++ int prev;
++ int next;
++ int logicalno;
++#endif /* USE_LOGICAL_JOYSTICKS */
++} SDL_joylist[MAX_JOYSTICKS];
++
+
+ /* The private structure used to keep track of a joystick */
+ struct joystick_hwdata {
+@@ -108,6 +199,73 @@
+ return(newstring);
+ }
+
++
++#ifndef NO_LOGICAL_JOYSTICKS
++
++static int CountLogicalJoysticks(int max)
++{
++ register int i, j, k, ret, prev;
++ const char* name;
++
++ ret = 0;
++
++ for(i = 0; i < max; i++) {
++ name = SDL_SYS_JoystickName(i);
++
++ if (name) {
++ for(j = 0; j < SDL_TABLESIZE(joystick_logicalmap); j++) {
++ if (!strcmp(name, joystick_logicalmap[j].name)) {
++
++ prev = i;
++ SDL_joylist[prev].map = joystick_logicalmap+j;
++
++ for(k = 1; k < joystick_logicalmap[j].njoys; k++) {
++ SDL_joylist[prev].next = max + ret;
++
++ if (prev != i)
++ SDL_joylist[max+ret].prev = prev;
++
++ prev = max + ret;
++ SDL_joylist[prev].logicalno = k;
++ SDL_joylist[prev].map = joystick_logicalmap+j;
++ ret++;
++ }
++
++ break;
++ }
++ }
++ }
++ }
++
++ return ret;
++}
++
++static void LogicalSuffix(int logicalno, char* namebuf, int len)
++{
++ register int slen;
++ const static char suffixs[] =
++ "01020304050607080910111213141516171819"
++ "20212223242526272829303132";
++ const char* suffix;
++
++ slen = strlen(namebuf);
++
++ suffix = NULL;
++
++ if (logicalno*2<sizeof(suffixs))
++ suffix = suffixs + (logicalno*2);
++
++ if (slen + 4 < len && suffix) {
++ namebuf[slen++] = ' ';
++ namebuf[slen++] = '#';
++ namebuf[slen++] = suffix[0];
++ namebuf[slen++] = suffix[1];
++ namebuf[slen++] = 0;
++ }
++}
++
++#endif /* USE_LOGICAL_JOYSTICKS */
++
+ #ifdef USE_INPUT_EVENTS
+ #define test_bit(nr, addr) \
+ (((1UL << ((nr) & 31)) & (((const unsigned int *) addr)[(nr) >> 5])) != 0)
+@@ -160,8 +318,8 @@
+ fd = open(path, O_RDONLY, 0);
+ if ( fd >= 0 ) {
+ /* Assume the user knows what they're doing. */
+- SDL_joylist[numjoysticks] = mystrdup(path);
+- if ( SDL_joylist[numjoysticks] ) {
++ SDL_joylist[numjoysticks].fname =mystrdup(path);
++ if ( SDL_joylist[numjoysticks].fname ) {
+ dev_nums[numjoysticks] = sb.st_rdev;
+ ++numjoysticks;
+ }
+@@ -208,8 +366,8 @@
+ close(fd);
+
+ /* We're fine, add this joystick */
+- SDL_joylist[numjoysticks] = mystrdup(path);
+- if ( SDL_joylist[numjoysticks] ) {
++ SDL_joylist[numjoysticks].fname =mystrdup(path);
++ if ( SDL_joylist[numjoysticks].fname ) {
+ dev_nums[numjoysticks] = sb.st_rdev;
+ ++numjoysticks;
+ }
+@@ -229,6 +387,9 @@
+ break;
+ #endif
+ }
++#ifndef NO_LOGICAL_JOYSTICKS
++ numjoysticks += CountLogicalJoysticks(numjoysticks);
++#endif
+
+ return(numjoysticks);
+ }
+@@ -239,20 +400,29 @@
+ int fd;
+ static char namebuf[128];
+ char *name;
++ SDL_logical_joydecl(int oindex = index);
+
++#ifndef NO_LOGICAL_JOYSTICKS
++ SDL_joylist_head(index, index);
++#endif
+ name = NULL;
+- fd = open(SDL_joylist[index], O_RDONLY, 0);
++ fd = open(SDL_joylist[index].fname, O_RDONLY, 0);
+ if ( fd >= 0 ) {
+ if (
+ #ifdef USE_INPUT_EVENTS
+ (ioctl(fd, EVIOCGNAME(sizeof(namebuf)), namebuf) <= 0) &&
+ #endif
+ (ioctl(fd, JSIOCGNAME(sizeof(namebuf)), namebuf) <= 0) ) {
+- name = SDL_joylist[index];
++ name = SDL_joylist[index].fname;
+ } else {
+ name = namebuf;
+ }
+ close(fd);
++
++#ifndef NO_LOGICAL_JOYSTICKS
++ if (SDL_joylist[oindex].prev || SDL_joylist[oindex].next)
++ LogicalSuffix(SDL_joylist[oindex].logicalno, namebuf, 128);
++#endif
+ }
+ return name;
+ }
+@@ -383,7 +553,7 @@
+
+ static SDL_bool EV_ConfigJoystick(SDL_Joystick *joystick, int fd)
+ {
+- int i;
++ int i, t;
+ unsigned long keybit[40];
+ unsigned long absbit[40];
+ unsigned long relbit[40];
+@@ -424,7 +594,8 @@
+ if ( test_bit(i, absbit) ) {
+ int values[5];
+
+- ioctl(fd, EVIOCGABS(i), values);
++ if ( ioctl(fd, EVIOCGABS(i), values) < 0 )
++ continue;
+ #ifdef DEBUG_INPUT_EVENTS
+ printf("Joystick has absolute axis: %x\n", i);
+ printf("Values = { %d, %d, %d, %d, %d }\n",
+@@ -440,8 +611,12 @@
+ (values[2] + values[1]) / 2 - values[4];
+ joystick->hwdata->abs_correct[i].coef[1] =
+ (values[2] + values[1]) / 2 + values[4];
+- joystick->hwdata->abs_correct[i].coef[2] =
+- (1 << 29) / ((values[2] - values[1]) / 2 - 2 * values[4]);
++ t = ((values[2] - values[1]) / 2 - 2 * values[4]);
++ if ( t != 0 ) {
++ joystick->hwdata->abs_correct[i].coef[2] = (1 << 29) / t;
++ } else {
++ joystick->hwdata->abs_correct[i].coef[2] = 0;
++ }
+ }
+ ++joystick->naxes;
+ }
+@@ -475,6 +650,22 @@
+
+ #endif /* USE_INPUT_EVENTS */
+
++#ifndef NO_LOGICAL_JOYSTICKS
++static void ConfigLogicalJoystick(SDL_Joystick *joystick)
++{
++ struct joystick_logical_layout* layout;
++
++ layout = SDL_joylist[joystick->index].map->layouts +
++ SDL_joylist[joystick->index].logicalno;
++
++ joystick->nbuttons = layout->nbuttons;
++ joystick->nhats = layout->nhats;
++ joystick->naxes = layout->naxes;
++ joystick->nballs = layout->nballs;
++}
++#endif
++
++
+ /* Function to open a joystick for use.
+ The joystick to open is specified by the index field of the joystick.
+ This should fill the nbuttons and naxes fields of the joystick structure.
+@@ -483,9 +674,28 @@
+ int SDL_SYS_JoystickOpen(SDL_Joystick *joystick)
+ {
+ int fd;
++ SDL_logical_joydecl(int realindex);
++ SDL_logical_joydecl(SDL_Joystick *realjoy = NULL);
+
+ /* Open the joystick and set the joystick file descriptor */
+- fd = open(SDL_joylist[joystick->index], O_RDONLY, 0);
++#ifndef NO_LOGICAL_JOYSTICKS
++ if (SDL_joylist[joystick->index].fname == NULL) {
++ SDL_joylist_head(realindex, joystick->index);
++ realjoy = SDL_JoystickOpen(realindex);
++
++ if (realjoy == NULL)
++ return(-1);
++
++ fd = realjoy->hwdata->fd;
++
++ } else {
++ fd = open(SDL_joylist[joystick->index].fname, O_RDONLY, 0);
++ }
++ SDL_joylist[joystick->index].joy = joystick;
++#else
++ fd = open(SDL_joylist[joystick->index].fname, O_RDONLY, 0);
++#endif
++
+ if ( fd < 0 ) {
+ SDL_SetError("Unable to open %s\n",
+ SDL_joylist[joystick->index]);
+@@ -505,6 +715,11 @@
+ fcntl(fd, F_SETFL, O_NONBLOCK);
+
+ /* Get the number of buttons and axes on the joystick */
++#ifndef NO_LOGICAL_JOYSTICKS
++ if (realjoy)
++ ConfigLogicalJoystick(joystick);
++ else
++#endif
+ #ifdef USE_INPUT_EVENTS
+ if ( ! EV_ConfigJoystick(joystick, fd) )
+ #endif
+@@ -513,6 +728,84 @@
+ return(0);
+ }
+
++#ifndef NO_LOGICAL_JOYSTICKS
++
++static SDL_Joystick* FindLogicalJoystick(
++ SDL_Joystick *joystick, struct joystick_logical_values* v)
++{
++ SDL_Joystick *logicaljoy;
++ register int i;
++
++ i = joystick->index;
++ logicaljoy = NULL;
++
++ /* get the fake joystick that will receive the event
++ */
++ for(;;) {
++
++ if (SDL_joylist[i].logicalno == v->njoy) {
++ logicaljoy = SDL_joylist[i].joy;
++ break;
++ }
++
++ if (SDL_joylist[i].next == 0)
++ break;
++
++ i = SDL_joylist[i].next;
++
++ }
++
++ return logicaljoy;
++}
++
++static int LogicalJoystickButton(
++ SDL_Joystick *joystick, Uint8 button, Uint8 state){
++ struct joystick_logical_values* buttons;
++ SDL_Joystick *logicaljoy = NULL;
++
++ /* if there's no map then this is just a regular joystick
++ */
++ if (SDL_joylist[joystick->index].map == NULL)
++ return 0;
++
++ /* get the logical joystick that will receive the event
++ */
++ buttons = SDL_joylist[joystick->index].map->buttons+button;
++ logicaljoy = FindLogicalJoystick(joystick, buttons);
++
++ if (logicaljoy == NULL)
++ return 1;
++
++ SDL_PrivateJoystickButton(logicaljoy, buttons->nthing, state);
++
++ return 1;
++}
++
++static int LogicalJoystickAxis(
++ SDL_Joystick *joystick, Uint8 axis, Sint16 value)
++{
++ struct joystick_logical_values* axes;
++ SDL_Joystick *logicaljoy = NULL;
++
++ /* if there's no map then this is just a regular joystick
++ */
++ if (SDL_joylist[joystick->index].map == NULL)
++ return 0;
++
++ /* get the logical joystick that will receive the event
++ */
++ axes = SDL_joylist[joystick->index].map->axes+axis;
++ logicaljoy = FindLogicalJoystick(joystick, axes);
++
++ if (logicaljoy == NULL)
++ return 1;
++
++ SDL_PrivateJoystickAxis(logicaljoy, axes->nthing, value);
++
++ return 1;
++}
++#endif /* USE_LOGICAL_JOYSTICKS */
++
+ static __inline__
+ void HandleHat(SDL_Joystick *stick, Uint8 hat, int axis, int value)
+ {
+@@ -522,6 +815,8 @@
+ { SDL_HAT_LEFT, SDL_HAT_CENTERED, SDL_HAT_RIGHT },
+ { SDL_HAT_LEFTDOWN, SDL_HAT_DOWN, SDL_HAT_RIGHTDOWN }
+ };
++ SDL_logical_joydecl(SDL_Joystick *logicaljoy = NULL);
++ SDL_logical_joydecl(struct joystick_logical_values* hats = NULL);
+
+ the_hat = &stick->hwdata->hats[hat];
+ if ( value < 0 ) {
+@@ -535,6 +830,24 @@
+ }
+ if ( value != the_hat->axis[axis] ) {
+ the_hat->axis[axis] = value;
++
++#ifndef NO_LOGICAL_JOYSTICKS
++ /* if there's no map then this is just a regular joystick
++ */
++ if (SDL_joylist[stick->index].map != NULL) {
++
++ /* get the fake joystick that will receive the event
++ */
++ hats = SDL_joylist[stick->index].map->hats+hat;
++ logicaljoy = FindLogicalJoystick(stick, hats);
++ }
++
++ if (logicaljoy) {
++ stick = logicaljoy;
++ hat = hats->nthing;
++ }
++#endif /* USE_LOGICAL_JOYSTICKS */
++
+ SDL_PrivateJoystickHat(stick, hat,
+ position_map[the_hat->axis[1]][the_hat->axis[0]]);
+ }
+@@ -557,12 +870,23 @@
+ int i, len;
+ Uint8 other_axis;
+
++#ifndef NO_LOGICAL_JOYSTICKS
++ if (SDL_joylist[joystick->index].fname == NULL) {
++ SDL_joylist_head(i, joystick->index);
++ return JS_HandleEvents(SDL_joylist[i].joy);
++ }
++#endif
++
+ while ((len=read(joystick->hwdata->fd, events, (sizeof events))) > 0) {
+ len /= sizeof(events[0]);
+ for ( i=0; i<len; ++i ) {
+ switch (events[i].type & ~JS_EVENT_INIT) {
+ case JS_EVENT_AXIS:
+ if ( events[i].number < joystick->naxes ) {
++#ifndef NO_LOGICAL_JOYSTICKS
++ if (!LogicalJoystickAxis(joystick,
++ events[i].number, events[i].value))
++#endif
+ SDL_PrivateJoystickAxis(joystick,
+ events[i].number, events[i].value);
+ break;
+@@ -585,6 +909,10 @@
+ }
+ break;
+ case JS_EVENT_BUTTON:
++#ifndef NO_LOGICAL_JOYSTICKS
++ if (!LogicalJoystickButton(joystick,
++ events[i].number, events[i].value))
++#endif
+ SDL_PrivateJoystickButton(joystick,
+ events[i].number, events[i].value);
+ break;
+@@ -627,6 +955,13 @@
+ int i, len;
+ int code;
+
++#ifndef NO_LOGICAL_JOYSTICKS
++ if (SDL_joylist[joystick->index].fname == NULL) {
++ SDL_joylist_head(i, joystick->index);
++ return EV_HandleEvents(SDL_joylist[i].joy);
++ }
++#endif
++
+ while ((len=read(joystick->hwdata->fd, events, (sizeof events))) > 0) {
+ len /= sizeof(events[0]);
+ for ( i=0; i<len; ++i ) {
+@@ -635,6 +970,11 @@
+ case EV_KEY:
+ if ( code >= BTN_MISC ) {
+ code -= BTN_MISC;
++#ifndef NO_LOGICAL_JOYSTICKS
++ if (!LogicalJoystickButton(joystick,
++ joystick->hwdata->key_map[code],
++ events[i].value))
++#endif
+ SDL_PrivateJoystickButton(joystick,
+ joystick->hwdata->key_map[code],
+ events[i].value);
+@@ -656,6 +996,11 @@
+ break;
+ default:
+ events[i].value = EV_AxisCorrect(joystick, code, events[i].value);
++#ifndef NO_LOGICAL_JOYSTICKS
++ if (!LogicalJoystickAxis(joystick,
++ joystick->hwdata->abs_map[code],
++ events[i].value))
++#endif
+ SDL_PrivateJoystickAxis(joystick,
+ joystick->hwdata->abs_map[code],
+ events[i].value);
+@@ -710,7 +1055,18 @@
+ /* Function to close a joystick after use */
+ void SDL_SYS_JoystickClose(SDL_Joystick *joystick)
+ {
++#ifndef NO_LOGICAL_JOYSTICKS
++ register int i;
++ if (SDL_joylist[joystick->index].fname == NULL) {
++ SDL_joylist_head(i, joystick->index);
++ SDL_JoystickClose(SDL_joylist[i].joy);
++ }
++#endif
++
+ if ( joystick->hwdata ) {
++#ifndef NO_LOGICAL_JOYSTICKS
++ if (SDL_joylist[joystick->index].fname != NULL)
++#endif
+ close(joystick->hwdata->fd);
+ if ( joystick->hwdata->hats ) {
+ free(joystick->hwdata->hats);
+@@ -728,9 +1084,9 @@
+ {
+ int i;
+
+- for ( i=0; SDL_joylist[i]; ++i ) {
+- free(SDL_joylist[i]);
++ for ( i=0; SDL_joylist[i].fname; ++i ) {
++ free(SDL_joylist[i].fname);
+ }
+- SDL_joylist[0] = NULL;
++ SDL_joylist[0].fname = NULL;
+ }
+
diff --git a/media-libs/libsdl/files/digest-libsdl-1.2.7-r2 b/media-libs/libsdl/files/digest-libsdl-1.2.7-r2
new file mode 100644
index 000000000000..e52820076cbe
--- /dev/null
+++ b/media-libs/libsdl/files/digest-libsdl-1.2.7-r2
@@ -0,0 +1 @@
+MD5 d29b34b6ba3ed213893fc9d8d35e357a SDL-1.2.7.tar.gz 2470936
diff --git a/media-libs/libsdl/libsdl-1.2.7-r2.ebuild b/media-libs/libsdl/libsdl-1.2.7-r2.ebuild
new file mode 100644
index 000000000000..ef1b7572e665
--- /dev/null
+++ b/media-libs/libsdl/libsdl-1.2.7-r2.ebuild
@@ -0,0 +1,97 @@
+# Copyright 1999-2004 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/media-libs/libsdl/libsdl-1.2.7-r2.ebuild,v 1.1 2004/07/14 00:17:25 mr_bones_ Exp $
+
+inherit fixheadtails eutils
+
+DESCRIPTION="Simple Direct Media Layer"
+HOMEPAGE="http://www.libsdl.org/"
+SRC_URI="http://www.libsdl.org/release/SDL-${PV}.tar.gz"
+
+LICENSE="LGPL-2"
+SLOT="0"
+KEYWORDS="~x86 ~ppc ~sparc ~alpha ~hppa ~amd64 ~ia64"
+IUSE="oss alsa esd arts nas X dga xv xinerama fbcon directfb ggi svga aalib opengl libcaca noaudio novideo nojoystick"
+# if you disable audio/video/joystick and something breaks, you pick up the pieces
+
+RDEPEND=">=media-libs/audiofile-0.1.9
+ alsa? ( media-libs/alsa-lib )
+ esd? ( >=media-sound/esound-0.2.19 )
+ arts? ( kde-base/arts )
+ nas? ( media-libs/nas virtual/x11 )
+ X? ( virtual/x11 )
+ directfb? ( >=dev-libs/DirectFB-0.9.19 )
+ ggi? ( >=media-libs/libggi-2.0_beta3 )
+ svga? ( >=media-libs/svgalib-1.4.2 )
+ aalib? ( media-libs/aalib )
+ libcaca? ( media-libs/libcaca )
+ opengl? ( virtual/opengl )"
+DEPEND="${RDEPEND}
+ x86? ( dev-lang/nasm )"
+
+S=${WORKDIR}/SDL-${PV}
+
+src_unpack() {
+ unpack ${A}
+ cd ${S}
+
+ epatch ${FILESDIR}/${PV}-nobuggy-X.patch #30089
+ epatch ${FILESDIR}/${PV}-libcaca.patch #40224
+ epatch ${FILESDIR}/${PV}-gcc34.patch #48947
+ epatch ${FILESDIR}/${PV}-joystick2.patch #52833
+
+ ht_fix_file configure.in
+
+ if use nas && ! use X ; then #32447
+ sed -i \
+ -e 's:-laudio:-laudio -L/usr/X11R6/lib:' \
+ configure.in || die "nas sed hack failed"
+ fi
+
+ ./autogen.sh || die "autogen failed"
+}
+
+src_compile() {
+ local myconf=""
+ use noaudio && myconf="${myconf} --disable-audio"
+ use novideo \
+ && myconf="${myconf} --disable-video" \
+ || myconf="${myconf} --enable-video-dummy"
+ use nojoystick && myconf="${myconf} --disable-joystick"
+
+ econf \
+ --enable-events \
+ --enable-cdrom \
+ --enable-threads \
+ --enable-timers \
+ --enable-endian \
+ --enable-file \
+ `use_enable oss` \
+ `use_enable alsa` \
+ `use_enable esd` \
+ `use_enable arts` \
+ `use_enable nas` \
+ `use_enable x86 nasm` \
+ `use_enable X video-x11` \
+ `use_enable dga` \
+ `use_enable xv video-x11-xv` \
+ `use_enable xinerama video-x11-xinerama` \
+ `use_enable dga video-dga` \
+ `use_enable fbcon video-fbcon` \
+ `use_enable directfb video-directfb` \
+ `use_enable ggi video-ggi` \
+ `use_enable svga video-svga` \
+ `use_enable aalib video-aalib` \
+ `use_enable libcaca video-caca` \
+ `use_enable opengl video-opengl` \
+ ${myconf} || die
+ emake || die "emake failed"
+}
+
+src_install() {
+ make DESTDIR=${D} install || die "make install failed"
+ preplib
+ dosed "s:-pthread::g" /usr/lib/libSDL.la # Bug 34804
+ dodoc BUGS CREDITS README README-SDL.txt README.CVS TODO WhatsNew
+ dohtml -r ./
+}