foxygit / doom Log in
commit 0910b7efe828717d47515118ba71529ba540181f
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Tue Apr 15 21:19:35 2008 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Tue Apr 15 21:19:35 2008 +0000

    Fix bug with joystick configuration.

    Subversion-branch: /trunk/chocolate-doom
    Subversion-revision: 1111
---
 setup/joystick.c | 57 ++++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 41 insertions(+), 16 deletions(-)

diff --git a/setup/joystick.c b/setup/joystick.c
index 66709242..fa59c559 100644
--- a/setup/joystick.c
+++ b/setup/joystick.c
@@ -34,6 +34,10 @@ typedef enum
     CALIBRATE_UP,
 } calibration_stage_t;

+// SDL joystick successfully initialised?
+
+static int joystick_initted = 0;
+
 // Joystick enable/disable

 int usejoystick = 0;
@@ -79,6 +83,23 @@ static txt_label_t *calibration_label;
 static calibration_stage_t calibrate_stage;
 static SDL_Joystick **all_joysticks = NULL;

+// Set the label showing the name of the currently selected joystick
+
+static void SetJoystickButtonLabel(void)
+{
+    char *name;
+
+    name = "None set";
+
+    if (joystick_initted
+     && joystick_index >= 0 && joystick_index < SDL_NumJoysticks())
+    {
+        name = (char *) SDL_JoystickName(joystick_index);
+    }
+
+    TXT_SetButtonLabel(joystick_button, name);
+}
+
 // Try to open all joysticks visible to SDL.

 static int OpenAllJoysticks(void)
@@ -87,7 +108,7 @@ static int OpenAllJoysticks(void)
     int num_joysticks;
     int result;

-    if (SDL_Init(SDL_INIT_JOYSTICK) < 0)
+    if (!joystick_initted)
     {
         return 0;
     }
@@ -112,14 +133,16 @@ static int OpenAllJoysticks(void)
         }
     }

-    if (!result)
+    // Success? Turn on joystick events.
+
+    if (result)
     {
-        free(all_joysticks);
-        all_joysticks = NULL;
+        SDL_JoystickEventState(SDL_ENABLE);
     }
     else
     {
-        SDL_JoystickEventState(SDL_ENABLE);
+        free(all_joysticks);
+        all_joysticks = NULL;
     }

     return result;
@@ -143,7 +166,6 @@ static void CloseAllJoysticks(void)
     }

     SDL_JoystickEventState(SDL_DISABLE);
-    SDL_QuitSubSystem(SDL_INIT_JOYSTICK);

     free(all_joysticks);
     all_joysticks = NULL;
@@ -265,12 +287,16 @@ static void NoJoystick(void)
     TXT_SetWindowAction(window, TXT_HORIZ_CENTER,
                         TXT_NewWindowEscapeAction(window));
     TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, NULL);
+
+    joystick_index = -1;
+    SetJoystickButtonLabel();
 }

 static void CalibrateWindowClosed(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(unused))
 {
     CloseAllJoysticks();
     TXT_SDL_SetEventCallback(NULL, NULL);
+    SetJoystickButtonLabel();
 }

 static void CalibrateJoystick(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(unused))
@@ -338,18 +364,13 @@ void JoyButtonSetCallback(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(variable))
 // GUI
 //

-static void SetJoystickButtonLabel(void)
+static void JoystickWindowClosed(TXT_UNCAST_ARG(window), TXT_UNCAST_ARG(unused))
 {
-    char *name;
-
-    name = "None set";
-
-    if (joystick_index >= 0 && joystick_index < SDL_NumJoysticks())
+    if (joystick_initted)
     {
-        name = (char *) SDL_JoystickName(joystick_index);
+        SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
+        joystick_initted = 0;
     }
-
-    TXT_SetButtonLabel(joystick_button, name);
 }

 static void AddJoystickControl(txt_table_t *table, char *label, int *var)
@@ -370,7 +391,10 @@ void ConfigJoystick(void)
     txt_table_t *button_table;
     txt_table_t *joystick_table;

-    SDL_Init(SDL_INIT_JOYSTICK);
+    if (!joystick_initted)
+    {
+        joystick_initted = SDL_Init(SDL_INIT_JOYSTICK) >= 0;
+    }

     window = TXT_NewWindow("Joystick configuration");

@@ -408,6 +432,7 @@ void ConfigJoystick(void)
     AddJoystickControl(button_table, "Strafe Right", &joybstraferight);

     TXT_SignalConnect(joystick_button, "pressed", CalibrateJoystick, NULL);
+    TXT_SignalConnect(window, "closed", JoystickWindowClosed, NULL);

     SetJoystickButtonLabel();
 }