From 835e565490c1502920280c77eed9bb65fa932164 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Tue, 25 Jul 2017 21:07:16 +0200 Subject: [PATCH] replaced obsolete joystick calibration with game controller configuration --- graphics/gfx_classic/joystick/axis_x.png | Bin 0 -> 2227 bytes graphics/gfx_classic/joystick/axis_y.png | Bin 0 -> 2269 bytes graphics/gfx_classic/joystick/button.png | Bin 0 -> 2397 bytes graphics/gfx_classic/joystick/controller.png | Bin 0 -> 60882 bytes src/files.c | 90 +++++ src/files.h | 2 + src/libgame/joystick.h | 2 + src/libgame/sdl.c | 4 +- src/libgame/sdl.h | 2 + src/screens.c | 398 ++++++++++++++++++- src/tools.c | 4 + 11 files changed, 489 insertions(+), 13 deletions(-) create mode 100644 graphics/gfx_classic/joystick/axis_x.png create mode 100644 graphics/gfx_classic/joystick/axis_y.png create mode 100644 graphics/gfx_classic/joystick/button.png create mode 100644 graphics/gfx_classic/joystick/controller.png diff --git a/graphics/gfx_classic/joystick/axis_x.png b/graphics/gfx_classic/joystick/axis_x.png new file mode 100644 index 0000000000000000000000000000000000000000..ff3fa943629922fc3bc2312f93a67193f85cdf11 GIT binary patch literal 2227 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 F{=e&*QJ??- literal 0 HcmV?d00001 diff --git a/graphics/gfx_classic/joystick/axis_y.png b/graphics/gfx_classic/joystick/axis_y.png new file mode 100644 index 0000000000000000000000000000000000000000..6942de5fbc25471a9d69834bf208f051d98e7c0c GIT binary patch literal 2269 zcmZWrX*87!8-3^Lyk|a!qKvl;B~Fq^nWu8fP$4CSB4jEuWJt;wM<_BT%1ovVH&VAj zMcf9Tq3fz!>c)**isaM3Z>?{w=Xv(p`{!QIUTY`p6j?B-1bHCH z1wlRp3LsDt0wo|&3Idly;4%o5fk0UZTnU3KA#eo*%EO=>3@XB)0t_m_pfU`ug27*4 zXf+I}!jK9Kslkvs0+F! zABFT#$N+^lqtF%Ak`Q0Pet4W-Z!3Js&sa0-o} z&{Gr|NukjUG@3%AC^VLV#xT%026~!-#xu|}4D=iWJLY#=@_$@NyP@orPDj@Cp`Q#lovucr6>RW#Kg}yq=BM zvGE2reuIrSvhgN1-onP4*?21(zsbhi*mye||CNJxaPV6kqKiXxa){d;qMJk9;ShH@ z#BUtp0hf5lB_4B$CtRYJOZ0Jxel9V!u zW1`uR_1eU9%73qFd+f&x%*j>0Xc(;$ml)ktr`ErFZE9XqYE_=7cOrAKWS$wXEK%F; zdZXavG1t-A$dHj%3B`2BiEIg_OD+|b${9zkX5Rf6b{D5KEu_RQ&U|ln9c>X5SOVfB z<@Ty^?Pbx&CPfxoZ|ckKC@pTZjo)oKmRAuyKf5Jm-`C;3UrM$OL{9EC^wY$F09 zPkeb^88TNEC7$@|QGbY?*wt74=I+Oe^)mx?`cVtIIhILrZewQ$Pmqv8Pfoa;Yd&M- z`^;E+#32hkkH}rZG*;N5`vigcf)z=*>A6$ zKc)Y>X3&C*P`&m1b;_FE{Nf;IT5jfZ<6v&ll$>_nWf?`@pmNcq_Ze!}yr5FGS0QL% zV{g=KP{zdWTh1o^3#(*8hkdl9KO>{_sU?;QHPJx>!xxw5&V8SP%ij8L5M6q7qD+QU zHsCgSI5>1F{PsbvnsMOv;q@|$r?1@-RWv5weLp?-Jvy{qqwTS2hUu#z7mXd~JVNB( z1-Q0GC2gFTQd*YO{eeNp0n7dg9~M<4Jm+@IHwX3H9rQ}>Nbjs!TUMQ~ppw!3QHEf} zgUe_%!mq5VK;ct$V!xu+`}@#oFOLNKcaFR37p{KN(D`k17thOY^Sg*zn~^IEeSuHbYf5|G)s>ezsAOVv zYsgKgSyI|j?B6C3?Qo9t?J;dBypdhi^X5=Sa&k%;YuZA}LMi$pGg%Z=oO)wd>{YAG z>Bj49>(P%&UNS?~{=xqqjG)rC@$24wi+N(u2rel4_>$Zh@?yR6W)+-=vL80l8l%2Y# zqK+&p^lwR6-oQLy|C!)~PVs-r#V^7eEoE(+ReQ^!A@+nn{_%|um~1qXG|h;X$Lt~xP2xVTjo zj9a0_mez{zA9tSnJuJOF(2HT5MvMotzSMa=Vzs>(XQLnqcC8d9uJFjK*mTQI)g{M$ zORSZ(Zla$KQ`7JKz2?w6opmKfybhh6kFqzq$IHcX!0a0zn9QO>v}A7gWbjp1{fH+R z+b@o*37YBIK#BfxROG}945!CicK1$FNrRr~k~zzw<;ng~5A{7y(>i`|5U!89Sm*e- zo`H$XoXsjj8dK_i_p)AP#5W+nQe@YlaqmFv_Z5j*D`QKf<8_t;Ma$y*Z3RZQpPKW{ zj+O__3gu#u`&rYGRb~FZlkb%poj*FfHO~(`AD3bBQk(PJD~D6BLvfKi-{tH8n9pIkd3)iF-|e0r#uV?E3bH=HG-b&?BI@;Kkp1hwpQS`dW&P@JlNz zRHE!k=)^4FQ*P@n-4w@KjJ*x9^ma&;&~TDAI^a;NK6O)Spv2!~R5URe?>!-u>L2gq z(0t3MfByT~d5wdLgN^WqcZhIr?oO4gT^i!@ocD8{zc{o|mI~4m+uV~1sK#<{(r!*r y`&Fcw4Bp;f-t)!ljN|y>9cs^i1T;QeJ$$RVTEfD_cxCy|o?>MtGOac~5c^*y_*x_Y literal 0 HcmV?d00001 diff --git a/graphics/gfx_classic/joystick/button.png b/graphics/gfx_classic/joystick/button.png new file mode 100644 index 0000000000000000000000000000000000000000..490e8bccfae09e789a52f4307ff03f1e20fa3a2b GIT binary patch literal 2397 zcmZXWc{J6D8^*u;cK7SXZHAkow9ufkj4Ze8TSDbZ>WWH>+#5HtWXaY-nk-oo=@MB& zwia1iL`9NJ%2p%QgfSXwO#Sye=XcKgKF|5Qe?QMTZ-SGf6@&VT0sw$vV{PvI-F1H~ z0e{yOgF(>%00U0;t`^@B0Dk}g0RRdB2moLpfB^sr0t5(9Aiw|tItVgAkO_ip5M+TM z7X&#Vr~rXH2vmf?1rVqNfj>duLJ0gB0+k_90D}SuRDnQM7+eH{OJHy@464DPIt(s@ z!KE;y0YfWbXgLh6grQXkq=i752=ogAtwtbi1kypEH3+1OKgY z40ga^CmeRh;mtU_1&6ocup17GaAZ4eh10=GaL=KY3Ard)EB7P(yArXHPk&AlU{{#9oQcVqcmWeHWa33k{3;W_#>9)6cnK3PW#Z*5yqt-b zG4To(ew~F^vG7V3euITqv+!CLUcSgvWYe}@qj}-GtX<`6wxqK`|w;F5h@a)3*|;*xK;cB^B=p(!G@Dvj2N0zS)=yU9A&(Qs#EL_$c4|wm2l^?NW0!YoS^C!M#e=Px&yU zzS=e>R?hc4XU#F!>%5U&d1eQ{zb~e8O^wdmTKa|E?gM6;>mK>ZMY4wUe>IG)hEfZ^ zxxLQGnHirl&Y21}d7Ni4f4MF!EYx6Ew_fkz67GEF)Xp%eSY4Orb?D`{{-XAFSMGp9 z#4lxSQHwmY`eS7IWm*l_9-&i|E^8-^U*8nTk1_Kc?qiFozV8|g;~1} z59rgbPUv9Wg<`i?;Z;7b-#%*L8ci3mhfGI)PjS)Eh^jf>Co(*CXD%MQSLLo1I~ZRd zcv$2-TN>-kSu~4Jwf24C&vl%6zi}AMhg->$&&F*|-gR;ft4+-DsJ1}UKLp4nO_oS{28Tv{thr>wEno(fWja zrLX`umVR4u_{FP8mu1D>t$&pZlHxu}jP_;rnR!{yJr5N1b=B$4%1oz@9GV(aBgExh zrGlhhrO$I=o~e?jdUhHy&2dv*F8NW0x*3+o0-X73Yu#^OkX;w-RK4$T_np{7R&2BB z()(G4?^u^8WwuT6tDfh&XD7LqnWrYcMBNTstQ{s?G%k~g3~0>aime?wm;CyL9c3|E zC$R4A*`EYu4f>(C8XAtPDpSWol=a?3C>lDivK~p;dp4s;rTXUsJ%|37llxgE_2Ti3 z_wQThoBpo!xz@K>Xf>D-dut?6+8EHa()K`Hs14rV=qXcTj~SU5D4%J~)4(=_Gj-lC zx9@hnc-?YYh9z~%GwDuRbpx!Sb$9hn?X~QLHY=-5iS(H0d;Ef)LJghi++JkWNRzL5 zZlQmVTrVO&{p0G?jj_8g7d&pcob3N(2FR`YJos@krEbVqeVhAB&+LIqZPv7!7d+`6 zYC^lJFJI$^|Mam++K6t+abhx}KKd!xJ-+t&VNO*9ZS~iU^b>f@w*DEm~1=h7 z3;*2fy)vb{BpDX246h#9vCeU!*<|DV%s;}Guc}_m)n2^Zn9UWzzNNay<>)_OJvMJ` zOJu6Dm#91 zKbIA+=;M6kd`jiuyQ#&Jt!-`k>j=v+d&L839gf|yn1|B;C9P0*PubEI zC815|D9G=LD%D7tiH4yj^4_1s5l)=oEtB504-}rilr${5;MO6Z}_J!Avj{74*C*^A= zL{N17`2~4-lea#^CE%x>((9ztd)7<+TI~8?G}06<8b`f*-fsKQH7Up&WvjDK>Mzp_ z7FMW8wB_<`=hBuQJgelY*sc_G_Fn-F~9`G*D zG+(l1WYvO6kC>wJ{MtNue9l+?8&I8X>qGenB@!E7U(t2C?QuwZ+5w8RhOqTTwAsIQ bW;X!3FRt9IJa6al<4>}&a5OL7uq*06?(C=j literal 0 HcmV?d00001 diff --git a/graphics/gfx_classic/joystick/controller.png b/graphics/gfx_classic/joystick/controller.png new file mode 100644 index 0000000000000000000000000000000000000000..d1d7d4b2d791ed7fa38b162892847d542fb1f199 GIT binary patch literal 60882 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 s_UvHSx= MAX_PLAYERS) return FALSE; @@ -2644,7 +2644,7 @@ static boolean SDLOpenJoystick(int nr) return (sdl_joystick[nr] != NULL); } -static void SDLCloseJoystick(int nr) +void SDLCloseJoystick(int nr) { if (nr < 0 || nr >= MAX_PLAYERS) return; diff --git a/src/libgame/sdl.h b/src/libgame/sdl.h index 5391b683..14872400 100644 --- a/src/libgame/sdl.h +++ b/src/libgame/sdl.h @@ -492,6 +492,8 @@ void SDLInitJoysticks(void); boolean SDLReadJoystick(int, int *, int *, boolean *, boolean *); boolean SDLCheckJoystickOpened(int); void SDLClearJoystickState(); +boolean SDLOpenJoystick(int); +void SDLCloseJoystick(int); void PrepareFadeBitmap(int); diff --git a/src/screens.c b/src/screens.c index b3d9111d..265c9e2f 100644 --- a/src/screens.c +++ b/src/screens.c @@ -163,7 +163,7 @@ static void HandleScreenGadgets(struct GadgetInfo *); static void HandleSetupScreen_Generic(int, int, int, int, int); static void HandleSetupScreen_Input(int, int, int, int, int); static void CustomizeKeyboard(int); -static void CalibrateJoystick(int); +static void ConfigureJoystick(int); static void execSetupGame(void); static void execSetupGraphics(void); static void execSetupSound(void); @@ -6007,8 +6007,8 @@ static void drawPlayerSetupInputInfo(int player_nr, boolean active) { &custom_key.right, "Joystick Right" }, { &custom_key.up, "Joystick Up" }, { &custom_key.down, "Joystick Down" }, - { &custom_key.snap, "Button 1" }, - { &custom_key.drop, "Button 2" } + { &custom_key.snap, "Button 1/A/X" }, + { &custom_key.drop, "Button 2/B/Y" } }; static char *joystick_name[MAX_PLAYERS] = { @@ -6038,7 +6038,7 @@ static void drawPlayerSetupInputInfo(int player_nr, boolean active) int font_nr = (joystick_active ? FONT_VALUE_1 : FONT_VALUE_OLD); DrawText(mSX + 8 * 32, mSY + 3 * 32, text, font_nr); - DrawText(mSX + 32, mSY + 4 * 32, "Calibrate", text_font_nr); + DrawText(mSX + 32, mSY + 4 * 32, "Configure", text_font_nr); } else { @@ -6189,7 +6189,7 @@ void HandleSetupScreen_Input(int mx, int my, int dx, int dy, int button) else if (y == 2) { if (setup.input[input_player_nr].use_joystick) - CalibrateJoystick(input_player_nr); + ConfigureJoystick(input_player_nr); else CustomizeKeyboard(input_player_nr); } @@ -6336,7 +6336,8 @@ void CustomizeKeyboard(int player_nr) DrawSetupScreen_Input(); } -static boolean CalibrateJoystickMain(int player_nr) +#if 0 +static boolean OLD_CalibrateJoystickMain(int player_nr) { int new_joystick_xleft = JOYSTICK_XMIDDLE; int new_joystick_xright = JOYSTICK_XMIDDLE; @@ -6507,23 +6508,398 @@ static boolean CalibrateJoystickMain(int player_nr) return TRUE; } +#endif + +/* game controller mapping generator by Gabriel Jacobo */ + +#define MARKER_BUTTON 1 +#define MARKER_AXIS_X 2 +#define MARKER_AXIS_Y 3 + +static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) +{ +#if defined(TARGET_SDL2) + static Bitmap *controller, *button, *axis_x, *axis_y; + Bitmap *marker; + boolean bitmaps_initialized = FALSE; + boolean screen_initialized = FALSE; + const char *name = NULL; + boolean success = TRUE; + boolean done = FALSE, next = FALSE; + Event event; + int alpha = 200, alpha_step = -1; + int alpha_ticks = 0; + char mapping[4096], temp[4096]; + int i, j; + + struct + { + int x, y; + int marker; + char *field; + int axis, button, hat, hat_value; + char mapping[4096]; + } + *step, *prev_step, steps[] = + { + { 370, 175, MARKER_BUTTON, "a", }, + { 410, 142, MARKER_BUTTON, "b", }, + { 334, 145, MARKER_BUTTON, "x", }, + { 372, 115, MARKER_BUTTON, "y", }, + { 176, 145, MARKER_BUTTON, "back", }, + { 230, 145, MARKER_BUTTON, "guide", }, + { 285, 145, MARKER_BUTTON, "start", }, + { 124, 220, MARKER_BUTTON, "dpleft", }, + { 160, 248, MARKER_BUTTON, "dpdown", }, + { 192, 220, MARKER_BUTTON, "dpright", }, + { 160, 192, MARKER_BUTTON, "dpup", }, + { 64, 60, MARKER_BUTTON, "leftshoulder", }, + { 102, 10, MARKER_AXIS_Y, "lefttrigger", }, + { 396, 60, MARKER_BUTTON, "rightshoulder", }, + { 360, 10, MARKER_AXIS_Y, "righttrigger", }, + { 87, 161, MARKER_BUTTON, "leftstick", }, + { 296, 230, MARKER_BUTTON, "rightstick", }, + { 87, 161, MARKER_AXIS_X, "leftx", }, + { 87, 161, MARKER_AXIS_Y, "lefty", }, + { 296, 230, MARKER_AXIS_X, "rightx", }, + { 296, 230, MARKER_AXIS_Y, "righty", }, + }; + + unsigned int event_frame_delay = 0; + unsigned int event_frame_delay_value = GAME_FRAME_DELAY; + + ResetDelayCounter(&event_frame_delay); + + if (!bitmaps_initialized) + { + controller = LoadCustomImage("joystick/controller.png"); + button = LoadCustomImage("joystick/button.png"); + axis_x = LoadCustomImage("joystick/axis_x.png"); + axis_y = LoadCustomImage("joystick/axis_y.png"); + + bitmaps_initialized = TRUE; + } + + /* print info about the joystick we are watching */ + name = SDL_JoystickName(joystick); + Error(ERR_DEBUG, "Watching joystick %d: (%s)\n", + SDL_JoystickInstanceID(joystick), + (name ? name : "(unknown joystick)")); + Error(ERR_DEBUG, "Joystick has %d axes, %d hats, %d balls, and %d buttons\n", + SDL_JoystickNumAxes(joystick), SDL_JoystickNumHats(joystick), + SDL_JoystickNumBalls(joystick), SDL_JoystickNumButtons(joystick)); + + /* initialize mapping with GUID and name */ + SDL_JoystickGetGUIDString(SDL_JoystickGetGUID(joystick), temp, sizeof(temp)); + + snprintf(mapping, sizeof(mapping), "%s,%s,platform:%s,", + temp, name ? name : "Unknown Joystick", SDL_GetPlatform()); + + /* loop through all steps (buttons and axes), getting joystick events */ + for (i = 0; i < SDL_arraysize(steps) && !done;) + { + step = &steps[i]; + strcpy(step->mapping, mapping); + step->axis = -1; + step->button = -1; + step->hat = -1; + step->hat_value = -1; + + marker = (step->marker == MARKER_BUTTON ? button : + step->marker == MARKER_AXIS_X ? axis_x : + step->marker == MARKER_AXIS_Y ? axis_y : marker); + + next = FALSE; + + while (!done && !next) + { + alpha += alpha_step * (int)(SDL_GetTicks() - alpha_ticks) / 5; + alpha_ticks = SDL_GetTicks(); + + if (alpha >= 255) + { + alpha = 255; + alpha_step = -1; + } + else if (alpha < 128) + { + alpha = 127; + alpha_step = 1; + } + + ClearField(); + + DrawTextSCentered(mSY - SY + 22 * 16, FONT_REQUEST, + "Press buttons and move axes on"); + DrawTextSCentered(mSY - SY + 23 * 16, FONT_REQUEST, + "your controller when indicated."); + DrawTextSCentered(mSY - SY + 24 * 16, FONT_REQUEST, + "(Your controller may look different.)"); + +#if defined(PLATFORM_ANDROID) + DrawTextSCentered(mSY - SY + 26 * 16, FONT_REQUEST, + "To correct a mistake,"); + DrawTextSCentered(mSY - SY + 27 * 16, FONT_REQUEST, + "press the 'back' button."); + DrawTextSCentered(mSY - SY + 28 * 16, FONT_REQUEST, + "To skip a button or axis,"); + DrawTextSCentered(mSY - SY + 29 * 16, FONT_REQUEST, + "press the 'menu' button."); +#else + DrawTextSCentered(mSY - SY + 26 * 16, FONT_REQUEST, + "To correct a mistake,"); + DrawTextSCentered(mSY - SY + 27 * 16, FONT_REQUEST, + "press the 'backspace' key."); + DrawTextSCentered(mSY - SY + 28 * 16, FONT_REQUEST, + "To skip a button or axis,"); + DrawTextSCentered(mSY - SY + 29 * 16, FONT_REQUEST, + "press the 'return' key."); + DrawTextSCentered(mSY - SY + 30 * 16, FONT_REQUEST, + "To exit, press the 'escape' key."); +#endif + + int controller_x = gfx.sx + (gfx.sxsize - controller->width) / 2; + int controller_y = gfx.sy; + + int marker_x = controller_x + step->x; + int marker_y = controller_y + step->y; + + BlitBitmapMasked(controller, drawto, 0, 0, + controller->width, controller->height, + controller_x, controller_y); + + SDL_SetSurfaceAlphaMod(marker->surface_masked, alpha); + + BlitBitmapMasked(marker, drawto, 0, 0, + marker->width, marker->height, + marker_x, marker_y); + + if (!screen_initialized) + FadeIn(REDRAW_FIELD); + else + BackToFront(); + + screen_initialized = TRUE; + + while (NextValidEvent(&event)) + { + switch (event.type) + { + case SDL_JOYAXISMOTION: + if (event.jaxis.value > 20000 || + event.jaxis.value < -20000) + { + for (j = 0; j < i; j++) + if (steps[j].axis == event.jaxis.axis) + break; + + if (j == i) + { + if (step->marker != MARKER_AXIS_X && + step->marker != MARKER_AXIS_Y) + break; + + step->axis = event.jaxis.axis; + strcat(mapping, step->field); + snprintf(temp, sizeof(temp), ":a%u,", event.jaxis.axis); + strcat(mapping, temp); + i++; + next = TRUE; + } + } + + break; + + case SDL_JOYHATMOTION: + /* ignore centering; we're probably just coming back + to the center from the previous item we set */ + if (event.jhat.value == SDL_HAT_CENTERED) + break; + + for (j = 0; j < i; j++) + if (steps[j].hat == event.jhat.hat && + steps[j].hat_value == event.jhat.value) + break; + + if (j == i) + { + step->hat = event.jhat.hat; + step->hat_value = event.jhat.value; + strcat(mapping, step->field); + snprintf(temp, sizeof(temp), ":h%u.%u,", + event.jhat.hat, event.jhat.value ); + strcat(mapping, temp); + i++; + next = TRUE; + } + + break; + + case SDL_JOYBALLMOTION: + break; + + case SDL_JOYBUTTONUP: + for (j = 0; j < i; j++) + if (steps[j].button == event.jbutton.button) + break; + + if (j == i) + { + step->button = event.jbutton.button; + strcat(mapping, step->field); + snprintf(temp, sizeof(temp), ":b%u,", event.jbutton.button); + strcat(mapping, temp); + i++; + next = TRUE; + } + + break; + + case SDL_FINGERDOWN: + case SDL_MOUSEBUTTONDOWN: + /* skip this step */ + i++; + next = TRUE; + + break; + + case SDL_KEYDOWN: + if (event.key.keysym.sym == KSYM_BackSpace || + event.key.keysym.sym == KSYM_Back) + { + /* undo this step */ + if (i > 0) + { + prev_step = &steps[--i]; + strcpy(mapping, prev_step->mapping); + next = TRUE; + } + + break; + } + + if (event.key.keysym.sym == KSYM_space || + event.key.keysym.sym == KSYM_Return || + event.key.keysym.sym == KSYM_Menu) + { + /* skip this step */ + i++; + next = TRUE; + + break; + } + + if (event.key.keysym.sym == KSYM_Escape) + { + success = FALSE; + done = TRUE; + } + + break; + + case SDL_QUIT: + program.exit_function(0); + break; + + default: + break; + } + + // do not handle events for longer than standard frame delay period + if (DelayReached(&event_frame_delay, event_frame_delay_value)) + break; + } + } + } + + if (success) + { + Error(ERR_DEBUG, "New game controller mapping:\n\n%s\n\n", mapping); + + // activate mapping for this game + SDL_GameControllerAddMapping(mapping); + + // save mapping to personal mappings + SaveSetup_AddGameControllerMapping(mapping); + } + + /* wait until the last pending event was removed from event queue */ + while (NextValidEvent(&event)); + + return success; +#else + return TRUE; +#endif +} -void CalibrateJoystick(int player_nr) +static int ConfigureJoystickMain(int player_nr) { - if (!CalibrateJoystickMain(player_nr)) + char *device_name = setup.input[player_nr].joy.device_name; + int joystick_nr = getJoystickNrFromDeviceName(device_name); + boolean joystick_active = CheckJoystickOpened(joystick_nr); + int success = FALSE; + int i; + + if (joystick.status == JOYSTICK_NOT_AVAILABLE) + return JOYSTICK_NOT_AVAILABLE; + + if (!joystick_active || !setup.input[player_nr].use_joystick) + return JOYSTICK_NOT_AVAILABLE; + + FadeSetEnterMenu(); + FadeOut(REDRAW_FIELD); + + // close all joystick devices (potentially opened as game controllers) + for (i = 0; i < SDL_NumJoysticks(); i++) + SDLCloseJoystick(i); + + // open joystick device as plain joystick to configure as game controller + SDL_Joystick *joystick = SDL_JoystickOpen(joystick_nr); + + // as the joystick was successfully opened before, this should not happen + if (joystick == NULL) + return FALSE; + + // create new game controller mapping (buttons and axes) for joystick device + success = ConfigureJoystickMapButtonsAndAxes(joystick); + + // close joystick (and maybe re-open as configured game controller later) + SDL_JoystickClose(joystick); + + // re-open all joystick devices (potentially as game controllers) + for (i = 0; i < SDL_NumJoysticks(); i++) + SDLOpenJoystick(i); + + // clear all joystick input actions for all joystick devices + SDLClearJoystickState(); + + return (success ? JOYSTICK_CONFIGURED : JOYSTICK_NOT_CONFIGURED); +} + +void ConfigureJoystick(int player_nr) +{ + boolean state = ConfigureJoystickMain(player_nr); + + if (state != JOYSTICK_NOT_CONFIGURED) { + boolean success = (state == JOYSTICK_CONFIGURED); + char *message = (success ? " IS CONFIGURED! " : " NOT AVAILABLE! "); char *device_name = setup.input[player_nr].joy.device_name; int nr = getJoystickNrFromDeviceName(device_name) + 1; int xpos = mSX - SX; int ypos = mSY - SY; + unsigned int wait_frame_delay = 0; + unsigned int wait_frame_delay_value = 2000; + + ResetDelayCounter(&wait_frame_delay); ClearField(); DrawTextF(xpos + 16, ypos + 6 * 32, FONT_TITLE_1, " JOYSTICK %d ", nr); - DrawTextF(xpos + 16, ypos + 7 * 32, FONT_TITLE_1, " NOT AVAILABLE! "); - BackToFront(); + DrawTextF(xpos + 16, ypos + 7 * 32, FONT_TITLE_1, message); - Delay(2000); /* show error message for a short time */ + while (!DelayReached(&wait_frame_delay, wait_frame_delay_value)) + BackToFront(); ClearEventQueue(); } diff --git a/src/tools.c b/src/tools.c index 1ea116ba..31ae317a 100644 --- a/src/tools.c +++ b/src/tools.c @@ -3759,6 +3759,10 @@ void WaitForEventToContinue() { case EVENT_BUTTONPRESS: case EVENT_KEYPRESS: +#if defined(TARGET_SDL2) + case SDL_CONTROLLERBUTTONDOWN: +#endif + case SDL_JOYBUTTONDOWN: still_wait = FALSE; break; -- 2.34.1