diff --git a/win32ss/user/winsrv/consrv/condrv/console.c b/win32ss/user/winsrv/consrv/condrv/console.c index e763a812553..a3d7a13ea79 100644 --- a/win32ss/user/winsrv/consrv/condrv/console.c +++ b/win32ss/user/winsrv/consrv/condrv/console.c @@ -79,24 +79,21 @@ RemoveConsole(IN PCONSOLE Console) VOID NTAPI ConDrvPause(PCONSOLE Console) { - /* In case we already have a pause event, just exit... */ - if (Console->UnpauseEvent) return; + /* In case we are already paused, just exit... */ + if (Console->ConsolePaused) return; - /* ... otherwise create it */ - NtCreateEvent(&Console->UnpauseEvent, EVENT_ALL_ACCESS, - NULL, NotificationEvent, FALSE); + /* ... otherwise set the flag */ + Console->ConsolePaused = TRUE; } VOID NTAPI ConDrvUnpause(PCONSOLE Console) { - /* In case we already freed the event, just exit... */ - if (!Console->UnpauseEvent) return; + /* In case we are already unpaused, just exit... */ + if (!Console->ConsolePaused) return; - /* ... otherwise set and free it */ - NtSetEvent(Console->UnpauseEvent, NULL); - NtClose(Console->UnpauseEvent); - Console->UnpauseEvent = NULL; + /* ... otherwise reset the flag */ + Console->ConsolePaused = FALSE; } @@ -248,7 +245,7 @@ ConDrvInitConsole(OUT PCONSOLE* NewConsole, } /* Make the new screen buffer active */ Console->ActiveBuffer = NewBuffer; - Console->UnpauseEvent = NULL; + Console->ConsolePaused = FALSE; DPRINT("Console initialized\n"); @@ -409,7 +406,7 @@ ConDrvDeleteConsole(IN PCONSOLE Console) /* Deinitialize the input buffer */ ConDrvDeinitInputBuffer(Console); - if (Console->UnpauseEvent) NtClose(Console->UnpauseEvent); + Console->ConsolePaused = FALSE; DPRINT("ConDrvDeleteConsole - Unlocking\n"); LeaveCriticalSection(&Console->Lock); diff --git a/win32ss/user/winsrv/consrv/condrv/dummyterm.c b/win32ss/user/winsrv/consrv/condrv/dummyterm.c index 7261994f6c9..eaeb94561c7 100644 --- a/win32ss/user/winsrv/consrv/condrv/dummyterm.c +++ b/win32ss/user/winsrv/consrv/condrv/dummyterm.c @@ -61,7 +61,7 @@ DummyWriteStream(IN OUT PTERMINAL This, */ // /* Stop here if the console is paused */ - // if (Console->UnpauseEvent != NULL) return STATUS_PENDING; + // if (Console->ConsolePaused) return STATUS_PENDING; return STATUS_PENDING; } diff --git a/win32ss/user/winsrv/consrv/condrv/graphics.c b/win32ss/user/winsrv/consrv/condrv/graphics.c index 04341c6b663..694c2f52106 100644 --- a/win32ss/user/winsrv/consrv/condrv/graphics.c +++ b/win32ss/user/winsrv/consrv/condrv/graphics.c @@ -228,7 +228,6 @@ GRAPHICS_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer, } NewBuffer->ViewOrigin.X = NewBuffer->ViewOrigin.Y = 0; - NewBuffer->VirtualY = 0; NewBuffer->CursorBlinkOn = FALSE; NewBuffer->ForceCursorOff = TRUE; diff --git a/win32ss/user/winsrv/consrv/condrv/text.c b/win32ss/user/winsrv/consrv/condrv/text.c index d38317de29a..2b568652ec2 100644 --- a/win32ss/user/winsrv/consrv/condrv/text.c +++ b/win32ss/user/winsrv/consrv/condrv/text.c @@ -793,7 +793,7 @@ ConDrvWriteConsole(IN PCONSOLE Console, ASSERT((StringBuffer != NULL) || (StringBuffer == NULL && NumCharsToWrite == 0)); /* Stop here if the console is paused */ - if (Console->UnpauseEvent != NULL) return STATUS_PENDING; + if (Console->ConsolePaused) return STATUS_PENDING; /* Convert the string to UNICODE */ if (Unicode) diff --git a/win32ss/user/winsrv/consrv/coninput.c b/win32ss/user/winsrv/consrv/coninput.c index d8f5b24d9db..8c2e0e82adb 100644 --- a/win32ss/user/winsrv/consrv/coninput.c +++ b/win32ss/user/winsrv/consrv/coninput.c @@ -202,6 +202,31 @@ ConioProcessInputEvent(PCONSRV_CONSOLE Console, PINPUT_RECORD InputEvent) { ULONG NumEventsWritten; + + if (InputEvent->EventType == KEY_EVENT) + { + BOOL Down = InputEvent->Event.KeyEvent.bKeyDown; + UINT VirtualKeyCode = InputEvent->Event.KeyEvent.wVirtualKeyCode; + DWORD ShiftState = InputEvent->Event.KeyEvent.dwControlKeyState; + + /* Process Ctrl-C and Ctrl-Break */ + if ( (GetConsoleInputBufferMode(Console) & ENABLE_PROCESSED_INPUT) && + Down && (VirtualKeyCode == VK_PAUSE || VirtualKeyCode == 'C') && + (ShiftState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) ) + { + DPRINT1("Console_Api Ctrl-C\n"); + ConSrvConsoleProcessCtrlEvent(Console, 0, CTRL_C_EVENT); + + if (Console->LineBuffer && !Console->LineComplete) + { + /* Line input is in progress; end it */ + Console->LinePos = Console->LineSize = 0; + Console->LineComplete = TRUE; + } + return STATUS_SUCCESS; // STATUS_CONTROL_C_EXIT; + } + } + return ConioAddInputEvents(Console, InputEvent, 1, diff --git a/win32ss/user/winsrv/consrv/conoutput.c b/win32ss/user/winsrv/consrv/conoutput.c index 15fd4ff5ede..173926032ed 100644 --- a/win32ss/user/winsrv/consrv/conoutput.c +++ b/win32ss/user/winsrv/consrv/conoutput.c @@ -206,7 +206,7 @@ CSR_API(SrvCreateConsoleScreenBuffer) TEXTMODE_BUFFER_INFO TextModeInfo = {{80, 25}, {80, 25}, DEFAULT_SCREEN_ATTRIB, - DEFAULT_POPUP_ATTRIB , + DEFAULT_POPUP_ATTRIB, TRUE, CSR_DEFAULT_CURSOR_SIZE}; GRAPHICS_BUFFER_INFO GraphicsInfo; diff --git a/win32ss/user/winsrv/consrv/console.c b/win32ss/user/winsrv/consrv/console.c index 8b50465bfad..f838376204d 100644 --- a/win32ss/user/winsrv/consrv/console.c +++ b/win32ss/user/winsrv/consrv/console.c @@ -240,14 +240,14 @@ ConsoleFreeUnicodeString(IN PUNICODE_STRING UnicodeString) } VOID -ConioPause(PCONSRV_CONSOLE Console, UINT Flags) +ConioPause(PCONSRV_CONSOLE Console, UCHAR Flags) { Console->PauseFlags |= Flags; ConDrvPause((PCONSOLE)Console); } VOID -ConioUnpause(PCONSRV_CONSOLE Console, UINT Flags) +ConioUnpause(PCONSRV_CONSOLE Console, UCHAR Flags) { Console->PauseFlags &= ~Flags; diff --git a/win32ss/user/winsrv/consrv/frontends/input.c b/win32ss/user/winsrv/consrv/frontends/input.c index 8bc0ad0ffae..053e2006efb 100644 --- a/win32ss/user/winsrv/consrv/frontends/input.c +++ b/win32ss/user/winsrv/consrv/frontends/input.c @@ -34,17 +34,20 @@ ConioGetShiftState(PBYTE KeyState, LPARAM lParam) ssOut |= SCROLLLOCK_ON; if (KeyState[VK_SHIFT] & 0x80) + // || (KeyState[VK_LSHIFT] & 0x80) || (KeyState[VK_RSHIFT] & 0x80) ssOut |= SHIFT_PRESSED; if (KeyState[VK_LCONTROL] & 0x80) ssOut |= LEFT_CTRL_PRESSED; if (KeyState[VK_RCONTROL] & 0x80) ssOut |= RIGHT_CTRL_PRESSED; + // if (KeyState[VK_CONTROL] & 0x80) { ... } if (KeyState[VK_LMENU] & 0x80) ssOut |= LEFT_ALT_PRESSED; if (KeyState[VK_RMENU] & 0x80) ssOut |= RIGHT_ALT_PRESSED; + // if (KeyState[VK_MENU] & 0x80) { ... } /* See WM_CHAR MSDN documentation for instance */ if (lParam & 0x01000000) @@ -124,23 +127,6 @@ ConioProcessKey(PCONSRV_CONSOLE Console, MSG* msg) if (Fake) return; - /* Process Ctrl-C and Ctrl-Break */ - if ( (GetConsoleInputBufferMode(Console) & ENABLE_PROCESSED_INPUT) && - Down && (VirtualKeyCode == VK_PAUSE || VirtualKeyCode == 'C') && - (ShiftState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED) || KeyState[VK_CONTROL] & 0x80) ) - { - DPRINT1("Console_Api Ctrl-C\n"); - ConSrvConsoleProcessCtrlEvent(Console, 0, CTRL_C_EVENT); - - if (Console->LineBuffer && !Console->LineComplete) - { - /* Line input is in progress; end it */ - Console->LinePos = Console->LineSize = 0; - Console->LineComplete = TRUE; - } - return; - } - // // FIXME: Scrolling via keyboard shortcuts must be done differently, // without touching the internal VirtualY variable. diff --git a/win32ss/user/winsrv/consrv/include/conio.h b/win32ss/user/winsrv/consrv/include/conio.h index cff5de40975..dc68afc4898 100644 --- a/win32ss/user/winsrv/consrv/include/conio.h +++ b/win32ss/user/winsrv/consrv/include/conio.h @@ -93,8 +93,6 @@ struct _CONSOLE_SCREEN_BUFFER COORD ViewOrigin; /* Beginning offset for the actual display area */ /***** Put that VV in TEXTMODE_SCREEN_BUFFER ?? *****/ - USHORT VirtualY; /* Top row of buffer being displayed, reported to callers */ - COORD CursorPosition; /* Current cursor position */ BOOLEAN CursorBlinkOn; BOOLEAN ForceCursorOff; @@ -152,6 +150,7 @@ typedef struct _TEXTMODE_SCREEN_BUFFER { CONSOLE_SCREEN_BUFFER; /* Screen buffer base class - MUST BE IN FIRST PLACE */ + USHORT VirtualY; /* Top row of buffer being displayed, reported to callers */ PCHAR_INFO Buffer; /* Pointer to UNICODE screen buffer (Buffer->Char.UnicodeChar only is valid, not Char.AsciiChar) */ USHORT ScreenDefaultAttrib; /* Default screen char attribute */ @@ -333,7 +332,7 @@ typedef struct _CONSOLE CONSOLE_STATE State; /* State of the console */ TERMINAL TermIFace; /* Terminal-specific interface */ - HANDLE UnpauseEvent; /* When != NULL, event for pausing the console */ + BOOLEAN ConsolePaused; /* If TRUE, the console is paused */ /******************************** Input buffer ********************************/ CONSOLE_INPUT_BUFFER InputBuffer; /* Input buffer of the console */ @@ -367,7 +366,7 @@ ConSrvConsoleCtrlEvent(IN ULONG CtrlEvent, /* conoutput.c */ PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y); -NTSTATUS ConioResizeBuffer(PCONSOLE /*PCONSRV_CONSOLE*/ Console, +NTSTATUS ConioResizeBuffer(PCONSOLE Console, PTEXTMODE_SCREEN_BUFFER ScreenBuffer, COORD Size); diff --git a/win32ss/user/winsrv/consrv/include/conio_winsrv.h b/win32ss/user/winsrv/consrv/include/conio_winsrv.h index 5057a31e4ad..a77bfcb0d39 100644 --- a/win32ss/user/winsrv/consrv/include/conio_winsrv.h +++ b/win32ss/user/winsrv/consrv/include/conio_winsrv.h @@ -152,7 +152,7 @@ typedef struct _WINSRV_CONSOLE BOOLEAN HasFocus; /* TRUE if the console has focus (is in the foreground) */ /******************************* Pausing support ******************************/ - BYTE PauseFlags; + UCHAR PauseFlags; LIST_ENTRY ReadWaitQueue; /* List head for the queue of unique input buffer read wait blocks */ LIST_ENTRY WriteWaitQueue; /* List head for the queue of current screen-buffer write wait blocks */ @@ -197,8 +197,8 @@ typedef struct _WINSRV_CONSOLE } WINSRV_CONSOLE; // , *PWINSRV_CONSOLE; /* console.c */ -VOID ConioPause(PCONSRV_CONSOLE Console, UINT Flags); -VOID ConioUnpause(PCONSRV_CONSOLE Console, UINT Flags); +VOID ConioPause(PCONSRV_CONSOLE Console, UCHAR Flags); +VOID ConioUnpause(PCONSRV_CONSOLE Console, UCHAR Flags); PCONSOLE_PROCESS_DATA NTAPI ConSrvGetConsoleLeaderProcess(IN PCONSRV_CONSOLE Console); @@ -227,7 +227,7 @@ ConioProcessInputEvent(PCONSRV_CONSOLE Console, /* conoutput.c */ PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y); -NTSTATUS ConioResizeBuffer(PCONSOLE /*PCONSRV_CONSOLE*/ Console, +NTSTATUS ConioResizeBuffer(PCONSOLE Console, PTEXTMODE_SCREEN_BUFFER ScreenBuffer, COORD Size);