private void btnSaveInput_Click(object sender, EventArgs e)
        {
            string launcherText = File.ReadAllText(Launcher.rootDir + "launcher.cfg");

            string[] launcherCfgLines = File.ReadAllLines(Launcher.rootDir + "launcher.cfg");
            string   cfgText          = File.ReadAllText(Launcher.rootDir + "nulldc-1-0-4-en-win\\nullDC.cfg");

            string[] cfgLines = File.ReadAllLines(Launcher.rootDir + "nulldc-1-0-4-en-win\\nullDC.cfg");

            if (chkCustomCFG.Checked)
            {
                if (!launcherText.Contains("custom_cfg"))
                {
                    launcherText += "custom_cfg=1" + Environment.NewLine;
                }
                else
                {
                    launcherText = launcherText.Replace("custom_cfg=0", "custom_cfg=1");
                }
            }
            else
            {
                if (!launcherText.Contains("custom_cfg"))
                {
                    launcherText += "custom_cfg=0" + Environment.NewLine;
                }
                else
                {
                    launcherText = launcherText.Replace("custom_cfg=1", "custom_cfg=0");
                }
            }


            if (chkEnableMapper.Checked)
            {
                launcherText = launcherText.Replace("enable_mapper=0", "enable_mapper=1");
                launcherText = launcherText.Replace("player1=joy1", "player1=keyboard");

                var player1_old = cfgLines.Where(s => s.Contains("player1=")).ToList().First();
                cfgText = cfgText.Replace(player1_old, "player1=keyboard");

                foreach (GamePadMapping mapping in Launcher.mappings.GamePadMappings)
                {
                    mapping.Default = false;
                }

                ((GamePadMapping)cboGamePadMappings.SelectedValue).Default = true;

                Launcher.ActiveGamePadMapping = (GamePadMapping)cboGamePadMappings.SelectedValue;

                var path = Launcher.rootDir + "//GamePadMappingList.xml";
                System.Xml.Serialization.XmlSerializer serializer =
                    new System.Xml.Serialization.XmlSerializer(typeof(GamePadMappingList));
                StreamWriter writer = new StreamWriter(path);
                serializer.Serialize(writer.BaseStream, Launcher.mappings);
                writer.Close();

                NetplayLaunchForm.StopMapper(true);
                NetplayLaunchForm.StartMapper();
            }
            else
            {
                launcherText = launcherText.Replace("enable_mapper=1", "enable_mapper=0");
                if (cboPlayer1.SelectedValue.ToString() == "joy1")
                {
                    launcherText = launcherText.Replace("player1=keyboard", "player1=joy1");
                }
                var player1_old = cfgLines.Where(s => s.Contains("player1=")).ToList().First();
                cfgText = cfgText.Replace(player1_old, "player1=joy1");

                NetplayLaunchForm.StopMapper();
            }

            String p1_val = $"{cboPlayer1.SelectedValue}";

            if (p1_val.Length == 0)
            {
                p1_val = "NULL";
            }

            var    region_old = launcherCfgLines.Where(s => s.Contains("region=")).ToList().First();
            String region_val = $"{cboRegion.SelectedValue}";

            cfgText      = cfgText.Replace(player1_old, "player1=" + p1_val);
            launcherText = launcherText.Replace(player1_old, "player1=" + p1_val);
            launcherText = launcherText.Replace(region_old, "region=" + region_val);
            File.WriteAllText(Launcher.rootDir + "nulldc-1-0-4-en-win\\nullDC.cfg", cfgText);
            File.WriteAllText(Launcher.rootDir + "launcher.cfg", launcherText);

            // reload from file
            cfgLines    = File.ReadAllLines(Launcher.rootDir + "nulldc-1-0-4-en-win\\nullDC.cfg");
            player1_old = cfgLines.Where(s => s.Contains("player1=")).ToList().First();
            backup_old  = cfgLines.Where(s => s.Contains("backup=")).ToList().First();
            player2_old = cfgLines.Where(s => s.Contains("player2=")).ToList().First();

            Launcher.LoadRegionSettings();
            Launcher.RestoreFiles();

            MessageBox.Show("Main Settings Successfully Saved");
        }
        public NetplayLaunchForm(bool tray = false, bool controllerSetup = false)
        {
            controller = new ControllerEngine();

            launcher = new Launcher();
            presets  = ConnectionPreset.ReadPresetsFile();

            StartTray = tray;

            string launcherCfgText = "";

            try
            {
                var launcherCfgUri = new System.Uri(Path.Combine(Launcher.rootDir, @"launcher.cfg"));
                launcherCfgText = File.ReadAllText(launcherCfgUri.LocalPath);
            }
            catch (System.IO.DirectoryNotFoundException)
            {
                MessageBox.Show("launcher.cfg not found. Please enter a valid root directory.");
                System.Environment.Exit(1);
            }


            if (launcherCfgText.Contains("enable_mapper=1"))
            {
                StartMapper();
            }

            if (controllerSetup)
            {
                LaunchControllerSetup(true);
            }
            else
            {
                if (!StartTray)
                {
                    try
                    {
                        launcher.UpdateLauncher(true);
                    }
                    catch { }
                    if (!Launcher.FilesRestored)
                    {
                        Launcher.RestoreFiles();
                    }
                }

                InitializeComponent(StartTray);
                //InitializeComponent();

                if (StartTray)
                {
                    this.WindowState = FormWindowState.Minimized;
                }

                ReloadRomList();
                Launcher.LoadRegionSettings();


                if (StartTray)
                {
                    Process[] processes = Process.GetProcessesByName("nullDC_Win32_Release-NoTrace");
                    if (processes.Length > 0)
                    {
                        Process nulldcProcess = processes[0];
                        nulldcProcess.EnableRaisingEvents = true;

                        nulldcProcess.Exited += (sender, e) =>
                        {
                            Application.Exit();
                        };
                    }
                }
            }
        }