05665b4b9217dbc9ba9910ed64a53b14aa82f2ae
[reactos.git] / reactos / win32ss / user / winsrv / consrv / frontendctl.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Console Server DLL
4 * FILE: win32ss/user/winsrv/consrv/frontendctl.c
5 * PURPOSE: Terminal Front-Ends Control
6 * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr)
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include "consrv.h"
12 #include "include/conio.h"
13 #include "include/conio2.h"
14 #include "conoutput.h"
15 #include "console.h"
16 #include "handle.h"
17
18 #define NDEBUG
19 #include <debug.h>
20
21
22 /* PRIVATE FUNCTIONS **********************************************************/
23
24
25 /* PUBLIC SERVER APIS *********************************************************/
26
27 /**********************************************************************
28 * HardwareStateProperty
29 *
30 * DESCRIPTION
31 * Set/Get the value of the HardwareState and switch
32 * between direct video buffer ouput and GDI windowed
33 * output.
34 * ARGUMENTS
35 * Client hands us a CONSOLE_GETSETHWSTATE object.
36 * We use the same object to Request.
37 * NOTE
38 * ConsoleHwState has the correct size to be compatible
39 * with NT's, but values are not.
40 */
41 #if 0
42 static NTSTATUS FASTCALL
43 SetConsoleHardwareState(PCONSOLE Console, ULONG ConsoleHwState)
44 {
45 DPRINT1("Console Hardware State: %d\n", ConsoleHwState);
46
47 if ((CONSOLE_HARDWARE_STATE_GDI_MANAGED == ConsoleHwState)
48 ||(CONSOLE_HARDWARE_STATE_DIRECT == ConsoleHwState))
49 {
50 if (Console->HardwareState != ConsoleHwState)
51 {
52 /* TODO: implement switching from full screen to windowed mode */
53 /* TODO: or back; now simply store the hardware state */
54 Console->HardwareState = ConsoleHwState;
55 }
56
57 return STATUS_SUCCESS;
58 }
59
60 return STATUS_INVALID_PARAMETER_3; /* Client: (handle, set_get, [mode]) */
61 }
62 #endif
63
64 CSR_API(SrvGetConsoleHardwareState)
65 {
66 #if 0
67 NTSTATUS Status;
68 PCONSOLE_GETSETHWSTATE HardwareStateRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HardwareStateRequest;
69 PCONSOLE_SCREEN_BUFFER Buff;
70 PCONSOLE Console;
71
72 Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
73 HardwareStateRequest->OutputHandle,
74 &Buff,
75 GENERIC_READ,
76 TRUE);
77 if (!NT_SUCCESS(Status))
78 {
79 DPRINT1("Failed to get console handle in SrvGetConsoleHardwareState\n");
80 return Status;
81 }
82
83 Console = Buff->Header.Console;
84 HardwareStateRequest->State = Console->HardwareState;
85
86 ConSrvReleaseScreenBuffer(Buff, TRUE);
87 return Status;
88 #else
89 UNIMPLEMENTED;
90 return STATUS_NOT_IMPLEMENTED;
91 #endif
92 }
93
94 CSR_API(SrvSetConsoleHardwareState)
95 {
96 #if 0
97 NTSTATUS Status;
98 PCONSOLE_GETSETHWSTATE HardwareStateRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HardwareStateRequest;
99 PCONSOLE_SCREEN_BUFFER Buff;
100 PCONSOLE Console;
101
102 Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
103 HardwareStateRequest->OutputHandle,
104 &Buff,
105 GENERIC_WRITE,
106 TRUE);
107 if (!NT_SUCCESS(Status))
108 {
109 DPRINT1("Failed to get console handle in SrvSetConsoleHardwareState\n");
110 return Status;
111 }
112
113 DPRINT("Setting console hardware state.\n");
114 Console = Buff->Header.Console;
115 Status = SetConsoleHardwareState(Console, HardwareStateRequest->State);
116
117 ConSrvReleaseScreenBuffer(Buff, TRUE);
118 return Status;
119 #else
120 UNIMPLEMENTED;
121 return STATUS_NOT_IMPLEMENTED;
122 #endif
123 }
124
125 CSR_API(SrvGetConsoleDisplayMode)
126 {
127 NTSTATUS Status;
128 PCONSOLE_GETDISPLAYMODE GetDisplayModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetDisplayModeRequest;
129 PCONSOLE Console;
130
131 Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
132 &Console, TRUE);
133 if (!NT_SUCCESS(Status)) return Status;
134
135 GetDisplayModeRequest->DisplayMode = ConioGetDisplayMode(Console);
136
137 ConSrvReleaseConsole(Console, TRUE);
138 return STATUS_SUCCESS;
139 }
140
141 CSR_API(SrvSetConsoleDisplayMode)
142 {
143 NTSTATUS Status;
144 PCONSOLE_SETDISPLAYMODE SetDisplayModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetDisplayModeRequest;
145 PCONSOLE Console;
146 PCONSOLE_SCREEN_BUFFER Buff;
147
148 Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
149 SetDisplayModeRequest->OutputHandle,
150 &Buff,
151 GENERIC_WRITE,
152 TRUE);
153 if (!NT_SUCCESS(Status)) return Status;
154
155 Console = Buff->Header.Console;
156
157 if (ConioSetDisplayMode(Console, SetDisplayModeRequest->DisplayMode))
158 {
159 SetDisplayModeRequest->NewSBDim = Buff->ScreenBufferSize;
160 Status = STATUS_SUCCESS;
161 }
162 else
163 {
164 Status = STATUS_INVALID_PARAMETER;
165 }
166
167 ConSrvReleaseScreenBuffer(Buff, TRUE);
168 return Status;
169 }
170
171 CSR_API(SrvGetLargestConsoleWindowSize)
172 {
173 NTSTATUS Status;
174 PCONSOLE_GETLARGESTWINDOWSIZE GetLargestWindowSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetLargestWindowSizeRequest;
175 PCONSOLE_SCREEN_BUFFER Buff;
176 PCONSOLE Console;
177
178 Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
179 GetLargestWindowSizeRequest->OutputHandle,
180 &Buff,
181 GENERIC_READ,
182 TRUE);
183 if (!NT_SUCCESS(Status)) return Status;
184
185 Console = Buff->Header.Console;
186 ConioGetLargestConsoleWindowSize(Console, &GetLargestWindowSizeRequest->Size);
187
188 ConSrvReleaseScreenBuffer(Buff, TRUE);
189 return STATUS_SUCCESS;
190 }
191
192 CSR_API(SrvShowConsoleCursor)
193 {
194 NTSTATUS Status;
195 PCONSOLE_SHOWCURSOR ShowCursorRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ShowCursorRequest;
196 PCONSOLE Console;
197 PCONSOLE_SCREEN_BUFFER Buff;
198
199 Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
200 ShowCursorRequest->OutputHandle,
201 &Buff,
202 GENERIC_WRITE,
203 TRUE);
204 if (!NT_SUCCESS(Status)) return Status;
205
206 Console = Buff->Header.Console;
207
208 ShowCursorRequest->RefCount = ConioShowMouseCursor(Console, ShowCursorRequest->Show);
209
210 ConSrvReleaseScreenBuffer(Buff, TRUE);
211 return STATUS_SUCCESS;
212 }
213
214 CSR_API(SrvSetConsoleCursor)
215 {
216 NTSTATUS Status;
217 BOOL Success;
218 PCONSOLE_SETCURSOR SetCursorRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetCursorRequest;
219 PCONSOLE Console;
220 PCONSOLE_SCREEN_BUFFER Buff;
221
222 // FIXME: Tests show that this function is used only for graphics screen buffers
223 // and otherwise it returns false + sets last error to invalid handle.
224 // NOTE: I find that behaviour is ridiculous but ok, let's accept that at the moment...
225 Status = ConSrvGetGraphicsBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
226 SetCursorRequest->OutputHandle,
227 &Buff,
228 GENERIC_WRITE,
229 TRUE);
230 if (!NT_SUCCESS(Status)) return Status;
231
232 Console = Buff->Header.Console;
233
234 Success = ConioSetMouseCursor(Console, SetCursorRequest->hCursor);
235
236 ConSrvReleaseScreenBuffer(Buff, TRUE);
237 return (Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
238 }
239
240 CSR_API(SrvConsoleMenuControl)
241 {
242 NTSTATUS Status;
243 PCONSOLE_MENUCONTROL MenuControlRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.MenuControlRequest;
244 PCONSOLE Console;
245 PCONSOLE_SCREEN_BUFFER Buff;
246
247 Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
248 MenuControlRequest->OutputHandle,
249 &Buff,
250 GENERIC_WRITE,
251 TRUE);
252 if (!NT_SUCCESS(Status)) return Status;
253
254 Console = Buff->Header.Console;
255
256 MenuControlRequest->hMenu = ConioMenuControl(Console,
257 MenuControlRequest->dwCmdIdLow,
258 MenuControlRequest->dwCmdIdHigh);
259
260 ConSrvReleaseScreenBuffer(Buff, TRUE);
261 return STATUS_SUCCESS;
262 }
263
264 CSR_API(SrvSetConsoleMenuClose)
265 {
266 NTSTATUS Status;
267 BOOL Success;
268 PCONSOLE_SETMENUCLOSE SetMenuCloseRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetMenuCloseRequest;
269 PCONSOLE Console;
270
271 Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
272 &Console, TRUE);
273 if (!NT_SUCCESS(Status)) return Status;
274
275 Success = ConioSetMenuClose(Console, SetMenuCloseRequest->Enable);
276
277 ConSrvReleaseConsole(Console, TRUE);
278 return (Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
279 }
280
281 CSR_API(SrvGetConsoleWindow)
282 {
283 NTSTATUS Status;
284 PCONSOLE_GETWINDOW GetWindowRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetWindowRequest;
285 PCONSOLE Console;
286
287 Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
288 if (!NT_SUCCESS(Status)) return Status;
289
290 GetWindowRequest->WindowHandle = ConioGetConsoleWindowHandle(Console);
291
292 ConSrvReleaseConsole(Console, TRUE);
293 return STATUS_SUCCESS;
294 }
295
296 CSR_API(SrvSetConsoleIcon)
297 {
298 NTSTATUS Status;
299 PCONSOLE_SETICON SetIconRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetIconRequest;
300 PCONSOLE Console;
301
302 Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
303 if (!NT_SUCCESS(Status)) return Status;
304
305 Status = (ConioChangeIcon(Console, SetIconRequest->WindowIcon)
306 ? STATUS_SUCCESS
307 : STATUS_UNSUCCESSFUL);
308
309 ConSrvReleaseConsole(Console, TRUE);
310 return Status;
311 }
312
313 CSR_API(SrvGetConsoleSelectionInfo)
314 {
315 NTSTATUS Status;
316 PCONSOLE_GETSELECTIONINFO GetSelectionInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetSelectionInfoRequest;
317 PCONSOLE Console;
318
319 Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
320 if (NT_SUCCESS(Status))
321 {
322 memset(&GetSelectionInfoRequest->Info, 0, sizeof(CONSOLE_SELECTION_INFO));
323 if (Console->Selection.dwFlags != 0)
324 GetSelectionInfoRequest->Info = Console->Selection;
325 ConSrvReleaseConsole(Console, TRUE);
326 }
327
328 return Status;
329 }
330
331
332
333 CSR_API(SrvGetConsoleNumberOfFonts)
334 {
335 DPRINT1("%s not yet implemented\n", __FUNCTION__);
336 return STATUS_NOT_IMPLEMENTED;
337 }
338
339 CSR_API(SrvGetConsoleFontInfo)
340 {
341 DPRINT1("%s not yet implemented\n", __FUNCTION__);
342 return STATUS_NOT_IMPLEMENTED;
343 }
344
345 CSR_API(SrvGetConsoleFontSize)
346 {
347 DPRINT1("%s not yet implemented\n", __FUNCTION__);
348 return STATUS_NOT_IMPLEMENTED;
349 }
350
351 CSR_API(SrvGetConsoleCurrentFont)
352 {
353 DPRINT1("%s not yet implemented\n", __FUNCTION__);
354 return STATUS_NOT_IMPLEMENTED;
355 }
356
357 CSR_API(SrvSetConsoleFont)
358 {
359 DPRINT1("%s not yet implemented\n", __FUNCTION__);
360 return STATUS_NOT_IMPLEMENTED;
361 }
362
363 /* EOF */