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 *******************************************************************/
12 #include "include/conio.h"
13 #include "include/conio2.h"
14 #include "conoutput.h"
22 /* PRIVATE FUNCTIONS **********************************************************/
25 /* PUBLIC SERVER APIS *********************************************************/
27 /**********************************************************************
28 * HardwareStateProperty
31 * Set/Get the value of the HardwareState and switch
32 * between direct video buffer ouput and GDI windowed
35 * Client hands us a CONSOLE_GETSETHWSTATE object.
36 * We use the same object to Request.
38 * ConsoleHwState has the correct size to be compatible
39 * with NT's, but values are not.
42 static NTSTATUS FASTCALL
43 SetConsoleHardwareState(PCONSOLE Console
, ULONG ConsoleHwState
)
45 DPRINT1("Console Hardware State: %d\n", ConsoleHwState
);
47 if ((CONSOLE_HARDWARE_STATE_GDI_MANAGED
== ConsoleHwState
)
48 ||(CONSOLE_HARDWARE_STATE_DIRECT
== ConsoleHwState
))
50 if (Console
->HardwareState
!= ConsoleHwState
)
52 /* TODO: implement switching from full screen to windowed mode */
53 /* TODO: or back; now simply store the hardware state */
54 Console
->HardwareState
= ConsoleHwState
;
57 return STATUS_SUCCESS
;
60 return STATUS_INVALID_PARAMETER_3
; /* Client: (handle, set_get, [mode]) */
64 CSR_API(SrvGetConsoleHardwareState
)
68 PCONSOLE_GETSETHWSTATE HardwareStateRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.HardwareStateRequest
;
69 PCONSOLE_SCREEN_BUFFER Buff
;
72 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
73 HardwareStateRequest
->OutputHandle
,
77 if (!NT_SUCCESS(Status
))
79 DPRINT1("Failed to get console handle in SrvGetConsoleHardwareState\n");
83 Console
= Buff
->Header
.Console
;
84 HardwareStateRequest
->State
= Console
->HardwareState
;
86 ConSrvReleaseScreenBuffer(Buff
, TRUE
);
90 return STATUS_NOT_IMPLEMENTED
;
94 CSR_API(SrvSetConsoleHardwareState
)
98 PCONSOLE_GETSETHWSTATE HardwareStateRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.HardwareStateRequest
;
99 PCONSOLE_SCREEN_BUFFER Buff
;
102 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
103 HardwareStateRequest
->OutputHandle
,
107 if (!NT_SUCCESS(Status
))
109 DPRINT1("Failed to get console handle in SrvSetConsoleHardwareState\n");
113 DPRINT("Setting console hardware state.\n");
114 Console
= Buff
->Header
.Console
;
115 Status
= SetConsoleHardwareState(Console
, HardwareStateRequest
->State
);
117 ConSrvReleaseScreenBuffer(Buff
, TRUE
);
121 return STATUS_NOT_IMPLEMENTED
;
125 CSR_API(SrvGetConsoleDisplayMode
)
128 PCONSOLE_GETDISPLAYMODE GetDisplayModeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetDisplayModeRequest
;
131 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
133 if (!NT_SUCCESS(Status
)) return Status
;
135 GetDisplayModeRequest
->DisplayMode
= ConioGetDisplayMode(Console
);
137 ConSrvReleaseConsole(Console
, TRUE
);
138 return STATUS_SUCCESS
;
141 CSR_API(SrvSetConsoleDisplayMode
)
144 PCONSOLE_SETDISPLAYMODE SetDisplayModeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetDisplayModeRequest
;
146 PCONSOLE_SCREEN_BUFFER Buff
;
148 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
149 SetDisplayModeRequest
->OutputHandle
,
153 if (!NT_SUCCESS(Status
)) return Status
;
155 Console
= Buff
->Header
.Console
;
157 if (ConioSetDisplayMode(Console
, SetDisplayModeRequest
->DisplayMode
))
159 SetDisplayModeRequest
->NewSBDim
= Buff
->ScreenBufferSize
;
160 Status
= STATUS_SUCCESS
;
164 Status
= STATUS_INVALID_PARAMETER
;
167 ConSrvReleaseScreenBuffer(Buff
, TRUE
);
171 CSR_API(SrvGetLargestConsoleWindowSize
)
174 PCONSOLE_GETLARGESTWINDOWSIZE GetLargestWindowSizeRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetLargestWindowSizeRequest
;
175 PCONSOLE_SCREEN_BUFFER Buff
;
178 Status
= ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
179 GetLargestWindowSizeRequest
->OutputHandle
,
183 if (!NT_SUCCESS(Status
)) return Status
;
185 Console
= Buff
->Header
.Console
;
186 ConioGetLargestConsoleWindowSize(Console
, &GetLargestWindowSizeRequest
->Size
);
188 ConSrvReleaseScreenBuffer(Buff
, TRUE
);
189 return STATUS_SUCCESS
;
192 CSR_API(SrvShowConsoleCursor
)
195 PCONSOLE_SHOWCURSOR ShowCursorRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ShowCursorRequest
;
197 PCONSOLE_SCREEN_BUFFER Buff
;
199 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
200 ShowCursorRequest
->OutputHandle
,
204 if (!NT_SUCCESS(Status
)) return Status
;
206 Console
= Buff
->Header
.Console
;
208 ShowCursorRequest
->RefCount
= ConioShowMouseCursor(Console
, ShowCursorRequest
->Show
);
210 ConSrvReleaseScreenBuffer(Buff
, TRUE
);
211 return STATUS_SUCCESS
;
214 CSR_API(SrvSetConsoleCursor
)
218 PCONSOLE_SETCURSOR SetCursorRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetCursorRequest
;
220 PCONSOLE_SCREEN_BUFFER Buff
;
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
,
230 if (!NT_SUCCESS(Status
)) return Status
;
232 Console
= Buff
->Header
.Console
;
234 Success
= ConioSetMouseCursor(Console
, SetCursorRequest
->hCursor
);
236 ConSrvReleaseScreenBuffer(Buff
, TRUE
);
237 return (Success
? STATUS_SUCCESS
: STATUS_UNSUCCESSFUL
);
240 CSR_API(SrvConsoleMenuControl
)
243 PCONSOLE_MENUCONTROL MenuControlRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.MenuControlRequest
;
245 PCONSOLE_SCREEN_BUFFER Buff
;
247 Status
= ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
248 MenuControlRequest
->OutputHandle
,
252 if (!NT_SUCCESS(Status
)) return Status
;
254 Console
= Buff
->Header
.Console
;
256 MenuControlRequest
->hMenu
= ConioMenuControl(Console
,
257 MenuControlRequest
->dwCmdIdLow
,
258 MenuControlRequest
->dwCmdIdHigh
);
260 ConSrvReleaseScreenBuffer(Buff
, TRUE
);
261 return STATUS_SUCCESS
;
264 CSR_API(SrvSetConsoleMenuClose
)
268 PCONSOLE_SETMENUCLOSE SetMenuCloseRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetMenuCloseRequest
;
271 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
273 if (!NT_SUCCESS(Status
)) return Status
;
275 Success
= ConioSetMenuClose(Console
, SetMenuCloseRequest
->Enable
);
277 ConSrvReleaseConsole(Console
, TRUE
);
278 return (Success
? STATUS_SUCCESS
: STATUS_UNSUCCESSFUL
);
281 CSR_API(SrvGetConsoleWindow
)
284 PCONSOLE_GETWINDOW GetWindowRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetWindowRequest
;
287 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
288 if (!NT_SUCCESS(Status
)) return Status
;
290 GetWindowRequest
->WindowHandle
= ConioGetConsoleWindowHandle(Console
);
292 ConSrvReleaseConsole(Console
, TRUE
);
293 return STATUS_SUCCESS
;
296 CSR_API(SrvSetConsoleIcon
)
299 PCONSOLE_SETICON SetIconRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.SetIconRequest
;
302 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
303 if (!NT_SUCCESS(Status
)) return Status
;
305 Status
= (ConioChangeIcon(Console
, SetIconRequest
->WindowIcon
)
307 : STATUS_UNSUCCESSFUL
);
309 ConSrvReleaseConsole(Console
, TRUE
);
313 CSR_API(SrvGetConsoleSelectionInfo
)
316 PCONSOLE_GETSELECTIONINFO GetSelectionInfoRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetSelectionInfoRequest
;
319 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
320 if (NT_SUCCESS(Status
))
322 memset(&GetSelectionInfoRequest
->Info
, 0, sizeof(CONSOLE_SELECTION_INFO
));
323 if (Console
->Selection
.dwFlags
!= 0)
324 GetSelectionInfoRequest
->Info
= Console
->Selection
;
325 ConSrvReleaseConsole(Console
, TRUE
);
333 CSR_API(SrvGetConsoleNumberOfFonts
)
335 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
336 return STATUS_NOT_IMPLEMENTED
;
339 CSR_API(SrvGetConsoleFontInfo
)
341 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
342 return STATUS_NOT_IMPLEMENTED
;
345 CSR_API(SrvGetConsoleFontSize
)
347 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
348 return STATUS_NOT_IMPLEMENTED
;
351 CSR_API(SrvGetConsoleCurrentFont
)
353 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
354 return STATUS_NOT_IMPLEMENTED
;
357 CSR_API(SrvSetConsoleFont
)
359 DPRINT1("%s not yet implemented\n", __FUNCTION__
);
360 return STATUS_NOT_IMPLEMENTED
;