Author: hbelusca Date: Mon Apr 1 00:23:34 2013 New Revision: 58632
URL: http://svn.reactos.org/svn/reactos?rev=58632&view=rev Log: [KERNEL32-CONSRV] Implement (Get/Set)ConsoleDisplayMode.
[PSDK] Reorganize wincon.h a little bit and add few new flags from MSDN / Wine's wincon.h (which was up-to-date compared to ours) and from https://sites.google.com/site/marckupper/utilities/setconsolemode (the ENABLE_AUTO_POSITION flag which happens to be set by default for consoles on Windows Vista+).
[CONSRV] - Fix the implementation of Srv(Get/Set)ConsoleMode. - Try to fix some mouse handling problems. - Add a TEMPORARY HACK!!!! to circumvent one of the many bugs we have in user32/win32k concerning handling right-mouse clicks on windows titlebars. The comment: /* * HACK: !! Because, when we deal with WM_RBUTTON* and we do not * call after that DefWindowProc, on ReactOS, right-clicks on the * (non-client) application title-bar does not display the system * menu and does not trigger a WM_NCRBUTTONUP message too. * See: http://git.reactos.org/?p=reactos.git;a=blob;f=reactos/win32ss/user/user32/w... * and line 1135 too. */
Tested with Far Manager 3 (TM)
Happy Easter !!
Modified: branches/ros-csrss/dll/win32/kernel32/client/console/console.c branches/ros-csrss/include/psdk/wincon.h branches/ros-csrss/include/reactos/subsys/win/conmsg.h branches/ros-csrss/win32ss/user/consrv/conio.h branches/ros-csrss/win32ss/user/consrv/conoutput.c branches/ros-csrss/win32ss/user/consrv/console.c branches/ros-csrss/win32ss/user/consrv/consrv.h branches/ros-csrss/win32ss/user/consrv/frontends/gui/guisettings.c branches/ros-csrss/win32ss/user/consrv/frontends/gui/guiterm.c 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] Mon Apr 1 00:23:34 2013 @@ -296,22 +296,30 @@
/* - * @unimplemented - */ -INT -WINAPI -GetConsoleDisplayMode(LPDWORD lpdwMode) - /* - * FUNCTION: Get the console display mode - * ARGUMENTS: - * lpdwMode - Address of variable that receives the current value - * of display mode - * STATUS: Undocumented - */ -{ - DPRINT1("GetConsoleDisplayMode(0x%x) UNIMPLEMENTED!\n", lpdwMode); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + * @implemented + */ +BOOL +WINAPI +GetConsoleDisplayMode(LPDWORD lpModeFlags) +{ + NTSTATUS Status; + CONSOLE_API_MESSAGE ApiMessage; + PCONSOLE_GETDISPLAYMODE GetDisplayModeRequest = &ApiMessage.Data.GetDisplayModeRequest; + + // GetDisplayModeRequest->OutputHandle = hConsoleOutput; + + Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + NULL, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetDisplayMode), + sizeof(CONSOLE_GETDISPLAYMODE)); + if (!NT_SUCCESS(Status)) + { + BaseSetLastNTError(Status); + return FALSE; + } + + *lpModeFlags = GetDisplayModeRequest->DisplayMode; + return TRUE; }
@@ -359,6 +367,8 @@ CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETSETHWSTATE HardwareStateRequest = &ApiMessage.Data.HardwareStateRequest;
+ DPRINT1("GetConsoleHardwareState(%d, 0x%p) UNIMPLEMENTED!\n", Flags, State); + HardwareStateRequest->OutputHandle = hConsoleOutput;
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, @@ -499,24 +509,34 @@
/* - * @unimplemented - */ -BOOL -WINAPI -SetConsoleDisplayMode(HANDLE hOut, - DWORD dwNewMode, - PCOORD lpdwOldMode) - /* - * FUNCTION: Set the console display mode. - * ARGUMENTS: - * hOut - Standard output handle. - * dwNewMode - New mode. - * lpdwOldMode - Address of a variable that receives the old mode. - */ -{ - DPRINT1("SetConsoleDisplayMode(0x%x, 0x%x, 0x%p) UNIMPLEMENTED!\n", hOut, dwNewMode, lpdwOldMode); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + * @implemented + */ +BOOL +WINAPI +SetConsoleDisplayMode(HANDLE hConsoleOutput, + DWORD dwFlags, + PCOORD lpNewScreenBufferDimensions) +{ + NTSTATUS Status; + CONSOLE_API_MESSAGE ApiMessage; + PCONSOLE_SETDISPLAYMODE SetDisplayModeRequest = &ApiMessage.Data.SetDisplayModeRequest; + + SetDisplayModeRequest->OutputHandle = hConsoleOutput; + SetDisplayModeRequest->DisplayMode = dwFlags; + SetDisplayModeRequest->NewSBDim = (COORD){0,0}; + + Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + NULL, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetDisplayMode), + sizeof(CONSOLE_SETDISPLAYMODE)); + if (!NT_SUCCESS(Status)) + { + BaseSetLastNTError(Status); + return FALSE; + } + + *lpNewScreenBufferDimensions = SetDisplayModeRequest->NewSBDim; + return TRUE; }
@@ -546,6 +566,8 @@ NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETSETHWSTATE HardwareStateRequest = &ApiMessage.Data.HardwareStateRequest; + + DPRINT1("SetConsoleHardwareState(%d, %d) UNIMPLEMENTED!\n", Flags, State);
HardwareStateRequest->OutputHandle = hConsoleOutput; HardwareStateRequest->State = State; @@ -1144,7 +1166,7 @@ PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &ApiMessage.Data.ConsoleModeRequest;
ConsoleModeRequest->ConsoleHandle = hConsoleHandle; - ConsoleModeRequest->ConsoleMode = dwMode; + ConsoleModeRequest->ConsoleMode = dwMode;
Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, NULL,
Modified: branches/ros-csrss/include/psdk/wincon.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/include/psdk/wincon.h?... ============================================================================== --- branches/ros-csrss/include/psdk/wincon.h [iso-8859-1] (original) +++ branches/ros-csrss/include/psdk/wincon.h [iso-8859-1] Mon Apr 1 00:23:34 2013 @@ -15,16 +15,43 @@ #endif
/* + * Special PID for parent process for AttachConsole API + */ +#if (_WIN32_WINNT >= 0x0501) +#define ATTACH_PARENT_PROCESS ((DWORD)-1) +#endif + +/* + * Console display modes + */ +#define CONSOLE_FULLSCREEN 1 +#define CONSOLE_FULLSCREEN_HARDWARE 2 +#if (_WIN32_WINNT >= 0x0600) +#define CONSOLE_OVERSTRIKE 1 +#endif + +#define CONSOLE_FULLSCREEN_MODE 1 +#define CONSOLE_WINDOWED_MODE 2 + +/* * Color attributes for text and screen background */ -#define FOREGROUND_BLUE 0x0001 -#define FOREGROUND_GREEN 0x0002 -#define FOREGROUND_RED 0x0004 -#define FOREGROUND_INTENSITY 0x0008 -#define BACKGROUND_BLUE 0x0010 -#define BACKGROUND_GREEN 0x0020 -#define BACKGROUND_RED 0x0040 -#define BACKGROUND_INTENSITY 0x0080 +#define FOREGROUND_BLUE 0x0001 +#define FOREGROUND_GREEN 0x0002 +#define FOREGROUND_RED 0x0004 +#define FOREGROUND_INTENSITY 0x0008 +#define BACKGROUND_BLUE 0x0010 +#define BACKGROUND_GREEN 0x0020 +#define BACKGROUND_RED 0x0040 +#define BACKGROUND_INTENSITY 0x0080 + +#define COMMON_LVB_LEADING_BYTE 0x0100 +#define COMMON_LVB_TRAILING_BYTE 0x0200 +#define COMMON_LVB_GRID_HORIZONTAL 0x0400 +#define COMMON_LVB_GRID_LVERTICAL 0x0800 +#define COMMON_LVB_GRID_RVERTICAL 0x1000 +#define COMMON_LVB_REVERSE_VIDEO 0x4000 +#define COMMON_LVB_UNDERSCORE 0x8000
/* * Control handler codes @@ -38,20 +65,39 @@ /* * Input mode flags */ -#define ENABLE_PROCESSED_INPUT 0x0001 -#define ENABLE_LINE_INPUT 0x0002 -#define ENABLE_ECHO_INPUT 0x0004 -#define ENABLE_WINDOW_INPUT 0x0008 -#define ENABLE_MOUSE_INPUT 0x0010 -#define ENABLE_INSERT_MODE 0x0020 -#define ENABLE_QUICK_EDIT_MODE 0x0040 -#define ENABLE_EXTENDED_FLAGS 0x0080 +#define ENABLE_PROCESSED_INPUT 0x0001 +#define ENABLE_LINE_INPUT 0x0002 +#define ENABLE_ECHO_INPUT 0x0004 +#define ENABLE_WINDOW_INPUT 0x0008 +#define ENABLE_MOUSE_INPUT 0x0010 +#define ENABLE_INSERT_MODE 0x0020 +#define ENABLE_QUICK_EDIT_MODE 0x0040 +#define ENABLE_EXTENDED_FLAGS 0x0080 +#if (_WIN32_WINNT >= 0x0600) +#define ENABLE_AUTO_POSITION 0x0100 +#endif
/* * Output mode flags */ -#define ENABLE_PROCESSED_OUTPUT 0x0001 -#define ENABLE_WRAP_AT_EOL_OUTPUT 0x0002 +#define ENABLE_PROCESSED_OUTPUT 0x0001 +#define ENABLE_WRAP_AT_EOL_OUTPUT 0x0002 + +/* + * Console selection flags + */ +#define CONSOLE_NO_SELECTION 0x0000 +#define CONSOLE_SELECTION_IN_PROGRESS 0x0001 +#define CONSOLE_SELECTION_NOT_EMPTY 0x0002 +#define CONSOLE_MOUSE_SELECTION 0x0004 +#define CONSOLE_MOUSE_DOWN 0x0008 + +/* + * History duplicate flags + */ +#if (_WIN32_WINNT >= 0x0600) +#define HISTORY_NO_DUP_FLAG 0x0001 +#endif
/* * Event types @@ -102,53 +148,53 @@ } CONSOLE_READCONSOLE_CONTROL, *PCONSOLE_READCONSOLE_CONTROL;
typedef struct _CHAR_INFO { - union { - WCHAR UnicodeChar; - CHAR AsciiChar; - } Char; - WORD Attributes; + union { + WCHAR UnicodeChar; + CHAR AsciiChar; + } Char; + WORD Attributes; } CHAR_INFO,*PCHAR_INFO; typedef struct _SMALL_RECT { - SHORT Left; - SHORT Top; - SHORT Right; - SHORT Bottom; + SHORT Left; + SHORT Top; + SHORT Right; + SHORT Bottom; } SMALL_RECT,*PSMALL_RECT; typedef struct _CONSOLE_CURSOR_INFO { - DWORD dwSize; - BOOL bVisible; + DWORD dwSize; + BOOL bVisible; } CONSOLE_CURSOR_INFO,*PCONSOLE_CURSOR_INFO; typedef struct _COORD { - SHORT X; - SHORT Y; + SHORT X; + SHORT Y; } COORD, *PCOORD; typedef struct _CONSOLE_SELECTION_INFO { - DWORD dwFlags; - COORD dwSelectionAnchor; - SMALL_RECT srSelection; + DWORD dwFlags; + COORD dwSelectionAnchor; + SMALL_RECT srSelection; } CONSOLE_SELECTION_INFO, *PCONSOLE_SELECTION_INFO; typedef struct _CONSOLE_FONT_INFO { - DWORD nFont; - COORD dwFontSize; + DWORD nFont; + COORD dwFontSize; } CONSOLE_FONT_INFO, *PCONSOLE_FONT_INFO; typedef struct _CONSOLE_SCREEN_BUFFER_INFO { - COORD dwSize; - COORD dwCursorPosition; - WORD wAttributes; - SMALL_RECT srWindow; - COORD dwMaximumWindowSize; + COORD dwSize; + COORD dwCursorPosition; + WORD wAttributes; + SMALL_RECT srWindow; + COORD dwMaximumWindowSize; } CONSOLE_SCREEN_BUFFER_INFO,*PCONSOLE_SCREEN_BUFFER_INFO; typedef BOOL(CALLBACK *PHANDLER_ROUTINE)(_In_ DWORD); typedef struct _KEY_EVENT_RECORD { - BOOL bKeyDown; - WORD wRepeatCount; - WORD wVirtualKeyCode; - WORD wVirtualScanCode; - union { - WCHAR UnicodeChar; - CHAR AsciiChar; - } uChar; - DWORD dwControlKeyState; + BOOL bKeyDown; + WORD wRepeatCount; + WORD wVirtualKeyCode; + WORD wVirtualScanCode; + union { + WCHAR UnicodeChar; + CHAR AsciiChar; + } uChar; + DWORD dwControlKeyState; } #ifdef __GNUC__ /* gcc's alignment is not what win32 expects */ @@ -156,29 +202,26 @@ #endif KEY_EVENT_RECORD; typedef struct _MOUSE_EVENT_RECORD { - COORD dwMousePosition; - DWORD dwButtonState; - DWORD dwControlKeyState; - DWORD dwEventFlags; + COORD dwMousePosition; + DWORD dwButtonState; + DWORD dwControlKeyState; + DWORD dwEventFlags; } MOUSE_EVENT_RECORD; typedef struct _WINDOW_BUFFER_SIZE_RECORD { COORD dwSize; } WINDOW_BUFFER_SIZE_RECORD; typedef struct _MENU_EVENT_RECORD { UINT dwCommandId; } MENU_EVENT_RECORD,*PMENU_EVENT_RECORD; typedef struct _FOCUS_EVENT_RECORD { BOOL bSetFocus; } FOCUS_EVENT_RECORD; typedef struct _INPUT_RECORD { - WORD EventType; - union { - KEY_EVENT_RECORD KeyEvent; - MOUSE_EVENT_RECORD MouseEvent; - WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent; - MENU_EVENT_RECORD MenuEvent; - FOCUS_EVENT_RECORD FocusEvent; - } Event; + WORD EventType; + union { + KEY_EVENT_RECORD KeyEvent; + MOUSE_EVENT_RECORD MouseEvent; + WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent; + MENU_EVENT_RECORD MenuEvent; + FOCUS_EVENT_RECORD FocusEvent; + } Event; } INPUT_RECORD,*PINPUT_RECORD;
#if (_WIN32_WINNT >= 0x0600) -#define HISTORY_NO_DUP_FLAG 0x1 -#define CONSOLE_OVERSTRIKE 0x1 - typedef struct _CONSOLE_HISTORY_INFO { UINT cbSize; UINT HistoryBufferSize; @@ -212,7 +255,6 @@ BOOL WINAPI AllocConsole(VOID);
#if (_WIN32_WINNT >= 0x0501) -#define ATTACH_PARENT_PROCESS (DWORD)-1 BOOL WINAPI AttachConsole(_In_ DWORD);
BOOL WINAPI AddConsoleAliasA(_In_ LPCSTR, _In_ LPCSTR, _In_ LPCSTR); @@ -294,7 +336,7 @@
#if (_WIN32_WINNT >= 0x0500) HWND WINAPI GetConsoleWindow(VOID); -WINBASEAPI BOOL APIENTRY GetConsoleDisplayMode(_Out_ LPDWORD lpModeFlags); +BOOL APIENTRY GetConsoleDisplayMode(_Out_ LPDWORD lpModeFlags); BOOL APIENTRY SetConsoleDisplayMode(_In_ HANDLE hConsoleOutput, _In_ DWORD dwFlags, _Out_opt_ PCOORD lpNewScreenBufferDimensions); #endif COORD WINAPI GetLargestConsoleWindowSize(_In_ HANDLE); @@ -438,10 +480,6 @@ _In_ COORD dwWriteCoord, _Out_ LPDWORD lpNumberOfCharsWritten);
-#define CONSOLE_FULLSCREEN 1 -#define CONSOLE_FULLSCREEN_HARDWARE 2 -#define CONSOLE_FULLSCREEN_MODE 1 -#define CONSOLE_WINDOWED_MODE 2
#ifdef UNICODE #define AddConsoleAlias AddConsoleAliasW
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] Mon Apr 1 00:23:34 2013 @@ -66,11 +66,11 @@ // ConsolepShowCursor, // ConsolepMenuControl, // ConsolepSetPalette, - // ConsolepSetDisplayMode, + ConsolepSetDisplayMode, // ConsolepRegisterVDM, ConsolepGetHardwareState, ConsolepSetHardwareState, - // ConsolepGetDisplayMode, + ConsolepGetDisplayMode, ConsolepAddAlias, ConsolepGetAlias, ConsolepGetAliasesLength, @@ -236,6 +236,34 @@ DWORD ConsoleMode; } CONSOLE_GETSETCONSOLEMODE, *PCONSOLE_GETSETCONSOLEMODE;
+ +#define CONSOLE_WINDOWED 0 /* Internal console hardware state */ +typedef struct +{ + // HANDLE OutputHandle; + DWORD DisplayMode; +} CONSOLE_GETDISPLAYMODE, *PCONSOLE_GETDISPLAYMODE; + +typedef struct +{ + HANDLE OutputHandle; + DWORD DisplayMode; + COORD NewSBDim; +} CONSOLE_SETDISPLAYMODE, *PCONSOLE_SETDISPLAYMODE; + +/* + * Console hardware states. + */ +#define CONSOLE_HARDWARE_STATE_GDI_MANAGED 0 +#define CONSOLE_HARDWARE_STATE_DIRECT 1 + +typedef struct +{ + HANDLE OutputHandle; + DWORD State; +} CONSOLE_GETSETHWSTATE, *PCONSOLE_GETSETHWSTATE; + + typedef struct { HANDLE OutputHandle; /* Handle to newly created screen buffer */ @@ -425,18 +453,6 @@ } CONSOLE_OPENCONSOLE, *PCONSOLE_OPENCONSOLE;
-/* - * Console hardware states. - */ -#define CONSOLE_HARDWARE_STATE_GDI_MANAGED 0 -#define CONSOLE_HARDWARE_STATE_DIRECT 1 - -typedef struct -{ - HANDLE OutputHandle; - DWORD State; -} CONSOLE_GETSETHWSTATE, *PCONSOLE_GETSETHWSTATE; - typedef struct { HWND WindowHandle; @@ -585,6 +601,8 @@
/* Console mode */ CONSOLE_GETSETCONSOLEMODE ConsoleModeRequest; + CONSOLE_GETDISPLAYMODE GetDisplayModeRequest; + CONSOLE_SETDISPLAYMODE SetDisplayModeRequest; CONSOLE_GETSETHWSTATE HardwareStateRequest;
/* Console window */
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] Mon Apr 1 00:23:34 2013 @@ -54,6 +54,7 @@ WORD ScreenDefaultAttrib; /* Default screen char attribute */ WORD PopupDefaultAttrib; /* Default popup char attribute */ USHORT Mode; + ULONG DisplayMode; } CONSOLE_SCREEN_BUFFER, *PCONSOLE_SCREEN_BUFFER;
typedef struct _CONSOLE_INPUT_BUFFER @@ -198,8 +199,7 @@ HANDLE UnpauseEvent; LIST_ENTRY WriteWaitQueue; /* List head for the queue of write wait blocks */
- DWORD HardwareState; /* _GDI_MANAGED, _DIRECT */ -/* BOOLEAN */ ULONG FullScreen; // Give the type of console: GUI (windowed) or TUI (fullscreen) + ULONG HardwareState; /* _GDI_MANAGED, _DIRECT */
/**************************** Aliases and Histories ***************************/ struct _ALIAS_HEADER *Aliases; @@ -216,16 +216,6 @@ COLORREF Colors[16]; /* Colour palette */
} CONSOLE, *PCONSOLE; - -/* CONSOLE_SELECTION_INFO dwFlags values */ -#define CONSOLE_NO_SELECTION 0x0 -#define CONSOLE_SELECTION_IN_PROGRESS 0x1 -#define CONSOLE_SELECTION_NOT_EMPTY 0x2 -#define CONSOLE_MOUSE_SELECTION 0x4 -#define CONSOLE_MOUSE_DOWN 0x8 - -/* HistoryFlags values */ -#define HISTORY_NO_DUP_FLAG 0x1
/* PauseFlags values (internal only) */ #define PAUSED_FROM_KEYBOARD 0x1 @@ -274,6 +264,7 @@ IN COORD ScreenBufferSize, IN USHORT ScreenAttrib, IN USHORT PopupAttrib, + IN ULONG DisplayMode, IN BOOLEAN IsCursorVisible, IN ULONG CursorSize); VOID WINAPI ConioDeleteScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer);
Modified: branches/ros-csrss/win32ss/user/consrv/conoutput.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/consrv/co... ============================================================================== --- branches/ros-csrss/win32ss/user/consrv/conoutput.c [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/consrv/conoutput.c [iso-8859-1] Mon Apr 1 00:23:34 2013 @@ -65,6 +65,7 @@ IN COORD ScreenBufferSize, IN USHORT ScreenAttrib, IN USHORT PopupAttrib, + IN ULONG DisplayMode, IN BOOLEAN IsCursorVisible, IN ULONG CursorSize) { @@ -103,8 +104,10 @@ { ClearLineBuffer(*Buffer); } + (*Buffer)->CursorPosition = (COORD){0, 0}; + (*Buffer)->Mode = ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT; - (*Buffer)->CursorPosition = (COORD){0, 0}; + (*Buffer)->DisplayMode = DisplayMode;
InsertHeadList(&Console->BufferList, &(*Buffer)->ListEntry); return STATUS_SUCCESS; @@ -1273,6 +1276,7 @@ COORD ScreenBufferSize = (COORD){80, 25}; USHORT ScreenAttrib = DEFAULT_SCREEN_ATTRIB; USHORT PopupAttrib = DEFAULT_POPUP_ATTRIB; + ULONG DisplayMode = CONSOLE_WINDOWED_MODE; BOOLEAN IsCursorVisible = TRUE; ULONG CursorSize = CSR_DEFAULT_CURSOR_SIZE;
@@ -1314,6 +1318,7 @@ { ScreenAttrib = Console->ActiveBuffer->ScreenDefaultAttrib; PopupAttrib = Console->ActiveBuffer->PopupDefaultAttrib; + DisplayMode = Console->ActiveBuffer->DisplayMode;
IsCursorVisible = Console->ActiveBuffer->CursorInfo.bVisible; CursorSize = Console->ActiveBuffer->CursorInfo.dwSize; @@ -1325,6 +1330,7 @@ ScreenBufferSize, ScreenAttrib, PopupAttrib, + DisplayMode, IsCursorVisible, CursorSize); if (NT_SUCCESS(Status))
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] Mon Apr 1 00:23:34 2013 @@ -391,6 +391,7 @@ /* if (ConsoleStartInfo->dwStartupFlags & STARTF_RUNFULLSCREEN) { + ConsoleInfo.FullScreen = TRUE; } */ } @@ -422,9 +423,8 @@ return STATUS_UNSUCCESSFUL; }
- // TODO: Use the values from ConsoleInfo. - Console->InputBuffer.Mode = ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | - ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT; + Console->InputBuffer.Mode = ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT | + ENABLE_ECHO_INPUT | ENABLE_MOUSE_INPUT; Console->QuickEdit = ConsoleInfo.QuickEdit; Console->InsertMode = ConsoleInfo.InsertMode; InitializeListHead(&Console->InputBuffer.ReadWaitQueue); @@ -440,6 +440,8 @@ ConsoleInfo.ScreenBufferSize, ConsoleInfo.ScreenAttrib, ConsoleInfo.PopupAttrib, + (ConsoleInfo.FullScreen ? CONSOLE_FULLSCREEN_MODE + : CONSOLE_WINDOWED_MODE), TRUE, ConsoleInfo.CursorSize); if (!NT_SUCCESS(Status)) @@ -452,7 +454,6 @@ } /* Make the new screen buffer active */ Console->ActiveBuffer = NewBuffer; - Console->FullScreen = ConsoleInfo.FullScreen; InitializeListHead(&Console->WriteWaitQueue);
/* @@ -1010,19 +1011,96 @@
CSR_API(SrvSetConsoleMode) { -#define CONSOLE_INPUT_MODE_VALID ( ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT | \ - ENABLE_ECHO_INPUT | ENABLE_WINDOW_INPUT | \ - ENABLE_MOUSE_INPUT | \ - ENABLE_INSERT_MODE | ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS ) -#define CONSOLE_OUTPUT_MODE_VALID ( ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT ) - +#define CONSOLE_VALID_CONTROL_MODES ( ENABLE_EXTENDED_FLAGS | ENABLE_INSERT_MODE | ENABLE_QUICK_EDIT_MODE ) +#define CONSOLE_VALID_INPUT_MODES ( ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT | \ + ENABLE_ECHO_INPUT | ENABLE_WINDOW_INPUT | \ + ENABLE_MOUSE_INPUT ) +#define CONSOLE_VALID_OUTPUT_MODES ( ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT ) + + NTSTATUS Status; + PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleModeRequest; + DWORD ConsoleMode = ConsoleModeRequest->ConsoleMode; + Object_t* Object = NULL; + + Status = ConSrvGetObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process), + ConsoleModeRequest->ConsoleHandle, + &Object, NULL, GENERIC_WRITE, TRUE, 0); + if (!NT_SUCCESS(Status)) return Status; + + Status = STATUS_SUCCESS; + + if (CONIO_INPUT_BUFFER_MAGIC == Object->Type) + { + PCONSOLE_INPUT_BUFFER InputBuffer = (PCONSOLE_INPUT_BUFFER)Object; + PCONSOLE Console = InputBuffer->Header.Console; + + DPRINT("SetConsoleMode(Input, %d)\n", ConsoleMode); + + /* + * 1. Only the presence of valid mode flags is allowed. + */ + if (ConsoleMode & ~(CONSOLE_VALID_INPUT_MODES | CONSOLE_VALID_CONTROL_MODES)) + { + Status = STATUS_INVALID_PARAMETER; + goto Quit; + } + + /* + * 2. If we use control mode flags without ENABLE_EXTENDED_FLAGS, + * then consider the flags invalid. + * + if ( (ConsoleMode & CONSOLE_VALID_CONTROL_MODES) && + (ConsoleMode & ENABLE_EXTENDED_FLAGS) == 0 ) + { + Status = STATUS_INVALID_PARAMETER; + goto Quit; + } + */ + + /* + * 3. Now we can continue. + */ + if (ConsoleMode & CONSOLE_VALID_CONTROL_MODES) + { + Console->QuickEdit = !!(ConsoleMode & ENABLE_QUICK_EDIT_MODE); + Console->InsertMode = !!(ConsoleMode & ENABLE_INSERT_MODE); + } + InputBuffer->Mode = (ConsoleMode & CONSOLE_VALID_INPUT_MODES); + } + else if (CONIO_SCREEN_BUFFER_MAGIC == Object->Type) + { + PCONSOLE_SCREEN_BUFFER Buffer = (PCONSOLE_SCREEN_BUFFER)Object; + + DPRINT("SetConsoleMode(Output, %d)\n", ConsoleMode); + + if (ConsoleMode & ~CONSOLE_VALID_OUTPUT_MODES) + { + Status = STATUS_INVALID_PARAMETER; + } + else + { + Buffer->Mode = (ConsoleMode & CONSOLE_VALID_OUTPUT_MODES); + } + } + else + { + Status = STATUS_INVALID_HANDLE; + } + +Quit: + ConSrvReleaseObject(Object, TRUE); + return Status; +} + +CSR_API(SrvGetConsoleMode) +{ NTSTATUS Status; PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleModeRequest; Object_t* Object = NULL;
Status = ConSrvGetObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process), - ConsoleModeRequest->ConsoleHandle, - &Object, NULL, GENERIC_WRITE, TRUE, 0); + ConsoleModeRequest->ConsoleHandle, + &Object, NULL, GENERIC_READ, TRUE, 0); if (!NT_SUCCESS(Status)) return Status;
Status = STATUS_SUCCESS; @@ -1030,39 +1108,19 @@ if (CONIO_INPUT_BUFFER_MAGIC == Object->Type) { PCONSOLE_INPUT_BUFFER InputBuffer = (PCONSOLE_INPUT_BUFFER)Object; - InputBuffer->Mode = ConsoleModeRequest->ConsoleMode & CONSOLE_INPUT_MODE_VALID; - } - else if (CONIO_SCREEN_BUFFER_MAGIC == Object->Type) - { - PCONSOLE_SCREEN_BUFFER Buffer = (PCONSOLE_SCREEN_BUFFER)Object; - Buffer->Mode = ConsoleModeRequest->ConsoleMode & CONSOLE_OUTPUT_MODE_VALID; - } - else - { - Status = STATUS_INVALID_HANDLE; - } - - ConSrvReleaseObject(Object, TRUE); - return Status; -} - -CSR_API(SrvGetConsoleMode) -{ - NTSTATUS Status; - PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleModeRequest; - Object_t* Object = NULL; - - Status = ConSrvGetObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process), - ConsoleModeRequest->ConsoleHandle, - &Object, NULL, GENERIC_READ, TRUE, 0); - if (!NT_SUCCESS(Status)) return Status; - - Status = STATUS_SUCCESS; - - if (CONIO_INPUT_BUFFER_MAGIC == Object->Type) - { - PCONSOLE_INPUT_BUFFER InputBuffer = (PCONSOLE_INPUT_BUFFER)Object; - ConsoleModeRequest->ConsoleMode = InputBuffer->Mode; + PCONSOLE Console = InputBuffer->Header.Console; + DWORD ConsoleMode = InputBuffer->Mode; + + if (Console->QuickEdit || Console->InsertMode) + { + // Windows does this, even if it's not documented on MSDN + ConsoleMode |= ENABLE_EXTENDED_FLAGS; + + if (Console->QuickEdit ) ConsoleMode |= ENABLE_QUICK_EDIT_MODE; + if (Console->InsertMode) ConsoleMode |= ENABLE_INSERT_MODE; + } + + ConsoleModeRequest->ConsoleMode = ConsoleMode; } else if (CONIO_SCREEN_BUFFER_MAGIC == Object->Type) { @@ -1181,7 +1239,7 @@ * with NT's, but values are not. */ static NTSTATUS FASTCALL -SetConsoleHardwareState(PCONSOLE Console, DWORD ConsoleHwState) +SetConsoleHardwareState(PCONSOLE Console, ULONG ConsoleHwState) { DPRINT1("Console Hardware State: %d\n", ConsoleHwState);
@@ -1223,7 +1281,6 @@ HardwareStateRequest->State = Console->HardwareState;
ConSrvReleaseScreenBuffer(Buff, TRUE); - return Status; }
@@ -1237,7 +1294,7 @@ Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), HardwareStateRequest->OutputHandle, &Buff, - GENERIC_READ, + GENERIC_WRITE, TRUE); if (!NT_SUCCESS(Status)) { @@ -1250,7 +1307,67 @@ Status = SetConsoleHardwareState(Console, HardwareStateRequest->State);
ConSrvReleaseScreenBuffer(Buff, TRUE); - + return Status; +} + +CSR_API(SrvGetConsoleDisplayMode) +{ + NTSTATUS Status; + PCONSOLE_GETDISPLAYMODE GetDisplayModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetDisplayModeRequest; + PCONSOLE Console; + ULONG DisplayMode = 0; + + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), + &Console, TRUE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to get console handle in SrvGetConsoleDisplayMode\n"); + return Status; + } + + if (Console->ActiveBuffer->DisplayMode & CONSOLE_FULLSCREEN_MODE) + DisplayMode |= CONSOLE_FULLSCREEN_HARDWARE; // CONSOLE_FULLSCREEN + else if (Console->ActiveBuffer->DisplayMode & CONSOLE_WINDOWED_MODE) + DisplayMode |= CONSOLE_WINDOWED; + + GetDisplayModeRequest->DisplayMode = DisplayMode; + Status = STATUS_SUCCESS; + + ConSrvReleaseConsole(Console, TRUE); + return Status; +} + +CSR_API(SrvSetConsoleDisplayMode) +{ + NTSTATUS Status; + PCONSOLE_SETDISPLAYMODE SetDisplayModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetDisplayModeRequest; + PCONSOLE_SCREEN_BUFFER Buff; + + Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), + SetDisplayModeRequest->OutputHandle, + &Buff, + GENERIC_WRITE, + TRUE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to get console handle in SrvSetConsoleDisplayMode\n"); + return Status; + } + + if (SetDisplayModeRequest->DisplayMode & ~(CONSOLE_FULLSCREEN_MODE | CONSOLE_WINDOWED_MODE)) + { + Status = STATUS_INVALID_PARAMETER; + } + else + { + Buff->DisplayMode = SetDisplayModeRequest->DisplayMode; + // TODO: Change the display mode + SetDisplayModeRequest->NewSBDim = Buff->ScreenBufferSize; + + Status = STATUS_SUCCESS; + } + + ConSrvReleaseScreenBuffer(Buff, TRUE); return Status; }
Modified: branches/ros-csrss/win32ss/user/consrv/consrv.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/consrv/co... ============================================================================== --- branches/ros-csrss/win32ss/user/consrv/consrv.h [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/consrv/consrv.h [iso-8859-1] Mon Apr 1 00:23:34 2013 @@ -151,6 +151,8 @@ CSR_API(SrvGetConsoleTitle); CSR_API(SrvGetConsoleHardwareState); CSR_API(SrvSetConsoleHardwareState); +CSR_API(SrvGetConsoleDisplayMode); +CSR_API(SrvSetConsoleDisplayMode); CSR_API(SrvGetConsoleWindow); CSR_API(SrvSetConsoleIcon); CSR_API(SrvGetConsoleCP);
Modified: branches/ros-csrss/win32ss/user/consrv/frontends/gui/guisettings.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/consrv/fr... ============================================================================== --- branches/ros-csrss/win32ss/user/consrv/frontends/gui/guisettings.c [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/consrv/frontends/gui/guisettings.c [iso-8859-1] Mon Apr 1 00:23:34 2013 @@ -281,7 +281,7 @@ pSharedInfo->ci.HistoryBufferSize = Console->HistoryBufferSize; pSharedInfo->ci.NumberOfHistoryBuffers = Console->NumberOfHistoryBuffers; pSharedInfo->ci.HistoryNoDup = Console->HistoryNoDup; - pSharedInfo->ci.FullScreen = Console->FullScreen; + pSharedInfo->ci.FullScreen = !!(Console->ActiveBuffer->DisplayMode & CONSOLE_FULLSCREEN_MODE); pSharedInfo->ci.QuickEdit = Console->QuickEdit; pSharedInfo->ci.InsertMode = Console->InsertMode; pSharedInfo->ci.InputBufferSize = 0;
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] Mon Apr 1 00:23:34 2013 @@ -15,6 +15,8 @@ #include "guiterm.h" #include "guisettings.h" #include "resource.h" + +#include <windowsx.h>
#define NDEBUG #include <debug.h> @@ -876,12 +878,12 @@ static LRESULT GuiConsoleHandleMouse(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM lParam) { - LRESULT Ret = TRUE; + BOOL Err = FALSE; PCONSOLE Console = GuiData->Console;
if (!ConSrvValidateConsoleUnsafe(Console, CONSOLE_RUNNING, TRUE)) { - Ret = FALSE; + Err = TRUE; goto Quit; }
@@ -943,7 +945,7 @@ }
default: - Ret = FALSE; + Err = TRUE; break; } } @@ -958,31 +960,37 @@ switch (msg) { case WM_LBUTTONDOWN: + SetCapture(GuiData->hWindow); dwButtonState = FROM_LEFT_1ST_BUTTON_PRESSED; dwEventFlags = 0; break;
case WM_MBUTTONDOWN: + SetCapture(GuiData->hWindow); dwButtonState = FROM_LEFT_2ND_BUTTON_PRESSED; dwEventFlags = 0; break;
case WM_RBUTTONDOWN: + SetCapture(GuiData->hWindow); dwButtonState = RIGHTMOST_BUTTON_PRESSED; dwEventFlags = 0; break;
case WM_LBUTTONUP: + ReleaseCapture(); dwButtonState = 0; dwEventFlags = 0; break;
case WM_MBUTTONUP: + ReleaseCapture(); dwButtonState = 0; dwEventFlags = 0; break;
case WM_RBUTTONUP: + ReleaseCapture(); dwButtonState = 0; dwEventFlags = 0; break; @@ -1018,11 +1026,11 @@ break;
default: - Ret = FALSE; + Err = TRUE; break; }
- if (Ret) + if (!Err) { if (wKeyState & MK_LBUTTON) dwButtonState |= FROM_LEFT_1ST_BUTTON_PRESSED; @@ -1060,14 +1068,18 @@ ConioProcessInputEvent(Console, &er); } } + else + { + Err = TRUE; + }
LeaveCriticalSection(&Console->Lock);
Quit: - if (!Ret) - Ret = DefWindowProcW(GuiData->hWindow, msg, wParam, lParam); - - return Ret; + if (Err) + return DefWindowProcW(GuiData->hWindow, msg, wParam, lParam); + else + return 0; }
static VOID @@ -1473,6 +1485,50 @@ break; }
+ case WM_NCRBUTTONDOWN: + { + DPRINT("WM_NCRBUTTONDOWN\n"); + /* + * HACK: !! Because, when we deal with WM_RBUTTON* and we do not + * call after that DefWindowProc, on ReactOS, right-clicks on the + * (non-client) application title-bar does not display the system + * menu and does not trigger a WM_NCRBUTTONUP message too. + * See: http://git.reactos.org/?p=reactos.git;a=blob;f=reactos/win32ss/user/user32/w... + * and line 1135 too. + */ + if (DefWindowProcW(hWnd, WM_NCHITTEST, 0, lParam) == HTCAPTION) + return DefWindowProcW(hWnd, WM_CONTEXTMENU, wParam, lParam); + else + goto Default; + } + // case WM_NCRBUTTONUP: + // DPRINT1("WM_NCRBUTTONUP\n"); + // goto Default; + + case WM_CONTEXTMENU: + { + if (DefWindowProcW(hWnd /*GuiData->hWindow*/, WM_NCHITTEST, 0, lParam) == HTCLIENT) + { + HMENU hMenu = CreatePopupMenu(); + if (hMenu != NULL) + { + GuiConsoleAppendMenuItems(hMenu, GuiConsoleEditMenuItems); + TrackPopupMenuEx(hMenu, + TPM_RIGHTBUTTON, + GET_X_LPARAM(lParam), + GET_Y_LPARAM(lParam), + hWnd, + NULL); + DestroyMenu(hMenu); + } + break; + } + else + { + goto Default; + } + } + case WM_SYSCOMMAND: { Result = GuiConsoleHandleSysMenuCommand(GuiData, wParam, lParam); @@ -1483,6 +1539,22 @@ case WM_VSCROLL: { Result = GuiConsoleHandleScroll(GuiData, msg, wParam); + break; + } + + case WM_SETFOCUS: + case WM_KILLFOCUS: + { + Console = GuiData->Console; // Not NULL because checked in GuiGetGuiData. + if (ConSrvValidateConsoleUnsafe(Console, CONSOLE_RUNNING, TRUE)) + { + INPUT_RECORD er; + er.EventType = FOCUS_EVENT; + er.Event.FocusEvent.bSetFocus = (msg == WM_SETFOCUS); + ConioProcessInputEvent(Console, &er); + + LeaveCriticalSection(&Console->Lock); + } break; }
@@ -1514,7 +1586,7 @@ // SetWindowText(GuiData->hWindow, GuiData->Console->Title.Buffer); // break;
- default: + default: Default: Result = DefWindowProcW(hWnd, msg, wParam, lParam); break; } @@ -1725,7 +1797,7 @@ wc.cbSize = sizeof(WNDCLASSEXW); wc.lpszClassName = GUI_CONSOLE_WINDOW_CLASS; wc.lpfnWndProc = GuiConsoleWndProc; - wc.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; + wc.style = CS_DBLCLKS /* | CS_HREDRAW | CS_VREDRAW */; wc.hInstance = ConSrvDllInstance; wc.hIcon = ghDefaultIcon; wc.hIconSm = ghDefaultIconSm; @@ -2207,6 +2279,7 @@ /* if (ConsoleStartInfo->dwStartupFlags & STARTF_RUNFULLSCREEN) { + ConsoleInfo.FullScreen = TRUE; } */ }
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] Mon Apr 1 00:23:34 2013 @@ -73,11 +73,11 @@ // SrvShowConsoleCursor, // SrvConsoleMenuControl, // SrvSetConsolePalette, - // SrvSetConsoleDisplayMode, + SrvSetConsoleDisplayMode, // SrvRegisterConsoleVDM, SrvGetConsoleHardwareState, SrvSetConsoleHardwareState, - // SrvGetConsoleDisplayMode, + SrvGetConsoleDisplayMode, SrvAddConsoleAlias, SrvGetConsoleAlias, SrvGetConsoleAliasesLength, @@ -164,11 +164,11 @@ // FALSE, // SrvShowConsoleCursor, // FALSE, // SrvConsoleMenuControl, // FALSE, // SrvSetConsolePalette, - // FALSE, // SrvSetConsoleDisplayMode, + FALSE, // SrvSetConsoleDisplayMode, // FALSE, // SrvRegisterConsoleVDM, FALSE, // SrvGetConsoleHardwareState, FALSE, // SrvSetConsoleHardwareState, - // TRUE, // SrvGetConsoleDisplayMode, + TRUE, // SrvGetConsoleDisplayMode, FALSE, // SrvAddConsoleAlias, FALSE, // SrvGetConsoleAlias, FALSE, // SrvGetConsoleAliasesLength, @@ -255,11 +255,11 @@ // "ShowConsoleCursor", // "ConsoleMenuControl", // "SetConsolePalette", - // "SetConsoleDisplayMode", + "SetConsoleDisplayMode", // "RegisterConsoleVDM", "GetConsoleHardwareState", "SetConsoleHardwareState", - // "GetConsoleDisplayMode", + "GetConsoleDisplayMode", "AddConsoleAlias", "GetConsoleAlias", "GetConsoleAliasesLength",