private void SettingsRegisterHotkey(KeyEventArgs e, int id)
        {
            e.SuppressKeyPress = true;
            if (e.Modifiers != Keys.None)
            {
                Keys key = Keys.None;
                Hotkey.KeyModifiers modifiers = Hotkey.GetModifiers(e.KeyData, out key);
                if (key != Keys.None)
                {
                    string   mod    = "";
                    string[] mSplit = modifiers.ToString().Split(new[] { ", " }, StringSplitOptions.None);
                    foreach (string m in mSplit)
                    {
                        mod += m + "+";
                    }
                    string hotkey = e.KeyData.ToString();
                    /* Almost 500 lines and only 10% done */
                    if (!config.hotkeys.Any(hotkey.Contains))
                    {
                        switch (id)
                        {
                        case 0:
                            textBox_hotkeySmoothOnOff.Text = mod + key;
                            break;

                        case 1:
                            textBox_hotkeyOverlayOnOff.Text = mod + key;
                            break;

                        case 2:
                            textBox_hotkeyToggleDisplay.Text = mod + key;
                            break;

                        case 3:
                            textBox_hotkeyTabletMode.Text = mod + key;
                            break;

                        case 4:
                            textBox_hotkeyStrengthUp.Text = mod + key;
                            break;

                        case 5:
                            textBox_hotkeyStrengthDown.Text = mod + key;
                            break;
                        }
                        config.hotkeys[id] = hotkey;
                        mainForm.RegisterHotkey(mainForm.Handle, id, modifiers, key);
                    }
                }
            }
        }
        public Settings(Main mF, Config cG, Overlay oF)
        {
            InitializeComponent();
            panel_cursorPanel.Paint += new PaintEventHandler(CursorPreviewPaint);
            mainForm    = mF;
            config      = cG;
            overlayForm = oF;

            // Overlay tab setup
            if (config.disableOverlay)
            {
                checkBox_disableOverlay.Checked = true;
            }
            if (config.allScreens)
            {
                checkBox_allScreens.Checked = true;
            }
            if (config.manualOverlayOverride)
            {
                checkBox_manualOverlayOverride.Checked = true;
            }
            else
            {
                textBox_overlayPositionX.Enabled = false;
                textBox_overlayPositionY.Enabled = false;
                textBox_overlaySizeX.Enabled     = false;
                textBox_overlaySizeY.Enabled     = false;
            }
            Rectangle ob = config.overrideBounds;

            textBox_overlayPositionX.Text = ob.Location.X.ToString();
            textBox_overlayPositionY.Text = ob.Location.Y.ToString();
            textBox_overlaySizeX.Text     = ob.Width.ToString();
            textBox_overlaySizeY.Text     = ob.Height.ToString();

            // Cursor tab
            if (config.disableCatchUp)
            {
                checkBox_disableCatchUp.Checked = true;
            }
            if (config.snapToCursor)
            {
                checkBox_snapToCursor.Checked = true;
            }
            switch (overlayForm.cursorType)
            {
            case Overlay.CursorType.Bullseye:
                radioButton_bullseye.Checked = true;
                break;

            case Overlay.CursorType.Circle:
                radioButton_circle.Checked = true;
                break;

            case Overlay.CursorType.Crosshair:
                radioButton_crosshair.Checked = true;
                break;

            case Overlay.CursorType.Cursor:
                radioButton_cursor.Checked = true;
                break;

            case Overlay.CursorType.TinyCursor:
                radioButton_tinyCursor.Checked = true;
                break;

            case Overlay.CursorType.Pen:
                radioButton_pen.Checked = true;
                break;
            }
            button_mainColor.BackColor = overlayForm.cursorColor;
            button_fillColor.BackColor = overlayForm.cursorFillColor;

            // Tablet tab
            if (config.disableAutoDetection)
            {
                checkBox_disableAutoDetection.Checked = true;
            }
            if (mainForm.smoothingOn)
            {
                checkBox_disableAutoDetection.Enabled = false;
            }
            int t = config.tolerance;

            textBox_tolerance.Text = t.ToString();
            if (config.tabletOffsetOverride)
            {
                checkBox_tabletOffsetOverride.Checked = true;
            }
            else
            {
                textBox_tabletOffsetX.Enabled = false;
                textBox_tabletOffsetY.Enabled = false;
            }
            Point co = config.tabletOffset;

            textBox_tabletOffsetX.Text = co.X.ToString();
            textBox_tabletOffsetY.Text = co.Y.ToString();

            // Hotkey tab
            KeysConverter c = new KeysConverter();
            string        mod;

            string[] ms;
            Keys     k;

            Hotkey.KeyModifiers m;
            k = (Keys)c.ConvertFromString(config.hotkeys[0]);
            if (k.ToString() != "None")
            {
                m   = Hotkey.GetModifiers(k, out k);
                mod = "";
                ms  = m.ToString().Split(new[] { ", " }, StringSplitOptions.None);
                foreach (string mm in ms)
                {
                    mod += mm + "+";
                }
                textBox_hotkeySmoothOnOff.Text = mod + k;
            }
            k = (Keys)c.ConvertFromString(config.hotkeys[1]);
            if (k.ToString() != "None")
            {
                m   = Hotkey.GetModifiers(k, out k);
                mod = "";
                ms  = m.ToString().Split(new[] { ", " }, StringSplitOptions.None);
                foreach (string mm in ms)
                {
                    mod += mm + "+";
                }
                textBox_hotkeyOverlayOnOff.Text = mod + k;
            }
            k = (Keys)c.ConvertFromString(config.hotkeys[2]);
            if (k.ToString() != "None")
            {
                m   = Hotkey.GetModifiers(k, out k);
                mod = "";
                ms  = m.ToString().Split(new[] { ", " }, StringSplitOptions.None);
                foreach (string mm in ms)
                {
                    mod += mm + "+";
                }
                textBox_hotkeyToggleDisplay.Text = mod + k;
            }
            k = (Keys)c.ConvertFromString(config.hotkeys[3]);
            if (k.ToString() != "None")
            {
                m   = Hotkey.GetModifiers(k, out k);
                mod = "";
                ms  = m.ToString().Split(new[] { ", " }, StringSplitOptions.None);
                foreach (string mm in ms)
                {
                    mod += mm + "+";
                }
                textBox_hotkeyTabletMode.Text = mod + k;
            }
            k = (Keys)c.ConvertFromString(config.hotkeys[4]);
            if (k.ToString() != "None")
            {
                m   = Hotkey.GetModifiers(k, out k);
                mod = "";
                ms  = m.ToString().Split(new[] { ", " }, StringSplitOptions.None);
                foreach (string mm in ms)
                {
                    mod += mm + "+";
                }
                textBox_hotkeyStrengthUp.Text = mod + k;
            }
            k = (Keys)c.ConvertFromString(config.hotkeys[5]);
            if (k.ToString() != "None")
            {
                m   = Hotkey.GetModifiers(k, out k);
                mod = "";
                ms  = m.ToString().Split(new[] { ", " }, StringSplitOptions.None);
                foreach (string mm in ms)
                {
                    mod += mm + "+";
                }
                textBox_hotkeyStrengthDown.Text = mod + k;
            }
        }
        public void LoadConfig(bool def = false)
        {
            if (def)
            {
                tabletOffset           = new Point(0, 0);
                overrideBounds         = new Rectangle(0, 0, 0, 0);
                smoothingStrength      = 30;
                smoothingInterpolation = 4;
                overlayScreen          = 0;
                tolerance             = 300;
                manualInterpolation   = false;
                stayOnTop             = false;
                disableOverlay        = false;
                allScreens            = false;
                manualOverlayOverride = false;
                disableCatchUp        = false;
                snapToCursor          = false;
                smoothOnDraw          = false;
                tabletOffsetOverride  = false;
                disableAutoDetection  = false;
                hotkeys[0]            = "None";
                hotkeys[1]            = "None";
                hotkeys[2]            = "None";
                hotkeys[3]            = "None";
                hotkeys[4]            = "None";
                hotkeys[5]            = "None";

                // Main window resetting
                mainForm.checkBox_smoothOnDraw.Checked           = true;
                mainForm.checkBox_stayOnTop.Checked              = true;
                mainForm.checkBox_tabletMode.Checked             = false;
                mainForm.checkBox_tabletMode.Enabled             = false;
                mainForm.checkBox_manualInterpolation.Checked    = false;
                mainForm.trackBar_smoothingInterpolation.Enabled = false;
                mainForm.textBox_smoothingInterpolation.Enabled  = false;
                mainForm.textBox_smoothingInterpolation.Text     = smoothingInterpolation.ToString();
                mainForm.textBox_smoothingStrength.Text          = smoothingStrength.ToString();
                mainForm.checkBox_smoothOnDraw.Checked           = false;
                mainForm.TopMost = false;

                // Cursor and overlay resetting
                overlayForm.cursorColor     = Color.FromArgb(128, 128, 128);
                overlayForm.cursorFillColor = Color.FromArgb(255, 255, 254);
                overlayForm.cursorType      = Overlay.CursorType.Bullseye;
                overlayForm.Show();
                overlayForm.Bounds = Screen.PrimaryScreen.Bounds;
                mainForm.button_colorDialog.BackColor = overlayForm.cursorColor;

                // Hotkey resetting
                for (int i = 0; i < mainForm.hotKeyHandling.Count(); i++)
                {
                    try {
                        mainForm.hotKeyHandling[i].Dispose();
                    }
                    catch {
                        // Nothing to dispose!
                    }
                }
            }
            else
            {
                try {
                    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                    // Main window loading
                    smoothingStrength      = int.Parse(config.AppSettings.Settings["Strength"].Value);
                    smoothingInterpolation = int.Parse(config.AppSettings.Settings["Interpolation"].Value);
                    manualInterpolation    = bool.Parse(config.AppSettings.Settings["Manual Interpolation"].Value);
                    smoothOnDraw           = bool.Parse(config.AppSettings.Settings["Smooth On Draw"].Value);
                    stayOnTop            = bool.Parse(config.AppSettings.Settings["Stay On Top"].Value);
                    disableAutoDetection = bool.Parse(config.AppSettings.Settings["Disable Auto Detection"].Value);
                    mainForm.tabletMode  = bool.Parse(config.AppSettings.Settings["Tablet Mode"].Value);
                    mainForm.checkBox_tabletMode.Enabled   = disableAutoDetection;
                    mainForm.checkBox_tabletMode.Checked   = mainForm.tabletMode;
                    mainForm.checkBox_smoothOnDraw.Checked = smoothOnDraw;
                    if (manualInterpolation)
                    {
                        mainForm.checkBox_manualInterpolation.Checked    = true;
                        mainForm.trackBar_smoothingInterpolation.Enabled = true;
                        mainForm.textBox_smoothingInterpolation.Enabled  = true;
                    }
                    mainForm.textBox_smoothingInterpolation.Text = smoothingInterpolation.ToString();
                    mainForm.textBox_smoothingStrength.Text      = smoothingStrength.ToString();
                    if (stayOnTop)
                    {
                        mainForm.checkBox_stayOnTop.Checked = true;
                        mainForm.TopMost    = true;
                        overlayForm.TopMost = true;
                    }

                    // Cursor and overlay loading
                    overlayForm.cursorType      = (Overlay.CursorType)Enum.Parse(typeof(Overlay.CursorType), config.AppSettings.Settings["Cursor Graphic"].Value);
                    overlayForm.cursorColor     = ColorTranslator.FromHtml(config.AppSettings.Settings["Main Color"].Value);
                    overlayForm.cursorFillColor = ColorTranslator.FromHtml(config.AppSettings.Settings["Fill Color"].Value);
                    overlayScreen         = int.Parse(config.AppSettings.Settings["Overlay Screen"].Value);
                    disableOverlay        = bool.Parse(config.AppSettings.Settings["Disable Overlay"].Value);
                    allScreens            = bool.Parse(config.AppSettings.Settings["All Screens"].Value);
                    manualOverlayOverride = bool.Parse(config.AppSettings.Settings["Manual Overlay Override"].Value);
                    RectangleConverter r = new RectangleConverter();
                    overrideBounds = (Rectangle)r.ConvertFromString(config.AppSettings.Settings["Override Bounds"].Value);
                    if (disableOverlay)
                    {
                        overlayForm.Hide();
                    }
                    overlayForm.Bounds = Screen.AllScreens[overlayScreen].Bounds;
                    if (allScreens)
                    {
                        overlayForm.Bounds = new Rectangle(0, 0, SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);
                    }
                    if (manualOverlayOverride)
                    {
                        overlayForm.Bounds = overrideBounds;
                    }
                    mainForm.button_colorDialog.BackColor = overlayForm.cursorColor;

                    // ...and everything else
                    disableCatchUp       = bool.Parse(config.AppSettings.Settings["Disable Catch Up"].Value);
                    snapToCursor         = bool.Parse(config.AppSettings.Settings["Snap To Cursor"].Value);
                    tolerance            = int.Parse(config.AppSettings.Settings["Tolerance"].Value);
                    tabletOffsetOverride = bool.Parse(config.AppSettings.Settings["Tablet Offset Override"].Value);
                    PointConverter p = new PointConverter();
                    tabletOffset = (Point)p.ConvertFromString(config.AppSettings.Settings["Tablet Offset"].Value);
                    KeysConverter       c = new KeysConverter();
                    Keys                k;
                    Hotkey.KeyModifiers m;
                    hotkeys[0] = config.AppSettings.Settings["Hotkey 1"].Value;
                    if (hotkeys[0] != "None")
                    {
                        k = (Keys)c.ConvertFromString(config.AppSettings.Settings["Hotkey 1"].Value);
                        m = Hotkey.GetModifiers(k, out k);
                        if (k != Keys.None)
                        {
                            mainForm.RegisterHotkey(mainForm.Handle, 0, m, k);
                        }
                    }
                    hotkeys[1] = config.AppSettings.Settings["Hotkey 2"].Value;
                    if (hotkeys[1] != "None")
                    {
                        k = (Keys)c.ConvertFromString(config.AppSettings.Settings["Hotkey 2"].Value);
                        m = Hotkey.GetModifiers(k, out k);
                        if (k != Keys.None)
                        {
                            mainForm.RegisterHotkey(mainForm.Handle, 1, m, k);
                        }
                    }
                    hotkeys[2] = config.AppSettings.Settings["Hotkey 3"].Value;
                    if (hotkeys[2] != "None")
                    {
                        k = (Keys)c.ConvertFromString(config.AppSettings.Settings["Hotkey 3"].Value);
                        m = Hotkey.GetModifiers(k, out k);
                        if (k != Keys.None)
                        {
                            mainForm.RegisterHotkey(mainForm.Handle, 2, m, k);
                        }
                    }
                    hotkeys[3] = config.AppSettings.Settings["Hotkey 4"].Value;
                    if (hotkeys[3] != "None")
                    {
                        k = (Keys)c.ConvertFromString(config.AppSettings.Settings["Hotkey 4"].Value);
                        m = Hotkey.GetModifiers(k, out k);
                        if (k != Keys.None)
                        {
                            mainForm.RegisterHotkey(mainForm.Handle, 3, m, k);
                        }
                    }
                    hotkeys[4] = config.AppSettings.Settings["Hotkey 5"].Value;
                    if (hotkeys[4] != "None")
                    {
                        k = (Keys)c.ConvertFromString(config.AppSettings.Settings["Hotkey 5"].Value);
                        m = Hotkey.GetModifiers(k, out k);
                        if (k != Keys.None)
                        {
                            mainForm.RegisterHotkey(mainForm.Handle, 4, m, k);
                        }
                    }
                    hotkeys[5] = config.AppSettings.Settings["Hotkey 6"].Value;
                    if (hotkeys[5] != "None")
                    {
                        k = (Keys)c.ConvertFromString(config.AppSettings.Settings["Hotkey 6"].Value);
                        m = Hotkey.GetModifiers(k, out k);
                        if (k != Keys.None)
                        {
                            mainForm.RegisterHotkey(mainForm.Handle, 5, m, k);
                        }
                    }
                }
                catch {
                    // Quietly fail loading bad configs or no configs
                }
            }
        }