Add the serial keys settings dialog.
[reactos.git] / reactos / dll / cpl / access / general.c
index 5c41d78..cb6be88 100644 (file)
@@ -22,11 +22,104 @@ typedef struct _GLOBAL_DATA
 {
     ACCESSTIMEOUT accessTimeout;
     SERIALKEYS serialKeys;
+    TCHAR szActivePort[MAX_PATH];
+    TCHAR szPort[MAX_PATH];
     BOOL bWarningSounds;
     BOOL bSoundOnActivation;
 } GLOBAL_DATA, *PGLOBAL_DATA;
 
 
+#define BAUDTICKS 6
+static INT nBaudArray[BAUDTICKS] = {300, 1200, 2400, 4800, 9600, 19200};
+
+
+INT_PTR CALLBACK
+SerialKeysDlgProc(HWND hwndDlg,
+                  UINT uMsg,
+                  WPARAM wParam,
+                  LPARAM lParam)
+{
+    PGLOBAL_DATA pGlobalData;
+    INT i, n;
+
+    pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
+
+    switch (uMsg)
+    {
+        case WM_INITDIALOG:
+            pGlobalData = (PGLOBAL_DATA)lParam;
+            SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
+
+            /* Add the COM-Ports 1 - 4 to the list */
+            for (i = 0; i < 4; i++)
+            {
+                TCHAR szBuffer[256];
+
+                _stprintf(szBuffer, _T("COM%d"), i + 1);
+                SendDlgItemMessage(hwndDlg, IDC_SERIAL_PORT_COMBO, CB_ADDSTRING, 0, (LPARAM)szBuffer);
+            }
+
+            /* Determine the current port */
+            if (pGlobalData->serialKeys.lpszActivePort && pGlobalData->serialKeys.lpszActivePort[0])
+            {
+                i = pGlobalData->serialKeys.lpszActivePort[3] - '1';
+                if (i < 0 || i > 3)
+                    i = 0;
+            }
+            else
+            {
+                /* Make COM1 the default port */
+                i = 0;
+                _tcscpy(pGlobalData->serialKeys.lpszActivePort, _T("COM1"));
+            }
+
+            /* Set the current port */
+            SendDlgItemMessage(hwndDlg, IDC_SERIAL_PORT_COMBO, CB_SETCURSEL, i, 0);
+
+            /* Determine the current baud rate */
+            n = 0;
+            for (i = 0; i < BAUDTICKS; i++)
+            {
+                TCHAR szBuffer[256];
+
+                _stprintf(szBuffer, _T("%d Baud"), nBaudArray[i]);
+                SendDlgItemMessage(hwndDlg, IDC_SERIAL_BAUD_COMBO, CB_ADDSTRING, 0, (LPARAM)szBuffer);
+
+                if (pGlobalData->serialKeys.iBaudRate == nBaudArray[i])
+                    n = i;
+            }
+
+            /* Set the current baud rate */
+            SendDlgItemMessage(hwndDlg, IDC_SERIAL_BAUD_COMBO, CB_SETCURSEL, n, 0);
+            break;
+
+        case WM_COMMAND:
+            switch (LOWORD(wParam))
+            {
+                case IDOK:
+                    i = SendDlgItemMessage(hwndDlg, IDC_SERIAL_PORT_COMBO, CB_GETCURSEL, 0, 0) + 1;
+                    _stprintf(pGlobalData->serialKeys.lpszActivePort, _T("COM%d"), i);
+
+                    i = SendDlgItemMessage(hwndDlg, IDC_SERIAL_BAUD_COMBO, CB_GETCURSEL, 0, 0);
+                    pGlobalData->serialKeys.iBaudRate = nBaudArray[i];
+
+                    EndDialog(hwndDlg, TRUE);
+                    break;
+
+                case IDCANCEL:
+                    EndDialog(hwndDlg, FALSE);
+                    break;
+
+                default:
+                    break;
+            }
+            break;
+    }
+
+    return FALSE;
+}
+
+
 static VOID
 FillResetComboBox(HWND hwnd)
 {
@@ -65,6 +158,8 @@ ReadGlobalData(PGLOBAL_DATA pGlobalData)
 
     /* Get serial keys information */
     pGlobalData->serialKeys.cbSize = sizeof(SERIALKEYS);
+    pGlobalData->serialKeys.lpszActivePort = pGlobalData->szActivePort;
+    pGlobalData->serialKeys.lpszPort = pGlobalData->szPort;
     SystemParametersInfo(SPI_GETSERIALKEYS,
                          sizeof(SERIALKEYS),
                          &pGlobalData->serialKeys,
@@ -245,6 +340,12 @@ GeneralPageProc(HWND hwndDlg,
                     break;
 
                 case IDC_SERIAL_BUTTON:
+                    if (DialogBoxParam(hApplet,
+                                       MAKEINTRESOURCE(IDD_SERIALKEYSOPTIONS),
+                                       hwndDlg,
+                                       (DLGPROC)SerialKeysDlgProc,
+                                       (LPARAM)pGlobalData))
+                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
                     break;
 
                 case IDC_ADMIN_LOGON_BOX: