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.
34 SetConsoleHardwareState(PCONSRV_CONSOLE 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
;
61 PCONSRV_CONSOLE Console
;
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
;
91 PCONSRV_CONSOLE Console
;
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
;
120 PCONSRV_CONSOLE Console
;
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
;
136 PCONSRV_CONSOLE Console
;
137 PCONSOLE_SCREEN_BUFFER Buff
;
139 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
140 SetDisplayModeRequest
->OutputHandle
,
144 if (!NT_SUCCESS(Status
)) return Status
;
146 Console
= (PCONSRV_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
/*PCONSRV_CONSOLE*/ Console
;
167 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
;
187 PCONSOLE
/*PCONSRV_CONSOLE*/ Console
;
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
;
210 PCONSRV_CONSOLE Console
;
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
= (PCONSRV_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
;
235 PCONSRV_CONSOLE Console
;
236 PCONSOLE_SCREEN_BUFFER Buff
;
238 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
239 MenuControlRequest
->OutputHandle
,
243 if (!NT_SUCCESS(Status
)) return Status
;
245 Console
= (PCONSRV_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
;
260 PCONSRV_CONSOLE Console
;
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
;
276 PCONSRV_CONSOLE Console
;
278 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
280 if (!NT_SUCCESS(Status
)) return Status
;
282 GetWindowRequest
->WindowHandle
= TermGetConsoleWindowHandle(Console
);
284 ConSrvReleaseConsole(Console
, TRUE
);
285 return STATUS_SUCCESS
;
288 CSR_API(SrvSetConsoleIcon
)
291 PCONSOLE_SETICON SetIconRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetIconRequest
;
292 PCONSRV_CONSOLE Console
;
294 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
296 if (!NT_SUCCESS(Status
)) return Status
;
298 Status
= (TermChangeIcon(Console
, SetIconRequest
->IconHandle
)
300 : STATUS_UNSUCCESSFUL
);
302 ConSrvReleaseConsole(Console
, TRUE
);
306 CSR_API(SrvGetConsoleSelectionInfo
)
309 PCONSOLE_GETSELECTIONINFO GetSelectionInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetSelectionInfoRequest
;
310 PCONSRV_CONSOLE Console
;
312 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
314 if (!NT_SUCCESS(Status
)) return Status
;
316 Status
= (TermGetSelectionInfo(Console
, &GetSelectionInfoRequest
->Info
)
318 : STATUS_UNSUCCESSFUL
);
320 ConSrvReleaseConsole(Console
, TRUE
);
326 CSR_API(SrvGetConsoleNumberOfFonts
)
328 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
329 return STATUS_NOT_IMPLEMENTED
;
332 CSR_API(SrvGetConsoleFontInfo
)
334 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
335 return STATUS_NOT_IMPLEMENTED
;
338 CSR_API(SrvGetConsoleFontSize
)
340 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
341 return STATUS_NOT_IMPLEMENTED
;
344 CSR_API(SrvGetConsoleCurrentFont
)
346 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
347 return STATUS_NOT_IMPLEMENTED
;
350 CSR_API(SrvSetConsoleFont
)
352 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
353 return STATUS_NOT_IMPLEMENTED
;