[CONSRV] Some code simplification and tidy up.

This commit is contained in:
Hermès Bélusca-Maïto 2020-03-01 17:22:05 +01:00
parent 31c13e89fe
commit 7babd93107
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
10 changed files with 50 additions and 44 deletions

View file

@ -79,24 +79,21 @@ RemoveConsole(IN PCONSOLE Console)
VOID NTAPI VOID NTAPI
ConDrvPause(PCONSOLE Console) ConDrvPause(PCONSOLE Console)
{ {
/* In case we already have a pause event, just exit... */ /* In case we are already paused, just exit... */
if (Console->UnpauseEvent) return; if (Console->ConsolePaused) return;
/* ... otherwise create it */ /* ... otherwise set the flag */
NtCreateEvent(&Console->UnpauseEvent, EVENT_ALL_ACCESS, Console->ConsolePaused = TRUE;
NULL, NotificationEvent, FALSE);
} }
VOID NTAPI VOID NTAPI
ConDrvUnpause(PCONSOLE Console) ConDrvUnpause(PCONSOLE Console)
{ {
/* In case we already freed the event, just exit... */ /* In case we are already unpaused, just exit... */
if (!Console->UnpauseEvent) return; if (!Console->ConsolePaused) return;
/* ... otherwise set and free it */ /* ... otherwise reset the flag */
NtSetEvent(Console->UnpauseEvent, NULL); Console->ConsolePaused = FALSE;
NtClose(Console->UnpauseEvent);
Console->UnpauseEvent = NULL;
} }
@ -248,7 +245,7 @@ ConDrvInitConsole(OUT PCONSOLE* NewConsole,
} }
/* Make the new screen buffer active */ /* Make the new screen buffer active */
Console->ActiveBuffer = NewBuffer; Console->ActiveBuffer = NewBuffer;
Console->UnpauseEvent = NULL; Console->ConsolePaused = FALSE;
DPRINT("Console initialized\n"); DPRINT("Console initialized\n");
@ -409,7 +406,7 @@ ConDrvDeleteConsole(IN PCONSOLE Console)
/* Deinitialize the input buffer */ /* Deinitialize the input buffer */
ConDrvDeinitInputBuffer(Console); ConDrvDeinitInputBuffer(Console);
if (Console->UnpauseEvent) NtClose(Console->UnpauseEvent); Console->ConsolePaused = FALSE;
DPRINT("ConDrvDeleteConsole - Unlocking\n"); DPRINT("ConDrvDeleteConsole - Unlocking\n");
LeaveCriticalSection(&Console->Lock); LeaveCriticalSection(&Console->Lock);

View file

@ -61,7 +61,7 @@ DummyWriteStream(IN OUT PTERMINAL This,
*/ */
// /* Stop here if the console is paused */ // /* Stop here if the console is paused */
// if (Console->UnpauseEvent != NULL) return STATUS_PENDING; // if (Console->ConsolePaused) return STATUS_PENDING;
return STATUS_PENDING; return STATUS_PENDING;
} }

View file

@ -228,7 +228,6 @@ GRAPHICS_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
} }
NewBuffer->ViewOrigin.X = NewBuffer->ViewOrigin.Y = 0; NewBuffer->ViewOrigin.X = NewBuffer->ViewOrigin.Y = 0;
NewBuffer->VirtualY = 0;
NewBuffer->CursorBlinkOn = FALSE; NewBuffer->CursorBlinkOn = FALSE;
NewBuffer->ForceCursorOff = TRUE; NewBuffer->ForceCursorOff = TRUE;

View file

@ -793,7 +793,7 @@ ConDrvWriteConsole(IN PCONSOLE Console,
ASSERT((StringBuffer != NULL) || (StringBuffer == NULL && NumCharsToWrite == 0)); ASSERT((StringBuffer != NULL) || (StringBuffer == NULL && NumCharsToWrite == 0));
/* Stop here if the console is paused */ /* 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 */ /* Convert the string to UNICODE */
if (Unicode) if (Unicode)

View file

@ -202,6 +202,31 @@ ConioProcessInputEvent(PCONSRV_CONSOLE Console,
PINPUT_RECORD InputEvent) PINPUT_RECORD InputEvent)
{ {
ULONG NumEventsWritten; 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, return ConioAddInputEvents(Console,
InputEvent, InputEvent,
1, 1,

View file

@ -206,7 +206,7 @@ CSR_API(SrvCreateConsoleScreenBuffer)
TEXTMODE_BUFFER_INFO TextModeInfo = {{80, 25}, TEXTMODE_BUFFER_INFO TextModeInfo = {{80, 25},
{80, 25}, {80, 25},
DEFAULT_SCREEN_ATTRIB, DEFAULT_SCREEN_ATTRIB,
DEFAULT_POPUP_ATTRIB , DEFAULT_POPUP_ATTRIB,
TRUE, TRUE,
CSR_DEFAULT_CURSOR_SIZE}; CSR_DEFAULT_CURSOR_SIZE};
GRAPHICS_BUFFER_INFO GraphicsInfo; GRAPHICS_BUFFER_INFO GraphicsInfo;

View file

@ -240,14 +240,14 @@ ConsoleFreeUnicodeString(IN PUNICODE_STRING UnicodeString)
} }
VOID VOID
ConioPause(PCONSRV_CONSOLE Console, UINT Flags) ConioPause(PCONSRV_CONSOLE Console, UCHAR Flags)
{ {
Console->PauseFlags |= Flags; Console->PauseFlags |= Flags;
ConDrvPause((PCONSOLE)Console); ConDrvPause((PCONSOLE)Console);
} }
VOID VOID
ConioUnpause(PCONSRV_CONSOLE Console, UINT Flags) ConioUnpause(PCONSRV_CONSOLE Console, UCHAR Flags)
{ {
Console->PauseFlags &= ~Flags; Console->PauseFlags &= ~Flags;

View file

@ -34,17 +34,20 @@ ConioGetShiftState(PBYTE KeyState, LPARAM lParam)
ssOut |= SCROLLLOCK_ON; ssOut |= SCROLLLOCK_ON;
if (KeyState[VK_SHIFT] & 0x80) if (KeyState[VK_SHIFT] & 0x80)
// || (KeyState[VK_LSHIFT] & 0x80) || (KeyState[VK_RSHIFT] & 0x80)
ssOut |= SHIFT_PRESSED; ssOut |= SHIFT_PRESSED;
if (KeyState[VK_LCONTROL] & 0x80) if (KeyState[VK_LCONTROL] & 0x80)
ssOut |= LEFT_CTRL_PRESSED; ssOut |= LEFT_CTRL_PRESSED;
if (KeyState[VK_RCONTROL] & 0x80) if (KeyState[VK_RCONTROL] & 0x80)
ssOut |= RIGHT_CTRL_PRESSED; ssOut |= RIGHT_CTRL_PRESSED;
// if (KeyState[VK_CONTROL] & 0x80) { ... }
if (KeyState[VK_LMENU] & 0x80) if (KeyState[VK_LMENU] & 0x80)
ssOut |= LEFT_ALT_PRESSED; ssOut |= LEFT_ALT_PRESSED;
if (KeyState[VK_RMENU] & 0x80) if (KeyState[VK_RMENU] & 0x80)
ssOut |= RIGHT_ALT_PRESSED; ssOut |= RIGHT_ALT_PRESSED;
// if (KeyState[VK_MENU] & 0x80) { ... }
/* See WM_CHAR MSDN documentation for instance */ /* See WM_CHAR MSDN documentation for instance */
if (lParam & 0x01000000) if (lParam & 0x01000000)
@ -124,23 +127,6 @@ ConioProcessKey(PCONSRV_CONSOLE Console, MSG* msg)
if (Fake) return; 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, // FIXME: Scrolling via keyboard shortcuts must be done differently,
// without touching the internal VirtualY variable. // without touching the internal VirtualY variable.

View file

@ -93,8 +93,6 @@ struct _CONSOLE_SCREEN_BUFFER
COORD ViewOrigin; /* Beginning offset for the actual display area */ COORD ViewOrigin; /* Beginning offset for the actual display area */
/***** Put that VV in TEXTMODE_SCREEN_BUFFER ?? *****/ /***** Put that VV in TEXTMODE_SCREEN_BUFFER ?? *****/
USHORT VirtualY; /* Top row of buffer being displayed, reported to callers */
COORD CursorPosition; /* Current cursor position */ COORD CursorPosition; /* Current cursor position */
BOOLEAN CursorBlinkOn; BOOLEAN CursorBlinkOn;
BOOLEAN ForceCursorOff; BOOLEAN ForceCursorOff;
@ -152,6 +150,7 @@ typedef struct _TEXTMODE_SCREEN_BUFFER
{ {
CONSOLE_SCREEN_BUFFER; /* Screen buffer base class - MUST BE IN FIRST PLACE */ 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) */ PCHAR_INFO Buffer; /* Pointer to UNICODE screen buffer (Buffer->Char.UnicodeChar only is valid, not Char.AsciiChar) */
USHORT ScreenDefaultAttrib; /* Default screen char attribute */ USHORT ScreenDefaultAttrib; /* Default screen char attribute */
@ -333,7 +332,7 @@ typedef struct _CONSOLE
CONSOLE_STATE State; /* State of the console */ CONSOLE_STATE State; /* State of the console */
TERMINAL TermIFace; /* Terminal-specific interface */ TERMINAL TermIFace; /* Terminal-specific interface */
HANDLE UnpauseEvent; /* When != NULL, event for pausing the console */ BOOLEAN ConsolePaused; /* If TRUE, the console is paused */
/******************************** Input buffer ********************************/ /******************************** Input buffer ********************************/
CONSOLE_INPUT_BUFFER InputBuffer; /* Input buffer of the console */ CONSOLE_INPUT_BUFFER InputBuffer; /* Input buffer of the console */
@ -367,7 +366,7 @@ ConSrvConsoleCtrlEvent(IN ULONG CtrlEvent,
/* conoutput.c */ /* conoutput.c */
PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y); 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, PTEXTMODE_SCREEN_BUFFER ScreenBuffer,
COORD Size); COORD Size);

View file

@ -152,7 +152,7 @@ typedef struct _WINSRV_CONSOLE
BOOLEAN HasFocus; /* TRUE if the console has focus (is in the foreground) */ BOOLEAN HasFocus; /* TRUE if the console has focus (is in the foreground) */
/******************************* Pausing support ******************************/ /******************************* Pausing support ******************************/
BYTE PauseFlags; UCHAR PauseFlags;
LIST_ENTRY ReadWaitQueue; /* List head for the queue of unique input buffer read wait blocks */ 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 */ 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; } WINSRV_CONSOLE; // , *PWINSRV_CONSOLE;
/* console.c */ /* console.c */
VOID ConioPause(PCONSRV_CONSOLE Console, UINT Flags); VOID ConioPause(PCONSRV_CONSOLE Console, UCHAR Flags);
VOID ConioUnpause(PCONSRV_CONSOLE Console, UINT Flags); VOID ConioUnpause(PCONSRV_CONSOLE Console, UCHAR Flags);
PCONSOLE_PROCESS_DATA NTAPI PCONSOLE_PROCESS_DATA NTAPI
ConSrvGetConsoleLeaderProcess(IN PCONSRV_CONSOLE Console); ConSrvGetConsoleLeaderProcess(IN PCONSRV_CONSOLE Console);
@ -227,7 +227,7 @@ ConioProcessInputEvent(PCONSRV_CONSOLE Console,
/* conoutput.c */ /* conoutput.c */
PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y); 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, PTEXTMODE_SCREEN_BUFFER ScreenBuffer,
COORD Size); COORD Size);