diff --git a/reactos/dll/win32/console/console.c b/reactos/dll/win32/console/console.c index f9c3b2fb652..e10e3bbb908 100644 --- a/reactos/dll/win32/console/console.c +++ b/reactos/dll/win32/console/console.c @@ -60,19 +60,18 @@ InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc, LPARAM lParam } PConsoleInfo -InitConsoleInfo() +AllocConsoleInfo() { PConsoleInfo pConInfo; - STARTUPINFO StartupInfo; - TCHAR * ptr; - SIZE_T length; pConInfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ConsoleInfo)); - if (!pConInfo) - { - return NULL; - } + + return pConInfo; +} +void +InitConsoleDefaults(PConsoleInfo pConInfo) +{ /* initialize struct */ pConInfo->InsertMode = TRUE; pConInfo->HistoryBufferSize = 50; @@ -88,49 +87,9 @@ InitConsoleInfo() pConInfo->FontSize = (DWORD)MAKELONG(8, 12); pConInfo->FontWeight = FALSE; memcpy(pConInfo->Colors, s_Colors, sizeof(s_Colors)); - - GetModuleFileName(NULL, pConInfo->szProcessName, MAX_PATH); - GetStartupInfo(&StartupInfo); - - - - if ( StartupInfo.lpTitle ) - { - if ( _tcslen(StartupInfo.lpTitle) ) - { - if ( !GetWindowsDirectory(pConInfo->szProcessName, MAX_PATH) ) - { - HeapFree(GetProcessHeap(), 0, pConInfo); - return FALSE; - } - length = _tcslen(pConInfo->szProcessName); - if ( !_tcsncmp(pConInfo->szProcessName, StartupInfo.lpTitle, length) ) - { - // Windows XP SP2 uses unexpanded environment vars to get path - // i.e. c:\windows\system32\cmd.exe - // becomes - // %SystemRoot%_system32_cmd.exe - - _tcscpy(pConInfo->szProcessName, _T("%SystemRoot%")); - _tcsncpy(&pConInfo->szProcessName[12], &StartupInfo.lpTitle[length], _tcslen(StartupInfo.lpTitle) - length + 1); - - ptr = &pConInfo->szProcessName[12]; - while( (ptr = _tcsstr(ptr, _T("\\"))) ) - ptr[0] = _T('_'); - } - } - else - { - _tcscpy(pConInfo->szProcessName, _T("Console")); - } - } - else - { - _tcscpy(pConInfo->szProcessName, _T("Console")); - } - return pConInfo; } + INT_PTR CALLBACK ApplyProc( @@ -148,11 +107,7 @@ ApplyProc( { case WM_INITDIALOG: { -#if 0 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_APPLY_CURRENT); -#else - hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_APPLY_ALL); -#endif SendMessage(hDlgCtrl, BM_SETCHECK, BST_CHECKED, 0); return TRUE; } @@ -193,19 +148,15 @@ ApplyConsoleInfo(HWND hwndDlg, PConsoleInfo pConInfo) } else if ( res == IDC_RADIO_APPLY_ALL ) { - /* apply options */ - WriteConsoleOptions(pConInfo); pConInfo->AppliedConfig = TRUE; SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR); + SendMessage(pConInfo->hConsoleWindow, PM_APPLY_CONSOLE_INFO, (WPARAM)pConInfo, (LPARAM)TRUE); } else if ( res == IDC_RADIO_APPLY_CURRENT ) { - /* - * TODO: - * exchange info in some private way with win32csr - */ pConInfo->AppliedConfig = TRUE; SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR); + SendMessage(pConInfo->hConsoleWindow, PM_APPLY_CONSOLE_INFO, (WPARAM)pConInfo, (LPARAM)TRUE); } } @@ -218,16 +169,68 @@ InitApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam) INT i=0; PConsoleInfo pConInfo; - UNREFERENCED_PARAMETER(hwnd); UNREFERENCED_PARAMETER(uMsg); - UNREFERENCED_PARAMETER(wParam); - UNREFERENCED_PARAMETER(lParam); - pConInfo = InitConsoleInfo(); + /* + * console.dll shares information with win32csr with wParam, lParam + * + * wParam is a file handle to an unamed file object which contains the ConsoleInfo struct + * lParam is a boolean parameter which specifies wheter defaults should be shown + */ + + pConInfo = AllocConsoleInfo(); + if (!pConInfo) + { + return 0; + } + + if (lParam) + { + /* use defaults */ + InitConsoleDefaults(pConInfo); + } + else + { + /* use current info */ + PConsoleInfo pSharedInfo = MapViewOfFile((HANDLE)wParam, + FILE_MAP_ALL_ACCESS, + 0, + 0, + sizeof(ConsoleInfo)); + + /* copy options */ + if (pSharedInfo) + { + pConInfo->InsertMode = pSharedInfo->InsertMode; + pConInfo->HistoryBufferSize = pSharedInfo->HistoryBufferSize; + pConInfo->NumberOfHistoryBuffers = pSharedInfo->NumberOfHistoryBuffers; + pConInfo->ScreenText = pSharedInfo->ScreenText; + pConInfo->ScreenBackground = pSharedInfo->ScreenBackground; + pConInfo->PopupText = pSharedInfo->PopupText; + pConInfo->PopupBackground = pSharedInfo->PopupBackground; + pConInfo->WindowSize = pSharedInfo->WindowSize; + pConInfo->WindowPosition = pSharedInfo->WindowPosition; + pConInfo->ScreenBuffer = pSharedInfo->ScreenBuffer; + pConInfo->UseRasterFonts = pSharedInfo->UseRasterFonts; + pConInfo->FontSize = pSharedInfo->FontSize; + pConInfo->FontWeight = pSharedInfo->FontWeight; + memcpy(pConInfo->Colors, pSharedInfo->Colors, sizeof(s_Colors)); + } + } + + /* console window -> is notified on a property change event */ + pConInfo->hConsoleWindow = hwnd; ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); psh.dwSize = sizeof(PROPSHEETHEADER); - psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE | PSH_NOAPPLYNOW; + psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW; + + if(_tcslen(pConInfo->szProcessName)) + { + psh.dwFlags |= PSH_PROPTITLE; + psh.pszCaption = pConInfo->szProcessName; + } + psh.hwndParent = NULL; psh.hInstance = hApplet; psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_CPLICON)); @@ -235,8 +238,7 @@ InitApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam) psh.nPages = 4; psh.nStartPage = 0; psh.ppsp = psp; - psh.pszCaption = pConInfo->szProcessName; - + InitPropSheetPage(&psp[i++], IDD_PROPPAGEOPTIONS, (DLGPROC) OptionsProc, (LPARAM)pConInfo); InitPropSheetPage(&psp[i++], IDD_PROPPAGEFONT, (DLGPROC) FontProc, (LPARAM)pConInfo); InitPropSheetPage(&psp[i++], IDD_PROPPAGELAYOUT, (DLGPROC) LayoutProc, (LPARAM)pConInfo); diff --git a/reactos/dll/win32/console/console.h b/reactos/dll/win32/console/console.h index e949aa47eba..933925811c8 100644 --- a/reactos/dll/win32/console/console.h +++ b/reactos/dll/win32/console/console.h @@ -21,11 +21,14 @@ typedef struct typedef struct TAGConsoleInfo { + HANDLE hFile; + HWND hConsoleWindow; TCHAR szProcessName[MAX_PATH]; BOOLEAN AppliedConfig; BOOLEAN UseRasterFonts; DWORD FontSize; DWORD FontWeight; + FONTSIGNATURE FontSignature; DWORD CursorSize; DWORD NumberOfHistoryBuffers; DWORD HistoryBufferSize; @@ -44,11 +47,12 @@ typedef struct TAGConsoleInfo COLORREF Colors[16]; } ConsoleInfo, *PConsoleInfo; -BOOL WriteConsoleOptions(PConsoleInfo pConInfo); void ApplyConsoleInfo(HWND hwndDlg, PConsoleInfo pConInfo); void PaintConsole(LPDRAWITEMSTRUCT drawItem, PConsoleInfo pConInfo); void PaintText(LPDRAWITEMSTRUCT drawItem, PConsoleInfo pConInfo); +#define PM_APPLY_CONSOLE_INFO (WM_APP + 100) + //globals extern HINSTANCE hApplet; diff --git a/reactos/dll/win32/console/en.rc b/reactos/dll/win32/console/en.rc index ee958a6d9f3..f197d19574b 100644 --- a/reactos/dll/win32/console/en.rc +++ b/reactos/dll/win32/console/en.rc @@ -135,7 +135,7 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION CAPTION "Apply Properties" FONT 8, "MS Shell Dlg" BEGIN -CONTROL "&Apply Properties to current window only", IDC_RADIO_APPLY_CURRENT, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED, 25, 25, 150, 10 +CONTROL "&Apply Properties to current window only", IDC_RADIO_APPLY_CURRENT, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 25, 150, 10 CONTROL "&Save Properties for future windows with same title", IDC_RADIO_APPLY_ALL, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 40, 185, 10 PUSHBUTTON "OK", IDOK, 25, 80, 40, 15, WS_VISIBLE PUSHBUTTON "Cancel", IDCANCEL, 120, 80, 50, 15, WS_VISIBLE diff --git a/reactos/dll/win32/console/options.c b/reactos/dll/win32/console/options.c index 10f06952b28..cc0ae4a472e 100644 --- a/reactos/dll/win32/console/options.c +++ b/reactos/dll/win32/console/options.c @@ -13,10 +13,6 @@ static void UpdateDialogElements(HWND hwndDlg, PConsoleInfo pConInfo); -static -BOOL -InitializeOptionsFromReg(TCHAR * Path, PConsoleInfo pConInfo); - INT_PTR CALLBACK OptionsProc( @@ -39,7 +35,6 @@ OptionsProc( { pConInfo = (PConsoleInfo) ((LPPROPSHEETPAGE)lParam)->lParam; SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pConInfo); - InitializeOptionsFromReg(pConInfo->szProcessName, pConInfo); UpdateDialogElements(hwndDlg, pConInfo); return TRUE; } @@ -59,11 +54,6 @@ OptionsProc( pConInfo->NumberOfHistoryBuffers = LOWORD(SendMessage(hDlgCtrl, UDM_GETPOS, 0, 0)); PropSheet_Changed(GetParent(hwndDlg), hwndDlg); } - //else if (lppsn->hdr.code == PSN_KILLACTIVE) - //{ - // SetWindowLong(hwndDlg, DWL_MSGRESULT, FALSE); - // return FALSE; - //} else if (lppsn->hdr.code == PSN_APPLY) { if (!pConInfo->AppliedConfig) @@ -178,91 +168,6 @@ OptionsProc( return FALSE; } -static -BOOL InitializeOptionsFromReg(TCHAR * Path, PConsoleInfo pConInfo) -{ - HKEY hKey; - HKEY hSubKey; - DWORD dwNumSubKeys = 0; - DWORD dwIndex; - DWORD dwValueName; - DWORD dwValue; - DWORD dwType; - TCHAR szValueName[MAX_PATH]; - TCHAR szValue[MAX_PATH]; - DWORD Value; - - if ( RegOpenCurrentUser(KEY_READ, &hKey) != ERROR_SUCCESS ) - return FALSE; - - - if ( RegOpenKeyEx(hKey, Path, 0, KEY_READ, &hSubKey) != ERROR_SUCCESS) - { - RegCloseKey(hKey); - return FALSE; - } - - RegQueryInfoKey(hSubKey, NULL, NULL, NULL, &dwNumSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL ); - - for (dwIndex = 0; dwIndex < dwNumSubKeys; dwIndex++) - { - dwValue = sizeof(Value); - dwValueName = MAX_PATH; - - if ( RegEnumValue(hSubKey, dwIndex, szValueName, &dwValueName, NULL, &dwType, (BYTE*)&Value, &dwValue) != ERROR_SUCCESS) - { - if (dwType == REG_SZ) - { - /* - * retry in case of string value - */ - dwValue = sizeof(szValue); - dwValueName = MAX_PATH; - if (RegEnumValue(hSubKey, dwIndex, szValueName, &dwValueName, NULL, NULL, (BYTE*)szValue, &dwValue) != ERROR_SUCCESS) - break; - } - else - break; - } - - if ( !_tcscmp(szValueName, _T("CursorSize")) ) - { - if ( Value == 0x32) - pConInfo->CursorSize = Value; - else if ( Value == 0x64 ) - pConInfo->CursorSize = Value; - } - else if ( !_tcscmp(szValueName, _T("NumberOfHistoryBuffers")) ) - { - pConInfo->NumberOfHistoryBuffers = Value; - } - else if ( !_tcscmp(szValueName, _T("HistoryBufferSize")) ) - { - pConInfo->HistoryBufferSize = Value; - } - else if ( !_tcscmp(szValueName, _T("HistoryNoDup")) ) - { - pConInfo->HistoryNoDup = Value; - } - else if ( !_tcscmp(szValueName, _T("FullScreen")) ) - { - pConInfo->FullScreen = Value; - } - else if ( !_tcscmp(szValueName, _T("QuickEdit")) ) - { - pConInfo->QuickEdit = Value; - } - else if ( !_tcscmp(szValueName, _T("InsertMode")) ) - { - pConInfo->InsertMode = Value; - } - } - - RegCloseKey(hKey); - RegCloseKey(hSubKey); - return TRUE; -} - static void UpdateDialogElements(HWND hwndDlg, PConsoleInfo pConInfo) @@ -360,69 +265,3 @@ UpdateDialogElements(HWND hwndDlg, PConsoleInfo pConInfo) } -BOOLEAN InitializeOptionsDialog(HWND hwndDlg) -{ - PConsoleInfo pConInfo = (PConsoleInfo) GetWindowLongPtr(GetParent(hwndDlg), DWLP_USER); - - if (!pConInfo) - return FALSE; - - - return TRUE; -} - -BOOL WriteConsoleOptions(PConsoleInfo pConInfo) -{ - HKEY hKey; - HKEY hSubKey; - - if ( RegOpenCurrentUser(KEY_READ | KEY_SET_VALUE, &hKey) != ERROR_SUCCESS ) - return FALSE; - - - if ( RegOpenKeyEx(hKey, pConInfo->szProcessName, 0, KEY_READ | KEY_SET_VALUE, &hSubKey) != ERROR_SUCCESS) - { - RegCloseKey(hKey); - return FALSE; - } - - if ( pConInfo->CursorSize == 0x0) - RegDeleteKey(hSubKey, _T("CursorSize")); - else - RegSetValueEx(hSubKey, _T("CursorSize"), 0, REG_DWORD, (const BYTE *)&pConInfo->CursorSize, sizeof(DWORD)); - - if ( pConInfo->NumberOfHistoryBuffers == 0x5 ) - RegDeleteKey(hSubKey, _T("NumberOfHistoryBuffers")); - else - RegSetValueEx(hSubKey, _T("NumberOfHistoryBuffers"), 0, REG_DWORD, (const BYTE *)&pConInfo->NumberOfHistoryBuffers, sizeof(DWORD)); - - if ( pConInfo->HistoryBufferSize == 50 ) - RegDeleteKey(hSubKey, _T("HistoryBufferSize")); - else - RegSetValueEx(hSubKey, _T("HistoryBufferSize"), 0, REG_DWORD, (const BYTE *)&pConInfo->HistoryBufferSize, sizeof(DWORD)); - - if ( pConInfo->FullScreen == FALSE ) - RegDeleteKey(hSubKey, _T("FullScreen")); - else - RegSetValueEx(hSubKey, _T("FullScreen"), 0, REG_DWORD, (const BYTE *)&pConInfo->FullScreen, sizeof(DWORD)); - - if ( pConInfo->QuickEdit == FALSE) - RegDeleteKey(hSubKey, _T("QuickEdit")); - else - RegSetValueEx(hSubKey, _T("QuickEdit"), 0, REG_DWORD, (const BYTE *)&pConInfo->QuickEdit, sizeof(DWORD)); - - if ( pConInfo->InsertMode == TRUE ) - RegDeleteKey(hSubKey, _T("InsertMode")); - else - RegSetValueEx(hSubKey, _T("InsertMode"), 0, REG_DWORD, (const BYTE *)&pConInfo->InsertMode, sizeof(DWORD)); - - if ( pConInfo->HistoryNoDup == FALSE ) - RegDeleteKey(hSubKey, _T("HistoryNoDup")); - else - RegSetValueEx(hSubKey, _T("HistoryNoDup"), 0, REG_DWORD, (const BYTE *)&pConInfo->HistoryNoDup, sizeof(DWORD)); - - RegCloseKey(hKey); - RegCloseKey(hSubKey); - - return TRUE; -}