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)
9 /* INCLUDES *******************************************************************/
16 /* PUBLIC SERVER APIS *********************************************************/
18 /**********************************************************************
19 * HardwareStateProperty
22 * Set/Get the value of the HardwareState and switch
23 * between direct video buffer ouput and GDI windowed
26 * Client hands us a CONSOLE_GETSETHWSTATE object.
27 * We use the same object to Request.
29 * ConsoleHwState has the correct size to be compatible
30 * with NT's, but values are not.
33 static NTSTATUS FASTCALL
34 SetConsoleHardwareState(PCONSOLE Console
, ULONG ConsoleHwState
)
36 DPRINT1("Console Hardware State: %d\n", ConsoleHwState
);
38 if ((CONSOLE_HARDWARE_STATE_GDI_MANAGED
== ConsoleHwState
)
39 ||(CONSOLE_HARDWARE_STATE_DIRECT
== ConsoleHwState
))
41 if (Console
->HardwareState
!= ConsoleHwState
)
43 /* TODO: implement switching from full screen to windowed mode */
44 /* TODO: or back; now simply store the hardware state */
45 Console
->HardwareState
= ConsoleHwState
;
48 return STATUS_SUCCESS
;
51 return STATUS_INVALID_PARAMETER_3
; /* Client: (handle, set_get, [mode]) */
55 CSR_API(SrvGetConsoleHardwareState
)
59 PCONSOLE_GETSETHWSTATE HardwareStateRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.HardwareStateRequest
;
60 PCONSOLE_SCREEN_BUFFER Buff
;
63 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
64 HardwareStateRequest
->OutputHandle
,
68 if (!NT_SUCCESS(Status
))
70 DPRINT1("Failed to get console handle in SrvGetConsoleHardwareState\n");
74 Console
= Buff
->Header
.Console
;
75 HardwareStateRequest
->State
= Console
->HardwareState
;
77 ConSrvReleaseScreenBuffer(Buff
, TRUE
);
81 return STATUS_NOT_IMPLEMENTED
;
85 CSR_API(SrvSetConsoleHardwareState
)
89 PCONSOLE_GETSETHWSTATE HardwareStateRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.HardwareStateRequest
;
90 PCONSOLE_SCREEN_BUFFER Buff
;
93 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
94 HardwareStateRequest
->OutputHandle
,
98 if (!NT_SUCCESS(Status
))
100 DPRINT1("Failed to get console handle in SrvSetConsoleHardwareState\n");
104 DPRINT("Setting console hardware state.\n");
105 Console
= Buff
->Header
.Console
;
106 Status
= SetConsoleHardwareState(Console
, HardwareStateRequest
->State
);
108 ConSrvReleaseScreenBuffer(Buff
, TRUE
);
112 return STATUS_NOT_IMPLEMENTED
;
116 CSR_API(SrvGetConsoleDisplayMode
)
119 PCONSOLE_GETDISPLAYMODE GetDisplayModeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetDisplayModeRequest
;
122 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
124 if (!NT_SUCCESS(Status
)) return Status
;
126 GetDisplayModeRequest
->DisplayMode
= TermGetDisplayMode(Console
);
128 ConSrvReleaseConsole(Console
, TRUE
);
129 return STATUS_SUCCESS
;
132 CSR_API(SrvSetConsoleDisplayMode
)
135 PCONSOLE_SETDISPLAYMODE SetDisplayModeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetDisplayModeRequest
;
137 PCONSOLE_SCREEN_BUFFER Buff
;
139 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
140 SetDisplayModeRequest
->OutputHandle
,
144 if (!NT_SUCCESS(Status
)) return Status
;
146 Console
= Buff
->Header
.Console
;
148 if (TermSetDisplayMode(Console
, SetDisplayModeRequest
->DisplayMode
))
150 SetDisplayModeRequest
->NewSBDim
= Buff
->ScreenBufferSize
;
151 Status
= STATUS_SUCCESS
;
155 Status
= STATUS_INVALID_PARAMETER
;
158 ConSrvReleaseScreenBuffer(Buff
, TRUE
);
162 CSR_API(SrvGetLargestConsoleWindowSize
)
165 PCONSOLE_GETLARGESTWINDOWSIZE GetLargestWindowSizeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetLargestWindowSizeRequest
;
166 PCONSOLE_SCREEN_BUFFER Buff
;
169 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
170 GetLargestWindowSizeRequest
->OutputHandle
,
174 if (!NT_SUCCESS(Status
)) return Status
;
176 Console
= Buff
->Header
.Console
;
177 TermGetLargestConsoleWindowSize(Console
, &GetLargestWindowSizeRequest
->Size
);
179 ConSrvReleaseScreenBuffer(Buff
, TRUE
);
180 return STATUS_SUCCESS
;
183 CSR_API(SrvShowConsoleCursor
)
186 PCONSOLE_SHOWCURSOR ShowCursorRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ShowCursorRequest
;
188 PCONSOLE_SCREEN_BUFFER Buff
;
190 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
191 ShowCursorRequest
->OutputHandle
,
195 if (!NT_SUCCESS(Status
)) return Status
;
197 Console
= Buff
->Header
.Console
;
199 ShowCursorRequest
->RefCount
= TermShowMouseCursor(Console
, ShowCursorRequest
->Show
);
201 ConSrvReleaseScreenBuffer(Buff
, TRUE
);
202 return STATUS_SUCCESS
;
205 CSR_API(SrvSetConsoleCursor
)
209 PCONSOLE_SETCURSOR SetCursorRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetCursorRequest
;
211 PCONSOLE_SCREEN_BUFFER Buff
;
213 // FIXME: Tests show that this function is used only for graphics screen buffers
214 // and otherwise it returns FALSE + sets last error to invalid handle.
215 // NOTE: I find that behaviour is ridiculous but ok, let's accept that at the moment...
216 Status
= ConSrvGetGraphicsBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
217 SetCursorRequest
->OutputHandle
,
221 if (!NT_SUCCESS(Status
)) return Status
;
223 Console
= Buff
->Header
.Console
;
225 Success
= TermSetMouseCursor(Console
, SetCursorRequest
->CursorHandle
);
227 ConSrvReleaseScreenBuffer(Buff
, TRUE
);
228 return (Success
? STATUS_SUCCESS
: STATUS_UNSUCCESSFUL
);
231 CSR_API(SrvConsoleMenuControl
)
234 PCONSOLE_MENUCONTROL MenuControlRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.MenuControlRequest
;
236 PCONSOLE_SCREEN_BUFFER Buff
;
238 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
239 MenuControlRequest
->OutputHandle
,
243 if (!NT_SUCCESS(Status
)) return Status
;
245 Console
= Buff
->Header
.Console
;
247 MenuControlRequest
->MenuHandle
= TermMenuControl(Console
,
248 MenuControlRequest
->CmdIdLow
,
249 MenuControlRequest
->CmdIdHigh
);
251 ConSrvReleaseScreenBuffer(Buff
, TRUE
);
252 return STATUS_SUCCESS
;
255 CSR_API(SrvSetConsoleMenuClose
)
259 PCONSOLE_SETMENUCLOSE SetMenuCloseRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetMenuCloseRequest
;
262 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
264 if (!NT_SUCCESS(Status
)) return Status
;
266 Success
= TermSetMenuClose(Console
, SetMenuCloseRequest
->Enable
);
268 ConSrvReleaseConsole(Console
, TRUE
);
269 return (Success
? STATUS_SUCCESS
: STATUS_UNSUCCESSFUL
);
272 CSR_API(SrvGetConsoleWindow
)
275 PCONSOLE_GETWINDOW GetWindowRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetWindowRequest
;
278 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
279 if (!NT_SUCCESS(Status
)) return Status
;
281 GetWindowRequest
->WindowHandle
= TermGetConsoleWindowHandle(Console
);
283 ConSrvReleaseConsole(Console
, TRUE
);
284 return STATUS_SUCCESS
;
287 CSR_API(SrvSetConsoleIcon
)
290 PCONSOLE_SETICON SetIconRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetIconRequest
;
293 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
294 if (!NT_SUCCESS(Status
)) return Status
;
296 Status
= (TermChangeIcon(Console
, SetIconRequest
->IconHandle
)
298 : STATUS_UNSUCCESSFUL
);
300 ConSrvReleaseConsole(Console
, TRUE
);
304 CSR_API(SrvGetConsoleSelectionInfo
)
307 PCONSOLE_GETSELECTIONINFO GetSelectionInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetSelectionInfoRequest
;
310 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
311 if (NT_SUCCESS(Status
))
313 memset(&GetSelectionInfoRequest
->Info
, 0, sizeof(CONSOLE_SELECTION_INFO
));
314 if (Console
->Selection
.dwFlags
!= 0)
315 GetSelectionInfoRequest
->Info
= Console
->Selection
;
316 ConSrvReleaseConsole(Console
, TRUE
);
324 CSR_API(SrvGetConsoleNumberOfFonts
)
326 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
327 return STATUS_NOT_IMPLEMENTED
;
330 CSR_API(SrvGetConsoleFontInfo
)
332 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
333 return STATUS_NOT_IMPLEMENTED
;
336 CSR_API(SrvGetConsoleFontSize
)
338 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
339 return STATUS_NOT_IMPLEMENTED
;
342 CSR_API(SrvGetConsoleCurrentFont
)
344 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
345 return STATUS_NOT_IMPLEMENTED
;
348 CSR_API(SrvSetConsoleFont
)
350 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
351 return STATUS_NOT_IMPLEMENTED
;