libretro: Check 'environ_cb' in controller setters
[pcsx_rearmed.git] / frontend / libretro.c
index 274d6d5..936776e 100644 (file)
@@ -335,14 +335,14 @@ void retro_set_environment(retro_environment_t cb)
    static const struct retro_variable vars[] = {
       { "pcsx_rearmed_frameskip", "Frameskip; 0|1|2|3" },
       { "pcsx_rearmed_region", "Region; Auto|NTSC|PAL" },
-      { "pcsx_rearmed_pad1type", "Pad 1 Type; none|standard|analog|negcon" },
-      { "pcsx_rearmed_pad2type", "Pad 2 Type; none|standard|analog|negcon" },
-      { "pcsx_rearmed_pad3type", "Pad 3 Type; none|standard|analog|negcon" },
-      { "pcsx_rearmed_pad4type", "Pad 4 Type; none|standard|analog|negcon" },
-      { "pcsx_rearmed_pad5type", "Pad 5 Type; none|standard|analog|negcon" },
-      { "pcsx_rearmed_pad6type", "Pad 6 Type; none|standard|analog|negcon" },
-      { "pcsx_rearmed_pad7type", "Pad 7 Type; none|standard|analog|negcon" },
-      { "pcsx_rearmed_pad8type", "Pad 8 Type; none|standard|analog|negcon" },
+      { "pcsx_rearmed_pad1type", "Pad 1 Type; default|none|standard|analog|negcon" },
+      { "pcsx_rearmed_pad2type", "Pad 2 Type; default|none|standard|analog|negcon" },
+      { "pcsx_rearmed_pad3type", "Pad 3 Type; default|none|standard|analog|negcon" },
+      { "pcsx_rearmed_pad4type", "Pad 4 Type; default|none|standard|analog|negcon" },
+      { "pcsx_rearmed_pad5type", "Pad 5 Type; default|none|standard|analog|negcon" },
+      { "pcsx_rearmed_pad6type", "Pad 6 Type; default|none|standard|analog|negcon" },
+      { "pcsx_rearmed_pad7type", "Pad 7 Type; default|none|standard|analog|negcon" },
+      { "pcsx_rearmed_pad8type", "Pad 8 Type; default|none|standard|analog|negcon" },
       { "pcsx_rearmed_multitap1", "Multitap 1; auto|disabled|enabled" },
       { "pcsx_rearmed_multitap2", "Multitap 2; auto|disabled|enabled" },
 #ifndef DRC_DISABLE
@@ -377,23 +377,43 @@ unsigned retro_api_version(void)
        return RETRO_API_VERSION;
 }
 
-static void update_controller_port_device(unsigned port)
+static void update_controller_port_device(unsigned port, unsigned device)
 {
        if (port >= PORTS_NUMBER)
                return;
 
-       static const char **CONTROLLER_VARIABLE = {
-               "pcsx_rearmed_pad1type", "pcsx_rearmed_pad2type",
-               "pcsx_rearmed_pad3type", "pcsx_rearmed_pad4type",
-               "pcsx_rearmed_pad5type", "pcsx_rearmed_pad6type",
-               "pcsx_rearmed_pad7type", "pcsx_rearmed_pad8type",
-       };
-
        struct retro_variable var;
+       int default_case = 0;
 
        var.value = NULL;
-       var.key = "pcsx_rearmed_pad1type";
-       if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+       switch (port) {
+       case 0:
+               var.key = "pcsx_rearmed_pad1type";
+               break;
+       case 1:
+               var.key = "pcsx_rearmed_pad2type";
+               break;
+       case 2:
+               var.key = "pcsx_rearmed_pad3type";
+               break;
+       case 3:
+               var.key = "pcsx_rearmed_pad4type";
+               break;
+       case 4:
+               var.key = "pcsx_rearmed_pad5type";
+               break;
+       case 5:
+               var.key = "pcsx_rearmed_pad6type";
+               break;
+       case 6:
+               var.key = "pcsx_rearmed_pad7type";
+               break;
+       case 7:
+               var.key = "pcsx_rearmed_pad8type";
+               break;
+       }
+
+       if (environ_cb && (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value))
        {
                if (strcmp(var.value, "standard") == 0)
                        in_type[0] = PSE_PAD_TYPE_STANDARD;
@@ -401,53 +421,96 @@ static void update_controller_port_device(unsigned port)
                        in_type[0] = PSE_PAD_TYPE_ANALOGPAD;
                else if (strcmp(var.value, "negcon") == 0)
                        in_type[0] = PSE_PAD_TYPE_NEGCON;
-               else // 'none' case
+               else if (strcmp(var.value, "none") == 0)
                        in_type[0] = PSE_PAD_TYPE_NONE;
+               else // 'default' case
+                       default_case = 1;
        }
+       else
+               default_case = 1;
+
+       if (default_case)
+               switch (device)
+               {
+               case RETRO_DEVICE_JOYPAD:
+                       in_type[port] = PSE_PAD_TYPE_STANDARD;
+                       break;
+               case RETRO_DEVICE_ANALOG:
+                       in_type[port] = PSE_PAD_TYPE_ANALOGPAD;
+                       break;
+               case RETRO_DEVICE_MOUSE:
+                       in_type[port] = PSE_PAD_TYPE_MOUSE;
+                       break;
+               case RETRO_DEVICE_LIGHTGUN:
+                       in_type[port] = PSE_PAD_TYPE_GUN;
+                       break;
+               case RETRO_DEVICE_NONE:
+               default:
+                       in_type[port] = PSE_PAD_TYPE_NONE;
+               }
 }
 
 static void update_multitap()
 {
        struct retro_variable var;
+       int auto_case;
 
        var.value = NULL;
        var.key = "pcsx_rearmed_multitap1";
-       if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+       auto_case = 0;
+       if (environ_cb && (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value))
        {
                if (strcmp(var.value, "enabled") == 0)
                        multitap1 = 1;
                else if (strcmp(var.value, "disabled") == 0)
                        multitap1 = 0;
                else // 'auto' case
-               {
-                       // If a gamepad is plugged after port 2, we need a first multitap.
-                       multitap1 = 0;
-                       for (int port = 2; port < PORTS_NUMBER; port++)
-                               multitap1 |= in_type[port] != PSE_PAD_TYPE_NONE;
-               }
+                       auto_case = 1;
+       }
+       else
+               auto_case == 1;
+
+       if (auto_case)
+       {
+               // If a gamepad is plugged after port 2, we need a first multitap.
+               multitap1 = 0;
+               for (int port = 2; port < PORTS_NUMBER; port++)
+                       multitap1 |= in_type[port] != PSE_PAD_TYPE_NONE;
        }
 
        var.value = NULL;
        var.key = "pcsx_rearmed_multitap2";
-       if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+       auto_case = 0;
+       if (environ_cb && (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value))
        {
                if (strcmp(var.value, "enabled") == 0)
                        multitap2 = 1;
                else if (strcmp(var.value, "disabled") == 0)
                        multitap2 = 0;
                else // 'auto' case
-               {
-                       // If a gamepad is plugged after port 4, we need a second multitap.
-                       multitap2 = 0;
-                       for (int port = 4; port < PORTS_NUMBER; port++)
-                               multitap2 |= in_type[port] != PSE_PAD_TYPE_NONE;
-               }
+                       auto_case = 1;
+       }
+       else
+               auto_case == 1;
+
+       if (auto_case)
+       {
+               // If a gamepad is plugged after port 4, we need a second multitap.
+               multitap2 = 0;
+               for (int port = 4; port < PORTS_NUMBER; port++)
+                       multitap2 |= in_type[port] != PSE_PAD_TYPE_NONE;
        }
 }
 
 void retro_set_controller_port_device(unsigned port, unsigned device)
 {
        SysPrintf("port %u  device %u",port,device);
+
+       if (port >= PORTS_NUMBER)
+               return;
+
+       update_controller_port_device(port, device);
+       update_multitap();
 }
 
 void retro_get_system_info(struct retro_system_info *info)
@@ -1141,7 +1204,7 @@ static void update_variables(bool in_flight)
    }
 
    for (int i = 0; i < PORTS_NUMBER; i++)
-      update_controller_port_device(i);
+      update_controller_port_device(i, RETRO_DEVICE_NONE);
 
    update_multitap();