http://shinh.skr.jp/sdlpad/SDL_pad_pl.tar.gz
ジョイスティックはドライバによって変態的なアサインになっていたり、 SDL を使う環境によっては、ヘンなキーコードが来っっってアレだね、という話に関して、 SDL の外部からこのキーアサインを変更できないかなぁという試みです。まぁ joy2key とか使えば 100% 用は足りる気もします。
仕組みとしては要するに SDL_Joystick* を乗っ取って、 SDL_pad の PAD1 を SDL_Joystick の形式にして戻してやる、という感じです。 SDL_Event 系には全く対応してません。
とりあえず今回は POSIX 対応ということで、 LD_PRELOAD で SDL_pad_pl を忍び込ませて挿し替える、という形にしています。 SDL_pad が勝手に呼ぶ SDL の API はなんとかせんと永久ループになる (program => SDL_pad_pl => SDL_pad => SDL_pad_pl => ...)けどどうしたもんかな、と思った結果、以下のような解決で解決しました。
#define SDL_PumpEvents SDL_PumpEvents_ #define SDL_NumJoystick SDL_NumJoysticks_ #define SDL_JoystickOpen SDL_JoystickOpen_ #define SDL_JoystickIndex SDL_JoystickIndex_ #define SDL_JoystickGetAxis SDL_JoystickGetAxis_ #define SDL_JoystickGetButton SDL_JoystickGetButton_ #include "SDL_pad.c"
これが正しい C の仮想関数です。 _ で終わる関数は dlsym で取得した SDL 本来の関数へのポインタです。
もともとのアイデアは id:sa-y さんが [es] 上、つまるところ WindowsCE 上でわけわからんキーコード来るけどプログラム本体いじるのは面倒だから、キーボードを使った Joystick ドライバが SDL にあればいいんじゃないだろうか…のような話をされていたことからです。
Windows 対応をするとすると、 Windows は LD_PRELOAD みたいな機構はなさそう だけど、 SDL.dll 自体はたいていアプリに同梱されているという文化的な事情から、 SDL.dll を挿し替える方向でしょうか。 PE フォーマットについて調べて特定関数だけ入れ替え、とかはとても楽しそうです(完全挿し替えだとオーディオドライバあたりが元のと変わってしまったりとかしそうなので)。