[KERNEL32][CONSRV]
[reactos.git] / reactos / win32ss / user / winsrv / consrv / condrv / coninput.c
index 783daa8..8a9329d 100644 (file)
@@ -60,8 +60,9 @@ ConioInputEventToAnsi(PCONSOLE Console, PINPUT_RECORD InputEvent)
 }
 
 NTSTATUS FASTCALL
-ConioProcessInputEvent(PCONSOLE Console,
-                       PINPUT_RECORD InputEvent)
+ConioAddInputEvent(PCONSOLE Console,
+                   PINPUT_RECORD InputEvent,
+                   BOOLEAN AppendToEnd)
 {
     ConsoleInput *ConInRec;
 
@@ -97,7 +98,17 @@ ConioProcessInputEvent(PCONSOLE Console,
     if (ConInRec == NULL) return STATUS_INSUFFICIENT_RESOURCES;
 
     ConInRec->InputEvent = *InputEvent;
-    InsertTailList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry);
+
+    if (AppendToEnd)
+    {
+        /* Append the event to the end of the queue */
+        InsertTailList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry);
+    }
+    else
+    {
+        /* Append the event to the beginning of the queue */
+        InsertHeadList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry);
+    }
 
     SetEvent(Console->InputBuffer.ActiveEvent);
     CsrNotifyWait(&Console->InputBuffer.ReadWaitQueue,
@@ -112,6 +123,13 @@ ConioProcessInputEvent(PCONSOLE Console,
     return STATUS_SUCCESS;
 }
 
+NTSTATUS FASTCALL
+ConioProcessInputEvent(PCONSOLE Console,
+                       PINPUT_RECORD InputEvent)
+{
+    return ConioAddInputEvent(Console, InputEvent, TRUE);
+}
+
 VOID FASTCALL
 PurgeInputBuffer(PCONSOLE Console)
 {
@@ -358,6 +376,7 @@ ConDrvReadConsole(IN PCONSOLE Console,
 NTSTATUS NTAPI
 ConDrvGetConsoleInput(IN PCONSOLE Console,
                       IN PCONSOLE_INPUT_BUFFER InputBuffer,
+                      IN BOOLEAN KeepEvents,
                       IN BOOLEAN WaitForMoreEvents,
                       IN BOOLEAN Unicode,
                       OUT PINPUT_RECORD InputRecord,
@@ -407,7 +426,8 @@ ConDrvGetConsoleInput(IN PCONSOLE Console,
         ++i;
         CurrentInput = CurrentInput->Flink;
 
-        if (WaitForMoreEvents) // TRUE --> Read, we remove inputs from the buffer ; FALSE --> Peek, we keep inputs.
+        /* Remove the events from the queue if needed */
+        if (!KeepEvents)
         {
             RemoveEntryList(&Input->ListEntry);
             ConsoleFreeHeap(Input);
@@ -429,6 +449,7 @@ NTSTATUS NTAPI
 ConDrvWriteConsoleInput(IN PCONSOLE Console,
                         IN PCONSOLE_INPUT_BUFFER InputBuffer,
                         IN BOOLEAN Unicode,
+                        IN BOOLEAN AppendToEnd,
                         IN PINPUT_RECORD InputRecord,
                         IN ULONG NumEventsToWrite,
                         OUT PULONG NumEventsWritten OPTIONAL)
@@ -457,7 +478,7 @@ ConDrvWriteConsoleInput(IN PCONSOLE Console,
                                               &AsciiChar);
         }
 
-        Status = ConioProcessInputEvent(Console, InputRecord++);
+        Status = ConioAddInputEvent(Console, InputRecord++, AppendToEnd);
     }
 
     if (NumEventsWritten) *NumEventsWritten = i;