diff options
Diffstat (limited to 'media-libs/libsdl/files')
-rw-r--r-- | media-libs/libsdl/files/1.2.7-joystick2.patch | 567 | ||||
-rw-r--r-- | media-libs/libsdl/files/digest-libsdl-1.2.7-r2 | 1 |
2 files changed, 568 insertions, 0 deletions
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 |