2 * PROJECT: ReactOS Console Configuration DLL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/console/console.c
5 * PURPOSE: initialization of DLL
6 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@student.tugraz.at)
16 LONG APIENTRY
InitApplet(HWND hwnd
, UINT uMsg
, LPARAM wParam
, LPARAM lParam
);
17 INT_PTR CALLBACK
OptionsProc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
18 INT_PTR CALLBACK
FontProc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
19 INT_PTR CALLBACK
LayoutProc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
20 INT_PTR CALLBACK
ColorsProc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
22 HINSTANCE hApplet
= 0;
25 APPLET Applets
[NUM_APPLETS
] =
27 {IDC_CPLICON
, IDS_CPLNAME
, IDS_CPLDESCRIPTION
, InitApplet
}
31 * Default 16-color palette for foreground and background
32 * (corresponding flags in comments).
34 const COLORREF s_Colors
[16] =
36 RGB(0, 0, 0), // (Black)
37 RGB(0, 0, 128), // BLUE
38 RGB(0, 128, 0), // GREEN
39 RGB(0, 128, 128), // BLUE | GREEN
40 RGB(128, 0, 0), // RED
41 RGB(128, 0, 128), // BLUE | RED
42 RGB(128, 128, 0), // GREEN | RED
43 RGB(192, 192, 192), // BLUE | GREEN | RED
45 RGB(128, 128, 128), // (Grey) INTENSITY
46 RGB(0, 0, 255), // BLUE | INTENSITY
47 RGB(0, 255, 0), // GREEN | INTENSITY
48 RGB(0, 255, 255), // BLUE | GREEN | INTENSITY
49 RGB(255, 0, 0), // RED | INTENSITY
50 RGB(255, 0, 255), // BLUE | RED | INTENSITY
51 RGB(255, 255, 0), // GREEN | RED | INTENSITY
52 RGB(255, 255, 255) // BLUE | GREEN | RED | INTENSITY
54 /* Default attributes */
55 #define DEFAULT_SCREEN_ATTRIB (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED)
56 #define DEFAULT_POPUP_ATTRIB (FOREGROUND_BLUE | FOREGROUND_RED | \
57 BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY)
59 #define CSR_DEFAULT_CURSOR_SIZE 25
62 InitPropSheetPage(PROPSHEETPAGE
*psp
,
67 ZeroMemory(psp
, sizeof(PROPSHEETPAGE
));
68 psp
->dwSize
= sizeof(PROPSHEETPAGE
);
69 psp
->dwFlags
= PSP_DEFAULT
;
70 psp
->hInstance
= hApplet
;
71 psp
->pszTemplate
= MAKEINTRESOURCE(idDlg
);
72 psp
->pfnDlgProc
= DlgProc
;
79 /* Adapted for holding GUI terminal information */
80 return HeapAlloc(GetProcessHeap(),
82 sizeof(CONSOLE_PROPS
) + sizeof(GUI_CONSOLE_INFO
));
86 InitConsoleDefaults(PCONSOLE_PROPS pConInfo
)
88 PGUI_CONSOLE_INFO GuiInfo
= NULL
;
90 /* Initialize the default properties */
91 pConInfo
->ci
.HistoryBufferSize
= 50;
92 pConInfo
->ci
.NumberOfHistoryBuffers
= 4;
93 pConInfo
->ci
.HistoryNoDup
= FALSE
;
94 pConInfo
->ci
.FullScreen
= FALSE
;
95 pConInfo
->ci
.QuickEdit
= FALSE
;
96 pConInfo
->ci
.InsertMode
= TRUE
;
97 // pConInfo->ci.InputBufferSize;
98 pConInfo
->ci
.ScreenBufferSize
= (COORD
){80, 300};
99 pConInfo
->ci
.ConsoleSize
= (COORD
){80, 25 };
100 pConInfo
->ci
.CursorBlinkOn
= TRUE
;
101 pConInfo
->ci
.ForceCursorOff
= FALSE
;
102 pConInfo
->ci
.CursorSize
= CSR_DEFAULT_CURSOR_SIZE
;
103 pConInfo
->ci
.ScreenAttrib
= DEFAULT_SCREEN_ATTRIB
;
104 pConInfo
->ci
.PopupAttrib
= DEFAULT_POPUP_ATTRIB
;
105 pConInfo
->ci
.CodePage
= 0;
106 pConInfo
->ci
.ConsoleTitle
[0] = L
'\0';
108 /* Adapted for holding GUI terminal information */
109 pConInfo
->TerminalInfo
.Size
= sizeof(GUI_CONSOLE_INFO
);
110 GuiInfo
= pConInfo
->TerminalInfo
.TermInfo
= (PGUI_CONSOLE_INFO
)(pConInfo
+ 1);
111 GuiInfo
->FaceName
[0] = L
'\0';
112 GuiInfo
->FontFamily
= FF_DONTCARE
;
113 GuiInfo
->FontSize
= 0;
114 GuiInfo
->FontWeight
= FW_DONTCARE
;
115 GuiInfo
->UseRasterFonts
= TRUE
;
117 GuiInfo
->AutoPosition
= TRUE
;
118 GuiInfo
->WindowOrigin
= (POINT
){0, 0};
120 memcpy(pConInfo
->ci
.Colors
, s_Colors
, sizeof(s_Colors
));
125 ApplyProc(HWND hwndDlg
,
132 UNREFERENCED_PARAMETER(lParam
);
138 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_APPLY_CURRENT
);
139 SendMessage(hDlgCtrl
, BM_SETCHECK
, BST_CHECKED
, 0);
144 if (LOWORD(wParam
) == IDOK
)
146 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_APPLY_CURRENT
);
147 if (SendMessage(hDlgCtrl
, BM_GETCHECK
, 0, 0) == BST_CHECKED
)
148 EndDialog(hwndDlg
, IDC_RADIO_APPLY_CURRENT
);
150 EndDialog(hwndDlg
, IDC_RADIO_APPLY_ALL
);
152 else if (LOWORD(wParam
) == IDCANCEL
)
154 EndDialog(hwndDlg
, IDCANCEL
);
166 ApplyConsoleInfo(HWND hwndDlg
,
167 PCONSOLE_PROPS pConInfo
)
171 res
= DialogBox(hApplet
, MAKEINTRESOURCE(IDD_APPLYOPTIONS
), hwndDlg
, ApplyProc
);
174 /* Don't destroy when user presses cancel */
175 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, PSNRET_INVALID_NOCHANGEPAGE
);
178 else if (res
== IDC_RADIO_APPLY_ALL
|| res
== IDC_RADIO_APPLY_CURRENT
)
181 PCONSOLE_PROPS pSharedInfo
;
184 * Create a memory section to share with the server, and map it.
186 /* Holds data for console.dll + console info + terminal-specific info */
187 hSection
= CreateFileMapping(INVALID_HANDLE_VALUE
,
191 sizeof(CONSOLE_PROPS
) + sizeof(GUI_CONSOLE_INFO
),
195 DPRINT1("Error when creating file mapping, error = %d\n", GetLastError());
199 pSharedInfo
= MapViewOfFile(hSection
, FILE_MAP_ALL_ACCESS
, 0, 0, 0);
202 DPRINT1("Error when mapping view of file, error = %d\n", GetLastError());
203 CloseHandle(hSection
);
207 /* We are applying the chosen configuration */
208 pConInfo
->AppliedConfig
= TRUE
;
210 /* Copy the console info into the section */
211 RtlCopyMemory(pSharedInfo
, pConInfo
, sizeof(CONSOLE_PROPS
) + sizeof(GUI_CONSOLE_INFO
));
213 pSharedInfo
->TerminalInfo
.TermInfo
= (PVOID
)((ULONG_PTR
)pSharedInfo
->TerminalInfo
.TermInfo
- (ULONG_PTR
)pSharedInfo
);
216 UnmapViewOfFile(pSharedInfo
);
218 /* Signal to the console server that it can apply the new configuration */
219 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, PSNRET_NOERROR
);
220 SendMessage(pConInfo
->hConsoleWindow
,
221 PM_APPLY_CONSOLE_INFO
,
223 (LPARAM
)(res
== IDC_RADIO_APPLY_ALL
));
225 /* Close the section and return */
226 CloseHandle(hSection
);
235 InitApplet(HWND hWnd
, UINT uMsg
, LPARAM wParam
, LPARAM lParam
)
237 HANDLE hSection
= (HANDLE
)wParam
;
238 BOOL GuiTermInfo
= FALSE
;
239 PCONSOLE_PROPS pSharedInfo
;
240 PCONSOLE_PROPS pConInfo
;
241 WCHAR szTitle
[MAX_PATH
+ 1];
242 PROPSHEETPAGE psp
[4];
246 UNREFERENCED_PARAMETER(uMsg
);
249 * CONSOLE.DLL shares information with CONSRV with wParam:
250 * wParam is a handle to a shared section holding a CONSOLE_PROPS struct.
252 * NOTE: lParam is not used.
255 /* Allocate a local buffer to hold console information */
256 pConInfo
= AllocConsoleInfo();
257 if (!pConInfo
) return 0;
259 /* Map the shared section */
260 pSharedInfo
= MapViewOfFile(hSection
, FILE_MAP_READ
, 0, 0, 0);
261 if (pSharedInfo
== NULL
)
263 HeapFree(GetProcessHeap(), 0, pConInfo
);
267 // if (IsBadReadPtr((PVOID)pSharedInfo, sizeof(CONSOLE_PROPS)))
271 /* Find the console window and whether we must use default parameters */
272 pConInfo
->hConsoleWindow
= pSharedInfo
->hConsoleWindow
;
273 pConInfo
->ShowDefaultParams
= pSharedInfo
->ShowDefaultParams
;
275 /* Check that we are going to modify GUI terminal information */
276 GuiTermInfo
= ( pSharedInfo
->TerminalInfo
.Size
== sizeof(GUI_CONSOLE_INFO
) &&
277 pSharedInfo
->TerminalInfo
.TermInfo
!= 0 );
279 if (pConInfo
->ShowDefaultParams
|| !GuiTermInfo
)
282 InitConsoleDefaults(pConInfo
);
287 * Copy the shared data into our allocated buffer, and
288 * de-offsetize the address of terminal-specific information.
290 RtlCopyMemory(pConInfo
, pSharedInfo
, sizeof(CONSOLE_PROPS
) + sizeof(GUI_CONSOLE_INFO
));
291 pConInfo
->TerminalInfo
.TermInfo
= (PVOID
)((ULONG_PTR
)pConInfo
+ (ULONG_PTR
)pConInfo
->TerminalInfo
.TermInfo
);
294 /* Close the section */
295 UnmapViewOfFile(pSharedInfo
);
296 CloseHandle(hSection
);
298 /* Initialize the property sheet structure */
299 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
300 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
301 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
| /* PSH_USEHICON */ PSH_USEICONID
| PSH_NOAPPLYNOW
;
303 if (pConInfo
->ci
.ConsoleTitle
[0] != L
'\0')
305 wcsncpy(szTitle
, L
"\"", sizeof(szTitle
) / sizeof(szTitle
[0]));
306 wcsncat(szTitle
, pConInfo
->ci
.ConsoleTitle
, sizeof(szTitle
) / sizeof(szTitle
[0]));
307 wcsncat(szTitle
, L
"\"", sizeof(szTitle
) / sizeof(szTitle
[0]));
311 wcscpy(szTitle
, L
"ReactOS Console");
313 psh
.pszCaption
= szTitle
;
315 psh
.hwndParent
= pConInfo
->hConsoleWindow
;
316 psh
.hInstance
= hApplet
;
317 // psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_CPLICON));
318 psh
.pszIcon
= MAKEINTRESOURCE(IDC_CPLICON
);
323 InitPropSheetPage(&psp
[i
++], IDD_PROPPAGEOPTIONS
, (DLGPROC
) OptionsProc
, (LPARAM
)pConInfo
);
324 InitPropSheetPage(&psp
[i
++], IDD_PROPPAGEFONT
, (DLGPROC
) FontProc
, (LPARAM
)pConInfo
);
325 InitPropSheetPage(&psp
[i
++], IDD_PROPPAGELAYOUT
, (DLGPROC
) LayoutProc
, (LPARAM
)pConInfo
);
326 InitPropSheetPage(&psp
[i
++], IDD_PROPPAGECOLORS
, (DLGPROC
) ColorsProc
, (LPARAM
)pConInfo
);
328 return (PropertySheet(&psh
) != -1);
331 /* Control Panel Callback */
333 CPlApplet(HWND hwndCPl
,
344 // TODO: Free allocated memory
352 CPLINFO
*CPlInfo
= (CPLINFO
*)lParam2
;
353 CPlInfo
->idIcon
= Applets
[0].idIcon
;
354 CPlInfo
->idName
= Applets
[0].idName
;
355 CPlInfo
->idInfo
= Applets
[0].idDescription
;
360 InitApplet(hwndCPl
, uMsg
, lParam1
, lParam2
);
370 DllMain(HINSTANCE hinstDLL
,
374 UNREFERENCED_PARAMETER(lpvReserved
);
378 case DLL_PROCESS_ATTACH
:
379 case DLL_THREAD_ATTACH
: