2 * PROJECT: ReactOS Console Configuration DLL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/console/console.c
5 * PURPOSE: Initialization
6 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
15 INT_PTR CALLBACK
OptionsProc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
16 INT_PTR CALLBACK
FontProc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
17 INT_PTR CALLBACK
LayoutProc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
18 INT_PTR CALLBACK
ColorsProc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
20 HINSTANCE hApplet
= NULL
;
22 /* Local copy of the console information */
23 PCONSOLE_STATE_INFO ConInfo
= NULL
;
24 /* What to do with the console information */
25 static BOOL SetConsoleInfo
= FALSE
;
26 static BOOL SaveConsoleInfo
= FALSE
;
29 InitPropSheetPage(PROPSHEETPAGEW
*psp
,
33 ZeroMemory(psp
, sizeof(*psp
));
34 psp
->dwSize
= sizeof(*psp
);
35 psp
->dwFlags
= PSP_DEFAULT
;
36 psp
->hInstance
= hApplet
;
37 psp
->pszTemplate
= MAKEINTRESOURCEW(idDlg
);
38 psp
->pfnDlgProc
= DlgProc
;
43 InitDefaultConsoleInfo(PCONSOLE_STATE_INFO pConInfo
)
45 // FIXME: Also retrieve the value of REG_DWORD CurrentPage.
46 ConCfgGetDefaultSettings(pConInfo
);
51 ApplyProc(HWND hwndDlg
,
56 UNREFERENCED_PARAMETER(lParam
);
62 CheckDlgButton(hwndDlg
, IDC_RADIO_APPLY_CURRENT
, BST_CHECKED
);
67 if (LOWORD(wParam
) == IDOK
)
69 if (IsDlgButtonChecked(hwndDlg
, IDC_RADIO_APPLY_CURRENT
) == BST_CHECKED
)
70 EndDialog(hwndDlg
, IDC_RADIO_APPLY_CURRENT
);
72 EndDialog(hwndDlg
, IDC_RADIO_APPLY_ALL
);
74 else if (LOWORD(wParam
) == IDCANCEL
)
76 EndDialog(hwndDlg
, IDCANCEL
);
88 ApplyConsoleInfo(HWND hwndDlg
)
90 static BOOL ConsoleInfoAlreadySaved
= FALSE
;
93 * We already applied all the console properties (and saved if needed).
94 * Nothing more needs to be done.
96 if (ConsoleInfoAlreadySaved
)
100 * If we are setting the default parameters, just save them,
101 * otherwise display the confirmation & apply dialog.
103 if (ConInfo
->hWnd
== NULL
)
105 SetConsoleInfo
= FALSE
;
106 SaveConsoleInfo
= TRUE
;
110 INT_PTR res
= DialogBoxW(hApplet
, MAKEINTRESOURCEW(IDD_APPLYOPTIONS
), hwndDlg
, ApplyProc
);
112 SetConsoleInfo
= (res
!= IDCANCEL
);
113 SaveConsoleInfo
= (res
== IDC_RADIO_APPLY_ALL
);
115 if (SetConsoleInfo
== FALSE
)
117 /* Don't destroy when the user presses cancel */
118 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, PSNRET_INVALID_NOCHANGEPAGE
);
124 * We applied all the console properties (and saved if needed).
125 * Set the flag so that if this function is called again, we won't
126 * need to redo everything again.
128 ConsoleInfoAlreadySaved
= TRUE
;
131 /* Options have been applied */
132 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, PSNRET_NOERROR
);
139 InitApplet(HANDLE hSectionOrWnd
)
142 PCONSOLE_STATE_INFO pSharedInfo
= NULL
;
143 WCHAR szTitle
[MAX_PATH
+ 1];
144 PROPSHEETPAGEW psp
[4];
145 PROPSHEETHEADERW psh
;
149 * Because of Windows compatibility, we need to behave the same concerning
150 * information sharing with CONSRV. For some obscure reason the designers
151 * decided to use the CPlApplet hWnd parameter as being either a handle to
152 * the applet's parent caller's window (in case we ask for displaying
153 * the global console settings), or a handle to a shared section holding
154 * a CONSOLE_STATE_INFO structure (they don't use the extra l/wParams).
158 * Try to open the shared section via the handle parameter. If we succeed,
159 * it means we were called by CONSRV for retrieving/setting parameters for
160 * a given console. If we fail, it means we are retrieving/setting default
161 * global parameters (and we were either called by CONSRV or directly by
162 * the user via the Control Panel, etc...)
164 pSharedInfo
= MapViewOfFile(hSectionOrWnd
, FILE_MAP_READ
, 0, 0, 0);
165 if (pSharedInfo
!= NULL
)
168 * We succeeded. We were called by CONSRV and are retrieving
169 * parameters for a given console.
172 /* Copy the shared data into our allocated buffer */
173 DPRINT1("pSharedInfo->cbSize == %lu ; sizeof(CONSOLE_STATE_INFO) == %u\n",
174 pSharedInfo
->cbSize
, sizeof(CONSOLE_STATE_INFO
));
175 ASSERT(pSharedInfo
->cbSize
>= sizeof(CONSOLE_STATE_INFO
));
177 /* Allocate a local buffer to hold console information */
178 ConInfo
= HeapAlloc(GetProcessHeap(),
180 pSharedInfo
->cbSize
);
182 RtlCopyMemory(ConInfo
, pSharedInfo
, pSharedInfo
->cbSize
);
184 /* Close the section */
185 UnmapViewOfFile(pSharedInfo
);
186 CloseHandle(hSectionOrWnd
);
188 if (!ConInfo
) return 0;
193 * We failed. We are retrieving the default global parameters.
196 /* Allocate a local buffer to hold console information */
197 ConInfo
= HeapAlloc(GetProcessHeap(),
199 sizeof(CONSOLE_STATE_INFO
));
200 if (!ConInfo
) return 0;
203 * Setting the console window handle to NULL indicates we are
204 * retrieving/setting the default console parameters.
206 ConInfo
->hWnd
= NULL
;
207 ConInfo
->ConsoleTitle
[0] = UNICODE_NULL
;
210 InitDefaultConsoleInfo(ConInfo
);
213 /* Initialize the property sheet structure */
214 ZeroMemory(&psh
, sizeof(psh
));
215 psh
.dwSize
= sizeof(psh
);
216 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
| /* PSH_USEHICON */ PSH_USEICONID
| PSH_NOAPPLYNOW
;
218 if (ConInfo
->ConsoleTitle
[0] != UNICODE_NULL
)
220 wcsncpy(szTitle
, L
"\"", MAX_PATH
);
221 wcsncat(szTitle
, ConInfo
->ConsoleTitle
, MAX_PATH
- wcslen(szTitle
));
222 wcsncat(szTitle
, L
"\"", MAX_PATH
- wcslen(szTitle
));
226 wcscpy(szTitle
, L
"ReactOS Console");
228 psh
.pszCaption
= szTitle
;
230 if (pSharedInfo
!= NULL
)
232 /* We were started from a console window: this is our parent (or ConInfo->hWnd is NULL) */
233 psh
.hwndParent
= ConInfo
->hWnd
;
237 /* We were started in another way (--> default parameters). Caller's window is our parent. */
238 psh
.hwndParent
= (HWND
)hSectionOrWnd
;
241 psh
.hInstance
= hApplet
;
242 // psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCEW(IDC_CPLICON));
243 psh
.pszIcon
= MAKEINTRESOURCEW(IDC_CPLICON
);
244 psh
.nPages
= ARRAYSIZE(psp
);
248 InitPropSheetPage(&psp
[i
++], IDD_PROPPAGEOPTIONS
, OptionsProc
);
249 InitPropSheetPage(&psp
[i
++], IDD_PROPPAGEFONT
, FontProc
);
250 InitPropSheetPage(&psp
[i
++], IDD_PROPPAGELAYOUT
, LayoutProc
);
251 InitPropSheetPage(&psp
[i
++], IDD_PROPPAGECOLORS
, ColorsProc
);
253 Result
= PropertySheetW(&psh
);
260 * Create a memory section to share with CONSRV, and map it.
262 hSection
= CreateFileMappingW(INVALID_HANDLE_VALUE
,
270 DPRINT1("Error when creating file mapping, error = %d\n", GetLastError());
274 pSharedInfo
= MapViewOfFile(hSection
, FILE_MAP_ALL_ACCESS
, 0, 0, 0);
277 DPRINT1("Error when mapping view of file, error = %d\n", GetLastError());
278 CloseHandle(hSection
);
282 /* Copy the console information into the section */
283 RtlCopyMemory(pSharedInfo
, ConInfo
, ConInfo
->cbSize
);
286 UnmapViewOfFile(pSharedInfo
);
288 /* Signal to CONSRV that it can apply the new configuration */
289 SendMessage(ConInfo
->hWnd
,
291 (WPARAM
)hSection
, 0);
293 /* Close the section and return */
294 CloseHandle(hSection
);
299 /* Default settings saved when ConInfo->hWnd == NULL */
300 ConCfgWriteUserSettings(ConInfo
, ConInfo
->hWnd
== NULL
);
305 HeapFree(GetProcessHeap(), 0, ConInfo
);
308 return (Result
!= -1);
311 /* Control Panel Callback */
314 CPlApplet(HWND hwndCPl
,
325 // TODO: Free allocated memory
333 CPLINFO
*CPlInfo
= (CPLINFO
*)lParam2
;
334 CPlInfo
->idIcon
= IDC_CPLICON
;
335 CPlInfo
->idName
= IDS_CPLNAME
;
336 CPlInfo
->idInfo
= IDS_CPLDESCRIPTION
;
341 InitApplet((HANDLE
)hwndCPl
);
350 DllMain(HINSTANCE hinstDLL
,
354 UNREFERENCED_PARAMETER(lpvReserved
);
358 case DLL_PROCESS_ATTACH
:
360 DisableThreadLibraryCalls(hinstDLL
);