Author: hbelusca Date: Tue Apr 9 15:21:14 2013 New Revision: 58726
URL: http://svn.reactos.org/svn/reactos?rev=58726&view=rev Log: [KERNEL32-CONSRV] - Implement GetLargestConsoleWindowSize (and add a DPRINT to see what happens when Far 1.65 is launched). - Implement SetConsoleWindowInfo in kernel32 and pre-implement its CONSRV counterpart.
Modified: branches/ros-csrss/dll/win32/kernel32/client/console/console.c branches/ros-csrss/include/reactos/subsys/win/conmsg.h branches/ros-csrss/win32ss/user/consrv/api.h branches/ros-csrss/win32ss/user/consrv/conio.h branches/ros-csrss/win32ss/user/consrv/console.c branches/ros-csrss/win32ss/user/consrv/frontends/gui/guiterm.c branches/ros-csrss/win32ss/user/consrv/include/conio.h branches/ros-csrss/win32ss/user/consrv/init.c
Modified: branches/ros-csrss/dll/win32/kernel32/client/console/console.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/dll/win32/kernel32/cli... ============================================================================== --- branches/ros-csrss/dll/win32/kernel32/client/console/console.c [iso-8859-1] (original) +++ branches/ros-csrss/dll/win32/kernel32/client/console/console.c [iso-8859-1] Tue Apr 9 15:21:14 2013 @@ -306,6 +306,12 @@ CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETDISPLAYMODE GetDisplayModeRequest = &ApiMessage.Data.GetDisplayModeRequest;
+ if (lpModeFlags == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + // GetDisplayModeRequest->OutputHandle = hConsoleOutput;
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, @@ -357,7 +363,7 @@ /* * @implemented (Undocumented) */ -DWORD +BOOL WINAPI GetConsoleHardwareState(HANDLE hConsoleOutput, DWORD Flags, @@ -368,6 +374,12 @@ PCONSOLE_GETSETHWSTATE HardwareStateRequest = &ApiMessage.Data.HardwareStateRequest;
DPRINT1("GetConsoleHardwareState(%d, 0x%p) UNIMPLEMENTED!\n", Flags, State); + + if (State == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + }
HardwareStateRequest->OutputHandle = hConsoleOutput;
@@ -523,7 +535,7 @@
SetDisplayModeRequest->OutputHandle = hConsoleOutput; SetDisplayModeRequest->DisplayMode = dwFlags; - SetDisplayModeRequest->NewSBDim = (COORD){0,0}; + SetDisplayModeRequest->NewSBDim = (COORD){0, 0};
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, NULL, @@ -535,7 +547,9 @@ return FALSE; }
- *lpNewScreenBufferDimensions = SetDisplayModeRequest->NewSBDim; + if (lpNewScreenBufferDimensions) + *lpNewScreenBufferDimensions = SetDisplayModeRequest->NewSBDim; + return TRUE; }
@@ -1022,6 +1036,12 @@ CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &ApiMessage.Data.ConsoleModeRequest;
+ if (lpMode == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + ConsoleModeRequest->ConsoleHandle = hConsoleHandle;
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, @@ -1082,16 +1102,30 @@ /*-------------------------------------------------------------- * GetLargestConsoleWindowSize * - * @unimplemented + * @implemented */ COORD WINAPI GetLargestConsoleWindowSize(HANDLE hConsoleOutput) { - COORD Coord = {80,25}; - DPRINT1("GetLargestConsoleWindowSize(0x%x) UNIMPLEMENTED!\n", hConsoleOutput); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return Coord; + NTSTATUS Status; + CONSOLE_API_MESSAGE ApiMessage; + PCONSOLE_GETLARGESTWINDOWSIZE GetLargestWindowSizeRequest = &ApiMessage.Data.GetLargestWindowSizeRequest; + + GetLargestWindowSizeRequest->OutputHandle = hConsoleOutput; + GetLargestWindowSizeRequest->Size = (COORD){0, 0}; + + Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + NULL, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetLargestWindowSize), + sizeof(CONSOLE_GETLARGESTWINDOWSIZE)); + if (!NT_SUCCESS(Status)) + { + BaseSetLastNTError(Status); + } + + DPRINT1("GetLargestConsoleWindowSize, X = %d, Y = %d\n", GetLargestWindowSizeRequest->Size.X, GetLargestWindowSizeRequest->Size.Y); + return GetLargestWindowSizeRequest->Size; }
@@ -1390,7 +1424,7 @@ /*-------------------------------------------------------------- * SetConsoleWindowInfo * - * @unimplemented + * @implemented */ BOOL WINAPI @@ -1398,9 +1432,31 @@ BOOL bAbsolute, CONST SMALL_RECT *lpConsoleWindow) { - DPRINT1("SetConsoleWindowInfo(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", hConsoleOutput, bAbsolute, lpConsoleWindow); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + NTSTATUS Status; + CONSOLE_API_MESSAGE ApiMessage; + PCONSOLE_SETWINDOWINFO SetWindowInfoRequest = &ApiMessage.Data.SetWindowInfoRequest; + + if (lpConsoleWindow == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + SetWindowInfoRequest->OutputHandle = hConsoleOutput; + SetWindowInfoRequest->Absolute = bAbsolute; + SetWindowInfoRequest->WindowRect = *lpConsoleWindow; + + Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + NULL, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetWindowInfo), + sizeof(CONSOLE_SETWINDOWINFO)); + if (!NT_SUCCESS(Status)) + { + BaseSetLastNTError(Status); + return FALSE; + } + + return TRUE; }
Modified: branches/ros-csrss/include/reactos/subsys/win/conmsg.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/include/reactos/subsys... ============================================================================== --- branches/ros-csrss/include/reactos/subsys/win/conmsg.h [iso-8859-1] (original) +++ branches/ros-csrss/include/reactos/subsys/win/conmsg.h [iso-8859-1] Tue Apr 9 15:21:14 2013 @@ -39,11 +39,11 @@ ConsolepSetMode, ConsolepSetActiveScreenBuffer, ConsolepFlushInputBuffer, - // ConsolepGetLargestWindowSize, + ConsolepGetLargestWindowSize, ConsolepSetScreenBufferSize, ConsolepSetCursorPosition, ConsolepSetCursorInfo, - // ConsolepSetWindowInfo, + ConsolepSetWindowInfo, ConsolepScrollScreenBuffer, ConsolepSetTextAttribute, // ConsolepSetFont, @@ -455,6 +455,20 @@
typedef struct { + HANDLE OutputHandle; + COORD Size; +} CONSOLE_GETLARGESTWINDOWSIZE, *PCONSOLE_GETLARGESTWINDOWSIZE; + +typedef struct +{ + HANDLE OutputHandle; + BOOL Absolute; + SMALL_RECT WindowRect; // New console window position in the screen-buffer frame (Absolute == TRUE) + // or in the old window position frame (Absolute == FALSE). +} CONSOLE_SETWINDOWINFO, *PCONSOLE_SETWINDOWINFO; + +typedef struct +{ HWND WindowHandle; } CONSOLE_GETWINDOW, *PCONSOLE_GETWINDOW;
@@ -575,9 +589,13 @@ ULONG Reserved; union { + /* Console initialization and uninitialization */ CONSOLE_ALLOCCONSOLE AllocConsoleRequest; CONSOLE_ATTACHCONSOLE AttachConsoleRequest; CONSOLE_FREECONSOLE FreeConsoleRequest; + + /* Process list */ + CONSOLE_GETPROCESSLIST GetProcessListRequest;
/* Handles */ CONSOLE_OPENCONSOLE OpenConsoleRequest; @@ -589,7 +607,7 @@ CONSOLE_GETSETCURSORINFO CursorInfoRequest; CONSOLE_SETCURSORPOSITION SetCursorPositionRequest;
- /* Screen buffer */ + /* Screen-buffer */ CONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest; CONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest; CONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest; @@ -607,6 +625,8 @@
/* Console window */ CONSOLE_GETSETCONSOLETITLE TitleRequest; + CONSOLE_GETLARGESTWINDOWSIZE GetLargestWindowSizeRequest; + CONSOLE_SETWINDOWINFO SetWindowInfoRequest; CONSOLE_GETWINDOW GetWindowRequest; CONSOLE_SETICON SetIconRequest;
@@ -644,8 +664,6 @@
/* Input and Output Code Pages */ CONSOLE_GETSETINPUTOUTPUTCP ConsoleCPRequest; - - CONSOLE_GETPROCESSLIST GetProcessListRequest; } Data; } CONSOLE_API_MESSAGE, *PCONSOLE_API_MESSAGE;
Modified: branches/ros-csrss/win32ss/user/consrv/api.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/consrv/ap... ============================================================================== --- branches/ros-csrss/win32ss/user/consrv/api.h [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/consrv/api.h [iso-8859-1] Tue Apr 9 15:21:14 2013 @@ -52,6 +52,8 @@ CSR_API(SrvSetConsoleHardwareState); CSR_API(SrvGetConsoleDisplayMode); CSR_API(SrvSetConsoleDisplayMode); +CSR_API(SrvGetLargestConsoleWindowSize); +CSR_API(SrvSetConsoleWindowInfo); CSR_API(SrvGetConsoleWindow); CSR_API(SrvSetConsoleIcon); CSR_API(SrvGetConsoleCP);
Modified: branches/ros-csrss/win32ss/user/consrv/conio.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/consrv/co... ============================================================================== --- branches/ros-csrss/win32ss/user/consrv/conio.h [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/consrv/conio.h [iso-8859-1] Tue Apr 9 15:21:14 2013 @@ -25,6 +25,8 @@ #define ConioResizeTerminal(Console) (Console)->TermIFace.Vtbl->ResizeTerminal((Console)) #define ConioProcessKeyCallback(Console, Msg, KeyStateMenu, ShiftState, VirtualKeyCode, Down) \ (Console)->TermIFace.Vtbl->ProcessKeyCallback((Console), (Msg), (KeyStateMenu), (ShiftState), (VirtualKeyCode), (Down)) +#define ConioGetLargestConsoleWindowSize(Console, pSize) \ + (Console)->TermIFace.Vtbl->GetLargestConsoleWindowSize((Console), (pSize)) #define ConioGetConsoleWindowHandle(Console) \ (Console)->TermIFace.Vtbl->GetConsoleWindowHandle((Console)) #define ConioRefreshInternalInfo(Console) \
Modified: branches/ros-csrss/win32ss/user/consrv/console.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/consrv/co... ============================================================================== --- branches/ros-csrss/win32ss/user/consrv/console.c [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/consrv/console.c [iso-8859-1] Tue Apr 9 15:21:14 2013 @@ -1261,10 +1261,10 @@ PCONSOLE Console;
Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), - HardwareStateRequest->OutputHandle, - &Buff, - GENERIC_READ, - TRUE); + HardwareStateRequest->OutputHandle, + &Buff, + GENERIC_READ, + TRUE); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to get console handle in SrvGetConsoleHardwareState\n"); @@ -1286,10 +1286,10 @@ PCONSOLE Console;
Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), - HardwareStateRequest->OutputHandle, - &Buff, - GENERIC_WRITE, - TRUE); + HardwareStateRequest->OutputHandle, + &Buff, + GENERIC_WRITE, + TRUE); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to get console handle in SrvSetConsoleHardwareState\n"); @@ -1365,6 +1365,87 @@ return Status; }
+CSR_API(SrvGetLargestConsoleWindowSize) +{ + NTSTATUS Status; + PCONSOLE_GETLARGESTWINDOWSIZE GetLargestWindowSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetLargestWindowSizeRequest; + PCONSOLE_SCREEN_BUFFER Buff; + PCONSOLE Console; + + Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), + GetLargestWindowSizeRequest->OutputHandle, + &Buff, + GENERIC_READ, + TRUE); + if (!NT_SUCCESS(Status)) return Status; + + Console = Buff->Header.Console; + ConioGetLargestConsoleWindowSize(Console, &GetLargestWindowSizeRequest->Size); + + ConSrvReleaseScreenBuffer(Buff, TRUE); + return STATUS_SUCCESS; +} + +CSR_API(SrvSetConsoleWindowInfo) +{ +#if 0 + NTSTATUS Status; +#endif + PCONSOLE_SETWINDOWINFO SetWindowInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetWindowInfoRequest; +#if 0 + PCONSOLE_SCREEN_BUFFER Buff; + PCONSOLE Console; +#endif + SMALL_RECT WindowRect = SetWindowInfoRequest->WindowRect; + +#if 0 + Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), + SetWindowInfoRequest->OutputHandle, + &Buff, + GENERIC_READ, + TRUE); + if (!NT_SUCCESS(Status)) return Status; + + Console = Buff->Header.Console; + + if (SetWindowInfoRequest->Absolute == FALSE) + { + /* Relative positions given. Transform them to absolute ones */ + WindowRect.Left += Buff->ShowX; + WindowRect.Top += Buff->ShowY; + WindowRect.Right += Buff->ShowX + Console->ConsoleSize.X - 1; + WindowRect.Bottom += Buff->ShowY + Console->ConsoleSize.Y - 1; + } + + if ( (WindowRect.Left < 0) || (WindowRect.Top < 0) || + (WindowRect.Right > ScreenBufferSize.X) || + (WindowRect.Bottom > ScreenBufferSize.Y) || + (WindowRect.Right <= WindowRect.Left) || + (WindowRect.Bottom <= WindowRect.Top) ) + { + ConSrvReleaseScreenBuffer(Buff, TRUE); + return STATUS_INVALID_PARAMETER; + } + + Buff->ShowX = WindowRect.Left; + Buff->ShowY = WindowRect.Top; + + // These two lines are frontend-specific. + Console->ConsoleSize.X = WindowRect.Right - WindowRect.Left + 1; + Console->ConsoleSize.Y = WindowRect.Bottom - WindowRect.Top + 1; + + // ConioGetLargestConsoleWindowSize(Console, &GetLargestWindowSizeRequest->Size); + + ConSrvReleaseScreenBuffer(Buff, TRUE); + return STATUS_SUCCESS; +#else + DPRINT1("SrvSetConsoleWindowInfo(0x%08x, %d, {L%d, T%d, R%d, B%d}) UNIMPLEMENTED\n", + SetWindowInfoRequest->OutputHandle, SetWindowInfoRequest->Absolute, + WindowRect.Left, WindowRect.Top, WindowRect.Right, WindowRect.Bottom); + return STATUS_NOT_IMPLEMENTED; +#endif +} + CSR_API(SrvGetConsoleWindow) { NTSTATUS Status; @@ -1375,8 +1456,8 @@ if (!NT_SUCCESS(Status)) return Status;
GetWindowRequest->WindowHandle = ConioGetConsoleWindowHandle(Console); + ConSrvReleaseConsole(Console, TRUE); - return STATUS_SUCCESS; }
@@ -1394,7 +1475,6 @@ : STATUS_UNSUCCESSFUL);
ConSrvReleaseConsole(Console, TRUE); - return Status; }
Modified: branches/ros-csrss/win32ss/user/consrv/frontends/gui/guiterm.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/consrv/fr... ============================================================================== --- branches/ros-csrss/win32ss/user/consrv/frontends/gui/guiterm.c [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/consrv/frontends/gui/guiterm.c [iso-8859-1] Tue Apr 9 15:21:14 2013 @@ -1326,7 +1326,7 @@
if (!ConSrvValidateConsoleUnsafe(Console, CONSOLE_RUNNING, TRUE)) return;
- windx = CONGUI_MIN_WIDTH * GuiData->CharWidth + 2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE)); + windx = CONGUI_MIN_WIDTH * GuiData->CharWidth + 2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE)); windy = CONGUI_MIN_HEIGHT * GuiData->CharHeight + 2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION);
minMaxInfo->ptMinTrackSize.x = windx; @@ -2321,6 +2321,39 @@ return GuiData->hWindow; }
+static VOID WINAPI +GuiGetLargestConsoleWindowSize(PCONSOLE Console, PCOORD pSize) +{ + PGUI_CONSOLE_DATA GuiData = Console->TermIFace.Data; + HWND hDesktop; + RECT desktop; + LONG width, height; + + if (!pSize) return; + + /* + * This is one solution. Surely better solutions exist : + * http://stackoverflow.com/questions/4631292/how-detect-current-screen-resolut... + * http://www.clearevo.com/blog/programming/2011/08/30/windows_c_c++_-_get_moni... + */ + hDesktop = GetDesktopWindow(); + if (!hDesktop) return; + + GetWindowRect(hDesktop, &desktop); + + width = desktop.right; + height = desktop.bottom; + + width -= (2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE))); + height -= (2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION)); + + if (width < 0) width = 0; + if (height < 0) height = 0; + + pSize->X = (SHORT)(width / GuiData->CharWidth ); + pSize->Y = (SHORT)(height / GuiData->CharHeight); +} + static FRONTEND_VTBL GuiVtbl = { GuiCleanupConsole, @@ -2335,7 +2368,8 @@ GuiRefreshInternalInfo, GuiChangeTitle, GuiChangeIcon, - GuiGetConsoleWindowHandle + GuiGetConsoleWindowHandle, + GuiGetLargestConsoleWindowSize };
NTSTATUS FASTCALL
Modified: branches/ros-csrss/win32ss/user/consrv/include/conio.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/consrv/in... ============================================================================== --- branches/ros-csrss/win32ss/user/consrv/include/conio.h [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/consrv/include/conio.h [iso-8859-1] Tue Apr 9 15:21:14 2013 @@ -125,6 +125,8 @@ BOOL (WINAPI *ChangeIcon)(struct _CONSOLE* Console, HICON hWindowIcon); HWND (WINAPI *GetConsoleWindowHandle)(struct _CONSOLE* Console); + VOID (WINAPI *GetLargestConsoleWindowSize)(struct _CONSOLE* Console, + PCOORD pSize);
} FRONTEND_VTBL, *PFRONTEND_VTBL;
Modified: branches/ros-csrss/win32ss/user/consrv/init.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/consrv/in... ============================================================================== --- branches/ros-csrss/win32ss/user/consrv/init.c [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/consrv/init.c [iso-8859-1] Tue Apr 9 15:21:14 2013 @@ -47,11 +47,11 @@ SrvSetConsoleMode, SrvSetConsoleActiveScreenBuffer, SrvFlushConsoleInputBuffer, - // SrvGetLargestConsoleWindowSize, + SrvGetLargestConsoleWindowSize, SrvSetConsoleScreenBufferSize, SrvSetConsoleCursorPosition, SrvSetConsoleCursorInfo, - // SrvSetConsoleWindowInfo, + SrvSetConsoleWindowInfo, SrvScrollConsoleScreenBuffer, SrvSetConsoleTextAttribute, // SrvSetConsoleFont, @@ -138,11 +138,11 @@ FALSE, // SrvSetConsoleMode, FALSE, // SrvSetConsoleActiveScreenBuffer, FALSE, // SrvFlushConsoleInputBuffer, - // FALSE, // SrvGetLargestConsoleWindowSize, + FALSE, // SrvGetLargestConsoleWindowSize, FALSE, // SrvSetConsoleScreenBufferSize, FALSE, // SrvSetConsoleCursorPosition, FALSE, // SrvSetConsoleCursorInfo, - // FALSE, // SrvSetConsoleWindowInfo, + FALSE, // SrvSetConsoleWindowInfo, FALSE, // SrvScrollConsoleScreenBuffer, FALSE, // SrvSetConsoleTextAttribute, // FALSE, // SrvSetConsoleFont, @@ -229,11 +229,11 @@ "SetConsoleMode", "SetConsoleActiveScreenBuffer", "FlushConsoleInputBuffer", - // "GetLargestConsoleWindowSize", + "GetLargestConsoleWindowSize", "SetConsoleScreenBufferSize", "SetConsoleCursorPosition", "SetConsoleCursorInfo", - // "SetConsoleWindowInfo", + "SetConsoleWindowInfo", "ScrollConsoleScreenBuffer", "SetConsoleTextAttribute", // "SetConsoleFont",